diff --git a/AUTHORS b/AUTHORS index 9a70d75..2244e67 100644 --- a/AUTHORS +++ b/AUTHORS
@@ -151,6 +151,7 @@ Arunprasad Rajkumar <ararunprasad@gmail.com> Arunprasad Rajkumar <arurajku@cisco.com> Arup Barua <arup.barua@samsung.com> +Aryan Kaushik <aryankaushik2023@gmail.com> Asami Doi <d0iasm.pub@gmail.com> Ashish Kumar Gupta <guptaag@amazon.com> Ashlin Joseph <ashlin.j@samsung.com>
diff --git a/DEPS b/DEPS index c78eb6af..a6b111a5 100644 --- a/DEPS +++ b/DEPS
@@ -300,7 +300,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': '9cc604b2c3edd8c64e81848cd867d88ab5214f2a', + 'skia_revision': '31f895f28df4179dda94325f1f967a3b0a3e0105', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. @@ -308,7 +308,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': 'c9029ddff73f199bb112cde529cdfa8834cd219f', + 'angle_revision': '383783de3e689fe0b9976d1e2cf5439a0ff972a2', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -327,7 +327,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:12.20230519.0.1', + 'fuchsia_version': 'version:12.20230519.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. @@ -351,7 +351,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling freetype # and whatever else without interference from each other. - 'freetype_revision': '99dadd56a40e6d9ae23b395225ecf9997432d22c', + 'freetype_revision': '115e927540dba128980dd734dadeb06aa7b0f4d8', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling freetype # and whatever else without interference from each other. @@ -371,7 +371,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': 'ac9d6ede9a944c02ddab627c4480cc7d5629a9d8', + 'catapult_revision': 'c6222c27ba3f3253c68caaa5b7274f1f7884cd94', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling CrossBench # and whatever else without interference from each other. @@ -427,7 +427,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': 'f74cc46029988be9d4f1656c4dae5b1fef0432b1', + 'dawn_revision': '74dcafc17b116a0a551cbb6cd54db74e996797fa', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -471,7 +471,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'libcxxabi_revision': 'a4c3a6dc75b3f4aef6b39e7a10452b197ec29371', + 'libcxxabi_revision': '982e218cb8a2d11979e241f483fff904468f6057', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -498,7 +498,7 @@ 'libcxx_revision': 'f8279b01085b800724f5c5629dc365b9f040dc53', # GN CIPD package version. - 'gn_version': 'git_revision:6975103d9f59ed9f3cfbc6d2201298f2c2fde046', + 'gn_version': 'git_revision:e9e83d9095d3234adf68f3e2866f25daf766d5c7', # ninja CIPD package version. # https://chrome-infra-packages.appspot.com/p/infra/3pp/tools/ninja @@ -803,7 +803,7 @@ 'src/clank': { 'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' + - 'b82008d8991e0d07ac142709418bc437083b6674', + 'a8f5ec6bcc79fe929145d05327eca1ed6d43df27', 'condition': 'checkout_android and checkout_src_internal', }, @@ -1195,7 +1195,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' + '@' + '033bcddf8bf5a53525ffdb5b0facf7d9e3f7b939', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'c039ce12a59be1650e06b0e4b9c362d524444948', 'condition': 'checkout_chromeos', }, @@ -1227,7 +1227,7 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'b0e8e7adbc7e61ad3c501683e13ffd05dcd9b669', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '9c32c9240c80469faed85dcfd481db29b89329af', 'src/third_party/devtools-frontend/src': Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), @@ -1700,7 +1700,7 @@ Var('pdfium_git') + '/pdfium.git' + '@' + Var('pdfium_revision'), 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'a9c0e2b0a61932cc706f57d504ea289d308e2af8', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '2a96a77e3dee79a45a95765c63a8986d75fe39ca', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1845,7 +1845,7 @@ 'dep_type': 'cipd', }, - 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@3a356ab9798772ac682757e9a0415585705917bc', + 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@68bc448fa9011489559a06e303a90ea9fbbf28d2', 'src/third_party/vulkan_memory_allocator': Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'ebe84bec02c041d28f902da0214bf442743fc907', @@ -1885,7 +1885,7 @@ Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'b033a4f1ae4a0e19ae4d5563fae023001bbf570f', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + 'ff75eae06475fc586bbe379bbb3c91896fe47bb9', + Var('webrtc_git') + '/src.git' + '@' + 'cc1ee35a692d6d3c247be70934e598f272db01af', # 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. @@ -1975,7 +1975,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': Var('chrome_git') + '/chrome/src-internal.git@7a466d413b86eeb881bbd06cbb02c2e4a35d23ec', + 'url': Var('chrome_git') + '/chrome/src-internal.git@ca755af32e93ba6c2b5d7c6677665364fe7ae015', 'condition': 'checkout_src_internal', }, @@ -2005,7 +2005,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': 'KIv3mQ-vraUUsXmjbeByOGhWSyM7eVQt-zDfQqc1tRcC', + 'version': '93ij8yDoCI_mjbr85x19L8WyrglIEEIKjio6HHgkd-8C', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -2016,7 +2016,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/media_app/app', - 'version': 'ytE7FV5CWUCA4UszvYGFyBfyFFGujO9MqXHdaBaUJj8C', + 'version': 'SuAGVyMKYmhfFgvIY4eewm8Tl9sGWWtFWQkAdH-TOCgC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -2038,7 +2038,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/projector_app/app', - 'version': 'FjcYLnt8XFsv3CWylOn97Wr-_Ye2LGp-c9qbdk5O3YEC', + 'version': 'woxSvTLKWL_qnrKZE_5hudMl8W3WswWL7RvSIhaTmRQC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -3944,17 +3944,17 @@ # Dependencies from src_internal 'src/chromeos/assistant/internal': { 'url': Var('chrome_git') + '/chrome/assistant.git' + '@' + - 'c63ab7bc8d601bc3b92bdcf8976e80e9df4cdb93', + '6642da7a3ef31bb09ecb888cb0938e9839bcb445', 'condition': 'checkout_src_internal and checkout_chromeos', }, 'src/chromeos/assistant/libassistant/src': { - 'url': Var('chrome_git') + '/external/gob/libassistant-internal/standalone/src.git' + '@' + '18376d73f1fab1204ee03e1b998ac83aa0539607', + 'url': Var('chrome_git') + '/external/gob/libassistant-internal/standalone/src.git' + '@' + 'e38dcf1c89c9a6b3e1d3e6745985564598a5bce4', 'condition': 'checkout_src_internal and checkout_chromeos', }, 'src/libassistant': { - 'url': Var('chrome_git') + '/chrome/libassistant.git' + '@' + 'fe0ef57f250510e890fc01e1b6c7da7b59117603', + 'url': Var('chrome_git') + '/chrome/libassistant.git' + '@' + '814fa857d072d8599cf8b02ac0a79cade692ce7f', 'condition': 'checkout_src_internal and checkout_chromeos', },
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn index 37c23aac..fcef866 100644 --- a/android_webview/BUILD.gn +++ b/android_webview/BUILD.gn
@@ -12,6 +12,7 @@ import("//build/config/android/jni.gni") import("//build/config/android/rules.gni") import("//build/config/cronet/config.gni") +import("//build/config/features.gni") import("//build/config/locales.gni") import("//chrome/android/chrome_common_shared_library.gni") import("//chrome/android/chrome_public_apk_tmpl.gni") @@ -1136,6 +1137,7 @@ "enable_print_preview=$enable_print_preview", "enable_screen_ai_service=$enable_screen_ai_service", "enable_vr=$enable_vr", + "use_blink=$use_blink", ] # components_strings contains strings from all components. WebView
diff --git a/android_webview/browser/aw_autofill_client.h b/android_webview/browser/aw_autofill_client.h index 6b37de8..afd7ef2 100644 --- a/android_webview/browser/aw_autofill_client.h +++ b/android_webview/browser/aw_autofill_client.h
@@ -58,6 +58,7 @@ // profile). Since there is only one pref service for a given browser context, // we cannot enable this feature via UserPrefs. Rather, we always keep the // feature enabled at the pref service, and control it via the delegates. +// Lifetime: WebView class AwAutofillClient : public autofill::ContentAutofillClient { public: static AwAutofillClient* FromWebContents(content::WebContents* web_contents) {
diff --git a/android_webview/browser/aw_browser_main_parts.h b/android_webview/browser/aw_browser_main_parts.h index 156b7ce81..21d4f01 100644 --- a/android_webview/browser/aw_browser_main_parts.h +++ b/android_webview/browser/aw_browser_main_parts.h
@@ -26,6 +26,7 @@ class AwBrowserProcess; class AwContentBrowserClient; +// Lifetime: Singleton class AwBrowserMainParts : public content::BrowserMainParts { public: explicit AwBrowserMainParts(AwContentBrowserClient* browser_client);
diff --git a/android_webview/browser/aw_browser_policy_connector.h b/android_webview/browser/aw_browser_policy_connector.h index 64e67fc..09d5be6 100644 --- a/android_webview/browser/aw_browser_policy_connector.h +++ b/android_webview/browser/aw_browser_policy_connector.h
@@ -11,6 +11,7 @@ // Sets up and keeps the browser-global policy objects such as the PolicyService // and the platform-specific PolicyProvider. +// Lifetime: Singleton class AwBrowserPolicyConnector : public policy::BrowserPolicyConnectorBase { public: AwBrowserPolicyConnector();
diff --git a/android_webview/browser/aw_browser_process.h b/android_webview/browser/aw_browser_process.h index 95d42ad..a318438 100644 --- a/android_webview/browser/aw_browser_process.h +++ b/android_webview/browser/aw_browser_process.h
@@ -42,6 +42,7 @@ class AwContentsLifecycleNotifier; class VisibilityMetricsLogger; +// Lifetime: Singleton class AwBrowserProcess { public: AwBrowserProcess(AwFeatureListCreator* aw_feature_list_creator);
diff --git a/android_webview/browser/aw_browser_terminator.h b/android_webview/browser/aw_browser_terminator.h index 1e5fac38..301897b1 100644 --- a/android_webview/browser/aw_browser_terminator.h +++ b/android_webview/browser/aw_browser_terminator.h
@@ -12,6 +12,7 @@ // This class manages the browser's behavior in response to renderer exits. If // the application does not successfully handle a renderer crash/kill, the // browser needs to crash itself. +// Lifetime: Singleton class AwBrowserTerminator : public crash_reporter::ChildExitObserver::Client { public: AwBrowserTerminator();
diff --git a/android_webview/browser/aw_client_hints_controller_delegate.h b/android_webview/browser/aw_client_hints_controller_delegate.h index 5b6d77c..415c4238b 100644 --- a/android_webview/browser/aw_client_hints_controller_delegate.h +++ b/android_webview/browser/aw_client_hints_controller_delegate.h
@@ -36,6 +36,7 @@ extern const char kClientHintsCachedPerOriginMap[]; } // namespace prefs +// Lifetime: Profile class AwClientHintsControllerDelegate : public content::ClientHintsControllerDelegate { public:
diff --git a/android_webview/browser/aw_contents_client_bridge.h b/android_webview/browser/aw_contents_client_bridge.h index a7700b2..6e731d6a 100644 --- a/android_webview/browser/aw_contents_client_bridge.h +++ b/android_webview/browser/aw_contents_client_bridge.h
@@ -40,6 +40,7 @@ // indirect refs from the Application (via callbacks) and so can outlive // webview, this class notifies it before being destroyed and to nullify // any references. +// Lifetime: WebView class AwContentsClientBridge { public: // Used to package up information needed by OnReceivedHttpError for transfer
diff --git a/android_webview/browser/gfx/aw_draw_fn_impl.cc b/android_webview/browser/gfx/aw_draw_fn_impl.cc index e4e9fd2..a536ecd 100644 --- a/android_webview/browser/gfx/aw_draw_fn_impl.cc +++ b/android_webview/browser/gfx/aw_draw_fn_impl.cc
@@ -32,6 +32,7 @@ "CheckDrawFunctorThread", base::FEATURE_ENABLED_BY_DEFAULT); +// Set once during process-wide initialization. AwDrawFnFunctionTable* g_draw_fn_function_table = nullptr; void OnSyncWrapper(int functor, void* data, AwDrawFn_OnSyncParams* params) {
diff --git a/android_webview/browser/gfx/aw_draw_fn_impl.h b/android_webview/browser/gfx/aw_draw_fn_impl.h index 2510c94..75498cec 100644 --- a/android_webview/browser/gfx/aw_draw_fn_impl.h +++ b/android_webview/browser/gfx/aw_draw_fn_impl.h
@@ -17,6 +17,7 @@ namespace android_webview { +// Lifetime: WebView class AwDrawFnImpl { public: // Safe to call even on versions where draw_fn functor is not supported.
diff --git a/android_webview/browser/gfx/aw_gl_functor.h b/android_webview/browser/gfx/aw_gl_functor.h index 8b3e73b..bc5eb35 100644 --- a/android_webview/browser/gfx/aw_gl_functor.h +++ b/android_webview/browser/gfx/aw_gl_functor.h
@@ -13,6 +13,7 @@ namespace android_webview { +// Lifetime: WebView class AwGLFunctor { public: explicit AwGLFunctor(const JavaObjectWeakGlobalRef& java_ref);
diff --git a/android_webview/browser/gfx/aw_gl_surface.h b/android_webview/browser/gfx/aw_gl_surface.h index d1c3be6..8913c42d 100644 --- a/android_webview/browser/gfx/aw_gl_surface.h +++ b/android_webview/browser/gfx/aw_gl_surface.h
@@ -15,6 +15,8 @@ // This surface is used to represent the underlying surface provided by the App // inside a hardware draw. Note that offscreen contexts will not be using this // GLSurface. +// +// Lifetime: WebView class AwGLSurface : public gl::GLSurfaceEGL { public: AwGLSurface(gl::GLDisplayEGL* display, bool is_angle);
diff --git a/android_webview/browser/gfx/aw_gl_surface_external_stencil.cc b/android_webview/browser/gfx/aw_gl_surface_external_stencil.cc index e825799..ac3e3b82 100644 --- a/android_webview/browser/gfx/aw_gl_surface_external_stencil.cc +++ b/android_webview/browser/gfx/aw_gl_surface_external_stencil.cc
@@ -19,6 +19,7 @@ base::FEATURE_ENABLED_BY_DEFAULT); } +// Lifetime: WebView class AwGLSurfaceExternalStencil::BlitContext { public: BlitContext() { @@ -108,6 +109,7 @@ GLint gl_max_vertex_attribs_; }; +// Lifetime: WebView class AwGLSurfaceExternalStencil::FrameBuffer { public: FrameBuffer(gfx::Size size) : size_(size) {
diff --git a/android_webview/browser/gfx/aw_gl_surface_external_stencil.h b/android_webview/browser/gfx/aw_gl_surface_external_stencil.h index 180b0803..f7ed63f1 100644 --- a/android_webview/browser/gfx/aw_gl_surface_external_stencil.h +++ b/android_webview/browser/gfx/aw_gl_surface_external_stencil.h
@@ -7,6 +7,7 @@ #include "android_webview/browser/gfx/aw_gl_surface.h" +// Lifetime: WebView namespace android_webview { class AwGLSurfaceExternalStencil : public AwGLSurface { public:
diff --git a/android_webview/browser/gfx/aw_picture.h b/android_webview/browser/gfx/aw_picture.h index 9795bda..93a69efc 100644 --- a/android_webview/browser/gfx/aw_picture.h +++ b/android_webview/browser/gfx/aw_picture.h
@@ -12,6 +12,8 @@ namespace android_webview { +// This class can outlive the WebView it was created from. It is self-contained +// and independent of the WebView once constructed. class AwPicture { public: AwPicture(sk_sp<SkPicture> picture);
diff --git a/android_webview/browser/gfx/aw_vulkan_context_provider.h b/android_webview/browser/gfx/aw_vulkan_context_provider.h index 691a53b..1f54eedc 100644 --- a/android_webview/browser/gfx/aw_vulkan_context_provider.h +++ b/android_webview/browser/gfx/aw_vulkan_context_provider.h
@@ -26,8 +26,10 @@ namespace android_webview { +// Lifetime: WebView class AwVulkanContextProvider final : public viz::VulkanContextProvider { public: + // Short-lived. Created and destroyed for each (Vulkan) draw. class ScopedSecondaryCBDraw { public: ScopedSecondaryCBDraw(AwVulkanContextProvider* provider, @@ -77,6 +79,11 @@ void SecondaryCBDrawBegin(sk_sp<GrVkSecondaryCBDrawContext> draw_context); void SecondaryCMBDrawSubmitted(); + // Lifetime: Singleton + // + // This counts its number of active users and will spin up and tear down + // according to demand. As such, it may not be the same singleton throughout + // the process's lifetime. struct Globals : base::RefCountedThreadSafe<Globals> { static scoped_refptr<Globals> GetOrCreateInstance( AwDrawFn_InitVkParams* params);
diff --git a/android_webview/browser/gfx/begin_frame_source_webview.h b/android_webview/browser/gfx/begin_frame_source_webview.h index 9e5c9ef..5d67501 100644 --- a/android_webview/browser/gfx/begin_frame_source_webview.h +++ b/android_webview/browser/gfx/begin_frame_source_webview.h
@@ -24,6 +24,8 @@ // BeginFrameSourceWebView to provide AddBeginFrameCompletionCallback which will // be forwarded to root begin frame source to ensure that callbacks called after // all BeginFrames are sent. +// +// Lifetime: WebView class BeginFrameSourceWebView : public viz::ExternalBeginFrameSource { public: BeginFrameSourceWebView(); @@ -74,6 +76,12 @@ // observes ExternalBeginFrameSourceAndroid to provide actual BeginFrames from // Android Choreographer and implements the logic of // AddBeginFrameCompletionCallback. +// +// Lifetime: Singleton +// +// There is only one RootBeginFrameSourceWebView, even if there are multiple +// displays with different VSync timings attached. Choreographer only uses the +// built-in display for frame timing. class RootBeginFrameSourceWebView : public BeginFrameSourceWebView { public: static RootBeginFrameSourceWebView* GetInstance();
diff --git a/android_webview/browser/gfx/browser_view_renderer.h b/android_webview/browser/gfx/browser_view_renderer.h index 84cb46c..9bb0ee5 100644 --- a/android_webview/browser/gfx/browser_view_renderer.h +++ b/android_webview/browser/gfx/browser_view_renderer.h
@@ -47,6 +47,8 @@ // Interface for all the WebView-specific content rendering operations. // Provides software and hardware rendering and the Capture Picture API. +// +// Lifetime: WebView class BrowserViewRenderer : public content::SynchronousCompositorClient, public CompositorFrameProducer, public RootFrameSinkProxyClient {
diff --git a/android_webview/browser/gfx/child_frame.h b/android_webview/browser/gfx/child_frame.h index 34ab573..b699dc34 100644 --- a/android_webview/browser/gfx/child_frame.h +++ b/android_webview/browser/gfx/child_frame.h
@@ -27,6 +27,7 @@ using CopyOutputRequestQueue = std::vector<std::unique_ptr<viz::CopyOutputRequest>>; +// Lifetime: WebView class ChildFrame { public: ChildFrame(
diff --git a/android_webview/browser/gfx/display_scheduler_webview.h b/android_webview/browser/gfx/display_scheduler_webview.h index d202c0b6..f882d140 100644 --- a/android_webview/browser/gfx/display_scheduler_webview.h +++ b/android_webview/browser/gfx/display_scheduler_webview.h
@@ -25,6 +25,7 @@ virtual bool IsFrameSinkOverlayed(viz::FrameSinkId frame_sink_id) = 0; }; +// Lifetime: WebView class DisplaySchedulerWebView : public viz::DisplaySchedulerBase, public viz::SurfaceObserver, public viz::FrameSinkObserver {
diff --git a/android_webview/browser/gfx/display_webview.h b/android_webview/browser/gfx/display_webview.h index f7bbc9b88..42ed86e 100644 --- a/android_webview/browser/gfx/display_webview.h +++ b/android_webview/browser/gfx/display_webview.h
@@ -16,6 +16,7 @@ class OverlayProcessorWebView; class RootFrameSink; +// Lifetime: WebView class DisplayWebView : public viz::Display, public viz::FrameSinkObserver { public: static std::unique_ptr<DisplayWebView> Create(
diff --git a/android_webview/browser/gfx/gpu_service_webview.h b/android_webview/browser/gfx/gpu_service_webview.h index 89c849d..107c5735 100644 --- a/android_webview/browser/gfx/gpu_service_webview.h +++ b/android_webview/browser/gfx/gpu_service_webview.h
@@ -26,6 +26,8 @@ // This class acts like GpuServiceImpl for WebView. It owns gpu service objects // and provides handle to these gpu objects for WebView. There is only one copy // of this class in WebView. +// +// Lifetime: Singleton class GpuServiceWebView { public: // This static function makes sure there is a single copy of this class.
diff --git a/android_webview/browser/gfx/hardware_renderer.h b/android_webview/browser/gfx/hardware_renderer.h index cb917b0..4f1eb853 100644 --- a/android_webview/browser/gfx/hardware_renderer.h +++ b/android_webview/browser/gfx/hardware_renderer.h
@@ -21,6 +21,7 @@ class AwVulkanContextProvider; class RenderThreadManager; +// Lifetime: Temporary struct OverlaysParams { enum class Mode { Disabled, @@ -35,6 +36,7 @@ MergeTransactionFn merge_transaction = nullptr; }; +// Lifetime: Temporary struct HardwareRendererDrawParams { bool operator==(const HardwareRendererDrawParams& other) const; bool operator!=(const HardwareRendererDrawParams& other) const; @@ -49,6 +51,7 @@ gfx::ColorSpace color_space; }; +// Lifetime: WebView class HardwareRenderer { public: // Two rules:
diff --git a/android_webview/browser/gfx/java_browser_view_renderer_helper.h b/android_webview/browser/gfx/java_browser_view_renderer_helper.h index 745e29d8..53a3a1127 100644 --- a/android_webview/browser/gfx/java_browser_view_renderer_helper.h +++ b/android_webview/browser/gfx/java_browser_view_renderer_helper.h
@@ -17,6 +17,7 @@ namespace android_webview { +// Lifetime: Temporary class SoftwareCanvasHolder { public: static std::unique_ptr<SoftwareCanvasHolder> Create(
diff --git a/android_webview/browser/gfx/output_surface_provider_webview.h b/android_webview/browser/gfx/output_surface_provider_webview.h index c8164c4..a4fbd82 100644 --- a/android_webview/browser/gfx/output_surface_provider_webview.h +++ b/android_webview/browser/gfx/output_surface_provider_webview.h
@@ -27,6 +27,8 @@ class AwVulkanContextProvider; // Effectively a data struct to pass pointers from render thread to viz thread. +// +// Lifetime: WebView class OutputSurfaceProviderWebView { public: explicit OutputSurfaceProviderWebView(
diff --git a/android_webview/browser/gfx/overlay_processor_webview.cc b/android_webview/browser/gfx/overlay_processor_webview.cc index d1c46b3..2099b97 100644 --- a/android_webview/browser/gfx/overlay_processor_webview.cc +++ b/android_webview/browser/gfx/overlay_processor_webview.cc
@@ -52,9 +52,14 @@ // Manages ASurfaceControl life-cycle and handles ASurfaceTransactions. Created // on Android RenderThread, but both used on both Android RenderThread and GPU // Main thread, so can be destroyed on one of them. +// +// Lifetime: WebView +// Each OverlayProcessorWebView owns one Manager. Ref-counted for callbacks. class OverlayProcessorWebView::Manager : public base::RefCountedThreadSafe<OverlayProcessorWebView::Manager> { private: + // Instances are either directly owned by Manager or indirectly through + // OverlaySurface. class Resource { public: Resource(gpu::SharedImageManager* shared_image_manager, @@ -411,6 +416,8 @@ friend class base::RefCountedThreadSafe<Manager>; // Class that holds SurfaceControl and associated resources. + // + // Instances are owned by Manager. class OverlaySurface { public: OverlaySurface(const gfx::SurfaceControl::Surface& parent)
diff --git a/android_webview/browser/gfx/overlay_processor_webview.h b/android_webview/browser/gfx/overlay_processor_webview.h index 5ce8511..5c8b2fa 100644 --- a/android_webview/browser/gfx/overlay_processor_webview.h +++ b/android_webview/browser/gfx/overlay_processor_webview.h
@@ -27,6 +27,7 @@ } // namespace viz namespace android_webview { +// Lifetime: WebView class OverlayProcessorWebView : public viz::OverlayProcessorSurfaceControl, public OverlaysInfoProvider { public:
diff --git a/android_webview/browser/gfx/parent_compositor_draw_constraints.h b/android_webview/browser/gfx/parent_compositor_draw_constraints.h index f7a57c3375..cc0b6ce 100644 --- a/android_webview/browser/gfx/parent_compositor_draw_constraints.h +++ b/android_webview/browser/gfx/parent_compositor_draw_constraints.h
@@ -12,6 +12,7 @@ class ChildFrame; +// Lifetime: Temporary struct ParentCompositorDrawConstraints { gfx::Size viewport_size; gfx::Transform transform;
diff --git a/android_webview/browser/gfx/render_thread_manager.h b/android_webview/browser/gfx/render_thread_manager.h index 653c2ca..45260535 100644 --- a/android_webview/browser/gfx/render_thread_manager.h +++ b/android_webview/browser/gfx/render_thread_manager.h
@@ -26,6 +26,8 @@ class CompositorFrameProducer; // This class is used to pass data between UI thread and RenderThread. +// +// Lifetime: WebView class RenderThreadManager : public CompositorFrameConsumer { public: explicit RenderThreadManager(
diff --git a/android_webview/browser/gfx/root_frame_sink.cc b/android_webview/browser/gfx/root_frame_sink.cc index a66dadcb..c484625 100644 --- a/android_webview/browser/gfx/root_frame_sink.cc +++ b/android_webview/browser/gfx/root_frame_sink.cc
@@ -27,6 +27,8 @@ } // namespace +// Lifetime: WebView +// Instance owned by RootFrameSink class RootFrameSink::ChildCompositorFrameSink : public viz::mojom::CompositorFrameSinkClient { public:
diff --git a/android_webview/browser/gfx/root_frame_sink.h b/android_webview/browser/gfx/root_frame_sink.h index 76e6be9..ca9f3cf 100644 --- a/android_webview/browser/gfx/root_frame_sink.h +++ b/android_webview/browser/gfx/root_frame_sink.h
@@ -47,6 +47,8 @@ // access to the GPU. It is single-threaded and refcounted on the viz thread. // This needs to be separate from classes for rendering which requires GPU // to enable sending begin frames independently from access to GPU. +// +// Lifetime: WebView class RootFrameSink : public base::RefCounted<RootFrameSink>, public viz::mojom::CompositorFrameSinkClient, public viz::ExternalBeginFrameSourceClient {
diff --git a/android_webview/browser/gfx/root_frame_sink_proxy.h b/android_webview/browser/gfx/root_frame_sink_proxy.h index e6dfe050..baa2a2ef 100644 --- a/android_webview/browser/gfx/root_frame_sink_proxy.h +++ b/android_webview/browser/gfx/root_frame_sink_proxy.h
@@ -32,6 +32,8 @@ // Per-AwContents object. Straddles UI and Viz thread. Public methods should be // called on the UI thread unless otherwise specified. Mostly used for creating // RootFrameSink and routing calls to it. +// +// Lifetime: WebView class RootFrameSinkProxy : public viz::BeginFrameObserverBase { public: RootFrameSinkProxy(
diff --git a/android_webview/browser/gfx/scoped_app_gl_state_restore.h b/android_webview/browser/gfx/scoped_app_gl_state_restore.h index e135b03..39d67c9 100644 --- a/android_webview/browser/gfx/scoped_app_gl_state_restore.h +++ b/android_webview/browser/gfx/scoped_app_gl_state_restore.h
@@ -30,6 +30,8 @@ }; // This class is not thread safe and should only be used on the UI thread. +// +// Lifetime: Temporary class ScopedAppGLStateRestore { public: enum CallMode {
diff --git a/android_webview/browser/gfx/scoped_app_gl_state_restore_impl.h b/android_webview/browser/gfx/scoped_app_gl_state_restore_impl.h index 2933b71..aa3d24f4 100644 --- a/android_webview/browser/gfx/scoped_app_gl_state_restore_impl.h +++ b/android_webview/browser/gfx/scoped_app_gl_state_restore_impl.h
@@ -15,6 +15,7 @@ namespace android_webview { namespace internal { +// Lifetime: Temporary class ScopedAppGLStateRestoreImpl : public ScopedAppGLStateRestore::Impl { public: ScopedAppGLStateRestoreImpl(ScopedAppGLStateRestore::CallMode mode,
diff --git a/android_webview/browser/gfx/scoped_app_gl_state_restore_impl_angle.h b/android_webview/browser/gfx/scoped_app_gl_state_restore_impl_angle.h index d25ad0ebe..213d1763 100644 --- a/android_webview/browser/gfx/scoped_app_gl_state_restore_impl_angle.h +++ b/android_webview/browser/gfx/scoped_app_gl_state_restore_impl_angle.h
@@ -13,6 +13,7 @@ namespace android_webview { namespace internal { +// Lifetime: Temporary class ScopedAppGLStateRestoreImplAngle : public ScopedAppGLStateRestore::Impl { public: ScopedAppGLStateRestoreImplAngle(ScopedAppGLStateRestore::CallMode mode,
diff --git a/android_webview/browser/gfx/skia_output_surface_dependency_webview.h b/android_webview/browser/gfx/skia_output_surface_dependency_webview.h index f9784fe..457f6a8 100644 --- a/android_webview/browser/gfx/skia_output_surface_dependency_webview.h +++ b/android_webview/browser/gfx/skia_output_surface_dependency_webview.h
@@ -18,6 +18,8 @@ class GpuServiceWebView; // Implementation for access to gpu objects and task queue for WebView. +// +// Lifetime: WebView class SkiaOutputSurfaceDependencyWebView : public viz::SkiaOutputSurfaceDependency { public:
diff --git a/android_webview/browser/gfx/task_forwarding_sequence.h b/android_webview/browser/gfx/task_forwarding_sequence.h index 4afe8e9..60f73e93 100644 --- a/android_webview/browser/gfx/task_forwarding_sequence.h +++ b/android_webview/browser/gfx/task_forwarding_sequence.h
@@ -25,6 +25,8 @@ // satisfies WebView's threading requirements. It encapsulates a // SyncPointOrderData, and posts tasks to the WebView's global task queue: // TaskQueueWebView. +// +// Lifetime: WebView class TaskForwardingSequence : public gpu::SingleTaskSequence { public: TaskForwardingSequence(TaskQueueWebView* task_queue,
diff --git a/android_webview/browser/gfx/task_queue_webview.cc b/android_webview/browser/gfx/task_queue_webview.cc index 0b86c863..c413901 100644 --- a/android_webview/browser/gfx/task_queue_webview.cc +++ b/android_webview/browser/gfx/task_queue_webview.cc
@@ -30,6 +30,8 @@ // other way around. This achieves viz scheduling tasks to gpu by first blocking // render thread on the viz thread so render thread is ready to receive and run // tasks. +// +// Lifetime: Singleton class TaskQueueViz : public TaskQueueWebView { public: TaskQueueViz();
diff --git a/android_webview/browser/gfx/task_queue_webview.h b/android_webview/browser/gfx/task_queue_webview.h index df04749..32f6d96 100644 --- a/android_webview/browser/gfx/task_queue_webview.h +++ b/android_webview/browser/gfx/task_queue_webview.h
@@ -14,6 +14,8 @@ // In WebView, there is a single task queue that runs all tasks instead of // thread task runners. This is the class actually scheduling and running tasks // for WebView. This is used by both CommandBuffer and SkiaDDL. +// +// Lifetime: Singleton class TaskQueueWebView { public: // Static method that makes sure this is only one copy of this class.
diff --git a/android_webview/browser/gfx/viz_compositor_thread_runner_webview.h b/android_webview/browser/gfx/viz_compositor_thread_runner_webview.h index c706a151..7c6f0d49 100644 --- a/android_webview/browser/gfx/viz_compositor_thread_runner_webview.h +++ b/android_webview/browser/gfx/viz_compositor_thread_runner_webview.h
@@ -37,6 +37,8 @@ // in VizMainImpl, which may cause confusion for developers. If this proves to // be common, then an alternative is assume viz runs in the browser process // and directly connect viz classes to mojo end points in the browser. +// +// Lifetime: Singleton class VizCompositorThreadRunnerWebView : public viz::VizCompositorThreadRunner { public: static VizCompositorThreadRunnerWebView* GetInstance();
diff --git a/android_webview/browser/gfx/vulkan_gl_interop.h b/android_webview/browser/gfx/vulkan_gl_interop.h index 70f1533..37af8295 100644 --- a/android_webview/browser/gfx/vulkan_gl_interop.h +++ b/android_webview/browser/gfx/vulkan_gl_interop.h
@@ -12,7 +12,7 @@ #include "base/android/scoped_hardware_buffer_handle.h" #include "base/containers/queue.h" #include "base/files/scoped_file.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/memory/scoped_refptr.h" #include "third_party/skia/include/core/SkRefCnt.h" #include "third_party/skia/include/gpu/vk/GrVkTypes.h" @@ -35,6 +35,8 @@ // With interop mode, we will render frames on AHBs with GL api, and then draw // AHBs with Vulkan API on the final target. +// +// Lifetime: WebView class VulkanGLInterop { public: VulkanGLInterop(RenderThreadManager* render_thread_manager, @@ -76,12 +78,9 @@ raw_ptr<AwVulkanContextProvider> vk_context_provider; }; - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union - RAW_PTR_EXCLUSION RenderThreadManager* const render_thread_manager_; - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union - RAW_PTR_EXCLUSION AwVulkanContextProvider* const vulkan_context_provider_; + raw_ptr<RenderThreadManager> const render_thread_manager_; + + raw_ptr<AwVulkanContextProvider> const vulkan_context_provider_; // GL context used to draw via GL in Vk interop path. scoped_refptr<GLNonOwnedCompatibilityContext> gl_context_;
diff --git a/android_webview/browser/metrics/visibility_metrics_logger.h b/android_webview/browser/metrics/visibility_metrics_logger.h index a7eb7af6..6795605 100644 --- a/android_webview/browser/metrics/visibility_metrics_logger.h +++ b/android_webview/browser/metrics/visibility_metrics_logger.h
@@ -14,6 +14,10 @@ namespace android_webview { +// Records how much of the screen is covered by WebViews. This helps us +// determine what WebView is being used for. +// +// Lifetime: Singleton class VisibilityMetricsLogger { public: // These values are persisted to logs and must match the WebViewUrlScheme enum
diff --git a/android_webview/browser/metrics/visibility_metrics_provider.h b/android_webview/browser/metrics/visibility_metrics_provider.h index 2659d20..8f81e9c 100644 --- a/android_webview/browser/metrics/visibility_metrics_provider.h +++ b/android_webview/browser/metrics/visibility_metrics_provider.h
@@ -12,6 +12,11 @@ class VisibilityMetricsLogger; +// Records the metrics collected by VisibilityMetricsLogger. +// +// This class is owned by the metrics::MetricsService. +// +// Lifetime: Singleton class VisibilityMetricsProvider : public metrics::MetricsProvider { public: explicit VisibilityMetricsProvider(VisibilityMetricsLogger* logger);
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/AndroidXProcessGlobalConfig.java b/android_webview/glue/java/src/com/android/webview/chromium/AndroidXProcessGlobalConfig.java index aeb89483..b6b4e63 100644 --- a/android_webview/glue/java/src/com/android/webview/chromium/AndroidXProcessGlobalConfig.java +++ b/android_webview/glue/java/src/com/android/webview/chromium/AndroidXProcessGlobalConfig.java
@@ -9,6 +9,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import org.chromium.android_webview.common.Lifetime; import org.chromium.support_lib_boundary.ProcessGlobalConfigConstants; import java.lang.reflect.Field; @@ -21,7 +22,11 @@ /** * Class that contains the process global configuration information if it was set by the embedding * app using androidx.webkit.ProcessGlobalConfig. + * + * It is extracted once when WebView first loads and is used for global process configurations ( + * hence the name). */ +@Lifetime.Singleton public final class AndroidXProcessGlobalConfig { private String mDataDirectorySuffix; private String mDataDirectoryBasePath;
diff --git a/android_webview/java/src/org/chromium/android_webview/AwBrowserContext.java b/android_webview/java/src/org/chromium/android_webview/AwBrowserContext.java index a1e61597..d4ec32c7 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwBrowserContext.java +++ b/android_webview/java/src/org/chromium/android_webview/AwBrowserContext.java
@@ -9,6 +9,7 @@ import androidx.annotation.VisibleForTesting; +import org.chromium.android_webview.common.Lifetime; import org.chromium.android_webview.common.PlatformServiceBridge; import org.chromium.base.ContextUtils; import org.chromium.base.StrictModeContext; @@ -30,6 +31,7 @@ * AwBrowserContext instance, so at this point the class mostly exists for conceptual clarity. */ @JNINamespace("android_webview") +@Lifetime.Profile public class AwBrowserContext implements BrowserContextHandle { private static final String CHROMIUM_PREFS_NAME = "WebViewProfilePrefsDefault";
diff --git a/android_webview/java/src/org/chromium/android_webview/gfx/AwDrawFnImpl.java b/android_webview/java/src/org/chromium/android_webview/gfx/AwDrawFnImpl.java index d0ad460..51d98e7 100644 --- a/android_webview/java/src/org/chromium/android_webview/gfx/AwDrawFnImpl.java +++ b/android_webview/java/src/org/chromium/android_webview/gfx/AwDrawFnImpl.java
@@ -6,6 +6,7 @@ import android.graphics.Canvas; +import org.chromium.android_webview.common.Lifetime; import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.NativeMethods; @@ -13,6 +14,7 @@ * Implementation of draw_fn.h. */ @JNINamespace("android_webview") +@Lifetime.WebView public class AwDrawFnImpl implements AwFunctor { private long mNativeAwDrawFnImpl; private final DrawFnAccess mAccess;
diff --git a/android_webview/java/src/org/chromium/android_webview/gfx/AwGLFunctor.java b/android_webview/java/src/org/chromium/android_webview/gfx/AwGLFunctor.java index af121d43..e508c8ef 100644 --- a/android_webview/java/src/org/chromium/android_webview/gfx/AwGLFunctor.java +++ b/android_webview/java/src/org/chromium/android_webview/gfx/AwGLFunctor.java
@@ -10,6 +10,7 @@ import androidx.annotation.VisibleForTesting; import org.chromium.android_webview.AwContents; +import org.chromium.android_webview.common.Lifetime; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.NativeMethods; @@ -22,6 +23,7 @@ * the render node hierarchy. */ @JNINamespace("android_webview") +@Lifetime.WebView public class AwGLFunctor implements AwFunctor { private final long mNativeAwGLFunctor; private final AwContents.NativeDrawGLFunctor mNativeDrawGLFunctor;
diff --git a/android_webview/java/src/org/chromium/android_webview/gfx/RootBeginFrameSourceWebView.java b/android_webview/java/src/org/chromium/android_webview/gfx/RootBeginFrameSourceWebView.java index 1d8f78e..a47aba6 100644 --- a/android_webview/java/src/org/chromium/android_webview/gfx/RootBeginFrameSourceWebView.java +++ b/android_webview/java/src/org/chromium/android_webview/gfx/RootBeginFrameSourceWebView.java
@@ -4,6 +4,7 @@ package org.chromium.android_webview.gfx; +import org.chromium.android_webview.common.Lifetime; import org.chromium.base.ContextUtils; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; @@ -15,6 +16,7 @@ * Provides DisplayRefreshRate tracking for MainBeginFrameSourceWebView */ @JNINamespace("android_webview") +@Lifetime.Singleton public class RootBeginFrameSourceWebView implements DisplayAndroidObserver { private long mNativeRootBeginFrameSourceWebView; private final DisplayAndroid mDisplayAndroid; @@ -39,4 +41,4 @@ void onUpdateRefreshRate(long nativeRootBeginFrameSourceWebView, RootBeginFrameSourceWebView caller, float refreshRate); } -}; \ No newline at end of file +};
diff --git a/android_webview/java/src/org/chromium/android_webview/metrics/AwOriginVisitLogger.java b/android_webview/java/src/org/chromium/android_webview/metrics/AwOriginVisitLogger.java index 073c4304..8028ab3 100644 --- a/android_webview/java/src/org/chromium/android_webview/metrics/AwOriginVisitLogger.java +++ b/android_webview/java/src/org/chromium/android_webview/metrics/AwOriginVisitLogger.java
@@ -9,6 +9,7 @@ import androidx.annotation.WorkerThread; +import org.chromium.android_webview.common.Lifetime; import org.chromium.base.ContextUtils; import org.chromium.base.StrictModeContext; import org.chromium.base.TimeUtils; @@ -24,6 +25,7 @@ /** * Stores visited origins and logs the count of distinct origins for a day. */ +@Lifetime.Singleton public final class AwOriginVisitLogger { private static final String PREFS_FILE = "AwOriginVisitLoggerPrefs"; private static final String KEY_ORIGINS_VISITED_DATE = "origins_visited_date";
diff --git a/android_webview/java/src/org/chromium/android_webview/metrics/AwSiteVisitLogger.java b/android_webview/java/src/org/chromium/android_webview/metrics/AwSiteVisitLogger.java index 63d4c816..7528dfb 100644 --- a/android_webview/java/src/org/chromium/android_webview/metrics/AwSiteVisitLogger.java +++ b/android_webview/java/src/org/chromium/android_webview/metrics/AwSiteVisitLogger.java
@@ -9,6 +9,7 @@ import androidx.annotation.WorkerThread; +import org.chromium.android_webview.common.Lifetime; import org.chromium.base.ContextUtils; import org.chromium.base.StrictModeContext; import org.chromium.base.TimeUtils; @@ -21,6 +22,7 @@ /** * Stores visited sites and logs the count of distinct visits over a week. */ +@Lifetime.Singleton public final class AwSiteVisitLogger { // This uses the same file name as {@link AwOriginVisitLogger} so that // only one shared preference XML file needs to be opened on navigation.
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientFullScreenTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientFullScreenTest.java index 49e5d01..6ebe36f 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientFullScreenTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientFullScreenTest.java
@@ -77,7 +77,6 @@ @Feature({"AndroidWebView"}) @DisableHardwareAccelerationForTest @Test - @DisabledTest(message = "crbug.com/618749") // turning this on as an experiment. public void testFullscreenVideoInSoftwareModeDoesNotDeadlock() throws Throwable { // Although fullscreen video is not supported without hardware acceleration // we should not deadlock if apps try to use it. @@ -101,7 +100,6 @@ @MediumTest @Feature({"AndroidWebView"}) @Test - @DisabledTest(message = "crbug.com/618749") public void testOnShowAndHideCustomViewWithCallback_video() throws Throwable { doTestOnShowAndHideCustomViewWithCallback(VIDEO_TEST_URL); } @@ -109,7 +107,6 @@ @MediumTest @Feature({"AndroidWebView"}) @Test - @DisabledTest(message = "crbug.com/618749") public void testOnShowAndHideCustomViewWithCallback_videoInsideDiv() throws Throwable { doTestOnShowAndHideCustomViewWithCallback(VIDEO_INSIDE_DIV_TEST_URL); } @@ -122,7 +119,6 @@ @MediumTest @Feature({"AndroidWebView"}) @Test - @DisabledTest(message = "crbug.com/618749") public void testOnShowAndHideCustomViewWithJavascript_video() throws Throwable { doTestOnShowAndHideCustomViewWithJavascript(VIDEO_TEST_URL); } @@ -130,7 +126,6 @@ @MediumTest @Feature({"AndroidWebView"}) @Test - @DisabledTest(message = "crbug.com/618749") public void testOnShowAndHideCustomViewWithJavascript_videoInsideDiv() throws Throwable { doTestOnShowAndHideCustomViewWithJavascript(VIDEO_INSIDE_DIV_TEST_URL); } @@ -144,7 +139,6 @@ @Feature({"AndroidWebView"}) @Test // Originally flaked only in multi-process mode (http://crbug.com/616501) - @DisabledTest(message = "crbug.com/618749") public void testOnShowAndHideCustomViewWithBackKey_video() throws Throwable { doTestOnShowAndHideCustomViewWithBackKey(VIDEO_TEST_URL); } @@ -152,7 +146,6 @@ @MediumTest @Feature({"AndroidWebView"}) @Test - @DisabledTest(message = "crbug.com/618749") public void testOnShowAndHideCustomViewWithBackKey_videoInsideDiv() throws Throwable { doTestOnShowAndHideCustomViewWithBackKey(VIDEO_INSIDE_DIV_TEST_URL); }
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java index 5284d1fa..8970b88 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java
@@ -3047,7 +3047,6 @@ @Test @SmallTest @Feature({"AndroidWebView", "Preferences"}) - @DisabledTest(message = "https://crbug.com/1133535") public void testUseWideViewportLayoutWidth() throws Throwable { TestAwContentsClient contentClient = new TestAwContentsClient(); AwTestContainerView testContainerView = @@ -3058,7 +3057,6 @@ @Test @SmallTest @Feature({"AndroidWebView", "Preferences"}) - @DisabledTest(message = "https://crbug.com/1133535") public void testUseWideViewportLayoutWidthNoQuirks() throws Throwable { TestAwContentsClient contentClient = new TestAwContentsClient(); AwTestContainerView testContainerView =
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/KeySystemTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/KeySystemTest.java index 6942e820..d2a70e5e 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/KeySystemTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/KeySystemTest.java
@@ -15,7 +15,6 @@ import org.chromium.android_webview.AwContents; import org.chromium.android_webview.permission.AwPermissionRequest; import org.chromium.android_webview.permission.Resource; -import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; /** @@ -112,7 +111,6 @@ @Test @Feature({"AndroidWebView"}) @SmallTest - @DisabledTest(message = "https://crbug.com/701916") public void testSupportWidevineKeySystem() throws Throwable { Assert.assertEquals( getPlatformKeySystemExpectations(), isKeySystemSupported("com.widevine.alpha")); @@ -128,7 +126,6 @@ @Test @Feature({"AndroidWebView"}) @SmallTest - @DisabledTest(message = "https://crbug.com/701916") public void testSupportPlatformKeySystem() throws Throwable { Assert.assertEquals(getPlatformKeySystemExpectations(), isKeySystemSupported("x-com.oem.test-keysystem"));
diff --git a/android_webview/tools/system_webview_shell/layout_tests/src/org/chromium/webview_shell/test/WebViewLayoutTest.java b/android_webview/tools/system_webview_shell/layout_tests/src/org/chromium/webview_shell/test/WebViewLayoutTest.java index 1d25665..b2822ea4 100644 --- a/android_webview/tools/system_webview_shell/layout_tests/src/org/chromium/webview_shell/test/WebViewLayoutTest.java +++ b/android_webview/tools/system_webview_shell/layout_tests/src/org/chromium/webview_shell/test/WebViewLayoutTest.java
@@ -353,7 +353,6 @@ @Test @MediumTest @CommandLineFlags.Add("use-fake-device-for-media-stream") - @DisabledTest(message = "https://crbug.com/1368439") public void testMediaStreamApiDenyPermission() throws Exception { runWebViewLayoutTest("blink-apis/webrtc/mediastream-permission-denied-callbacks.html", "blink-apis/webrtc/mediastream-permission-denied-callbacks-expected.txt"); @@ -362,7 +361,6 @@ @Test @MediumTest @CommandLineFlags.Add("use-fake-device-for-media-stream") - @DisabledTest(message = "https://crbug.com/1368439") public void testMediaStreamApi() throws Exception { mTestActivity.setGrantPermission(true); runWebViewLayoutTest("blink-apis/webrtc/mediastream-callbacks.html",
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index 1c762a25..97a1f5c 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -1409,6 +1409,8 @@ "system/holding_space/suggestions_section.h", "system/hotspot/hotspot_detailed_view.cc", "system/hotspot/hotspot_detailed_view.h", + "system/hotspot/hotspot_detailed_view_controller.cc", + "system/hotspot/hotspot_detailed_view_controller.h", "system/hotspot/hotspot_feature_pod_controller.cc", "system/hotspot/hotspot_feature_pod_controller.h", "system/hotspot/hotspot_info_cache.cc", @@ -2043,6 +2045,8 @@ "system/unified/feature_tiles_container_view.h", "system/unified/glanceable_tray_bubble.cc", "system/unified/glanceable_tray_bubble.h", + "system/unified/glanceable_tray_bubble_view.cc", + "system/unified/glanceable_tray_bubble_view.h", "system/unified/ime_mode_view.cc", "system/unified/ime_mode_view.h", "system/unified/managed_device_tray_item_view.cc", @@ -2071,6 +2075,10 @@ "system/unified/quiet_mode_feature_pod_controller.h", "system/unified/screen_capture_tray_item_view.cc", "system/unified/screen_capture_tray_item_view.h", + "system/unified/tasks_bubble_view.cc", + "system/unified/tasks_bubble_view.h", + "system/unified/tasks_combobox_model.cc", + "system/unified/tasks_combobox_model.h", "system/unified/top_shortcuts_view.cc", "system/unified/top_shortcuts_view.h", "system/unified/unified_notifier_settings_controller.cc", @@ -2996,6 +3004,7 @@ "child_accounts/parent_access_controller_impl_unittest.cc", "clipboard/clipboard_history_controller_unittest.cc", "clipboard/clipboard_history_item_unittest.cc", + "clipboard/clipboard_history_menu_model_adapter_unittest.cc", "clipboard/clipboard_history_resource_manager_unittest.cc", "clipboard/clipboard_history_unittest.cc", "clipboard/clipboard_history_util_unittest.cc", @@ -3259,6 +3268,7 @@ "system/holding_space/test_holding_space_item_views_section.h", "system/holding_space/test_holding_space_tray_child_bubble.cc", "system/holding_space/test_holding_space_tray_child_bubble.h", + "system/hotspot/hotspot_detailed_view_controller_unittest.cc", "system/hotspot/hotspot_detailed_view_unittest.cc", "system/hotspot/hotspot_feature_pod_controller_unittest.cc", "system/hotspot/hotspot_info_cache_unittest.cc", @@ -3462,6 +3472,7 @@ "user_education/user_education_help_bubble_controller_unittest.cc", "user_education/user_education_ping_controller_unittest.cc", "user_education/user_education_util_unittest.cc", + "user_education/views/help_bubble_view_ash_unittest.cc", "user_education/welcome_tour/welcome_tour_controller_unittest.cc", "utility/cropping_util_unittest.cc", "utility/haptics_util_unittest.cc", @@ -3990,6 +4001,8 @@ "frame_throttler/mock_frame_throttling_observer.h", "game_dashboard/test_game_dashboard_delegate.cc", "game_dashboard/test_game_dashboard_delegate.h", + "glanceables/tasks/fake_glanceables_tasks_client.cc", + "glanceables/tasks/fake_glanceables_tasks_client.h", "glanceables/test_glanceables_delegate.cc", "glanceables/test_glanceables_delegate.h", "ime/test_ime_controller_client.cc",
diff --git a/ash/app_list/views/app_list_bubble_view_unittest.cc b/ash/app_list/views/app_list_bubble_view_unittest.cc index 4e290206..c6e704a 100644 --- a/ash/app_list/views/app_list_bubble_view_unittest.cc +++ b/ash/app_list/views/app_list_bubble_view_unittest.cc
@@ -29,6 +29,7 @@ #include "ash/app_list/views/scrollable_apps_grid_view.h" #include "ash/app_list/views/search_box_view.h" #include "ash/assistant/model/assistant_ui_model.h" +#include "ash/constants/ash_features.h" #include "ash/controls/gradient_layer_delegate.h" #include "ash/controls/scroll_view_gradient_helper.h" #include "ash/drag_drop/drag_drop_controller.h" @@ -39,6 +40,7 @@ #include "ash/public/cpp/test/shell_test_api.h" #include "ash/shell.h" #include "ash/style/ash_color_provider.h" +#include "ash/system/notification_center/notification_center_tray.h" #include "ash/system/tray/tray_constants.h" #include "ash/system/unified/unified_system_tray.h" #include "ash/test/ash_test_base.h" @@ -629,49 +631,6 @@ EXPECT_EQ(u"", search_box_input->GetText()); } -// Regression test for https://crbug.com/1313140 -TEST_F(AppListBubbleViewTest, CanOpenMessageCenterWithKeyboardShortcut) { - // Add a notification so there's something to focus in the message center. - auto notification = std::make_unique<message_center::Notification>( - message_center::NOTIFICATION_TYPE_SIMPLE, "id", u"Title", u"Message", - ui::ImageModel(), /*display_source=*/std::u16string(), GURL(), - message_center::NotifierId(), message_center::RichNotificationData(), - /*delegate=*/nullptr); - message_center::MessageCenter::Get()->AddNotification( - std::move(notification)); - - // Message center starts closed. - auto* system_tray = GetPrimaryUnifiedSystemTray(); - ASSERT_FALSE(system_tray->IsMessageCenterBubbleShown()); - - // Open the launcher and do a search. - AddAppItems(1); - ShowAppList(); - PressAndReleaseKey(ui::VKEY_A); - - // Search box has focus. - views::Textfield* search_box_input = GetSearchBoxView()->search_box(); - ASSERT_TRUE(search_box_input->HasFocus()); - - // Enable animations. - ui::ScopedAnimationDurationScaleMode duration( - ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION); - - // Move focus to the message center notification area with Alt-Shift-N. The - // message center will open and the app list will dismiss. - PressAndReleaseKey(ui::VKEY_N, ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN); - - // Wait for the app list hide animation to finish. - AppListBubbleView* view = GetBubblePresenter()->bubble_view_for_test(); - ui::LayerAnimationStoppedWaiter().Wait(view->layer()); - - // Search box did not steal focus. - EXPECT_FALSE(search_box_input->HasFocus()); - - // Message center is still open. - EXPECT_TRUE(system_tray->IsMessageCenterBubbleShown()); -} - TEST_F(AppListBubbleViewTest, SearchBoxTextUsesPrimaryTextColor) { ShowAppList(); @@ -1686,5 +1645,78 @@ GetAppListTestHelper()->GetBubbleView()->current_page_for_test()); } +class AppListBubbleViewWithQsRevampTest + : public AppListBubbleViewTest, + public testing::WithParamInterface<bool> { + public: + void SetUp() override { + scoped_feature_list_.InitWithFeatureState(features::kQsRevamp, + IsQsRevampEnabled()); + + AshTestBase::SetUp(); + } + + bool IsNotificationBubbleShown() { + return features::IsQsRevampEnabled() + ? GetPrimaryShelf() + ->GetStatusAreaWidget() + ->notification_center_tray() + ->IsBubbleShown() + : GetPrimaryUnifiedSystemTray()->IsMessageCenterBubbleShown(); + } + + bool IsQsRevampEnabled() { return GetParam(); } + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +INSTANTIATE_TEST_SUITE_P(All, + AppListBubbleViewWithQsRevampTest, + testing::Bool()); + +// Regression test for https://crbug.com/1313140 +TEST_P(AppListBubbleViewWithQsRevampTest, + CanOpenMessageCenterWithKeyboardShortcut) { + // Add a notification so there's something to focus in the message center. + auto notification = std::make_unique<message_center::Notification>( + message_center::NOTIFICATION_TYPE_SIMPLE, "id", u"Title", u"Message", + ui::ImageModel(), /*display_source=*/std::u16string(), GURL(), + message_center::NotifierId(), message_center::RichNotificationData(), + /*delegate=*/nullptr); + message_center::MessageCenter::Get()->AddNotification( + std::move(notification)); + + // Message center starts closed. + ASSERT_FALSE(IsNotificationBubbleShown()); + + // Open the launcher and do a search. + AddAppItems(1); + ShowAppList(); + PressAndReleaseKey(ui::VKEY_A); + + // Search box has focus. + views::Textfield* search_box_input = GetSearchBoxView()->search_box(); + ASSERT_TRUE(search_box_input->HasFocus()); + + // Enable animations. + ui::ScopedAnimationDurationScaleMode duration( + ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION); + + // Move focus to the message center notification area with Alt-Shift-N. The + // message center will open and the app list will dismiss. + PressAndReleaseKey(ui::VKEY_N, ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN); + + // Wait for the app list hide animation to finish. + AppListBubbleView* view = GetBubblePresenter()->bubble_view_for_test(); + ui::LayerAnimationStoppedWaiter().Wait(view->layer()); + + // Search box did not steal focus. + EXPECT_FALSE(search_box_input->HasFocus()); + + // Message center is still open. + EXPECT_TRUE(IsNotificationBubbleShown()); +} + } // namespace } // namespace ash
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd index f1d4785..382b2b8 100644 --- a/ash/ash_strings.grd +++ b/ash/ash_strings.grd
@@ -303,6 +303,9 @@ <message name="IDS_ASH_QUICK_SETTINGS_BUBBLE_CAST_SETTINGS_ACCESSIBLE_DESCRIPTION" desc="The accessible description for cast settings accessed through the cast feature pod."> Cast Settings </message> + <message name="IDS_ASH_QUICK_SETTINGS_BUBBLE_HOTSPOT_SETTINGS_ACCESSIBLE_DESCRIPTION" desc="The accessible description for hotspot settings accessed through the hotspot feature pod."> + Hotspot Settings + </message> <message name="IDS_ASH_QUICK_SETTINGS_BUBBLE_IME_SETTINGS_ACCESSIBLE_DESCRIPTION" desc="The accessible description for IME settings accessed through the IME feature pod."> Input Methods Settings </message> @@ -4264,9 +4267,6 @@ <message name="IDS_ASH_LOGIN_SWITCH_TO_PIN" desc="Text to display on the button that is used for switching between PIN and password authentication"> Switch to PIN </message> - <message name="IDS_ASH_LOGIN_POD_PASSWORD_TAP_PLACEHOLDER" desc="Text to display as placeholder in the password field when the user can click/tap their profile picture to unlock."> - Tap your profile image - </message> <message name="IDS_ASH_LOGIN_ERROR_AUTHENTICATING" desc="Couldn't sign in because PIN or password is invalid"> Your PIN or password couldn't be verified. Try again. </message> @@ -4306,9 +4306,6 @@ <message name="IDS_ASH_LOGIN_POD_PASSWORD_FIELD_ACCESSIBLE_NAME" desc="Text to be spoken when the focus is set to the password field of a user pod on the sign-in screen."> Password for <ph name="USER_EMAIL_ADDRESS">$1<ex>john.doe@example.com</ex></ph> </message> - <message name="IDS_ASH_LOGIN_POD_AUTH_TAP_PASSWORD_FIELD_ACCESSIBLE_NAME" desc="Text to be spoken when the focus is set to the password field of a user pod on the sign-in screen, and authentication by tap is enabled."> - Press Enter to unlock for <ph name="USER_EMAIL_ADDRESS">$1<ex>john.doe@example.com</ex></ph> - </message> <message name="IDS_ASH_LOGIN_DISPLAY_PASSWORD_BUTTON_ACCESSIBLE_NAME_SHOW" desc="Text to be spoken when the focus is set to the display password button (in Show state) on login screen."> Show password </message> @@ -4399,24 +4396,9 @@ <message name="IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_AUTH_FAILED" desc="Text shown in the user pod to tell user that couldn't unlock because finger is not recognized"> Not recognized </message> - <message name="IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_PASSWORD_REQUIRED" desc="Text shown when fingerprint has been disabled because it has been too long since the user last used the device"> - Password required for more security - </message> - <message name="IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_PIN_OR_PASSWORD_REQUIRED" desc="Text shown when fingerprint has been disabled because it has been too long since the user last used the device"> - PIN or password required for more security - </message> - <message name="IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_DISABLED_FROM_ATTEMPTS_OLD" desc="Text shown in the user pod to tell user that fingerprint unlock has reached maximum attempt"> - Too many attempts - </message> <message name="IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_DISABLED_FROM_ATTEMPTS" desc="Label for the Fingerprint icon on user's lock screen after too many failed attempts to authenticate a fingerprint."> Too many fingerprint attempts </message> - <message name="IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_ACCESSIBLE_AUTH_SUCCESS" desc="Accessibility text read by chromevox when the user successfully authenticated with fingerprint on the lock screen"> - Unlocking with fingerprint - </message> - <message name="IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_ACCESSIBLE_AUTH_FAILED" desc="Accessibility text read by chromevox that the user's fingerprint authentication attempt was not successful"> - Fingerprint not recognized - </message> <message name="IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_ACCESSIBLE_AUTH_DISABLED_FROM_ATTEMPTS" desc="Accessibility text read by chromevox when the user has made too many unsuccessful fingerprint unlock attempts; fingerprint is now disabled until the user unlocks with a different authentication method"> Too many fingerprint attempts </message> @@ -5861,6 +5843,9 @@ </message> <!-- Multipaste --> + <message name="IDS_ASH_CLIPBOARD_HISTORY_CONTROL_V_LONGPRESS_FOOTER" desc="The message used to educate users about the clipboard history menu that shows when they hold down Ctrl+V."> + You’ll see the clipboard when you press and hold Ctrl + V. You can turn off this shortcut by disabling the #clipboard-history-longpress flag in chrome://flags (os://flags if using Lacros). + </message> <message name="IDS_ASH_MULTIPASTE_CONTEXTUAL_NUDGE" desc="The label used for the multipaste nudge, to be seen once the user copies and pastes multiple times in a short time span."> Press <ph name="SHORTCUT_KEY_NAME">$1<ex>Launcher</ex></ph> + V to view your clipboard. The last 5 items you've copied are saved to your clipboard. </message>
diff --git a/ash/ash_strings_grd/IDS_ASH_CLIPBOARD_HISTORY_CONTROL_V_LONGPRESS_FOOTER.png.sha1 b/ash/ash_strings_grd/IDS_ASH_CLIPBOARD_HISTORY_CONTROL_V_LONGPRESS_FOOTER.png.sha1 new file mode 100644 index 0000000..403b837 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_CLIPBOARD_HISTORY_CONTROL_V_LONGPRESS_FOOTER.png.sha1
@@ -0,0 +1 @@ +a0e4cd5c7fddca027bc99748023f40a175549a36 \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_DISABLED_FROM_ATTEMPTS_OLD.png.sha1 b/ash/ash_strings_grd/IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_DISABLED_FROM_ATTEMPTS_OLD.png.sha1 deleted file mode 100644 index 4558338e..0000000 --- a/ash/ash_strings_grd/IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_DISABLED_FROM_ATTEMPTS_OLD.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -8d9e7b62efed878aaea4d62b0f9f04992f861dca \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_PASSWORD_REQUIRED.png.sha1 b/ash/ash_strings_grd/IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_PASSWORD_REQUIRED.png.sha1 deleted file mode 100644 index 5c5fe83a6..0000000 --- a/ash/ash_strings_grd/IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_PASSWORD_REQUIRED.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -1f24efdc8738ecbbbcfb91883a4468f827b706a3 \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_PIN_OR_PASSWORD_REQUIRED.png.sha1 b/ash/ash_strings_grd/IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_PIN_OR_PASSWORD_REQUIRED.png.sha1 deleted file mode 100644 index d635af4..0000000 --- a/ash/ash_strings_grd/IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_PIN_OR_PASSWORD_REQUIRED.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -9be91ca2a5e9f63c32afd4c6b1f1a30db9f346f3 \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_QUICK_SETTINGS_BUBBLE_HOTSPOT_SETTINGS_ACCESSIBLE_DESCRIPTION.png.sha1 b/ash/ash_strings_grd/IDS_ASH_QUICK_SETTINGS_BUBBLE_HOTSPOT_SETTINGS_ACCESSIBLE_DESCRIPTION.png.sha1 new file mode 100644 index 0000000..2919b63 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_QUICK_SETTINGS_BUBBLE_HOTSPOT_SETTINGS_ACCESSIBLE_DESCRIPTION.png.sha1
@@ -0,0 +1 @@ +204f78dd7977206c211fc06221f9a7a8af0ecffe \ No newline at end of file
diff --git a/ash/clipboard/clipboard_history_controller_impl.cc b/ash/clipboard/clipboard_history_controller_impl.cc index 538b7f8..2c9e8dc5 100644 --- a/ash/clipboard/clipboard_history_controller_impl.cc +++ b/ash/clipboard/clipboard_history_controller_impl.cc
@@ -430,7 +430,7 @@ base::BindRepeating(&ClipboardHistoryControllerImpl::OnMenuClosed, base::Unretained(this)), clipboard_history_.get()); - context_menu_->Run(anchor_rect, source_type); + context_menu_->Run(anchor_rect, source_type, show_source); DCHECK(IsMenuShowing()); accelerator_target_->OnMenuShown();
diff --git a/ash/clipboard/clipboard_history_menu_model_adapter.cc b/ash/clipboard/clipboard_history_menu_model_adapter.cc index a034788..7d24653 100644 --- a/ash/clipboard/clipboard_history_menu_model_adapter.cc +++ b/ash/clipboard/clipboard_history_menu_model_adapter.cc
@@ -4,32 +4,86 @@ #include "ash/clipboard/clipboard_history_menu_model_adapter.h" +#include <string> + +#include "ash/bubble/bubble_utils.h" #include "ash/clipboard/clipboard_history.h" #include "ash/clipboard/clipboard_history_util.h" #include "ash/clipboard/views/clipboard_history_item_view.h" +#include "ash/clipboard/views/clipboard_history_label.h" +#include "ash/clipboard/views/clipboard_history_view_constants.h" +#include "ash/constants/ash_features.h" #include "ash/public/cpp/clipboard_history_controller.h" #include "ash/public/cpp/clipboard_image_model_factory.h" +#include "ash/strings/grit/ash_strings.h" +#include "ash/style/typography.h" #include "ash/wm/window_util.h" +#include "base/check.h" #include "base/functional/bind.h" #include "base/memory/raw_ptr.h" #include "base/metrics/histogram_macros.h" #include "base/ranges/algorithm.h" +#include "base/strings/string_util.h" #include "base/task/sequenced_task_runner.h" #include "ui/accessibility/ax_enums.mojom.h" #include "ui/base/l10n/l10n_util.h" +#include "ui/base/models/menu_model.h" #include "ui/base/models/simple_menu_model.h" #include "ui/base/ui_base_types.h" +#include "ui/chromeos/styles/cros_tokens_color_mappings.h" #include "ui/gfx/geometry/rect.h" #include "ui/strings/grit/ui_strings.h" #include "ui/views/accessibility/view_accessibility.h" +#include "ui/views/border.h" #include "ui/views/controls/menu/menu_item_view.h" +#include "ui/views/controls/menu/menu_model_adapter.h" #include "ui/views/controls/menu/menu_runner.h" #include "ui/views/controls/menu/menu_types.h" #include "ui/views/controls/menu/submenu_view.h" +#include "ui/views/controls/separator.h" +#include "ui/views/layout/box_layout.h" +#include "ui/views/layout/box_layout_view.h" #include "ui/views/widget/widget.h" namespace ash { +namespace { + +// Populates `container` with a separator and a label containing educational +// content to appear at the bottom of the clipboard history menu. +void InsertFooterContent(views::MenuItemView* container) { + const int content_width = + clipboard_history_util::GetPreferredItemViewWidth() - + ClipboardHistoryViews::kContentsInsets.width(); + + // Introduce a layout view between `container` and the desired separator and + // label to circumvent `container` manually laying out its children. + container->AddChildView( + views::Builder<views::BoxLayoutView>() + .SetOrientation(views::BoxLayout::Orientation::kVertical) + .AddChildren( + views::Builder<views::Separator>() + .SetBorder(views::CreateEmptyBorder( + ClipboardHistoryViews::kContentsInsets)) + .SetColorId(cros_tokens::kCrosSysSeparator) + .SetOrientation(views::Separator::Orientation::kHorizontal) + .SetPreferredLength(content_width), + views::Builder<views::Label>( + bubble_utils::CreateLabel( + TypographyToken::kCrosAnnotation1, + l10n_util::GetStringUTF16( + IDS_ASH_CLIPBOARD_HISTORY_CONTROL_V_LONGPRESS_FOOTER), + cros_tokens::kCrosSysSecondary)) + .SetBorder(views::CreateEmptyBorder( + ClipboardHistoryViews::kContentsInsets)) + .SetHorizontalAlignment(gfx::ALIGN_LEFT) + .SetMultiLine(true) + .SizeToFit(/*fixed_width=*/content_width)) + .Build()); +} + +} // namespace + // ClipboardHistoryMenuModelAdapter::MenuModelWithWillCloseCallback ------------ // Utility class that allows `ClipboardHistoryMenuModelAdapter` to run a task @@ -104,7 +158,8 @@ void ClipboardHistoryMenuModelAdapter::Run( const gfx::Rect& anchor_rect, - ui::MenuSourceType source_type) { + ui::MenuSourceType source_type, + crosapi::mojom::ClipboardHistoryControllerShowSource show_source) { DCHECK(!root_view_); DCHECK(model_); DCHECK(item_snapshots_.empty()); @@ -131,6 +186,14 @@ ++command_id; } + if (show_source == crosapi::mojom::ClipboardHistoryControllerShowSource:: + kControlVLongpress) { + // Add placeholder non-interactive item that will contain a separator + // (styled differently from the context menu separators) and educational + // footer text. + model_->AddTitle(std::u16string()); + } + // Start async rendering of HTML, if any exists. // This factory may be nullptr in tests. if (auto* clipboard_image_factory = ClipboardImageModelFactory::Get()) { @@ -145,7 +208,7 @@ views::MenuRunner::USE_ASH_SYS_UI_LAYOUT | views::MenuRunner::FIXED_ANCHOR); menu_runner_->RunMenuAt( - /*widget_owner=*/nullptr, /*menu_button_controller=*/nullptr, anchor_rect, + /*parent=*/nullptr, /*button_controller=*/nullptr, anchor_rect, views::MenuAnchorPosition::kBubbleBottomRight, source_type); } @@ -321,6 +384,11 @@ ->GetMenuItemViewAtForTest(index)); } +const ui::SimpleMenuModel* ClipboardHistoryMenuModelAdapter::GetModelForTest() + const { + return model_.get(); +} + ClipboardHistoryMenuModelAdapter::ClipboardHistoryMenuModelAdapter( std::unique_ptr<MenuModelWithWillCloseCallback> model, base::RepeatingClosure menu_closed_callback, @@ -430,12 +498,21 @@ // Margins are managed by `ClipboardHistoryItemView`. container->SetMargins(/*top_margin=*/0, /*bottom_margin=*/0); - std::unique_ptr<ClipboardHistoryItemView> item_view = - ClipboardHistoryItemView::CreateFromClipboardHistoryItem( - GetItemFromCommandId(command_id).id(), clipboard_history_, container); - item_view->Init(); - item_views_by_command_id_.insert(std::make_pair(command_id, item_view.get())); - container->AddChildView(std::move(item_view)); + size_t num_items = clipboard_history_->GetItems().size(); + if (index < num_items) { + std::unique_ptr<ClipboardHistoryItemView> item_view = + ClipboardHistoryItemView::CreateFromClipboardHistoryItem( + GetItemFromCommandId(command_id).id(), clipboard_history_, + container); + item_view->Init(); + item_views_by_command_id_.insert( + std::make_pair(command_id, item_view.get())); + container->AddChildView(std::move(item_view)); + } else { + CHECK_EQ(index, num_items); + CHECK_EQ(model->GetTypeAt(index), ui::MenuModel::ItemType::TYPE_TITLE); + InsertFooterContent(container); + } return container; }
diff --git a/ash/clipboard/clipboard_history_menu_model_adapter.h b/ash/clipboard/clipboard_history_menu_model_adapter.h index f32bcab5d..76dc06d0 100644 --- a/ash/clipboard/clipboard_history_menu_model_adapter.h +++ b/ash/clipboard/clipboard_history_menu_model_adapter.h
@@ -11,6 +11,7 @@ #include "ash/public/cpp/clipboard_history_controller.h" #include "base/memory/raw_ptr.h" #include "base/time/time.h" +#include "chromeos/crosapi/mojom/clipboard_history.mojom.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/base/models/simple_menu_model.h" #include "ui/views/controls/menu/menu_model_adapter.h" @@ -52,10 +53,11 @@ const ClipboardHistoryMenuModelAdapter&) = delete; ~ClipboardHistoryMenuModelAdapter() override; - // Shows the menu anchored at `anchor_rect`, `source_type` indicates how the - // menu is triggered. + // Shows the menu anchored at `anchor_rect`. `source_type` and `show_source` + // indicate how the menu was triggered. void Run(const gfx::Rect& anchor_rect, - ui::MenuSourceType source_type); + ui::MenuSourceType source_type, + crosapi::mojom::ClipboardHistoryControllerShowSource show_source); // Returns if the menu is currently running. bool IsRunning() const; @@ -95,6 +97,8 @@ const views::MenuItemView* GetMenuItemViewAtForTest(size_t index) const; views::MenuItemView* GetMenuItemViewAtForTest(size_t index); + const ui::SimpleMenuModel* GetModelForTest() const; + private: class MenuModelWithWillCloseCallback; class ScopedA11yIgnore;
diff --git a/ash/clipboard/clipboard_history_menu_model_adapter_unittest.cc b/ash/clipboard/clipboard_history_menu_model_adapter_unittest.cc new file mode 100644 index 0000000..f7151bf --- /dev/null +++ b/ash/clipboard/clipboard_history_menu_model_adapter_unittest.cc
@@ -0,0 +1,98 @@ +// 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/clipboard/clipboard_history_menu_model_adapter.h" + +#include "ash/clipboard/clipboard_history.h" +#include "ash/clipboard/clipboard_history_controller_impl.h" +#include "ash/shell.h" +#include "ash/test/ash_test_base.h" +#include "base/test/repeating_test_future.h" +#include "chromeos/crosapi/mojom/clipboard_history.mojom.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/base/clipboard/scoped_clipboard_writer.h" +#include "ui/base/models/simple_menu_model.h" + +namespace ash { +using crosapi::mojom::ClipboardHistoryControllerShowSource; + +namespace { + +ClipboardHistoryControllerImpl* GetClipboardHistoryController() { + return Shell::Get()->clipboard_history_controller(); +} + +std::vector<ClipboardHistoryControllerShowSource> +GetClipboardHistoryShowSources() { + std::vector<ClipboardHistoryControllerShowSource> sources; + for (int i = + static_cast<int>(ClipboardHistoryControllerShowSource::kMinValue); + i <= static_cast<int>(ClipboardHistoryControllerShowSource::kMaxValue); + ++i) { + sources.push_back(static_cast<ClipboardHistoryControllerShowSource>(i)); + } + return sources; +} + +} // namespace + +// Base class for `ClipboardHistoryMenuModelAdapter` tests that run with each +// possible `ClipboardHistoryControllerShowSource`. +class ClipboardHistoryMenuModelAdapterShowSourceTest + : public AshTestBase, + public testing::WithParamInterface<ClipboardHistoryControllerShowSource> { + public: + // AshTestBase: + void SetUp() override { + AshTestBase::SetUp(); + GetClipboardHistoryController()->set_confirmed_operation_callback_for_test( + operation_confirmed_future_.GetCallback()); + } + + void WriteTextToClipboardAndConfirm(const std::u16string& str) { + { + ui::ScopedClipboardWriter scw(ui::ClipboardBuffer::kCopyPaste); + scw.WriteText(str); + } + EXPECT_TRUE(operation_confirmed_future_.Take()); + } + + ClipboardHistoryControllerShowSource GetSource() const { return GetParam(); } + + private: + base::test::RepeatingTestFuture<bool> operation_confirmed_future_; +}; + +INSTANTIATE_TEST_SUITE_P(All, + ClipboardHistoryMenuModelAdapterShowSourceTest, + testing::ValuesIn(GetClipboardHistoryShowSources())); + +// Verifies that the clipboard history menu has an educational footer iff it was +// shown by the Ctrl+V long-press shortcut. +TEST_P(ClipboardHistoryMenuModelAdapterShowSourceTest, + ControlVLongpressShowsFooter) { + // Write items to clipboard history so that the menu can show. + WriteTextToClipboardAndConfirm(u"A"); + WriteTextToClipboardAndConfirm(u"B"); + + // Show the clipboard history menu. + auto* controller = GetClipboardHistoryController(); + EXPECT_TRUE(controller->ShowMenu( + gfx::Rect(), ui::MenuSourceType::MENU_SOURCE_NONE, GetSource())); + EXPECT_TRUE(controller->IsMenuShowing()); + + // Verify that iff the menu was shown via Ctrl+V long-press, the menu has an + // educational footer item; otherwise, the number of items in the menu should + // match the number of items in clipboard history. + const auto* model = controller->context_menu_for_test()->GetModelForTest(); + EXPECT_EQ(controller->history()->GetItems().size(), 2u); + if (GetSource() == ClipboardHistoryControllerShowSource::kControlVLongpress) { + ASSERT_EQ(model->GetItemCount(), 3u); + EXPECT_EQ(model->GetTypeAt(2u), ui::MenuModel::ItemType::TYPE_TITLE); + } else { + EXPECT_EQ(model->GetItemCount(), 2u); + } +} + +} // namespace ash
diff --git a/ash/clipboard/clipboard_history_util.cc b/ash/clipboard/clipboard_history_util.cc index d543c581..0f945978 100644 --- a/ash/clipboard/clipboard_history_util.cc +++ b/ash/clipboard/clipboard_history_util.cc
@@ -24,6 +24,7 @@ #include "ui/gfx/canvas.h" #include "ui/gfx/image/canvas_image_source.h" #include "ui/gfx/paint_vector_icon.h" +#include "ui/views/controls/menu/menu_config.h" namespace ash::clipboard_history_util { @@ -250,4 +251,8 @@ return item_descriptors; } +int GetPreferredItemViewWidth() { + return views::MenuConfig::instance().touchable_menu_min_width; +} + } // namespace ash::clipboard_history_util
diff --git a/ash/clipboard/clipboard_history_util.h b/ash/clipboard/clipboard_history_util.h index fb6346c..52b24ce0 100644 --- a/ash/clipboard/clipboard_history_util.h +++ b/ash/clipboard/clipboard_history_util.h
@@ -161,6 +161,9 @@ std::vector<crosapi::mojom::ClipboardHistoryItemDescriptor> GetItemDescriptorsFrom(const std::list<ClipboardHistoryItem>& items); +// Calculates the preferred width for clipboard history menu item views. +int GetPreferredItemViewWidth(); + } // namespace clipboard_history_util } // namespace ash
diff --git a/ash/clipboard/views/clipboard_history_item_view.cc b/ash/clipboard/views/clipboard_history_item_view.cc index 96b23b1..f61e00d 100644 --- a/ash/clipboard/views/clipboard_history_item_view.cc +++ b/ash/clipboard/views/clipboard_history_item_view.cc
@@ -25,7 +25,6 @@ #include "ui/views/accessibility/view_accessibility.h" #include "ui/views/animation/ink_drop.h" #include "ui/views/border.h" -#include "ui/views/controls/menu/menu_config.h" #include "ui/views/controls/menu/menu_item_view.h" #include "ui/views/layout/fill_layout.h" @@ -270,7 +269,7 @@ gfx::Size ClipboardHistoryItemView::CalculatePreferredSize() const { const int preferred_width = - views::MenuConfig::instance().touchable_menu_min_width; + clipboard_history_util::GetPreferredItemViewWidth(); return gfx::Size(preferred_width, GetHeightForWidth(preferred_width)); }
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc index 44698ff..737672d 100644 --- a/ash/constants/ash_features.cc +++ b/ash/constants/ash_features.cc
@@ -1610,6 +1610,11 @@ "OobeDrivePinning", base::FEATURE_DISABLED_BY_DEFAULT); +// If enabled, Consumer Software Screen will be shown during OOBE. +BASE_FEATURE(kOobeSoftwareUpdate, + "OobeSoftwareUpdate", + base::FEATURE_DISABLED_BY_DEFAULT); + // Enables the Gaia info screen in OOBE. BASE_FEATURE(kOobeGaiaInfoScreen, "OobeGaiaInfoScreen", @@ -3203,6 +3208,10 @@ IsOobeChoobeEnabled() && IsDriveFsBulkPinningEnabled(); } +bool IsOobeSoftwareUpdateEnabled() { + return base::FeatureList::IsEnabled(kOobeSoftwareUpdate); +} + bool IsOobeQuickStartEnabled() { return base::FeatureList::IsEnabled(kOobeQuickStart); }
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h index afc1cf4..a0240ff 100644 --- a/ash/constants/ash_features.h +++ b/ash/constants/ash_features.h
@@ -478,6 +478,7 @@ COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kOobeGaiaInfoScreen); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kOobeJelly); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kOobeSimon); +COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kOobeSoftwareUpdate); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kFeatureManagementOobeSimon); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kOobeSkipAssistant); @@ -865,6 +866,7 @@ COMPONENT_EXPORT(ASH_CONSTANTS) bool IsOobeJellyEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsOobeSimonEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsOobeSkipAssistantEnabled(); +COMPONENT_EXPORT(ASH_CONSTANTS) bool IsOobeSoftwareUpdateEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsKioskEnrollmentInOobeEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsKioskLoginScreenEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS)
diff --git a/ash/constants/ash_pref_names.cc b/ash/constants/ash_pref_names.cc index 7fa6aee0..a5359de 100644 --- a/ash/constants/ash_pref_names.cc +++ b/ash/constants/ash_pref_names.cc
@@ -1014,11 +1014,14 @@ // detection. const char kUserSpeakOnMuteDetectionEnabled[] = "ash.user.speak_on_mute_detection_enabled"; - -// A boolean pref indicating whether a user has opted-in the speak-on-mute -// detection. -const char kUserSpeakOnMuteDetectionOptIn[] = - "ash.user.speak_on_mute_detection_opt_in"; +// A boolean pref indicating whether a speak-on-mute detection opt-in nudge +// should be displayed to the user. +const char kShouldShowSpeakOnMuteOptInNudge[] = + "ash.user.should_show_speak_on_mute_opt_in_nudge"; +// An integer pref counting the number of times speak-on-mute detection opt-in +// nudge has been displayed to the user. +const char kSpeakOnMuteOptInNudgeShownCount[] = + "ash.user.speak_on_mute_opt_in_nudge_shown_count"; // A boolean pref indicating whether the geolocation is allowed for the user. const char kUserGeolocationAllowed[] = "ash.user.geolocation_allowed";
diff --git a/ash/constants/ash_pref_names.h b/ash/constants/ash_pref_names.h index d83d77d..c5b7ef2 100644 --- a/ash/constants/ash_pref_names.h +++ b/ash/constants/ash_pref_names.h
@@ -470,7 +470,9 @@ COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kUserSpeakOnMuteDetectionEnabled[]; COMPONENT_EXPORT(ASH_CONSTANTS) -extern const char kUserSpeakOnMuteDetectionOptIn[]; +extern const char kShouldShowSpeakOnMuteOptInNudge[]; +COMPONENT_EXPORT(ASH_CONSTANTS) +extern const char kSpeakOnMuteOptInNudgeShownCount[]; COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kUserGeolocationAllowed[]; COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kDeviceGeolocationAllowed[]; COMPONENT_EXPORT(ASH_CONSTANTS)
diff --git a/ash/constants/notifier_catalogs.h b/ash/constants/notifier_catalogs.h index a45e755..56686d02e 100644 --- a/ash/constants/notifier_catalogs.h +++ b/ash/constants/notifier_catalogs.h
@@ -253,17 +253,22 @@ kEcheTrayTabletModeNotSupported = 38, kNotificationCenterTrayNoNotifications = 39, kCopyToClipboardAction = 40, - kVideoConferenceTraySpeakOnMuteDetected = 41, + // [Deprecated] kVideoConferenceTraySpeakOnMuteDetected = 41, kCopyGifToClipboardAction = 42, - kVideoConferenceTrayUseWhileDisabled = 43, - kMaxValue = kVideoConferenceTrayUseWhileDisabled, + // [Deprecated] kVideoConferenceTrayUseWhileDisabled = 43, + kMaxValue = kCopyGifToClipboardAction }; // A living catalog that registers anchored nudges. // Current values should not be renumbered or removed. // TODO(b/280309972): Add metrics for AnchoredNudge catalog. // To deprecate comment out the entry. -enum class AnchoredNudgeCatalogName { kTest = 0, kMaxValue = kTest }; +enum class AnchoredNudgeCatalogName { + kTest = 0, + kVideoConferenceTraySpeakOnMuteDetected = 1, + kVideoConferenceTrayUseWhileDisabled = 2, + kMaxValue = kVideoConferenceTrayUseWhileDisabled +}; } // namespace ash
diff --git a/ash/game_dashboard/game_dashboard_controller.cc b/ash/game_dashboard/game_dashboard_controller.cc index 0b3b3790..720ea69 100644 --- a/ash/game_dashboard/game_dashboard_controller.cc +++ b/ash/game_dashboard/game_dashboard_controller.cc
@@ -7,6 +7,7 @@ #include <memory> #include <string> +#include "ash/capture_mode/capture_mode_controller.h" #include "ash/public/cpp/app_types_util.h" #include "ash/public/cpp/window_properties.h" #include "chromeos/ui/base/window_properties.h" @@ -33,11 +34,13 @@ g_instance = this; CHECK(aura::Env::HasInstance()); env_observation_.Observe(aura::Env::GetInstance()); + CaptureModeController::Get()->AddObserver(this); } GameDashboardController::~GameDashboardController() { - DCHECK_EQ(g_instance, this); + CHECK_EQ(g_instance, this); g_instance = nullptr; + CaptureModeController::Get()->RemoveObserver(this); } void GameDashboardController::OnWindowInitialized(aura::Window* new_window) { @@ -62,6 +65,29 @@ window_observations_.RemoveObservation(window); } +void GameDashboardController::OnRecordingStarted(aura::Window* current_root) { + // Update any needed game dashboard UIs if and only if this recording started + // from a request by a game dashboard entry point. +} + +void GameDashboardController::OnRecordingEnded() {} + +void GameDashboardController::OnVideoFileFinalized( + bool user_deleted_video_file, + const gfx::ImageSkia& thumbnail) {} + +void GameDashboardController::OnRecordedWindowChangingRoot( + aura::Window* new_root) { + // TODO(phshah): Update any game dashboard UIs that need to change as a result + // of the recorded window moving to a different display if and only if this + // recording started from a request by a game dashboard entry point. If + // nothing needs to change, leave empty. +} + +void GameDashboardController::OnRecordingStartAborted() { + // Reset the Gamedashboard UI state to its initial state. +} + GameDashboardController::WindowGameState GameDashboardController::GetWindowGameState(aura::Window* window) const { const auto* app_id = window->GetProperty(kAppIDKey);
diff --git a/ash/game_dashboard/game_dashboard_controller.h b/ash/game_dashboard/game_dashboard_controller.h index 4bce3507..b991f4c 100644 --- a/ash/game_dashboard/game_dashboard_controller.h +++ b/ash/game_dashboard/game_dashboard_controller.h
@@ -8,6 +8,7 @@ #include <memory> #include "ash/ash_export.h" +#include "ash/capture_mode/capture_mode_observer.h" #include "ash/game_dashboard/game_dashboard_delegate.h" #include "base/scoped_multi_source_observation.h" #include "base/scoped_observation.h" @@ -23,7 +24,8 @@ // Controls the Game Dashboard behavior on supported windows. class ASH_EXPORT GameDashboardController : public aura::EnvObserver, - public aura::WindowObserver { + public aura::WindowObserver, + public CaptureModeObserver { public: explicit GameDashboardController( std::unique_ptr<GameDashboardDelegate> delegate); @@ -43,6 +45,14 @@ intptr_t old) override; void OnWindowDestroying(aura::Window* window) override; + // CaptureModeObserver: + void OnRecordingStarted(aura::Window* current_root) override; + void OnRecordingEnded() override; + void OnVideoFileFinalized(bool user_deleted_video_file, + const gfx::ImageSkia& thumbnail) override; + void OnRecordedWindowChangingRoot(aura::Window* new_root) override; + void OnRecordingStartAborted() override; + private: enum class WindowGameState { kGame, kNotGame, kNotYetKnown };
diff --git a/ash/glanceables/tasks/fake_glanceables_tasks_client.cc b/ash/glanceables/tasks/fake_glanceables_tasks_client.cc new file mode 100644 index 0000000..d8b0867 --- /dev/null +++ b/ash/glanceables/tasks/fake_glanceables_tasks_client.cc
@@ -0,0 +1,72 @@ +// 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/glanceables/tasks/fake_glanceables_tasks_client.h" + +#include "ash/glanceables/tasks/glanceables_tasks_client.h" +#include "ash/glanceables/tasks/glanceables_tasks_types.h" +#include "base/functional/callback.h" + +namespace ash { + +FakeGlanceablesTasksClient::FakeGlanceablesTasksClient() { + PopulateTasks(); + PopulateTaskLists(); +} + +FakeGlanceablesTasksClient::~FakeGlanceablesTasksClient() = default; + +void FakeGlanceablesTasksClient::GetTaskLists(GetTaskListsCallback callback) { + std::move(callback).Run(task_lists_.get()); +} + +void FakeGlanceablesTasksClient::GetTasks(const std::string& task_list_id, + GetTasksCallback callback) { + auto iter = tasks_in_task_lists_.find(task_list_id); + CHECK(iter != tasks_in_task_lists_.end()); + std::move(callback).Run(iter->second.get()); +} + +void FakeGlanceablesTasksClient::MarkAsCompleted( + const std::string& task_list_id, + const std::string& task_id, + MarkAsCompletedCallback callback) { + // TODO(b:277268122): Add once UI is further along and ready to test. +} + +void FakeGlanceablesTasksClient::PopulateTasks() { + task_lists_ = std::make_unique<ui::ListModel<GlanceablesTaskList>>(); + + task_lists_->Add(std::make_unique<GlanceablesTaskList>( + "TaskListID1", "Task List 1 Title", base::Time::Now())); + task_lists_->Add(std::make_unique<GlanceablesTaskList>( + "TaskListID2", "Task List 2 Title", base::Time::Now())); +} + +void FakeGlanceablesTasksClient::PopulateTaskLists() { + std::unique_ptr<ui::ListModel<GlanceablesTask>> task_list_1 = + std::make_unique<ui::ListModel<GlanceablesTask>>(); + task_list_1->Add(std::make_unique<GlanceablesTask>( + "TaskListItem1", "Task List 1 Item 1 Title", /*completed=*/false, + /*due=*/base::Time::Now(), + /*has_subtasks=*/false, /*has_email_link=*/false)); + task_list_1->Add(std::make_unique<GlanceablesTask>( + "TaskListItem2", "Task List 1 Item 2 Title", /*completed=*/false, + /*due=*/base::Time::Now(), + /*has_subtasks=*/false, /*has_email_link=*/false)); + std::unique_ptr<ui::ListModel<GlanceablesTask>> task_list_2 = + std::make_unique<ui::ListModel<GlanceablesTask>>(); + task_list_2->Add(std::make_unique<GlanceablesTask>( + "TaskListItem3", "Task List 2 Item 1 Title", /*completed=*/false, + /*due=*/base::Time::Now(), + /*has_subtasks=*/false, /*has_email_link=*/false)); + task_list_2->Add(std::make_unique<GlanceablesTask>( + "TaskListItem4", "Task List 2 Item 2 Title", /*completed=*/false, + /*due=*/base::Time::Now(), + /*has_subtasks=*/false, /*has_email_link=*/false)); + tasks_in_task_lists_.emplace("TaskListID1", std::move(task_list_1)); + tasks_in_task_lists_.emplace("TaskListID2", std::move(task_list_2)); +} + +} // namespace ash
diff --git a/ash/glanceables/tasks/fake_glanceables_tasks_client.h b/ash/glanceables/tasks/fake_glanceables_tasks_client.h new file mode 100644 index 0000000..71b08f3 --- /dev/null +++ b/ash/glanceables/tasks/fake_glanceables_tasks_client.h
@@ -0,0 +1,58 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_GLANCEABLES_TASKS_FAKE_GLANCEABLES_TASKS_CLIENT_H_ +#define ASH_GLANCEABLES_TASKS_FAKE_GLANCEABLES_TASKS_CLIENT_H_ + +#include <string> +#include <vector> + +#include "ash/ash_export.h" +#include "ash/glanceables/tasks/glanceables_tasks_client.h" +#include "base/containers/flat_map.h" +#include "base/functional/callback_forward.h" +#include "ui/base/models/list_model.h" + +namespace ash { + +struct GlanceablesTask; +struct GlanceablesTaskList; + +class ASH_EXPORT FakeGlanceablesTasksClient : public GlanceablesTasksClient { + public: + using GetTaskListsCallback = + base::OnceCallback<void(ui::ListModel<GlanceablesTaskList>* task_lists)>; + using GetTasksCallback = + base::OnceCallback<void(ui::ListModel<GlanceablesTask>* tasks)>; + using MarkAsCompletedCallback = base::OnceCallback<void(bool success)>; + + FakeGlanceablesTasksClient(); + FakeGlanceablesTasksClient(const FakeGlanceablesTasksClient&) = delete; + FakeGlanceablesTasksClient& operator=(const FakeGlanceablesTasksClient&) = + delete; + ~FakeGlanceablesTasksClient() override; + + // GlanceablesTasksClient: + void GetTaskLists(GetTaskListsCallback callback) override; + void GetTasks(const std::string& task_list_id, + GetTasksCallback callback) override; + void MarkAsCompleted(const std::string& task_list_id, + const std::string& task_id, + MarkAsCompletedCallback callback) override; + + private: + void PopulateTasks(); + void PopulateTaskLists(); + + // All available task lists. + std::unique_ptr<ui::ListModel<GlanceablesTaskList>> task_lists_; + + // All available tasks grouped by task list id. + base::flat_map<std::string, std::unique_ptr<ui::ListModel<GlanceablesTask>>> + tasks_in_task_lists_; +}; + +} // namespace ash + +#endif // ASH_GLANCEABLES_TASKS_FAKE_GLANCEABLES_TASKS_CLIENT_H_
diff --git a/ash/glanceables/tasks/glanceables_tasks_client.h b/ash/glanceables/tasks/glanceables_tasks_client.h index a679adf..db573ca 100644 --- a/ash/glanceables/tasks/glanceables_tasks_client.h +++ b/ash/glanceables/tasks/glanceables_tasks_client.h
@@ -42,7 +42,6 @@ const std::string& task_id, MarkAsCompletedCallback callback) = 0; - protected: virtual ~GlanceablesTasksClient() = default; };
diff --git a/ash/login/ui/lock_contents_view.cc b/ash/login/ui/lock_contents_view.cc index 54e6f50b..aa4231f 100644 --- a/ash/login/ui/lock_contents_view.cc +++ b/ash/login/ui/lock_contents_view.cc
@@ -1912,9 +1912,6 @@ if (state->show_pin) { to_update_auth |= LoginAuthUserView::AUTH_PIN; } - if (state->enable_tap_auth) { - to_update_auth |= LoginAuthUserView::AUTH_TAP; - } if (state->fingerprint_state != FingerprintState::UNAVAILABLE) { to_update_auth |= LoginAuthUserView::AUTH_FINGERPRINT; }
diff --git a/ash/login/ui/login_auth_user_view.cc b/ash/login/ui/login_auth_user_view.cc index b1319881..8639534a 100644 --- a/ash/login/ui/login_auth_user_view.cc +++ b/ash/login/ui/login_auth_user_view.cc
@@ -8,7 +8,6 @@ #include <memory> #include <utility> -#include "ash/constants/ash_features.h" #include "ash/login/login_screen_controller.h" #include "ash/login/resources/grit/login_resources.h" #include "ash/login/ui/arrow_button_view.h" @@ -39,7 +38,6 @@ #include "ash/system/model/clock_model.h" #include "ash/system/model/system_tray_model.h" #include "ash/system/time/time_of_day.h" -#include "base/feature_list.h" #include "base/functional/bind.h" #include "base/i18n/time_formatting.h" #include "base/memory/ptr_util.h" @@ -113,16 +111,7 @@ // Date time format containing only the day of the week, for example: "Tuesday". constexpr char kDayOfWeekOnlyTimeFormat[] = "EEEE"; -constexpr int kFingerprintIconSizeDp = 28; -constexpr int kResetToDefaultIconDelayMs = 1300; -constexpr base::TimeDelta kResetToDefaultMessageDelayMs = - base::Milliseconds(3000); -constexpr int kFingerprintIconTopSpacingDp = 20; -constexpr int kSpacingBetweenFingerprintIconAndLabelDp = 15; -constexpr int kFingerprintViewWidthDp = 204; -constexpr int kDistanceBetweenPasswordFieldAndFingerprintViewDp = 90; -constexpr int kFingerprintFailedAnimationDurationMs = 700; -constexpr int kFingerprintFailedAnimationNumFrames = 45; +constexpr int kDistanceBetweenPasswordFieldAndAuthFactorsViewDp = 90; constexpr base::TimeDelta kChallengeResponseResetAfterFailureDelay = base::Seconds(5); @@ -215,72 +204,6 @@ view)); } -// The label shown below the fingerprint icon. -// TODO(https://crbug.com/1233614): Remove this class after the Smart Lock UI -// revamp is complete. -class FingerprintLabel : public views::Label { - public: - FingerprintLabel() { - SetSubpixelRenderingEnabled(false); - SetAutoColorReadabilityEnabled(false); - SetEnabledColorId(kColorAshTextColorSecondary); - SetMultiLine(true); - - SetTextBasedOnState(FingerprintState::AVAILABLE_DEFAULT, - false /*can_use_pin*/); - } - - FingerprintLabel(const FingerprintLabel&) = delete; - FingerprintLabel& operator=(const FingerprintLabel&) = delete; - - void SetTextBasedOnAuthAttempt(bool success) { - SetText(l10n_util::GetStringUTF16( - success ? IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_AUTH_SUCCESS - : IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_AUTH_FAILED)); - SetAccessibleName(l10n_util::GetStringUTF16( - success ? IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_ACCESSIBLE_AUTH_SUCCESS - : IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_ACCESSIBLE_AUTH_FAILED)); - } - - void SetTextBasedOnState(FingerprintState state, bool can_use_pin) { - auto get_displayed_id = [&]() { - switch (state) { - case FingerprintState::UNAVAILABLE: - case FingerprintState::AVAILABLE_DEFAULT: - return IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_AVAILABLE; - case FingerprintState::AVAILABLE_WITH_TOUCH_SENSOR_WARNING: - return IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_TOUCH_SENSOR; - case FingerprintState::DISABLED_FROM_ATTEMPTS: - return IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_DISABLED_FROM_ATTEMPTS_OLD; - case FingerprintState::DISABLED_FROM_TIMEOUT: - if (can_use_pin) { - return IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_PIN_OR_PASSWORD_REQUIRED; - } - return IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_PASSWORD_REQUIRED; - } - NOTREACHED(); - }; - - auto get_accessible_id = [&]() { - if (state == FingerprintState::DISABLED_FROM_ATTEMPTS) { - return IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_ACCESSIBLE_AUTH_DISABLED_FROM_ATTEMPTS; - } - return get_displayed_id(); - }; - - SetText(l10n_util::GetStringUTF16(get_displayed_id())); - SetAccessibleName(l10n_util::GetStringUTF16(get_accessible_id())); - } - - // views::Label: - void GetAccessibleNodeData(ui::AXNodeData* node_data) override { - node_data->role = ax::mojom::Role::kStaticText; - node_data->SetNameChecked(GetAccessibleName()); - } - - private: -}; - // The content needed to render the disabled auth message view. struct LockScreenMessage { std::u16string title; @@ -380,171 +303,6 @@ } // namespace -// Consists of fingerprint icon view and a label. -// TODO(https://crbug.com/1233614): Remove this class after the Smart Lock UI -// revamp is complete. -class LoginAuthUserView::FingerprintView : public views::View { - public: - FingerprintView() { - SetPaintToLayer(); - layer()->SetFillsBoundsOpaquely(false); - SetBorder(views::CreateEmptyBorder( - gfx::Insets::TLBR(kFingerprintIconTopSpacingDp, 0, 0, 0))); - - auto* layout = SetLayoutManager(std::make_unique<views::BoxLayout>( - views::BoxLayout::Orientation::kVertical, gfx::Insets(), - kSpacingBetweenFingerprintIconAndLabelDp)); - layout->set_main_axis_alignment( - views::BoxLayout::MainAxisAlignment::kCenter); - - icon_ = new AnimatedRoundedImageView( - gfx::Size(kFingerprintIconSizeDp, kFingerprintIconSizeDp), - 0 /*corner_radius*/); - - AddChildView(icon_.get()); - - label_ = new FingerprintLabel(); - AddChildView(label_.get()); - - DisplayCurrentState(); - } - - FingerprintView(const FingerprintView&) = delete; - FingerprintView& operator=(const FingerprintView&) = delete; - - ~FingerprintView() override = default; - - void SetState(FingerprintState state) { - if (state_ == state) { - return; - } - - reset_state_.Stop(); - state_ = state; - - DisplayCurrentState(); - - if (ShouldFireChromeVoxAlert(state)) { - FireAlert(); - } - } - - void SetCanUsePin(bool value) { - if (can_use_pin_ == value) { - return; - } - - can_use_pin_ = value; - label_->SetTextBasedOnState(state_, can_use_pin_); - } - - void ResetUIState() { DisplayCurrentState(); } - - void NotifyFingerprintAuthResult(bool success) { - reset_state_.Stop(); - label_->SetTextBasedOnAuthAttempt(success); - - if (success) { - // We do not need to treat the light/dark mode for this use-case since - // this hint is shown for a short time interval. - icon_->SetImage(gfx::CreateVectorIcon( - kLockScreenFingerprintSuccessIcon, kFingerprintIconSizeDp, - AshColorProvider::Get()->GetContentLayerColor( - AshColorProvider::ContentLayerType::kIconColorPositive))); - } else { - SetIcon(FingerprintState::DISABLED_FROM_ATTEMPTS); - // base::Unretained is safe because reset_state_ is owned by |this|. - reset_state_.Start(FROM_HERE, - base::Milliseconds(kResetToDefaultIconDelayMs), - base::BindOnce(&FingerprintView::DisplayCurrentState, - base::Unretained(this))); - - FireAlert(); - } - } - - // views::View: - gfx::Size CalculatePreferredSize() const override { - gfx::Size size = views::View::CalculatePreferredSize(); - size.set_width(kFingerprintViewWidthDp); - return size; - } - - // views::View: - void OnGestureEvent(ui::GestureEvent* event) override { - if (event->type() != ui::ET_GESTURE_TAP) { - return; - } - if (state_ == FingerprintState::AVAILABLE_DEFAULT || - state_ == FingerprintState::AVAILABLE_WITH_TOUCH_SENSOR_WARNING) { - SetState(FingerprintState::AVAILABLE_WITH_TOUCH_SENSOR_WARNING); - reset_state_.Start( - FROM_HERE, kResetToDefaultMessageDelayMs, - base::BindOnce(&FingerprintView::SetState, base::Unretained(this), - FingerprintState::AVAILABLE_DEFAULT)); - } - } - - // views::View: - void OnThemeChanged() override { - views::View::OnThemeChanged(); - SetIcon(state_); - } - - private: - void DisplayCurrentState() { - SetVisible(state_ != FingerprintState::UNAVAILABLE); - SetIcon(state_); - label_->SetTextBasedOnState(state_, can_use_pin_); - } - - void FireAlert() { - label_->NotifyAccessibilityEvent(ax::mojom::Event::kAlert, - true /*send_native_event*/); - } - - void SetIcon(FingerprintState state) { - const SkColor icon_color = AshColorProvider::Get()->GetContentLayerColor( - AshColorProvider::ContentLayerType::kIconColorPrimary); - const SkColor color = - state == FingerprintState::AVAILABLE_DEFAULT || - state == FingerprintState::AVAILABLE_WITH_TOUCH_SENSOR_WARNING - ? icon_color - : ColorUtil::GetDisabledColor(icon_color); - switch (state) { - case FingerprintState::UNAVAILABLE: - case FingerprintState::AVAILABLE_DEFAULT: - case FingerprintState::AVAILABLE_WITH_TOUCH_SENSOR_WARNING: - case FingerprintState::DISABLED_FROM_TIMEOUT: - icon_->SetImage(gfx::CreateVectorIcon(kLockScreenFingerprintIcon, - kFingerprintIconSizeDp, color)); - break; - case FingerprintState::DISABLED_FROM_ATTEMPTS: - icon_->SetAnimationDecoder( - std::make_unique<HorizontalImageSequenceAnimationDecoder>( - *ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed( - IDR_LOGIN_FINGERPRINT_UNLOCK_SPINNER), - base::Milliseconds(kFingerprintFailedAnimationDurationMs), - kFingerprintFailedAnimationNumFrames), - AnimatedRoundedImageView::Playback::kSingle); - break; - } - } - - bool ShouldFireChromeVoxAlert(FingerprintState state) { - return state == FingerprintState::DISABLED_FROM_ATTEMPTS || - state == FingerprintState::DISABLED_FROM_TIMEOUT; - } - - raw_ptr<FingerprintLabel, ExperimentalAsh> label_ = nullptr; - raw_ptr<AnimatedRoundedImageView, ExperimentalAsh> icon_ = nullptr; - base::OneShotTimer reset_state_; - FingerprintState state_ = FingerprintState::AVAILABLE_DEFAULT; - - // Affects DISABLED_FROM_TIMEOUT message. - bool can_use_pin_ = false; -}; - // Consists of challenge-response icon view and a label. class LoginAuthUserView::ChallengeResponseView : public views::View { public: @@ -1120,41 +878,30 @@ auto locked_tpm_message_view = std::make_unique<LockedTpmMessageView>(); locked_tpm_message_view_ = locked_tpm_message_view.get(); - smart_lock_ui_revamp_enabled_ = - base::FeatureList::IsEnabled(ash::features::kSmartLockUIRevamp); - std::unique_ptr<FingerprintView> fingerprint_view; - std::unique_ptr<LoginAuthFactorsView> auth_factors_view; - if (smart_lock_ui_revamp_enabled_) { - auto fingerprint_auth_factor_model = - FingerprintAuthFactorModel::Factory::Create(user.fingerprint_state); - fingerprint_auth_factor_model_ = fingerprint_auth_factor_model.get(); - auto smart_lock_auth_factor_model = - SmartLockAuthFactorModel::Factory::Create( - user.smart_lock_state, - base::BindRepeating( - &LoginAuthUserView::OnSmartLockArrowButtonTapped, - base::Unretained(this))); - smart_lock_auth_factor_model_ = smart_lock_auth_factor_model.get(); + auto fingerprint_auth_factor_model = + FingerprintAuthFactorModel::Factory::Create(user.fingerprint_state); + fingerprint_auth_factor_model_ = fingerprint_auth_factor_model.get(); + auto smart_lock_auth_factor_model = SmartLockAuthFactorModel::Factory::Create( + user.smart_lock_state, + base::BindRepeating(&LoginAuthUserView::OnSmartLockArrowButtonTapped, + base::Unretained(this))); + smart_lock_auth_factor_model_ = smart_lock_auth_factor_model.get(); - // Note: at the moment, between Fingerprint and Smart Lock, Smart Lock - // is the only auth factor which considers an "arrow button" tap event. - auth_factors_view = std::make_unique<LoginAuthFactorsView>( - base::BindRepeating( - &SmartLockAuthFactorModel::OnArrowButtonTapOrClickEvent, - base::Unretained(smart_lock_auth_factor_model_)), - callbacks.on_auth_factor_is_hiding_password_changed); + // Note: at the moment, between Fingerprint and Smart Lock, Smart Lock + // is the only auth factor which considers an "arrow button" tap event. + auto auth_factors_view = std::make_unique<LoginAuthFactorsView>( + base::BindRepeating( + &SmartLockAuthFactorModel::OnArrowButtonTapOrClickEvent, + base::Unretained(smart_lock_auth_factor_model_)), + callbacks.on_auth_factor_is_hiding_password_changed); - auth_factors_view_ = auth_factors_view.get(); - auth_factors_view_->AddAuthFactor(std::move(fingerprint_auth_factor_model)); - auth_factors_view_->AddAuthFactor(std::move(smart_lock_auth_factor_model)); + auth_factors_view_ = auth_factors_view.get(); + auth_factors_view_->AddAuthFactor(std::move(fingerprint_auth_factor_model)); + auth_factors_view_->AddAuthFactor(std::move(smart_lock_auth_factor_model)); - // Needed for up/down sliding animation. - auth_factors_view_->SetPaintToLayer(); - auth_factors_view_->layer()->SetFillsBoundsOpaquely(false); - } else { - fingerprint_view = std::make_unique<FingerprintView>(); - fingerprint_view_ = fingerprint_view.get(); - } + // Needed for up/down sliding animation. + auth_factors_view_->SetPaintToLayer(); + auth_factors_view_->layer()->SetFillsBoundsOpaquely(false); auto challenge_response_view = std::make_unique<ChallengeResponseView>(base::BindRepeating( @@ -1184,15 +931,8 @@ login_views_utils::WrapViewForPreferredSize(std::move(pin_input_view)); auto wrapped_pin_password_toggle_view = login_views_utils::WrapViewForPreferredSize(std::move(toggle_container)); - std::unique_ptr<views::View> wrapped_fingerprint_view; - std::unique_ptr<views::View> wrapped_auth_factors_view; - if (smart_lock_ui_revamp_enabled_) { - wrapped_auth_factors_view = login_views_utils::WrapViewForPreferredSize( - std::move(auth_factors_view)); - } else { - wrapped_fingerprint_view = login_views_utils::WrapViewForPreferredSize( - std::move(fingerprint_view)); - } + auto wrapped_auth_factors_view = + login_views_utils::WrapViewForPreferredSize(std::move(auth_factors_view)); auto wrapped_challenge_response_view = login_views_utils::WrapViewForPreferredSize( std::move(challenge_response_view)); @@ -1223,11 +963,7 @@ AddChildView(std::move(wrapped_padding_below_password_view)); AddChildView(std::move(wrapped_pin_view)); AddChildView(std::move(wrapped_pin_password_toggle_view)); - if (smart_lock_ui_revamp_enabled_) { - AddChildView(std::move(wrapped_auth_factors_view)); - } else { - AddChildView(std::move(wrapped_fingerprint_view)); - } + AddChildView(std::move(wrapped_auth_factors_view)); auto* challenge_ptr = AddChildView(std::move(wrapped_challenge_response_view)); @@ -1302,36 +1038,26 @@ pin_view_->SetVisible(current_state.has_pinpad); password_view_->SetEnabled(current_state.has_password); - password_view_->SetEnabledOnEmptyPassword(HasAuthMethod(AUTH_TAP)); + password_view_->SetEnabledOnEmptyPassword(false); password_view_->SetFocusEnabledForTextfield(current_state.has_password); password_view_->SetVisible(current_state.has_password); password_view_->layer()->SetOpacity(current_state.has_password); pin_input_view_->UpdateLength(auth_metadata_.autosubmit_pin_length); - pin_input_view_->SetAuthenticateWithEmptyPinOnReturnKey( - HasAuthMethod(AUTH_TAP)); + pin_input_view_->SetAuthenticateWithEmptyPinOnReturnKey(false); pin_input_view_->SetVisible(current_state.has_pin_input); pin_password_toggle_->SetVisible(current_state.has_toggle); pin_password_toggle_->SetText(GetPinPasswordToggleText()); - if (smart_lock_ui_revamp_enabled_) { - DCHECK(fingerprint_auth_factor_model_); - DCHECK(smart_lock_auth_factor_model_); - DCHECK(auth_factors_view_); - // TODO(b/219978360): Should investigate why setting - // |fingerprint_auth_factor_model_| availability here is necessary if state - // management within LockContentsView is working properly. - fingerprint_auth_factor_model_->set_available( - current_state.has_fingerprint); - auth_factors_view_->SetCanUsePin(HasAuthMethod(AUTH_PIN)); - auth_factors_view_->SetVisible(current_state.has_fingerprint || - current_state.has_smart_lock); - } else { - DCHECK(fingerprint_view_); - fingerprint_view_->SetVisible(current_state.has_fingerprint); - fingerprint_view_->SetCanUsePin(HasAuthMethod(AUTH_PIN)); - } + // TODO(b/219978360): Should investigate why setting + // |fingerprint_auth_factor_model_| availability here is necessary if state + // management within LockContentsView is working properly. + fingerprint_auth_factor_model_->set_available(current_state.has_fingerprint); + auth_factors_view_->SetCanUsePin(HasAuthMethod(AUTH_PIN)); + auth_factors_view_->SetVisible(current_state.has_fingerprint || + current_state.has_smart_lock); + challenge_response_view_->SetVisible(current_state.has_challenge_response); padding_below_user_view_->SetPreferredSize(GetPaddingBelowUserView()); @@ -1354,23 +1080,7 @@ void LoginAuthUserView::SetEasyUnlockIcon( EasyUnlockIconState icon_state, const std::u16string& accessibility_label) { - if (smart_lock_ui_revamp_enabled_) { - return; - } - - password_view_->SetEasyUnlockIcon(icon_state, accessibility_label); - - const std::string& user_display_email = - current_user().basic_user_info.display_email; - if (icon_state == EasyUnlockIconState::UNLOCKED) { - password_view_->SetAccessibleName(l10n_util::GetStringFUTF16( - IDS_ASH_LOGIN_POD_AUTH_TAP_PASSWORD_FIELD_ACCESSIBLE_NAME, - base::UTF8ToUTF16(user_display_email))); - } else { - password_view_->SetAccessibleName(l10n_util::GetStringFUTF16( - IDS_ASH_LOGIN_POD_PASSWORD_FIELD_ACCESSIBLE_NAME, - base::UTF8ToUTF16(user_display_email))); - } + // TODO(b/281542383): remove this function } void LoginAuthUserView::CaptureStateForAnimationPreLayout() { @@ -1384,14 +1094,9 @@ stop_animation(this); stop_animation(password_view_); stop_animation(pin_view_); - if (fingerprint_view_) { - stop_animation(fingerprint_view_); - } stop_animation(challenge_response_view_); stop_animation(pin_password_toggle_); - if (auth_factors_view_) { - stop_animation(auth_factors_view_); - } + stop_animation(auth_factors_view_); DCHECK(!previous_state_); previous_state_ = std::make_unique<UiState>(this); @@ -1518,62 +1223,39 @@ } //////// - // Fade the fingerprint view if it is being hidden or shown. - if (!smart_lock_ui_revamp_enabled_ && fingerprint_view_ && - previous_state_->has_fingerprint != current_state.has_fingerprint) { - float opacity_start = 0, opacity_end = 1; - if (!current_state.has_fingerprint) { - std::swap(opacity_start, opacity_end); - } + // Slide the auth factors view up/down when entering/leaving a state of + // |auth_factors_view_| that requests the password field to be hidden. + if (previous_state_->auth_factor_is_hiding_password != + current_state.auth_factor_is_hiding_password) { + CHECK(auth_factors_view_); + ui::ScopedLayerAnimationSettings settings( + auth_factors_view_->layer()->GetAnimator()); + settings.SetTransitionDuration( + kAuthFactorHidingPasswordFieldSlideUpDuration); + settings.SetTweenType(gfx::Tween::Type::ACCEL_20_DECEL_100); - fingerprint_view_->layer()->SetOpacity(opacity_start); - - { - ui::ScopedLayerAnimationSettings settings( - fingerprint_view_->layer()->GetAnimator()); - settings.SetTransitionDuration( - base::Milliseconds(login::kChangeUserAnimationDurationMs)); - settings.SetTweenType(gfx::Tween::Type::FAST_OUT_SLOW_IN); - fingerprint_view_->layer()->SetOpacity(opacity_end); - } + gfx::Transform transform; + transform.Translate(/*x=*/0, + /*y=*/current_state.auth_factor_is_hiding_password + ? -kAuthFactorHidingPasswordFieldSlideUpDistanceDp + : 0); + auth_factors_view_->layer()->SetTransform(transform); } - if (smart_lock_ui_revamp_enabled_) { - //////// - // Slide the auth factors view up/down when entering/leaving a state of - // |auth_factors_view_| that requests the password field to be hidden. - if (previous_state_->auth_factor_is_hiding_password != - current_state.auth_factor_is_hiding_password) { - CHECK(auth_factors_view_); - ui::ScopedLayerAnimationSettings settings( - auth_factors_view_->layer()->GetAnimator()); - settings.SetTransitionDuration( - kAuthFactorHidingPasswordFieldSlideUpDuration); - settings.SetTweenType(gfx::Tween::Type::ACCEL_20_DECEL_100); - - gfx::Transform transform; - transform.Translate(/*x=*/0, - /*y=*/current_state.auth_factor_is_hiding_password - ? -kAuthFactorHidingPasswordFieldSlideUpDistanceDp - : 0); - auth_factors_view_->layer()->SetTransform(transform); - } - - // Translate the user view to its previous position when in the auth factor - // view requests to hide the password field. This prevents the user view - // from moving when the password view collapses. Note that this transform is - // applied even if |auth_factor_is_hiding_password| hasn't changed; the - // user view should not move on subsequent LayoutAuth() calls if an auth - // factor still wants to hide the password. - if (current_state.auth_factor_is_hiding_password) { - layer()->GetAnimator()->StopAnimating(); - int non_pin_y_end_in_screen = GetBoundsInScreen().y(); - gfx::Transform transform; - transform.Translate(/*x=*/0, - /*y=*/previous_state_->non_pin_y_start_in_screen - - non_pin_y_end_in_screen); - layer()->SetTransform(transform); - } + // Translate the user view to its previous position when in the auth factor + // view requests to hide the password field. This prevents the user view + // from moving when the password view collapses. Note that this transform is + // applied even if |auth_factor_is_hiding_password| hasn't changed; the + // user view should not move on subsequent LayoutAuth() calls if an auth + // factor still wants to hide the password. + if (current_state.auth_factor_is_hiding_password) { + layer()->GetAnimator()->StopAnimating(); + int non_pin_y_end_in_screen = GetBoundsInScreen().y(); + gfx::Transform transform; + transform.Translate(/*x=*/0, + /*y=*/previous_state_->non_pin_y_start_in_screen - + non_pin_y_end_in_screen); + layer()->SetTransform(transform); } //////// @@ -1615,42 +1297,27 @@ } void LoginAuthUserView::SetFingerprintState(FingerprintState state) { - if (smart_lock_ui_revamp_enabled_) { - DCHECK(fingerprint_auth_factor_model_); - fingerprint_auth_factor_model_->SetFingerprintState(state); - } else { - DCHECK(fingerprint_view_); - fingerprint_view_->SetState(state); - } + CHECK(fingerprint_auth_factor_model_); + fingerprint_auth_factor_model_->SetFingerprintState(state); } void LoginAuthUserView::ResetFingerprintUIState() { - if (smart_lock_ui_revamp_enabled_) { - DCHECK(fingerprint_auth_factor_model_); - fingerprint_auth_factor_model_->ResetUIState(); - } else { - DCHECK(fingerprint_view_); - fingerprint_view_->ResetUIState(); - } + CHECK(fingerprint_auth_factor_model_); + fingerprint_auth_factor_model_->ResetUIState(); } void LoginAuthUserView::NotifyFingerprintAuthResult(bool success) { - if (smart_lock_ui_revamp_enabled_) { - DCHECK(fingerprint_auth_factor_model_); - fingerprint_auth_factor_model_->NotifyFingerprintAuthResult(success); - } else { - DCHECK(fingerprint_view_); - fingerprint_view_->NotifyFingerprintAuthResult(success); - } + CHECK(fingerprint_auth_factor_model_); + fingerprint_auth_factor_model_->NotifyFingerprintAuthResult(success); } void LoginAuthUserView::SetSmartLockState(SmartLockState state) { - DCHECK(smart_lock_auth_factor_model_); + CHECK(smart_lock_auth_factor_model_); smart_lock_auth_factor_model_->SetSmartLockState(state); } void LoginAuthUserView::NotifySmartLockAuthResult(bool success) { - DCHECK(smart_lock_auth_factor_model_); + CHECK(smart_lock_auth_factor_model_); smart_lock_auth_factor_model_->NotifySmartLockAuthResult(success); } @@ -1698,16 +1365,7 @@ void LoginAuthUserView::OnAuthSubmit(const std::u16string& password) { LOG(WARNING) << "crbug.com/1339004 : AuthSubmit " << password_view_->IsReadOnly() << " / " - << pin_input_view_->IsReadOnly() << " / " - << HasAuthMethod(AUTH_TAP); - - // Pressing enter when the password field is empty and tap-to-unlock is - // enabled should attempt unlock. - if (HasAuthMethod(AUTH_TAP) && password.empty()) { - Shell::Get()->login_screen_controller()->AuthenticateUserWithEasyUnlock( - current_user().basic_user_info.account_id); - return; - } + << pin_input_view_->IsReadOnly(); password_view_->SetReadOnly(true); pin_input_view_->SetReadOnly(true); @@ -1770,18 +1428,12 @@ } void LoginAuthUserView::OnSmartLockArrowButtonTapped() { - DCHECK(smart_lock_ui_revamp_enabled_); Shell::Get()->login_screen_controller()->AuthenticateUserWithEasyUnlock( current_user().basic_user_info.account_id); } void LoginAuthUserView::OnUserViewTap() { - if (HasAuthMethod(AUTH_TAP)) { - if (!smart_lock_ui_revamp_enabled_) { - Shell::Get()->login_screen_controller()->AuthenticateUserWithEasyUnlock( - current_user().basic_user_info.account_id); - } - } else if (HasAuthMethod(AUTH_ONLINE_SIGN_IN)) { + if (HasAuthMethod(AUTH_ONLINE_SIGN_IN)) { // Tapping anywhere in the user view is the same with tapping the message. OnOnlineSignInMessageTap(); } else { @@ -1933,8 +1585,7 @@ if (HasAuthMethod(AUTH_CHALLENGE_RESPONSE) || HasAuthMethod(AUTH_ONLINE_SIGN_IN) || HasAuthMethod(AUTH_DISABLED) || !HasAuthMethod(AUTH_PASSWORD) || - (smart_lock_ui_revamp_enabled_ && - HasAuthMethod(AUTH_AUTH_FACTOR_IS_HIDING_PASSWORD))) { + HasAuthMethod(AUTH_AUTH_FACTOR_IS_HIDING_PASSWORD)) { input_field_mode_ = InputFieldMode::NONE; return; } @@ -2017,7 +1668,7 @@ } if (state.has_fingerprint || (auth_factors_view_ && auth_factors_view_->GetVisible())) { - return SizeFromHeight(kDistanceBetweenPasswordFieldAndFingerprintViewDp); + return SizeFromHeight(kDistanceBetweenPasswordFieldAndAuthFactorsViewDp); } if (state.has_challenge_response) { return SizeFromHeight(kDistanceBetweenPwdFieldAndChallengeResponseViewDp); @@ -2035,12 +1686,6 @@ } std::u16string LoginAuthUserView::GetPasswordViewPlaceholder() const { - // Note: |AUTH_TAP| must have higher priority than |AUTH_PIN| when - // determining the placeholder. - if (HasAuthMethod(AUTH_TAP) && !smart_lock_ui_revamp_enabled_) { - return l10n_util::GetStringUTF16( - IDS_ASH_LOGIN_POD_PASSWORD_TAP_PLACEHOLDER); - } if (input_field_mode_ == InputFieldMode::PIN_AND_PASSWORD) { return l10n_util::GetStringUTF16( IDS_ASH_LOGIN_POD_PASSWORD_PIN_PLACEHOLDER);
diff --git a/ash/login/ui/login_auth_user_view.h b/ash/login/ui/login_auth_user_view.h index 841224b..5444a59 100644 --- a/ash/login/ui/login_auth_user_view.h +++ b/ash/login/ui/login_auth_user_view.h
@@ -52,19 +52,17 @@ AUTH_NONE = 0, // No extra auth methods. AUTH_PASSWORD = 1 << 0, // Display password. AUTH_PIN = 1 << 1, // Display PIN keyboard. - AUTH_TAP = 1 << 2, // [DEPRECATED] Tap to unlock. - // TODO(b/217970801): Remove this field. - AUTH_ONLINE_SIGN_IN = 1 << 3, // Force online sign-in. - AUTH_FINGERPRINT = 1 << 4, // Use fingerprint to unlock. - AUTH_SMART_LOCK = 1 << 5, // Use Smart Lock to unlock. - AUTH_CHALLENGE_RESPONSE = 1 << 6, // Authenticate via challenge-response + AUTH_ONLINE_SIGN_IN = 1 << 2, // Force online sign-in. + AUTH_FINGERPRINT = 1 << 3, // Use fingerprint to unlock. + AUTH_SMART_LOCK = 1 << 4, // Use Smart Lock to unlock. + AUTH_CHALLENGE_RESPONSE = 1 << 5, // Authenticate via challenge-response // protocol using security token. - AUTH_DISABLED = 1 << 7, // Disable all the auth methods and show a + AUTH_DISABLED = 1 << 6, // Disable all the auth methods and show a // message to user. - AUTH_DISABLED_TPM_LOCKED = 1 << 8, // Disable all the auth methods due + AUTH_DISABLED_TPM_LOCKED = 1 << 7, // Disable all the auth methods due // to the TPM being locked AUTH_AUTH_FACTOR_IS_HIDING_PASSWORD = - 1 << 9, // Hide the password/pin fields and slide the auth factors + 1 << 8, // Hide the password/pin fields and slide the auth factors // up. This happens, for example, when an auth factor requires // the user to click a button as a final step. Note that if // this bit is set, the password/pin will be hidden even if @@ -137,9 +135,9 @@ ~Callbacks(); // Executed whenever an authentication result is available, such as when the - // user submits a password or taps the user icon when AUTH_TAP is enabled. + // user submits a password or clicks to complete Smart Lock. OnAuthCallback on_auth; - // Called when the user taps the user view and AUTH_TAP is not enabled. + // Called when the user taps the user view. LoginUserView::OnTap on_tap; // Called when the remove user warning message has been shown. LoginUserView::OnRemoveWarningShown on_remove_warning_shown; @@ -220,7 +218,6 @@ private: struct UiState; - class FingerprintView; class ChallengeResponseView; class DisabledAuthMessageView; class LockedTpmMessageView; @@ -256,7 +253,7 @@ void OnPinTextChanged(bool is_empty); // Helper method to check if an auth method is enable. Use it like this: - // bool has_tap = HasAuthMethod(AUTH_TAP). + // bool has_tap = HasAuthMethod(AUTH_PASSWORD). bool HasAuthMethod(AuthMethods auth_method) const; // Whether the authentication attempt should use the user's PIN. @@ -307,10 +304,6 @@ // Controls which input field is currently being shown. InputFieldMode input_field_mode_ = InputFieldMode::NONE; - // TODO(https://crbug.com/1233614): Remove this field once the Smart Lock UI - // revamp is complete. - bool smart_lock_ui_revamp_enabled_ = false; - raw_ptr<LoginUserView, ExperimentalAsh> user_view_ = nullptr; raw_ptr<LoginPasswordView, ExperimentalAsh> password_view_ = nullptr; raw_ptr<LoginPinInputView, ExperimentalAsh> pin_input_view_ = nullptr; @@ -319,7 +312,6 @@ raw_ptr<views::LabelButton, ExperimentalAsh> online_sign_in_button_ = nullptr; raw_ptr<DisabledAuthMessageView, ExperimentalAsh> disabled_auth_message_ = nullptr; - raw_ptr<FingerprintView, ExperimentalAsh> fingerprint_view_ = nullptr; raw_ptr<LoginAuthFactorsView, ExperimentalAsh> auth_factors_view_ = nullptr; raw_ptr<FingerprintAuthFactorModel, ExperimentalAsh> fingerprint_auth_factor_model_ = nullptr;
diff --git a/ash/login/ui/login_auth_user_view_unittest.cc b/ash/login/ui/login_auth_user_view_unittest.cc index 8f3f53d..d14e96a1 100644 --- a/ash/login/ui/login_auth_user_view_unittest.cc +++ b/ash/login/ui/login_auth_user_view_unittest.cc
@@ -226,63 +226,6 @@ EXPECT_TRUE(user_test.is_opaque()); } -// Verifies that pressing return with an empty password field when tap-to-unlock -// is enabled attempts unlock. -TEST_P(LoginAuthUserViewUnittest, PressReturnWithTapToUnlockEnabled) { - auto client = std::make_unique<MockLoginScreenClient>(); - - ui::test::EventGenerator* generator = GetEventGenerator(); - - LoginAuthUserView::TestApi auth_test(view_); - LoginPasswordView* password_view(auth_test.password_view()); - LoginUserView* user_view(auth_test.user_view()); - - SetUserCount(1); - - EXPECT_CALL(*client, - AuthenticateUserWithEasyUnlock( - user_view->current_user().basic_user_info.account_id)); - SetAuthMethods(LoginAuthUserView::AUTH_PASSWORD | - LoginAuthUserView::AUTH_TAP); - password_view->Reset(); - - generator->PressKey(ui::KeyboardCode::VKEY_RETURN, 0); - base::RunLoop().RunUntilIdle(); -} - -// Verifies that pressing return on the pin input field when tap-to-unlock -// is enabled attempts unlock. -TEST_P(LoginAuthUserViewUnittest, PressReturnOnPinWithTapToUnlockEnabled) { - auto client = std::make_unique<MockLoginScreenClient>(); - - ui::test::EventGenerator* generator = GetEventGenerator(); - LoginAuthUserView::TestApi auth_test(view_); - LoginUserView* user_view(auth_test.user_view()); - LoginPinInputView* pin_input(auth_test.pin_input_view()); - - SetUserCount(1); - - // One call using focus, and one direct call to the view. - EXPECT_CALL(*client, - AuthenticateUserWithEasyUnlock( - user_view->current_user().basic_user_info.account_id)) - .Times(2); - SetAuthMethods(LoginAuthUserView::AUTH_PASSWORD | - LoginAuthUserView::AUTH_PIN | LoginAuthUserView::AUTH_TAP, - /*show_pinpad_for_pw=*/false, - /*virtual_keyboard_visible=*/false, - /*autosubmit_pin_length=*/6); - - // Call through correct focus. - pin_input->RequestFocus(); - generator->PressKey(ui::KeyboardCode::VKEY_RETURN, ui::EF_NONE); - - // Call the view directly as well. - pin_input->OnKeyPressed(ui::KeyEvent( - ui::ET_KEY_PRESSED, ui::KeyboardCode::VKEY_RETURN, ui::EF_NONE)); - base::RunLoop().RunUntilIdle(); -} - TEST_P(LoginAuthUserViewUnittest, OnlineSignInMessage) { auto client = std::make_unique<MockLoginScreenClient>(); LoginAuthUserView::TestApi auth_test(view_); @@ -311,8 +254,6 @@ EXPECT_FALSE(online_sign_in_message->GetVisible()); SetAuthMethods(LoginAuthUserView::AUTH_PIN); EXPECT_FALSE(online_sign_in_message->GetVisible()); - SetAuthMethods(LoginAuthUserView::AUTH_TAP); - EXPECT_FALSE(online_sign_in_message->GetVisible()); } // Verifies that password is cleared after AUTH_PASSWORD is disabled. @@ -595,6 +536,11 @@ fake_smart_lock_auth_factor_model_factory_.get()); } + void TearDown() override { + SmartLockAuthFactorModel::Factory::SetFactoryForTesting(nullptr); + LoginAuthUserViewUnittest::TearDown(); + } + std::unique_ptr<FakeSmartLockAuthFactorModelFactory> fake_smart_lock_auth_factor_model_factory_; };
diff --git a/ash/public/cpp/desk_template.cc b/ash/public/cpp/desk_template.cc index 8ed5c12..f463e30 100644 --- a/ash/public/cpp/desk_template.cc +++ b/ash/public/cpp/desk_template.cc
@@ -82,9 +82,9 @@ return desk_template; } -void DeskTemplate::SetDeskIndex(int desk_index) { +void DeskTemplate::SetDeskUuid(base::Uuid desk_uuid) { DCHECK(desk_restore_data_); - desk_restore_data_->SetDeskIndex(desk_index); + desk_restore_data_->SetDeskUuid(desk_uuid); } std::string DeskTemplate::ToString() const {
diff --git a/ash/public/cpp/desk_template.h b/ash/public/cpp/desk_template.h index b2f0346..6dc6b577 100644 --- a/ash/public/cpp/desk_template.h +++ b/ash/public/cpp/desk_template.h
@@ -133,9 +133,8 @@ // Indicates whether this template can be modified by user. bool IsModifiable() const { return source_ == DeskTemplateSource::kUser; } - // Sets `desk_index` as the desk to launch on for all windows in the - // template. - void SetDeskIndex(int desk_index); + // Sets `desk_uuid` as the desk to launch on for all windows in the template. + void SetDeskUuid(base::Uuid desk_uuid); // Returns `this` in string format. Used for feedback logs. std::string ToString() const;
diff --git a/ash/public/cpp/window_properties.cc b/ash/public/cpp/window_properties.cc index b0b0c40..94eab67 100644 --- a/ash/public/cpp/window_properties.cc +++ b/ash/public/cpp/window_properties.cc
@@ -67,6 +67,5 @@ DEFINE_UI_CLASS_PROPERTY_KEY(ResizeShadowType, kResizeShadowTypeKey, ResizeShadowType::kUnlock) -DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(std::string, kDeskGuidKey, nullptr) } // namespace ash
diff --git a/ash/public/cpp/window_properties.h b/ash/public/cpp/window_properties.h index abca1df..279f70cc 100644 --- a/ash/public/cpp/window_properties.h +++ b/ash/public/cpp/window_properties.h
@@ -194,11 +194,6 @@ ASH_PUBLIC_EXPORT extern const aura::WindowProperty<gfx::Rect*>* const kWindowPipResizeHandleBoundsKey; -// A property key to indicate a desk guid of a workspace this window belongs -// to. -ASH_PUBLIC_EXPORT extern const aura::WindowProperty<std::string*>* const - kDeskGuidKey; - // Alphabetical sort. } // namespace ash
diff --git a/ash/strings/ash_strings_be.xtb b/ash/strings/ash_strings_be.xtb index a5947eaf..9aee1855 100644 --- a/ash/strings/ash_strings_be.xtb +++ b/ash/strings/ash_strings_be.xtb
@@ -94,6 +94,7 @@ <translation id="1346748346194534595">Справа</translation> <translation id="1351937230027495976">Згарнуць меню</translation> <translation id="1360220746312242196">Пры пошуку на старонцы перайсці да папярэдняга супадзення</translation> +<translation id="1360788414852622716">Ідзе адключэнне профілю. Гэта можа заняць некалькі хвілін.</translation> <translation id="1364382257761975320">Каб разблакіраваць Chromebook, выкарыстайце функцыю разблакіравання адбіткам пальца</translation> <translation id="1365866993922957110">Атрымліваць аўтаматычныя абнаўленні</translation> <translation id="1372545819342940910">Захаваць працоўны стол для прагляду пазней</translation> @@ -545,6 +546,7 @@ <translation id="3510164367642747937">Вылучаць курсор мышы</translation> <translation id="3513798432020909783">Уліковы запіс пад кіраваннем <ph name="MANAGER_EMAIL" /></translation> <translation id="352245152354538528">{0,plural, =1{Абнавіце прыладу на працягу 1 хвіліны}one{Абнавіце прыладу на працягу # хвіліны}few{Абнавіце прыладу на працягу # хвілін}many{Абнавіце прыладу на працягу # хвілін}other{Абнавіце прыладу на працягу # хвілін}}</translation> +<translation id="3522979239100719575">Ідзе пошук даступных профіляў. Гэта можа заняць некалькі хвілін.</translation> <translation id="3526440770046466733">Адкрыць спасылку ў новай укладцы, але заставацца на бягучай</translation> <translation id="353086728817903341">Устаноўлена падключэнне да некалькіх (<ph name="NUM_DEVICES" />) прылад</translation> <translation id="3533126039236445965">Праграмы на панэлі доступу</translation> @@ -1557,6 +1559,7 @@ <translation id="8083540854303889870">Захавана на будучыню</translation> <translation id="8091153018031979607">Пачынаецца ў <ph name="START_TIME" /> <ph name="DAYS_ELAPSED" /></translation> <translation id="8091387634532529612">Аўтаматычныя абнаўленні</translation> +<translation id="8092380135549145188">Налады пракруткі</translation> <translation id="8098591350844501178">Спыніць трансляцыю экрана на прыёмнік "<ph name="RECEIVER_NAME" />"</translation> <translation id="810637681351706236">Адмацаваць праграму з панэлі доступу</translation> <translation id="8113423164597455979">Уключана, усе праграмы</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb index 70613a1..e18d671 100644 --- a/ash/strings/ash_strings_fa.xtb +++ b/ash/strings/ash_strings_fa.xtb
@@ -207,7 +207,7 @@ <translation id="1879018240766558464">درحالحاضر از پنجرههای «ناشناس» پشتیبانی نمیشود. برنامههای دیگر ذخیره خواهد شد.</translation> <translation id="1882814835921407042">عدم وجود شبکه تلفن همراه</translation> <translation id="1882897271359938046">بازتاب به <ph name="DISPLAY_NAME" /></translation> -<translation id="1885785240814121742">باز کردن قفل با اثر انگشت</translation> +<translation id="1885785240814121742">قفلگشایی با اثر انگشت</translation> <translation id="1888656773939766144"><ph name="DISPLAY_NAME" /> از <ph name="SPECIFIED_RESOLUTION" /> (<ph name="SPECIFIED_REFRESH_RATE" /> هرتز) پشتیبانی نمیکند. وضوح به <ph name="FALLBACK_RESOLUTION" /> (<ph name="FALLBACK_REFRESH_RATE" />) تغییر کرده است. برای حفظ تغییرات، روی تأیید کلیک کنید. تنظیمات قبلی <ph name="TIMEOUT_SECONDS" /> دیگر بازیابی خواهد شد.</translation> <translation id="1908992311423394684">نصب جدید</translation> <translation id="1915307458270490472">قطع تماس</translation> @@ -1502,7 +1502,7 @@ <translation id="7860671499921112077">برای ورود به «نمای کلی»، با سه انگشت تند به بالا بکشید</translation> <translation id="7862292329216937261">برای استفاده از دستگاه بهعنوان مهمان، باید از سیستم خارج شوید و سپس گزینه «مرور بهعنوان مهمان» را در پایین صفحهنمایش انتخاب کنید.</translation> <translation id="7866482334467279021">روشن</translation> -<translation id="7868900307798234037">درحال باز کردن قفل با اثر انگشت</translation> +<translation id="7868900307798234037">درحال قفلگشایی با اثر انگشت</translation> <translation id="7872786842639831132">خاموش</translation> <translation id="7875575368831396199">ظاهراً بلوتوث در <ph name="DEVICE_TYPE" /> شما خاموش است. لطفاً برای استفاده از «مرکز کنترل تلفن»، بلوتوث را روشن کنید.</translation> <translation id="7877557217297072640">{0,plural, =0{اکنون دستگاه را به نسخه قبلی تغییر دهید}=1{تا یک ثانیه دیگر دستگاه را به نسخه قبلی تغییر دهید}one{تا # ثانیه دیگر دستگاه را به نسخه قبلی تغییر دهید}other{تا # ثانیه دیگر دستگاه را به نسخه قبلی تغییر دهید}}</translation> @@ -1533,7 +1533,7 @@ <translation id="797512352675305461">روشن یا خاموش کردن ذرهبین تمامصفحه</translation> <translation id="7977927628060636163">درحال جستجوی شبکههای تلفن همراه…</translation> <translation id="7982789257301363584">شبکه</translation> -<translation id="7984197416080286869">تلاشهای بیش از حد برای باز کردن قفل با اثر انگشت</translation> +<translation id="7984197416080286869">تلاشهای بیش از حد برای قفلگشایی با اثر انگشت</translation> <translation id="798779949890829624">این تنظیم را سرپرست شما مدیریت میکند</translation> <translation id="799296642788192631">میتوانید فایلهای مهم را سنجاق کنید. برای سنجاق کردن، نشانگر را روی مورد مدنظر نگه دارید یا Files را باز کنید و روی مورد مدنظر کلیک راست کنید.</translation> <translation id="7994370417837006925">ورود چندگانه به سیستم</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb index 6028ef4..2cf48dc 100644 --- a/ash/strings/ash_strings_sw.xtb +++ b/ash/strings/ash_strings_sw.xtb
@@ -1080,7 +1080,7 @@ <translation id="5881663018261910378">Umezimwa</translation> <translation id="5887954372087850114">Dirisha la <ph name="WINDOW_TITLE" /> limewekwa kwenye <ph name="DESK_TITLE" /> na limeondolewa kwenye maeneokazi mengine yote</translation> <translation id="588817334757907802">Fungua faili katika kivinjari cha Chrome</translation> -<translation id="5895138241574237353">Zzima na uwashe</translation> +<translation id="5895138241574237353">Zima na uwashe</translation> <translation id="589817443623831496">Uchanganuzi wa pointi</translation> <translation id="5901316534475909376">Shift+Esc</translation> <translation id="5901630391730855834">Manjano</translation>
diff --git a/ash/system/accessibility/accessibility_detailed_view_pixeltest.cc b/ash/system/accessibility/accessibility_detailed_view_pixeltest.cc index 21558d1f..78acec72 100644 --- a/ash/system/accessibility/accessibility_detailed_view_pixeltest.cc +++ b/ash/system/accessibility/accessibility_detailed_view_pixeltest.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/system/unified/unified_system_tray.h" #include "ash/system/unified/unified_system_tray_bubble.h" #include "ash/system/unified/unified_system_tray_controller.h" @@ -9,20 +10,42 @@ #include "ash/test/ash_test_base.h" #include "ash/test/pixel/ash_pixel_differ.h" #include "ash/test/pixel/ash_pixel_test_init_params.h" +#include "base/test/scoped_feature_list.h" +#include "chromeos/constants/chromeos_features.h" namespace ash { // Pixel tests for the quick settings accessibility detailed view. -class AccessibilityDetailedViewPixelTest : public AshTestBase { +class AccessibilityDetailedViewPixelTest + : public AshTestBase, + public testing::WithParamInterface<bool> { public: + AccessibilityDetailedViewPixelTest() { + if (IsQsRevampEnabled()) { + feature_list_.InitWithFeatures( + {features::kQsRevamp, chromeos::features::kJelly}, {}); + } else { + feature_list_.InitWithFeatures( + {}, {features::kQsRevamp, chromeos::features::kJelly}); + } + } + + bool IsQsRevampEnabled() { return GetParam(); } + // AshTestBase: absl::optional<pixel_test::InitParams> CreatePixelTestInitParams() const override { return pixel_test::InitParams(); } + + base::test::ScopedFeatureList feature_list_; }; -TEST_F(AccessibilityDetailedViewPixelTest, Basics) { +INSTANTIATE_TEST_SUITE_P(QsRevamp, + AccessibilityDetailedViewPixelTest, + testing::Bool()); + +TEST_P(AccessibilityDetailedViewPixelTest, Basics) { UnifiedSystemTray* system_tray = GetPrimaryUnifiedSystemTray(); system_tray->ShowBubble(); ASSERT_TRUE(system_tray->bubble()); @@ -30,13 +53,19 @@ system_tray->bubble() ->unified_system_tray_controller() ->ShowAccessibilityDetailedView(); - views::View* detailed_view_container = - system_tray->bubble()->unified_view()->detailed_view_container(); + views::View* detailed_view_container; + if (IsQsRevampEnabled()) { + detailed_view_container = + system_tray->bubble()->quick_settings_view()->detailed_view_container(); + } else { + detailed_view_container = + system_tray->bubble()->unified_view()->detailed_view_container(); + } ASSERT_TRUE(detailed_view_container); EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( - "accessibility_detailed_view", - /*revision_number=*/1, detailed_view_container)); + "check_view", + /*revision_number=*/0, detailed_view_container)); } } // namespace ash
diff --git a/ash/system/hotspot/hotspot_detailed_view.cc b/ash/system/hotspot/hotspot_detailed_view.cc index 3eefcb2a..51008934 100644 --- a/ash/system/hotspot/hotspot_detailed_view.cc +++ b/ash/system/hotspot/hotspot_detailed_view.cc
@@ -133,6 +133,12 @@ toggle_ = toggle.get(); entry_row_->AddRightView(toggle.release()); + auto extra_icon = std::make_unique<views::ImageView>(); + extra_icon->SetVisible(false); + extra_icon->SetID(static_cast<int>(HotspotDetailedViewChildId::kExtraIcon)); + extra_icon_ = extra_icon.get(); + entry_row_->AddAdditionalRightView(extra_icon.release()); + // Allow the row to be taller than a typical tray menu item. entry_row_->SetExpandable(true); entry_row_->tri_view()->SetInsets(kToggleRowTriViewInsets); @@ -156,6 +162,7 @@ const HotspotState& state, const HotspotAllowStatus& allow_status) { toggle_->SetIsOn(IsEnabledOrEnabling(state)); + bool enabled = !IsIntermediateState(state) && allow_status == HotspotAllowStatus::kAllowed; entry_row_->SetEnabled(enabled); @@ -227,20 +234,11 @@ const HotspotAllowStatus& allow_status) { if (allow_status == HotspotAllowStatus::kAllowed || allow_status == HotspotAllowStatus::kDisallowedNoMobileData) { - RemoveExtraIcon(); + extra_icon_->SetVisible(false); return; } - if (!extra_icon_) { - std::unique_ptr<views::ImageView> extra_icon( - TrayPopupUtils::CreateMainImageView(/*use_wide_layout=*/false)); - extra_icon->SetBackground( - views::CreateSolidBackground(SK_ColorTRANSPARENT)); - extra_icon->SetID(static_cast<int>(HotspotDetailedViewChildId::kExtraIcon)); - extra_icon_ = extra_icon.get(); - entry_row_->AddAdditionalRightView(extra_icon.release()); - } - + extra_icon_->SetVisible(true); bool use_managed_icon = allow_status == HotspotAllowStatus::kDisallowedByPolicy; extra_icon_->SetImage(ui::ImageModel::FromVectorIcon( @@ -252,13 +250,6 @@ : IDS_ASH_HOTSPOT_DETAILED_VIEW_INFO_TOOLTIP_MOBILE_DATA_NOT_SUPPORTED)); } -void HotspotDetailedView::RemoveExtraIcon() { - if (extra_icon_ && extra_icon_->parent()) { - extra_icon_->parent()->RemoveChildView(extra_icon_); - extra_icon_ = nullptr; - } -} - BEGIN_METADATA(HotspotDetailedView, TrayDetailedView) END_METADATA
diff --git a/ash/system/hotspot/hotspot_detailed_view.h b/ash/system/hotspot/hotspot_detailed_view.h index ab6beb0..a78e5b8 100644 --- a/ash/system/hotspot/hotspot_detailed_view.h +++ b/ash/system/hotspot/hotspot_detailed_view.h
@@ -55,6 +55,7 @@ void CreateExtraTitleRowButtons() override; private: + friend class HotspotDetailedViewControllerTest; friend class HotspotDetailedViewTest; // Used for testing. Starts at 1 because view IDs should not be 0. @@ -85,7 +86,6 @@ void UpdateSubText(const hotspot_config::mojom::HotspotInfoPtr& hotspot_info); void UpdateExtraIcon( const hotspot_config::mojom::HotspotAllowStatus& allow_status); - void RemoveExtraIcon(); const raw_ptr<Delegate, ExperimentalAsh> delegate_;
diff --git a/ash/system/hotspot/hotspot_detailed_view_controller.cc b/ash/system/hotspot/hotspot_detailed_view_controller.cc new file mode 100644 index 0000000..06af20db --- /dev/null +++ b/ash/system/hotspot/hotspot_detailed_view_controller.cc
@@ -0,0 +1,89 @@ +// 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/system/hotspot/hotspot_detailed_view_controller.h" + +#include "ash/constants/ash_switches.h" +#include "ash/public/cpp/hotspot_config_service.h" +#include "ash/public/cpp/system_tray_client.h" +#include "ash/strings/grit/ash_strings.h" +#include "ash/system/model/system_tray_model.h" +#include "ash/system/tray/detailed_view_delegate.h" +#include "ash/system/unified/unified_system_tray_controller.h" +#include "ui/base/l10n/l10n_util.h" +#include "ui/views/view.h" + +namespace ash { + +using hotspot_config::mojom::HotspotAllowStatus; +using hotspot_config::mojom::HotspotInfoPtr; +using hotspot_config::mojom::HotspotState; + +namespace { + +bool NeedUpdateHotspotView(const HotspotInfoPtr& current_hotspot_info, + const HotspotInfoPtr& new_hotspot_info) { + if (!current_hotspot_info) { + return true; + } + + // No need to update the detailed view if hotspot configuration is changed. + return current_hotspot_info->state != new_hotspot_info->state || + current_hotspot_info->allow_status != new_hotspot_info->allow_status || + current_hotspot_info->client_count != new_hotspot_info->client_count; +} + +} // namespace + +HotspotDetailedViewController::HotspotDetailedViewController( + UnifiedSystemTrayController* tray_controller) + : detailed_view_delegate_( + std::make_unique<DetailedViewDelegate>(tray_controller)), + tray_controller_(tray_controller) { + GetHotspotConfigService( + remote_cros_hotspot_config_.BindNewPipeAndPassReceiver()); + remote_cros_hotspot_config_->AddObserver( + cros_hotspot_config_observer_receiver_.BindNewPipeAndPassRemote()); +} + +HotspotDetailedViewController::~HotspotDetailedViewController() = default; + +std::unique_ptr<views::View> HotspotDetailedViewController::CreateView() { + CHECK(!view_); + std::unique_ptr<HotspotDetailedView> hotspot_detailed_view = + std::make_unique<HotspotDetailedView>(detailed_view_delegate_.get(), + /*delegate=*/this); + view_ = hotspot_detailed_view.get(); + return hotspot_detailed_view; +} + +std::u16string HotspotDetailedViewController::GetAccessibleName() const { + return l10n_util::GetStringUTF16( + IDS_ASH_QUICK_SETTINGS_BUBBLE_HOTSPOT_SETTINGS_ACCESSIBLE_DESCRIPTION); +} + +void HotspotDetailedViewController::OnHotspotInfoChanged() { + remote_cros_hotspot_config_->GetHotspotInfo( + base::BindOnce(&HotspotDetailedViewController::OnGetHotspotInfo, + weak_ptr_factory_.GetWeakPtr())); +} + +void HotspotDetailedViewController::OnGetHotspotInfo( + HotspotInfoPtr hotspot_info) { + bool need_update_view = NeedUpdateHotspotView(hotspot_info_, hotspot_info); + hotspot_info_ = std::move(hotspot_info); + if (view_ && need_update_view) { + view_->UpdateViewForHotspot(mojo::Clone(hotspot_info_)); + } +} + +void HotspotDetailedViewController::OnToggleClicked(bool new_state) { + if (new_state) { + remote_cros_hotspot_config_->EnableHotspot(base::DoNothing()); + return; + } + remote_cros_hotspot_config_->DisableHotspot(base::DoNothing()); +} + +} // namespace ash
diff --git a/ash/system/hotspot/hotspot_detailed_view_controller.h b/ash/system/hotspot/hotspot_detailed_view_controller.h new file mode 100644 index 0000000..168d4ccdb --- /dev/null +++ b/ash/system/hotspot/hotspot_detailed_view_controller.h
@@ -0,0 +1,78 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_SYSTEM_HOTSPOT_HOTSPOT_DETAILED_VIEW_CONTROLLER_H_ +#define ASH_SYSTEM_HOTSPOT_HOTSPOT_DETAILED_VIEW_CONTROLLER_H_ + +#include <string> + +#include "ash/ash_export.h" +#include "ash/system/hotspot/hotspot_detailed_view.h" +#include "ash/system/unified/detailed_view_controller.h" +#include "base/memory/raw_ptr.h" +#include "base/memory/weak_ptr.h" +#include "chromeos/ash/services/hotspot_config/public/mojom/cros_hotspot_config.mojom.h" +#include "mojo/public/cpp/bindings/receiver.h" +#include "mojo/public/cpp/bindings/remote.h" + +namespace views { +class View; +} // namespace views + +namespace ash { + +class DetailedViewDelegate; +class UnifiedSystemTrayController; + +// This class encapsulates the logic to update the detailed Hotspot +// page within the quick settings and translate user interaction with the +// detailed view into Hotspot state changes. +class ASH_EXPORT HotspotDetailedViewController + : public DetailedViewController, + public hotspot_config::mojom::CrosHotspotConfigObserver, + public HotspotDetailedView::Delegate { + public: + explicit HotspotDetailedViewController( + UnifiedSystemTrayController* tray_controller); + HotspotDetailedViewController(const HotspotDetailedViewController&) = delete; + HotspotDetailedViewController& operator=( + const HotspotDetailedViewController&) = delete; + ~HotspotDetailedViewController() override; + + private: + friend class HotspotDetailedViewControllerTest; + + // DetailedViewController: + std::unique_ptr<views::View> CreateView() override; + std::u16string GetAccessibleName() const override; + + // hotspot_config::mojom::CrosHotspotConfigObserver: + void OnHotspotInfoChanged() override; + + // HotspotDetailedView::Delegate: + void OnToggleClicked(bool new_state) override; + + void OnGetHotspotInfo(hotspot_config::mojom::HotspotInfoPtr hotspot_info); + + const std::unique_ptr<DetailedViewDelegate> detailed_view_delegate_; + + mojo::Remote<hotspot_config::mojom::CrosHotspotConfig> + remote_cros_hotspot_config_; + mojo::Receiver<hotspot_config::mojom::CrosHotspotConfigObserver> + cros_hotspot_config_observer_receiver_{this}; + + hotspot_config::mojom::HotspotInfoPtr hotspot_info_; + + // Owned by views hierarchy. + raw_ptr<HotspotDetailedView, ExperimentalAsh> view_ = nullptr; + + raw_ptr<UnifiedSystemTrayController, ExperimentalAsh> tray_controller_ = + nullptr; + + base::WeakPtrFactory<HotspotDetailedViewController> weak_ptr_factory_{this}; +}; + +} // namespace ash + +#endif // ASH_SYSTEM_HOTSPOT_HOTSPOT_DETAILED_VIEW_CONTROLLER_H_
diff --git a/ash/system/hotspot/hotspot_detailed_view_controller_unittest.cc b/ash/system/hotspot/hotspot_detailed_view_controller_unittest.cc new file mode 100644 index 0000000..d3fc419 --- /dev/null +++ b/ash/system/hotspot/hotspot_detailed_view_controller_unittest.cc
@@ -0,0 +1,163 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/system/hotspot/hotspot_detailed_view_controller.h" + +#include "ash/constants/ash_features.h" +#include "ash/style/switch.h" +#include "ash/system/hotspot/hotspot_detailed_view.h" +#include "ash/system/tray/hover_highlight_view.h" +#include "ash/system/unified/unified_system_tray.h" +#include "ash/system/unified/unified_system_tray_bubble.h" +#include "ash/system/unified/unified_system_tray_controller.h" +#include "ash/test/ash_test_base.h" +#include "base/run_loop.h" +#include "base/test/scoped_feature_list.h" +#include "chromeos/ash/services/hotspot_config/public/cpp/cros_hotspot_config_test_helper.h" +#include "chromeos/ash/services/hotspot_config/public/mojom/cros_hotspot_config.mojom.h" +#include "ui/views/view.h" + +namespace ash { + +using hotspot_config::mojom::HotspotAllowStatus; +using hotspot_config::mojom::HotspotConfig; +using hotspot_config::mojom::HotspotConfigPtr; +using hotspot_config::mojom::HotspotInfo; +using hotspot_config::mojom::HotspotState; + +class HotspotDetailedViewControllerTest : public AshTestBase { + public: + HotspotDetailedViewControllerTest() = default; + ~HotspotDetailedViewControllerTest() override = default; + + void SetUp() override { + scoped_feature_list_.InitWithFeatures( + {features::kHotspot, features::kQsRevamp}, {}); + cros_hotspot_config_test_helper_ = + std::make_unique<hotspot_config::CrosHotspotConfigTestHelper>( + /*use_fake_implementation=*/true); + AshTestBase::SetUp(); + + GetPrimaryUnifiedSystemTray()->ShowBubble(); + + UnifiedSystemTrayController* unified_system_tray_controller = + GetPrimaryUnifiedSystemTray() + ->bubble() + ->unified_system_tray_controller(); + unified_system_tray_controller->ShowHotspotDetailedView(); + hotspot_detailed_view_controller_ = + static_cast<HotspotDetailedViewController*>( + unified_system_tray_controller->detailed_view_controller()); + + // Spin the runloop to have hotspot_detailed_view_controller_ observe the + // hotspot info change. + base::RunLoop().RunUntilIdle(); + } + + void TearDown() override { + AshTestBase::TearDown(); + cros_hotspot_config_test_helper_.reset(); + } + + void UpdateHotspotInfo(HotspotState state, + HotspotAllowStatus allow_status, + int client_count = 0, + HotspotConfigPtr config = {}) { + auto hotspot_info = HotspotInfo::New(); + hotspot_info->state = state; + hotspot_info->allow_status = allow_status; + hotspot_info->client_count = client_count; + hotspot_info->config = std::move(config); + cros_hotspot_config_test_helper_->SetFakeHotspotInfo( + std::move(hotspot_info)); + // Spin the runloop to observe the hotspot info change. + base::RunLoop().RunUntilIdle(); + } + + void EnableAndDisableHotspotOnce() { + UpdateHotspotInfo(HotspotState::kEnabled, HotspotAllowStatus::kAllowed); + UpdateHotspotInfo(HotspotState::kDisabled, HotspotAllowStatus::kAllowed); + } + + HotspotDetailedView::Delegate* hotspot_detailed_view_delegate() { + return hotspot_detailed_view_controller_; + } + + HotspotDetailedView* hotspot_detailed_view() { + return hotspot_detailed_view_controller_->view_; + } + + Switch* GetToggleButton() { return hotspot_detailed_view()->toggle_; } + + void AssertSubtextLabel(const std::u16string& expected_text) { + HoverHighlightView* entry_row = hotspot_detailed_view()->entry_row_; + if (expected_text.empty()) { + EXPECT_FALSE(entry_row->sub_text_label()); + return; + } + ASSERT_TRUE(entry_row->sub_text_label()); + EXPECT_TRUE(entry_row->sub_text_label()->GetVisible()); + EXPECT_EQ(expected_text, entry_row->sub_text_label()->GetText()); + } + + protected: + base::test::ScopedFeatureList scoped_feature_list_; + raw_ptr<HotspotDetailedViewController, ExperimentalAsh> + hotspot_detailed_view_controller_; + std::unique_ptr<hotspot_config::CrosHotspotConfigTestHelper> + cros_hotspot_config_test_helper_; +}; + +TEST_F(HotspotDetailedViewControllerTest, ToggleClicked) { + ASSERT_TRUE(hotspot_detailed_view_controller_); + UpdateHotspotInfo(HotspotState::kDisabled, HotspotAllowStatus::kAllowed); + + ASSERT_TRUE(hotspot_detailed_view()); + Switch* toggle = GetToggleButton(); + ASSERT_TRUE(toggle); + EXPECT_FALSE(toggle->GetIsOn()); + + hotspot_detailed_view_delegate()->OnToggleClicked(/*new_state=*/true); + // Spin the runloop to have cros_hotspot_config finish enable hotspot and + // notify the hotspot_info change. + base::RunLoop().RunUntilIdle(); + EXPECT_TRUE(toggle->GetIsOn()); + hotspot_detailed_view_delegate()->OnToggleClicked(/*new_state=*/false); + + // Spin the runloop to have cros_hotspot_config finish disable hotspot and + // notify the hotspot_info change. + base::RunLoop().RunUntilIdle(); + EXPECT_FALSE(toggle->GetIsOn()); +} + +TEST_F(HotspotDetailedViewControllerTest, NotifiesWhenHotspotInfoChanges) { + ASSERT_TRUE(hotspot_detailed_view_controller_); + UpdateHotspotInfo(HotspotState::kDisabled, HotspotAllowStatus::kAllowed); + + ASSERT_TRUE(hotspot_detailed_view()); + Switch* toggle = GetToggleButton(); + ASSERT_TRUE(toggle); + EXPECT_FALSE(toggle->GetIsOn()); + + UpdateHotspotInfo(HotspotState::kEnabled, HotspotAllowStatus::kAllowed); + EXPECT_TRUE(toggle->GetIsOn()); + AssertSubtextLabel(u"On, no devices connected"); + + UpdateHotspotInfo(HotspotState::kEnabled, HotspotAllowStatus::kAllowed, + /*client_count=*/1); + EXPECT_TRUE(toggle->GetIsOn()); + AssertSubtextLabel(u"1 device connected"); + + // Updating the hotspot configuration should not update hotspot detailed + // view. + auto config = HotspotConfig::New(); + config->ssid = "hotspot_ssid"; + config->passphrase = "hotspot_passphrase"; + UpdateHotspotInfo(HotspotState::kEnabled, HotspotAllowStatus::kAllowed, + /*client_count=*/1, std::move(config)); + EXPECT_TRUE(toggle->GetIsOn()); + AssertSubtextLabel(u"1 device connected"); +} + +} // namespace ash
diff --git a/ash/system/hotspot/hotspot_detailed_view_unittest.cc b/ash/system/hotspot/hotspot_detailed_view_unittest.cc index 4bd57eb..f44c448 100644 --- a/ash/system/hotspot/hotspot_detailed_view_unittest.cc +++ b/ash/system/hotspot/hotspot_detailed_view_unittest.cc
@@ -190,7 +190,7 @@ AssertEntryRowEnabled(/*expected_enabled=*/true); AssertToggleOn(/*expected_toggle_on=*/true); views::ImageView* extra_icon = GetExtraIcon(); - EXPECT_FALSE(extra_icon); + EXPECT_FALSE(extra_icon->GetVisible()); UpdateHotspotView(HotspotState::kEnabled, HotspotAllowStatus::kAllowed, 1); AssertSubtextLabel(u"1 device connected"); @@ -208,7 +208,7 @@ AssertEntryRowEnabled(/*expected_enabled=*/false); AssertToggleOn(/*expected_toggle_on=*/true); views::ImageView* extra_icon = GetExtraIcon(); - EXPECT_FALSE(extra_icon); + EXPECT_FALSE(extra_icon->GetVisible()); } TEST_F(HotspotDetailedViewTest, HotspotDisablingUI) { @@ -220,7 +220,7 @@ AssertEntryRowEnabled(/*expected_enabled=*/false); AssertToggleOn(/*expected_toggle_on=*/false); views::ImageView* extra_icon = GetExtraIcon(); - EXPECT_FALSE(extra_icon); + EXPECT_FALSE(extra_icon->GetVisible()); } TEST_F(HotspotDetailedViewTest, HotspotDisabledAndAllowedUI) { @@ -232,7 +232,7 @@ AssertEntryRowEnabled(/*expected_enabled=*/true); AssertToggleOn(/*expected_toggle_on=*/false); views::ImageView* extra_icon = GetExtraIcon(); - EXPECT_FALSE(extra_icon); + EXPECT_FALSE(extra_icon->GetVisible()); } TEST_F(HotspotDetailedViewTest, HotspotDisabledAndNoMobileNetworkUI) { @@ -245,7 +245,7 @@ AssertEntryRowEnabled(/*expected_enabled=*/false); AssertToggleOn(/*expected_toggle_on=*/false); views::ImageView* extra_icon = GetExtraIcon(); - EXPECT_FALSE(extra_icon); + EXPECT_FALSE(extra_icon->GetVisible()); } TEST_F(HotspotDetailedViewTest, @@ -256,12 +256,12 @@ ASSERT_TRUE(hotspot_detailed_view_); AssertTextLabel(kHotspotTitle); AssertSubtextLabel(std::u16string()); - views::ImageView* extra_icon = GetExtraIcon(); - ASSERT_TRUE(extra_icon); - EXPECT_EQ(u"Your mobile network doesn't support hotspot", - extra_icon->GetTooltipText()); AssertEntryRowEnabled(/*expected_enabled=*/false); AssertToggleOn(/*expected_toggle_on=*/false); + views::ImageView* extra_icon = GetExtraIcon(); + EXPECT_TRUE(extra_icon->GetVisible()); + EXPECT_EQ(u"Your mobile network doesn't support hotspot", + extra_icon->GetTooltipText()); } TEST_F(HotspotDetailedViewTest, HotspotDisabledAndBlockedByPolicyUI) { @@ -271,12 +271,12 @@ ASSERT_TRUE(hotspot_detailed_view_); AssertTextLabel(kHotspotTitle); AssertSubtextLabel(std::u16string()); - views::ImageView* extra_icon = GetExtraIcon(); - ASSERT_TRUE(extra_icon); - EXPECT_EQ(u"This setting is managed by your administrator", - extra_icon->GetTooltipText()); AssertEntryRowEnabled(/*expected_enabled=*/false); AssertToggleOn(/*expected_toggle_on=*/false); + views::ImageView* extra_icon = GetExtraIcon(); + EXPECT_TRUE(extra_icon->GetVisible()); + EXPECT_EQ(u"This setting is managed by your administrator", + extra_icon->GetTooltipText()); } TEST_F(HotspotDetailedViewTest, PressingEntryRowNotifiesDelegate) {
diff --git a/ash/system/hotspot/hotspot_feature_pod_controller.cc b/ash/system/hotspot/hotspot_feature_pod_controller.cc index abadb1d..bc3f28f 100644 --- a/ash/system/hotspot/hotspot_feature_pod_controller.cc +++ b/ash/system/hotspot/hotspot_feature_pod_controller.cc
@@ -133,8 +133,7 @@ } TrackDiveInUMA(); - // TODO(b/274154971): Show hotspot detailed view when - // HotspotDetailedViewController is added. + tray_controller_->ShowHotspotDetailedView(); } void HotspotFeaturePodController::TrackToggleHotspotUMA(
diff --git a/ash/system/hotspot/hotspot_feature_pod_controller_unittest.cc b/ash/system/hotspot/hotspot_feature_pod_controller_unittest.cc index ecce949b..38914e2 100644 --- a/ash/system/hotspot/hotspot_feature_pod_controller_unittest.cc +++ b/ash/system/hotspot/hotspot_feature_pod_controller_unittest.cc
@@ -107,6 +107,15 @@ base::RunLoop().RunUntilIdle(); } + void ExpectHotspotDetailedViewShown() { + TrayDetailedView* detailed_view = GetPrimaryUnifiedSystemTray() + ->bubble() + ->quick_settings_view() + ->GetDetailedViewForTest(); + ASSERT_TRUE(detailed_view); + EXPECT_TRUE(views::IsViewClass<HotspotDetailedView>(detailed_view)); + } + protected: base::test::ScopedFeatureList scoped_feature_list_; std::unique_ptr<hotspot_config::CrosHotspotConfigTestHelper> @@ -119,7 +128,7 @@ EXPECT_FALSE(hotspot_feature_tile_->GetVisible()); } -TEST_F(HotspotFeaturePodControllerTest, HotspotEnabled) { +TEST_F(HotspotFeaturePodControllerTest, PressLabelWhenHotspotEnabled) { EnableAndDisableHotspotOnce(); UpdateHotspotInfo(HotspotState::kEnabled, HotspotAllowStatus::kAllowed); @@ -136,6 +145,28 @@ EXPECT_EQ(u"Toggle Hotspot. Hotspot is on, 2 devices connected.", hotspot_feature_tile_->icon_button()->GetTooltipText()); + // Press on the label should navigate to the detailed page without toggle + // hotspot. + PressLabel(); + ExpectHotspotDetailedViewShown(); + EXPECT_TRUE(hotspot_feature_tile_->IsToggled()); +} + +TEST_F(HotspotFeaturePodControllerTest, PressIconWhenHotspotEnabled) { + EnableAndDisableHotspotOnce(); + UpdateHotspotInfo(HotspotState::kEnabled, HotspotAllowStatus::kAllowed); + + EXPECT_TRUE(hotspot_feature_tile_->GetVisible()); + EXPECT_TRUE(hotspot_feature_tile_->GetEnabled()); + EXPECT_TRUE(hotspot_feature_tile_->IsToggled()); + EXPECT_EQ(u"Hotspot", hotspot_feature_tile_->label()->GetText()); + EXPECT_EQ(u"On", hotspot_feature_tile_->sub_label()->GetText()); + EXPECT_EQ(u"Toggle Hotspot. Hotspot is on, no device connected.", + hotspot_feature_tile_->icon_button()->GetTooltipText()); + EXPECT_EQ(u"Show hotspot details. Hotspot is on.", + hotspot_feature_tile_->GetTooltipText()); + + // Press on the icon should toggle hotspot. PressIcon(); EXPECT_FALSE(hotspot_feature_tile_->IsToggled()); EXPECT_TRUE(hotspot_feature_tile_->GetVisible()); @@ -156,10 +187,14 @@ hotspot_feature_tile_->icon_button()->GetTooltipText()); EXPECT_EQ(u"Show hotspot details. Hotspot is enabling.", hotspot_feature_tile_->GetTooltipText()); + + // Press on the icon should navigate to the detailed page but not to toggle + // hotspot. PressIcon(); EXPECT_TRUE(hotspot_feature_tile_->IsToggled()); EXPECT_TRUE(hotspot_feature_tile_->GetVisible()); EXPECT_TRUE(hotspot_feature_tile_->GetEnabled()); + ExpectHotspotDetailedViewShown(); } TEST_F(HotspotFeaturePodControllerTest, HotspotDisabling) { @@ -175,13 +210,18 @@ hotspot_feature_tile_->icon_button()->GetTooltipText()); EXPECT_EQ(u"Show hotspot details. Hotspot is disabling.", hotspot_feature_tile_->GetTooltipText()); + + // Press on the icon should navigate to the detailed page but not to toggle + // hotspot. PressIcon(); EXPECT_TRUE(hotspot_feature_tile_->IsToggled()); EXPECT_TRUE(hotspot_feature_tile_->GetVisible()); EXPECT_TRUE(hotspot_feature_tile_->GetEnabled()); + ExpectHotspotDetailedViewShown(); } -TEST_F(HotspotFeaturePodControllerTest, HotspotDisabledAllowEnable) { +TEST_F(HotspotFeaturePodControllerTest, + PressIconWhenHotspotDisabledAndAllowEnable) { EnableAndDisableHotspotOnce(); UpdateHotspotInfo(HotspotState::kDisabled, HotspotAllowStatus::kAllowed); @@ -194,10 +234,38 @@ hotspot_feature_tile_->icon_button()->GetTooltipText()); EXPECT_EQ(u"Toggle Hotspot. Hotspot is off.", hotspot_feature_tile_->GetTooltipText()); + + // Press on the icon should toggle hotspot and navigate to the detailed page. PressIcon(); EXPECT_TRUE(hotspot_feature_tile_->IsToggled()); EXPECT_TRUE(hotspot_feature_tile_->GetVisible()); EXPECT_TRUE(hotspot_feature_tile_->GetEnabled()); + ExpectHotspotDetailedViewShown(); +} + +TEST_F(HotspotFeaturePodControllerTest, + PressLabelWhenHotspotDisabledAndAllowEnable) { + EnableAndDisableHotspotOnce(); + UpdateHotspotInfo(HotspotState::kDisabled, HotspotAllowStatus::kAllowed); + + EXPECT_TRUE(hotspot_feature_tile_->GetVisible()); + EXPECT_TRUE(hotspot_feature_tile_->GetEnabled()); + EXPECT_FALSE(hotspot_feature_tile_->IsToggled()); + EXPECT_EQ(u"Hotspot", hotspot_feature_tile_->label()->GetText()); + EXPECT_EQ(u"Off", hotspot_feature_tile_->sub_label()->GetText()); + EXPECT_EQ(u"Toggle Hotspot. Hotspot is off.", + hotspot_feature_tile_->icon_button()->GetTooltipText()); + EXPECT_EQ(u"Toggle Hotspot. Hotspot is off.", + hotspot_feature_tile_->GetTooltipText()); + + // Press on the drive in label should toggle hotspot and navigate to the + // detailed page. + UpdateHotspotInfo(HotspotState::kDisabled, HotspotAllowStatus::kAllowed); + PressLabel(); + EXPECT_TRUE(hotspot_feature_tile_->IsToggled()); + EXPECT_TRUE(hotspot_feature_tile_->GetVisible()); + EXPECT_TRUE(hotspot_feature_tile_->GetEnabled()); + ExpectHotspotDetailedViewShown(); } TEST_F(HotspotFeaturePodControllerTest, HotspotDisabledNoMobileNetwork) { @@ -214,10 +282,14 @@ hotspot_feature_tile_->icon_button()->GetTooltipText()); EXPECT_EQ(u"Show hotspot details. Hotspot is off.", hotspot_feature_tile_->GetTooltipText()); + + // Press on the icon should navigate to the detailed page but not to toggle + // hotspot. PressIcon(); EXPECT_FALSE(hotspot_feature_tile_->IsToggled()); EXPECT_TRUE(hotspot_feature_tile_->GetVisible()); EXPECT_TRUE(hotspot_feature_tile_->GetEnabled()); + ExpectHotspotDetailedViewShown(); } TEST_F(HotspotFeaturePodControllerTest, @@ -236,8 +308,14 @@ hotspot_feature_tile_->icon_button()->GetTooltipText()); EXPECT_EQ(u"Show hotspot details. Hotspot is off.", hotspot_feature_tile_->GetTooltipText()); + + // Press on the icon should navigate to the detailed page but not to toggle + // hotspot. PressIcon(); EXPECT_FALSE(hotspot_feature_tile_->IsToggled()); + EXPECT_TRUE(hotspot_feature_tile_->GetVisible()); + EXPECT_TRUE(hotspot_feature_tile_->GetEnabled()); + ExpectHotspotDetailedViewShown(); } TEST_F(HotspotFeaturePodControllerTest, HotspotDisabledBlockedByPolicy) { @@ -254,10 +332,14 @@ hotspot_feature_tile_->icon_button()->GetTooltipText()); EXPECT_EQ(u"Show hotspot details. Hotspot is off.", hotspot_feature_tile_->GetTooltipText()); + + // Press on the icon should navigate to the detailed page but not to toggle + // hotspot. PressIcon(); EXPECT_FALSE(hotspot_feature_tile_->IsToggled()); EXPECT_TRUE(hotspot_feature_tile_->GetVisible()); EXPECT_TRUE(hotspot_feature_tile_->GetEnabled()); + ExpectHotspotDetailedViewShown(); } TEST_F(HotspotFeaturePodControllerTest, LockScreen) { @@ -274,10 +356,13 @@ hotspot_feature_tile_->icon_button()->GetTooltipText()); EXPECT_EQ(u"Toggle Hotspot. Hotspot is off.", hotspot_feature_tile_->GetTooltipText()); + + // Press on the icon should toggle hotspot and navigate to the detailed page. PressIcon(); EXPECT_TRUE(hotspot_feature_tile_->IsToggled()); EXPECT_TRUE(hotspot_feature_tile_->GetVisible()); EXPECT_TRUE(hotspot_feature_tile_->GetEnabled()); + ExpectHotspotDetailedViewShown(); } TEST_F(HotspotFeaturePodControllerTest, LabelUMATracking) {
diff --git a/ash/system/toast/anchored_nudge.cc b/ash/system/toast/anchored_nudge.cc index f13a089..0c2118e 100644 --- a/ash/system/toast/anchored_nudge.cc +++ b/ash/system/toast/anchored_nudge.cc
@@ -89,11 +89,6 @@ AnchoredNudge::~AnchoredNudge() { hover_observer_.reset(); - - // Make sure `delegate_` knows that the nudge has been closed, for cases where - // the nudge wasn't closed through the manager (e.g. widget destroyed by - // test). - delegate_->OnNudgeClosed(id_); } const std::u16string& AnchoredNudge::GetText() {
diff --git a/ash/system/toast/anchored_nudge.h b/ash/system/toast/anchored_nudge.h index 0647ec2..74c8eab 100644 --- a/ash/system/toast/anchored_nudge.h +++ b/ash/system/toast/anchored_nudge.h
@@ -31,9 +31,6 @@ public: virtual ~Delegate() {} - // Called when the nudge is being destroyed. - virtual void OnNudgeClosed(const std::string& id) = 0; - // Called when the mouse hover enters or exits the nudge. virtual void OnNudgeHoverStateChanged(const std::string& id, bool is_hovering) = 0;
diff --git a/ash/system/toast/anchored_nudge_manager_impl.cc b/ash/system/toast/anchored_nudge_manager_impl.cc index 873191e6..d525267 100644 --- a/ash/system/toast/anchored_nudge_manager_impl.cc +++ b/ash/system/toast/anchored_nudge_manager_impl.cc
@@ -72,6 +72,42 @@ raw_ptr<AnchoredNudgeManagerImpl> anchored_nudge_manager_; }; +// A widget observer that is used to clean up the cached objects related to a +// nudge when its widget is destroying. +class AnchoredNudgeManagerImpl::NudgeWidgetObserver + : public views::WidgetObserver { + public: + NudgeWidgetObserver(AnchoredNudge* anchored_nudge, + AnchoredNudgeManagerImpl* anchored_nudge_manager) + : anchored_nudge_(anchored_nudge), + anchored_nudge_manager_(anchored_nudge_manager) { + anchored_nudge->GetWidget()->AddObserver(this); + } + + NudgeWidgetObserver(const NudgeWidgetObserver&) = delete; + + NudgeWidgetObserver& operator=(const NudgeWidgetObserver&) = delete; + + ~NudgeWidgetObserver() override { + if (anchored_nudge_ && anchored_nudge_->GetWidget()) { + anchored_nudge_->GetWidget()->RemoveObserver(this); + } + } + + // WidgetObserver: + void OnWidgetDestroying(views::Widget* widget) override { + widget->RemoveObserver(this); + anchored_nudge_manager_->HandleNudgeWidgetDestroying(anchored_nudge_->id()); + } + + private: + // Owned by the views hierarchy. + raw_ptr<AnchoredNudge> anchored_nudge_; + + // Owned by `Shell`. + raw_ptr<AnchoredNudgeManagerImpl> anchored_nudge_manager_; +}; + AnchoredNudgeManagerImpl::AnchoredNudgeManagerImpl() = default; AnchoredNudgeManagerImpl::~AnchoredNudgeManagerImpl() { @@ -118,6 +154,9 @@ anchored_nudge_widget->Show(); + nudge_widget_observers_[id] = + std::make_unique<NudgeWidgetObserver>(anchored_nudge_ptr, this); + anchor_view_observers_[id] = std::make_unique<AnchorViewObserver>( anchored_nudge_ptr, anchor_view, this); @@ -135,12 +174,8 @@ return; } - auto anchored_nudge_ptr = shown_nudges_[id]; - - dismiss_timers_.erase(id); - anchor_view_observers_.erase(id); - shown_nudges_.erase(id); - anchored_nudge_ptr->GetWidget()->CloseNow(); + // Cache cleanup occurs on `HandleNudgeWidgetDestroying()`. + shown_nudges_[id]->GetWidget()->CloseNow(); } void AnchoredNudgeManagerImpl::CloseAllNudges() { @@ -149,8 +184,12 @@ } } -void AnchoredNudgeManagerImpl::OnNudgeClosed(const std::string& id) { - Cancel(id); +void AnchoredNudgeManagerImpl::HandleNudgeWidgetDestroying( + const std::string& id) { + dismiss_timers_.erase(id); + anchor_view_observers_.erase(id); + nudge_widget_observers_.erase(id); + shown_nudges_.erase(id); } void AnchoredNudgeManagerImpl::OnNudgeHoverStateChanged(const std::string& id,
diff --git a/ash/system/toast/anchored_nudge_manager_impl.h b/ash/system/toast/anchored_nudge_manager_impl.h index 5fb377be..dfcb8d6 100644 --- a/ash/system/toast/anchored_nudge_manager_impl.h +++ b/ash/system/toast/anchored_nudge_manager_impl.h
@@ -34,8 +34,11 @@ // Closes all `shown_nudges_`. void CloseAllNudges(); + // Removes all cached objects (e.g. observers, timers) related to a nudge when + // its widget is destroying. + void HandleNudgeWidgetDestroying(const std::string& id); + // AnchoredNudge::Delegate: - void OnNudgeClosed(const std::string& id) override; void OnNudgeHoverStateChanged(const std::string& id, bool is_hovering) override; @@ -49,6 +52,7 @@ private: friend class AnchoredNudgeManagerImplTest; class AnchorViewObserver; + class NudgeWidgetObserver; // Manage the dismiss timer for the nudge with given `id`. void StartDismissTimer(const std::string& id); @@ -65,6 +69,12 @@ std::map<std::string, std::unique_ptr<AnchorViewObserver>> anchor_view_observers_; + // Maps an `AnchoredNudge` `id` to an observation of that nudge's widget, + // which is used to clean up the cached objects related to that nudge when its + // widget is destroying. + std::map<std::string, std::unique_ptr<NudgeWidgetObserver>> + nudge_widget_observers_; + // Maps an `AnchoredNudge` `id` to a timer that's used to dismiss the nudge // after `kAnchoredNudgeDuration` has passed. std::map<std::string, base::OneShotTimer> dismiss_timers_;
diff --git a/ash/system/tray/tray_constants.h b/ash/system/tray/tray_constants.h index f5d3f20..403f1d77 100644 --- a/ash/system/tray/tray_constants.h +++ b/ash/system/tray/tray_constants.h
@@ -30,6 +30,12 @@ // The width of the revamped tray menu. constexpr int kRevampedTrayMenuWidth = 400; +// TODO(b:277268122): Update once spec is finalized. +// Horizontal margins between the glanceable bubble and individual glanceables. +constexpr int kGlanceablesLeftRightMargin = 25; +constexpr int kGlanceablesVerticalMargin = 10; +constexpr int kTasksGlanceableMinHeight = 200; + constexpr int kTrayPopupAutoCloseDelayInSeconds = 2; constexpr int kTrayPopupAutoCloseDelayInSecondsWithSpokenFeedback = 5; constexpr int kTrayPopupPaddingHorizontal = 18;
diff --git a/ash/system/unified/date_tray_unittest.cc b/ash/system/unified/date_tray_unittest.cc index 4ea6075..56fc3bb 100644 --- a/ash/system/unified/date_tray_unittest.cc +++ b/ash/system/unified/date_tray_unittest.cc
@@ -4,6 +4,8 @@ #include "ash/system/unified/date_tray.h" +#include "ash/glanceables/glanceables_v2_controller.h" +#include "ash/glanceables/tasks/fake_glanceables_tasks_client.h" #include "ash/public/cpp/test/shell_test_api.h" #include "ash/shell.h" #include "ash/system/status_area_widget.h" @@ -11,6 +13,7 @@ #include "ash/system/time/time_tray_item_view.h" #include "ash/system/time/time_view.h" #include "ash/system/unified/glanceable_tray_bubble.h" +#include "ash/system/unified/tasks_bubble_view.h" #include "ash/system/unified/unified_system_tray_bubble.h" #include "ash/test/ash_test_base.h" #include "base/memory/raw_ptr.h" @@ -19,9 +22,14 @@ #include "base/time/time.h" #include "base/time/time_override.h" #include "ui/events/keycodes/keyboard_codes_posix.h" +#include "ui/views/controls/combobox/combobox.h" #include "ui/wm/public/activation_change_observer.h" #include "ui/wm/public/activation_client.h" +namespace { +constexpr char kUserEmail[] = "test_user@gmail.com"; +} + namespace ash { class DateTrayTest @@ -51,6 +59,9 @@ /*thread_ticks_override=*/nullptr); AshTestBase::SetUp(); + + SimulateUserLogin(GetAccountId(kUserEmail)); + widget_ = CreateFramelessTestWidget(); widget_->SetContentsView(std::make_unique<views::View>()); widget_->SetFullscreen(true); @@ -61,9 +72,22 @@ widget_->GetContentsView()->AddChildView(unified_system_tray_.get()); date_tray_->SetVisiblePreferred(true); date_tray_->unified_system_tray_->SetVisiblePreferred(true); + + if (AreGlanceablesV2Enabled()) { + fake_glanceables_tasks_client_ = + std::make_unique<FakeGlanceablesTasksClient>(); + Shell::Get()->glanceables_v2_controller()->UpdateClientsRegistration( + GetAccountId(kUserEmail), + GlanceablesV2Controller::ClientsRegistration{ + .tasks_client = fake_glanceables_tasks_client_.get()}); + } } void TearDown() override { + if (AreGlanceablesV2Enabled()) { + fake_glanceables_tasks_client_.reset(); + } + widget_.reset(); date_tray_ = nullptr; if (observering_activation_changes_) { @@ -125,8 +149,13 @@ GetUnifiedSystemTray()->CloseBubble(); } + AccountId GetAccountId(base::StringPiece email) { + return AccountId::FromUserEmail(std::string(email)); + } + private: std::unique_ptr<views::Widget> widget_; + std::unique_ptr<FakeGlanceablesTasksClient> fake_glanceables_tasks_client_; bool observering_activation_changes_ = false; // Owned by `widget_`. @@ -159,6 +188,29 @@ EXPECT_FALSE(AreContentsViewShown()); } +TEST_P(DateTrayTest, ShowTasksComboModel) { + LeftClickOn(GetDateTray()); + base::RunLoop().RunUntilIdle(); + EXPECT_TRUE(IsBubbleShown()); + EXPECT_TRUE(AreContentsViewShown()); + + if (!AreGlanceablesV2Enabled()) { + EXPECT_EQ(GetGlanceableTrayBubble(), nullptr); + } else { + EXPECT_TRUE(GetGlanceableTrayBubble()->GetTasksView()->GetVisible()); + EXPECT_FALSE(GetGlanceableTrayBubble()->GetTasksView()->IsMenuRunning()); + EXPECT_TRUE(GetGlanceableTrayBubble() + ->GetTasksView() + ->task_list_combo_box_view() + ->GetVisible()); + GestureTapOn( + GetGlanceableTrayBubble()->GetTasksView()->task_list_combo_box_view()); + PressAndReleaseKey(ui::VKEY_DOWN); + base::RunLoop().RunUntilIdle(); + EXPECT_TRUE(GetGlanceableTrayBubble()->GetTasksView()->IsMenuRunning()); + } +} + // Tests clicking/tapping the DateTray shows/closes the calendar bubble. TEST_P(DateTrayTest, ShowCalendarBubble) { base::HistogramTester histogram_tester;
diff --git a/ash/system/unified/glanceable_tray_bubble.cc b/ash/system/unified/glanceable_tray_bubble.cc index bb0d4cb..8c020786 100644 --- a/ash/system/unified/glanceable_tray_bubble.cc +++ b/ash/system/unified/glanceable_tray_bubble.cc
@@ -8,6 +8,8 @@ #include "ash/system/tray/tray_constants.h" #include "ash/system/tray/tray_event_filter.h" #include "ash/system/tray/tray_utils.h" +#include "ash/system/unified/glanceable_tray_bubble_view.h" +#include "ash/system/unified/tasks_bubble_view.h" namespace ash { @@ -27,15 +29,16 @@ init_params.reroute_event_handler = true; init_params.translucent = true; - bubble_view_ = new TrayBubbleView(init_params); + bubble_view_ = new GlanceableTrayBubbleView(init_params, tray_->shelf()); + // bubble_widget_ takes ownership of the bubble_view_. bubble_widget_ = views::BubbleDialogDelegateView::CreateBubble(bubble_view_); bubble_widget_->AddObserver(this); TrayBackgroundView::InitializeBubbleAnimations(bubble_widget_); bubble_view_->InitializeAndShowBubble(); tray->tray_event_filter()->AddBubble(this); - UpdateBubble(); + bubble_view_->UpdateBubble(); } GlanceableTrayBubble::~GlanceableTrayBubble() { @@ -68,17 +71,8 @@ return bubble_widget_; } -void GlanceableTrayBubble::UpdateBubble() { - // TODO(b:277268122): set real contents for glanceables view. - if (!title_label_) { - title_label_ = bubble_view_->AddChildView(std::make_unique<views::Label>()); - title_label_->SetText(u"Temp Title Label for Glanceables"); - } - - int max_height = CalculateMaxTrayBubbleHeight(); - bubble_view_->SetMaxHeight(max_height); - bubble_view_->ChangeAnchorAlignment(tray_->shelf()->alignment()); - bubble_view_->ChangeAnchorRect(tray_->shelf()->GetSystemTrayAnchorRect()); +TasksBubbleView* GlanceableTrayBubble::GetTasksView() const { + return bubble_view_->GetTasksView(); } bool GlanceableTrayBubble::IsBubbleActive() const {
diff --git a/ash/system/unified/glanceable_tray_bubble.h b/ash/system/unified/glanceable_tray_bubble.h index b37b3393..776875b 100644 --- a/ash/system/unified/glanceable_tray_bubble.h +++ b/ash/system/unified/glanceable_tray_bubble.h
@@ -11,6 +11,9 @@ namespace ash { +class GlanceableTrayBubbleView; +class TasksBubbleView; + // Manages the bubble that contains GlanceableTrayView. // Shows the bubble on the constructor, and closes the bubble on the destructor. class ASH_EXPORT GlanceableTrayBubble : public TrayBubbleBase { @@ -30,7 +33,8 @@ TrayBubbleView* GetBubbleView() const override; views::Widget* GetBubbleWidget() const override; bool IsBubbleActive() const; - TrayBubbleView* GetBubbleView() { return bubble_view_; } + + TasksBubbleView* GetTasksView() const; private: void UpdateBubble(); @@ -46,12 +50,9 @@ raw_ptr<views::Widget, ExperimentalAsh> bubble_widget_ = nullptr; // Main bubble view anchored to `tray_`. - raw_ptr<TrayBubbleView, ExperimentalAsh> bubble_view_ = nullptr; - - // Stand-in title label for glanceables_view_. - // TODO(b:277268122): Remove and replace with actual glanceable content. - raw_ptr<views::Label, ExperimentalAsh> title_label_ = nullptr; + raw_ptr<GlanceableTrayBubbleView, ExperimentalAsh> bubble_view_ = nullptr; }; + } // namespace ash #endif // ASH_SYSTEM_UNIFIED_GLANCEABLE_TRAY_BUBBLE_H_
diff --git a/ash/system/unified/glanceable_tray_bubble_view.cc b/ash/system/unified/glanceable_tray_bubble_view.cc new file mode 100644 index 0000000..50401a5 --- /dev/null +++ b/ash/system/unified/glanceable_tray_bubble_view.cc
@@ -0,0 +1,42 @@ +// 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/system/unified/glanceable_tray_bubble_view.h" + +#include "ash/shelf/shelf.h" +#include "ash/system/tray/tray_bubble_view.h" +#include "ash/system/tray/tray_constants.h" +#include "ash/system/tray/tray_utils.h" +#include "ash/system/unified/tasks_bubble_view.h" +#include "ui/views/controls/label.h" + +namespace ash { + +GlanceableTrayBubbleView::GlanceableTrayBubbleView( + const InitParams& init_params, + Shelf* shelf) + : TrayBubbleView(init_params), shelf_(shelf) {} + +void GlanceableTrayBubbleView::UpdateBubble() { + // TODO(b:277268122): set real contents for glanceables view. + if (!tasks_bubble_view_) { + tasks_bubble_view_ = AddChildView(std::make_unique<TasksBubbleView>()); + } + + int max_height = CalculateMaxTrayBubbleHeight(); + SetMaxHeight(max_height); + ChangeAnchorAlignment(shelf_->alignment()); + ChangeAnchorRect(shelf_->GetSystemTrayAnchorRect()); +} + +bool GlanceableTrayBubbleView::CanActivate() const { + return true; +} + +gfx::Size GlanceableTrayBubbleView::CalculatePreferredSize() const { + // TODO(b:277268122): Scale height based on task_items_list_view_ contents. + return gfx::Size(kRevampedTrayMenuWidth, kTasksGlanceableMinHeight); +} + +} // namespace ash
diff --git a/ash/system/unified/glanceable_tray_bubble_view.h b/ash/system/unified/glanceable_tray_bubble_view.h new file mode 100644 index 0000000..feedda2 --- /dev/null +++ b/ash/system/unified/glanceable_tray_bubble_view.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 ASH_SYSTEM_UNIFIED_GLANCEABLE_TRAY_BUBBLE_VIEW_H_ +#define ASH_SYSTEM_UNIFIED_GLANCEABLE_TRAY_BUBBLE_VIEW_H_ + +#include "ash/system/tray/tray_bubble_view.h" + +namespace views { +class Label; +} + +namespace ash { +class TasksBubbleView; +class Shelf; + +class GlanceableTrayBubbleView : public TrayBubbleView { + public: + GlanceableTrayBubbleView(const InitParams& init_params, Shelf* shelf); + GlanceableTrayBubbleView(const GlanceableTrayBubbleView&) = delete; + GlanceableTrayBubbleView& operator=(const GlanceableTrayBubbleView&) = delete; + ~GlanceableTrayBubbleView() override = default; + + void UpdateBubble(); + + TasksBubbleView* GetTasksView() const { return tasks_bubble_view_; } + + // TrayBubbleView: + bool CanActivate() const override; + + // views::View: + gfx::Size CalculatePreferredSize() const override; + + private: + const raw_ptr<Shelf, ExperimentalAsh> shelf_; + + // Stand-in title label for glanceables_view_. + // TODO(b:277268122): Remove and replace with actual glanceable content. + raw_ptr<views::Label, ExperimentalAsh> title_label_ = nullptr; + + // Bubble view for the tasks glanceable. Owned by bubble_view_. + raw_ptr<TasksBubbleView, ExperimentalAsh> tasks_bubble_view_ = nullptr; +}; + +} // namespace ash + +#endif // ASH_SYSTEM_UNIFIED_GLANCEABLE_TRAY_BUBBLE_VIEW_H_
diff --git a/ash/system/unified/tasks_bubble_view.cc b/ash/system/unified/tasks_bubble_view.cc new file mode 100644 index 0000000..18c0d48 --- /dev/null +++ b/ash/system/unified/tasks_bubble_view.cc
@@ -0,0 +1,111 @@ +// 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/system/unified/tasks_bubble_view.h" + +#include "ash/glanceables/glanceables_v2_controller.h" +#include "ash/glanceables/tasks/glanceables_tasks_client.h" +#include "ash/shell.h" +#include "ash/system/tray/tray_constants.h" +#include "ash/system/unified/tasks_combobox_model.h" +#include "ui/base/metadata/metadata_impl_macros.h" +#include "ui/views/accessibility/view_accessibility.h" +#include "ui/views/controls/button/image_button.h" +#include "ui/views/controls/combobox/combobox.h" +#include "ui/views/controls/image_view.h" +#include "ui/views/layout/flex_layout_view.h" +#include "ui/views/vector_icons.h" + +namespace ash { + +TasksBubbleView::TasksBubbleView() { + SetCrossAxisAlignment(views::LayoutAlignment::kCenter); + SetOrientation(views::LayoutOrientation::kVertical); + + if (ash::Shell::Get()->glanceables_v2_controller()->GetTasksClient()) { + ash::Shell::Get() + ->glanceables_v2_controller() + ->GetTasksClient() + ->GetTaskLists(base::BindOnce(&TasksBubbleView::InitViews, + weak_ptr_factory_.GetWeakPtr())); + } +} + +TasksBubbleView::~TasksBubbleView() = default; + +bool TasksBubbleView::IsMenuRunning() { + return task_list_combo_box_view_ && + task_list_combo_box_view_->IsMenuRunning(); +} + +void TasksBubbleView::GetAccessibleNodeData(ui::AXNodeData* node_data) { + // TODO(b:277268122): Implement accessibility behavior. + if (!GetVisible()) { + return; + } + node_data->role = ax::mojom::Role::kListBox; + node_data->SetName(u"Glanceables Bubble Task View Accessible Name"); +} + +gfx::Size TasksBubbleView::CalculatePreferredSize() const { + // TODO(b:277268122): Scale height based on task_items_list_view_ contents. + return gfx::Size(kRevampedTrayMenuWidth - 2 * kGlanceablesLeftRightMargin, + kTasksGlanceableMinHeight - 2 * kGlanceablesVerticalMargin); +} + +void TasksBubbleView::InitViews(ui::ListModel<GlanceablesTaskList>* task_list) { + // TODO(b:277268122): Implement empty tasks glanceable state. + if (task_list->item_count() == 0) { + return; + } + + tasks_header_view_ = AddChildView(std::make_unique<views::FlexLayoutView>()); + tasks_header_view_->SetCrossAxisAlignment(views::LayoutAlignment::kStretch); + tasks_header_view_->SetOrientation(views::LayoutOrientation::kHorizontal); + tasks_header_view_->SetProperty( + views::kFlexBehaviorKey, + views::FlexSpecification(views::MinimumFlexSizeRule::kPreferred, + views::MaximumFlexSizeRule::kPreferred)); + + task_items_list_view_ = + AddChildView(std::make_unique<views::FlexLayoutView>()); + task_items_list_view_->SetCrossAxisAlignment( + views::LayoutAlignment::kStretch); + task_items_list_view_->SetOrientation(views::LayoutOrientation::kVertical); + task_items_list_view_->SetProperty( + views::kFlexBehaviorKey, + views::FlexSpecification(views::MinimumFlexSizeRule::kPreferred, + views::MaximumFlexSizeRule::kPreferred)); + + task_icon_view_ = + tasks_header_view_->AddChildView(std::make_unique<views::ImageView>()); + task_list_combo_box_view_ = + tasks_header_view_->AddChildView(std::make_unique<views::Combobox>( + std::make_unique<TasksComboboxModel>(task_list))); + // TODO(b:277268122): Implement accessibility behavior. + task_list_combo_box_view_->SetTooltipTextAndAccessibleName( + u"Task list selector"); + task_list_combo_box_view_->SetCallback(base::BindRepeating( + &TasksBubbleView::SelectedTasksListChanged, base::Unretained(this))); + task_list_combo_box_view_->SetSelectedIndex(0); + + action_button_ = + tasks_header_view_->AddChildView(views::ImageButton::CreateIconButton( + base::BindRepeating(&TasksBubbleView::ActionButtonPressed, + base::Unretained(this)), + views::kLaunchIcon, u"Open tasks app")); +} + +void TasksBubbleView::ActionButtonPressed() { + // TODO(b:277268122): launch tasks web app. +} + +void TasksBubbleView::SelectedTasksListChanged() { + // TODO(b:277268122): Update task_items_list_view_. +} + +BEGIN_METADATA(TasksBubbleView, views::View) +END_METADATA + +} // namespace ash
diff --git a/ash/system/unified/tasks_bubble_view.h b/ash/system/unified/tasks_bubble_view.h new file mode 100644 index 0000000..1a31a73 --- /dev/null +++ b/ash/system/unified/tasks_bubble_view.h
@@ -0,0 +1,102 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_SYSTEM_UNIFIED_TASKS_BUBBLE_VIEW_H_ +#define ASH_SYSTEM_UNIFIED_TASKS_BUBBLE_VIEW_H_ + +#include "ash/ash_export.h" +#include "ash/glanceables/tasks/glanceables_tasks_types.h" +#include "base/memory/raw_ptr.h" +#include "ui/base/metadata/metadata_header_macros.h" +#include "ui/base/models/list_model.h" +#include "ui/views/layout/flex_layout_view.h" +#include "ui/views/metadata/view_factory.h" + +namespace views { +class Combobox; +class ImageButton; +class ImageView; +} // namespace views + +namespace ash { + +// 'contents_view_' uses nested `FlexLayoutView`s to layout the tasks bubble. +// configurations. +// +---------------------------------------------------------------+ +// |`contents_view_` | +// | +-----------------------------------------------------------+ | +// | |tasks_header_view_ | | +// | +-----------------------------------------------------------+ | +// | +-----------------------------------------------------------+ | +// | |task_items_list_view_ | | +// | +-----------------------------------------------------------+ | +// +---------------------------------------------------------------+ +// +// TODO(b:277268122): Override action_button_ class. +// +----------------------------------------------------------------+ +// |tasks_header_view_ | +// |+---------------+ +-------------------------+ +--------------+ | +// ||task_icon_view_| |task_list_combo_box_view_| |action_button_| | +// |+---------------+ +-------------------------+ +--------------+ | +// +----------------------------------------------------------------+ +// +// TODO(b:277268122): Add TaskItemListView and TaskCheckboxView classes. +// +----------------------------------------------------------------+ +// |task_items_list_view_ | +// | +----------------------------------------------------------- + | +// | |TaskCheckboxView | | +// | +----------------------------------------------------------- + | +// | +----------------------------------------------------------- + | +// | |TaskCheckboxView | | +// | +----------------------------------------------------------- + | +// +----------------------------------------------------------------+ + +class ASH_EXPORT TasksBubbleView : public views::FlexLayoutView { + public: + METADATA_HEADER(TasksBubbleView); + + TasksBubbleView(); + TasksBubbleView(const TasksBubbleView&) = delete; + TasksBubbleView& operator=(const TasksBubbleView&) = delete; + ~TasksBubbleView() override; + + bool IsMenuRunning(); + + views::Combobox* task_list_combo_box_view() const { + return task_list_combo_box_view_; + } + + // views::View: + void GetAccessibleNodeData(ui::AXNodeData* node_data) override; + gfx::Size CalculatePreferredSize() const override; + + private: + friend class DateTrayTest; + // Setup child views. + void InitViews(ui::ListModel<GlanceablesTaskList>* task_list); + + // Handles on-click behavior for `action_button_` + void ActionButtonPressed(); + + // Handles switching between tasks lists. + void SelectedTasksListChanged(); + + raw_ptr<views::FlexLayoutView, ExperimentalAsh> tasks_header_view_ = + nullptr; // Owned by views hierarchy. + raw_ptr<views::ImageView, ExperimentalAsh> task_icon_view_ = + nullptr; // Owned by views hierarchy. + raw_ptr<views::Combobox, ExperimentalAsh> task_list_combo_box_view_ = + nullptr; // Owned by views hierarchy. + // TODO(b:277268122): replace stand-in button. + raw_ptr<views::ImageButton, ExperimentalAsh> action_button_ = + nullptr; // Owned by views hierarchy. + raw_ptr<views::FlexLayoutView, ExperimentalAsh> task_items_list_view_ = + nullptr; // Owned by views hierarchy. + + base::WeakPtrFactory<TasksBubbleView> weak_ptr_factory_{this}; +}; + +} // namespace ash + +#endif // ASH_SYSTEM_UNIFIED_TASKS_BUBBLE_VIEW_H_
diff --git a/ash/system/unified/tasks_combobox_model.cc b/ash/system/unified/tasks_combobox_model.cc new file mode 100644 index 0000000..816abaa22 --- /dev/null +++ b/ash/system/unified/tasks_combobox_model.cc
@@ -0,0 +1,31 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <string> + +#include "ash/system/unified/tasks_combobox_model.h" + +#include "base/strings/utf_string_conversions.h" + +namespace ash { + +TasksComboboxModel::TasksComboboxModel( + ui::ListModel<GlanceablesTaskList>* task_list) + : task_list_(task_list) {} + +TasksComboboxModel::~TasksComboboxModel() = default; + +size_t TasksComboboxModel::GetItemCount() const { + return task_list_->item_count(); +} + +std::u16string TasksComboboxModel::GetItemAt(size_t index) const { + return base::UTF8ToUTF16(task_list_->GetItemAt(index)->title); +} + +absl::optional<size_t> TasksComboboxModel::GetDefaultIndex() const { + return 0; +} + +} // namespace ash
diff --git a/ash/system/unified/tasks_combobox_model.h b/ash/system/unified/tasks_combobox_model.h new file mode 100644 index 0000000..aaf81f3fe --- /dev/null +++ b/ash/system/unified/tasks_combobox_model.h
@@ -0,0 +1,42 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_SYSTEM_UNIFIED_TASKS_COMBOBOX_MODEL_H_ +#define ASH_SYSTEM_UNIFIED_TASKS_COMBOBOX_MODEL_H_ + +#include <string> + +#include "ash/glanceables/tasks/glanceables_tasks_types.h" +#include "ui/base/models/combobox_model.h" +#include "ui/base/models/list_model.h" + +namespace ash { + +// A simple data model for the glanceables tasks combobox. This is used to +// switch between different available tasks lists in the glanceable. +class TasksComboboxModel : public ui::ComboboxModel { + public: + explicit TasksComboboxModel(ui::ListModel<GlanceablesTaskList>* tasks_list); + + TasksComboboxModel(const TasksComboboxModel&) = delete; + TasksComboboxModel& operator=(const TasksComboboxModel&) = delete; + + ~TasksComboboxModel() override; + + private: + void SetTaskLists(); + + // Overridden from ui::ComboboxModel: + size_t GetItemCount() const override; + std::u16string GetItemAt(size_t index) const override; + absl::optional<size_t> GetDefaultIndex() const override; + + private: + // Owned by `GlanceableTasksClientImpl`. + const raw_ptr<ui::ListModel<GlanceablesTaskList>, ExperimentalAsh> task_list_; +}; + +} // namespace ash + +#endif // ASH_SYSTEM_UNIFIED_TASKS_COMBOBOX_MODEL_H_
diff --git a/ash/system/unified/unified_system_tray_controller.cc b/ash/system/unified/unified_system_tray_controller.cc index c23c5eb..12dbd70 100644 --- a/ash/system/unified/unified_system_tray_controller.cc +++ b/ash/system/unified/unified_system_tray_controller.cc
@@ -30,6 +30,7 @@ #include "ash/system/cast/cast_feature_pod_controller.h" #include "ash/system/cast/unified_cast_detailed_view_controller.h" #include "ash/system/dark_mode/dark_mode_feature_pod_controller.h" +#include "ash/system/hotspot/hotspot_detailed_view_controller.h" #include "ash/system/hotspot/hotspot_feature_pod_controller.h" #include "ash/system/ime/ime_feature_pod_controller.h" #include "ash/system/ime/unified_ime_detailed_view_controller.h" @@ -475,6 +476,12 @@ ShowDetailedView(std::make_unique<NetworkDetailedViewController>(this)); } +void UnifiedSystemTrayController::ShowHotspotDetailedView() { + DCHECK(features::IsQsRevampEnabled()); + + ShowDetailedView(std::make_unique<HotspotDetailedViewController>(this)); +} + void UnifiedSystemTrayController::ShowBluetoothDetailedView() { // QSRevamp does not allow expand/collapse of the System Tray. if (!IsExpanded() && !features::IsQsRevampEnabled()) {
diff --git a/ash/system/unified/unified_system_tray_controller.h b/ash/system/unified/unified_system_tray_controller.h index 8ef1ba8c..74fee42 100644 --- a/ash/system/unified/unified_system_tray_controller.h +++ b/ash/system/unified/unified_system_tray_controller.h
@@ -114,6 +114,8 @@ // Show the detailed view of network. If |force| is true, it shows the // detailed view even if it's collapsed. Called from the view. void ShowNetworkDetailedView(bool force); + // Show the detailed view of hotspot. Called from the view. + void ShowHotspotDetailedView(); // Show the detailed view of bluetooth. If collapsed, it doesn't show the // detailed view. Called from the view. void ShowBluetoothDetailedView();
diff --git a/ash/system/video_conference/video_conference_tray_controller.cc b/ash/system/video_conference/video_conference_tray_controller.cc index 567358e..d68ae86 100644 --- a/ash/system/video_conference/video_conference_tray_controller.cc +++ b/ash/system/video_conference/video_conference_tray_controller.cc
@@ -10,8 +10,7 @@ #include "ash/constants/ash_pref_names.h" #include "ash/constants/notifier_catalogs.h" #include "ash/public/cpp/shelf_types.h" -#include "ash/public/cpp/system/toast_data.h" -#include "ash/public/cpp/system/toast_manager.h" +#include "ash/public/cpp/system/anchored_nudge_data.h" #include "ash/root_window_controller.h" #include "ash/session/session_controller_impl.h" #include "ash/shelf/shelf.h" @@ -19,6 +18,7 @@ #include "ash/strings/grit/ash_strings.h" #include "ash/style/icon_button.h" #include "ash/system/status_area_widget.h" +#include "ash/system/toast/anchored_nudge_manager_impl.h" #include "ash/system/video_conference/video_conference_common.h" #include "ash/system/video_conference/video_conference_tray.h" #include "base/check.h" @@ -35,13 +35,13 @@ namespace ash { namespace { -// The ID for the "Speak-on-mute detected" toast. -constexpr char kVideoConferenceTraySpeakOnMuteDetectedId[] = - "video_conference_tray_toast_ids.speak_on_mute_detected"; +// The ID for the "Speak-on-mute detected" nudge. +constexpr char kVideoConferenceTraySpeakOnMuteDetectedNudgeId[] = + "video_conference_tray_nudge_ids.speak_on_mute_detected"; -// The ID for the "use while disabled" toast. -constexpr char kVideoConferenceTrayUseWhileDisabledToastId[] = - "video_conference_tray_toast_ids.use_while_disable"; +// The ID for the "use while disabled" nudge. +constexpr char kVideoConferenceTrayUseWhileDisabledNudgeId[] = + "video_conference_tray_nudge_ids.use_while_disabled"; // The cool down duration for speak-on-mute detection notification in seconds. constexpr int KSpeakOnMuteNotificationCoolDownDuration = 60; @@ -60,6 +60,13 @@ return false; } +VideoConferenceTray* GetVcTrayInActiveWindow() { + return RootWindowController::ForWindow( + Shell::Get()->GetRootWindowForNewWindows()) + ->GetStatusAreaWidget() + ->video_conference_tray(); +} + } // namespace VideoConferenceTrayController::VideoConferenceTrayController() { @@ -135,7 +142,7 @@ void VideoConferenceTrayController::SetCameraMuted(bool muted) { // If the camera is hardware-muted, do nothing here. if (camera_muted_by_hardware_switch_) { - // TODO(b/272145024): Display a toast if camera button is clicked during + // TODO(b/272145024): Display a nudge if camera button is clicked during // hardware-muted. return; } @@ -277,15 +284,13 @@ if (!last_speak_on_mute_notification_time_.has_value() || (current_time - last_speak_on_mute_notification_time_.value()) .InSeconds() >= KSpeakOnMuteNotificationCoolDownDuration) { - ToastData toast_data( - kVideoConferenceTraySpeakOnMuteDetectedId, - ToastCatalogName::kVideoConferenceTraySpeakOnMuteDetected, + AnchoredNudgeData nudge_data( + kVideoConferenceTraySpeakOnMuteDetectedNudgeId, + AnchoredNudgeCatalogName::kVideoConferenceTraySpeakOnMuteDetected, l10n_util::GetStringUTF16( IDS_ASH_VIDEO_CONFERENCE_TOAST_SPEAK_ON_MUTE_DETECTED), - ToastData::kDefaultToastDuration, - /*visible_on_lock_screen=*/false); - toast_data.show_on_all_root_windows = true; - ToastManager::Get()->Show(std::move(toast_data)); + /*anchor_view=*/GetVcTrayInActiveWindow()->audio_icon()); + AnchoredNudgeManager::Get()->Show(nudge_data); last_speak_on_mute_notification_time_.emplace(current_time); } @@ -375,37 +380,37 @@ // TODO(b/273570886): Handle the case when both camera and microphone are // being used while disabled. std::u16string device_name; - int toast_text_id; + int text_id; + views::View* anchor_view = nullptr; switch (device) { case crosapi::mojom::VideoConferenceMediaDevice::kMicrophone: device_name = l10n_util::GetStringUTF16(IDS_ASH_VIDEO_CONFERENCE_MICROPHONE_NAME); - toast_text_id = + text_id = microphone_muted_by_hardware_switch_ ? IDS_ASH_VIDEO_CONFERENCE_TOAST_USE_WHILE_HARDWARE_DISABLED : IDS_ASH_VIDEO_CONFERENCE_TOAST_USE_WHILE_SOFTWARE_DISABLED; + anchor_view = GetVcTrayInActiveWindow()->audio_icon(); break; case crosapi::mojom::VideoConferenceMediaDevice::kCamera: device_name = l10n_util::GetStringUTF16(IDS_ASH_VIDEO_CONFERENCE_CAMERA_NAME); - toast_text_id = + text_id = camera_muted_by_hardware_switch_ ? IDS_ASH_VIDEO_CONFERENCE_TOAST_USE_WHILE_HARDWARE_DISABLED : IDS_ASH_VIDEO_CONFERENCE_TOAST_USE_WHILE_SOFTWARE_DISABLED; + anchor_view = GetVcTrayInActiveWindow()->camera_icon(); break; default: NOTREACHED(); return; } - ToastData toast_data( - kVideoConferenceTrayUseWhileDisabledToastId, - ToastCatalogName::kVideoConferenceTrayUseWhileDisabled, - l10n_util::GetStringFUTF16(toast_text_id, app_name, device_name), - ToastData::kDefaultToastDuration, - /*visible_on_lock_screen=*/false); - toast_data.show_on_all_root_windows = true; - ToastManager::Get()->Show(std::move(toast_data)); + AnchoredNudgeData nudge_data( + kVideoConferenceTrayUseWhileDisabledNudgeId, + AnchoredNudgeCatalogName::kVideoConferenceTrayUseWhileDisabled, + l10n_util::GetStringFUTF16(text_id, app_name, device_name), anchor_view); + AnchoredNudgeManager::Get()->Show(nudge_data); } void VideoConferenceTrayController::UpdateCameraIcons() {
diff --git a/ash/system/video_conference/video_conference_tray_controller_unittest.cc b/ash/system/video_conference/video_conference_tray_controller_unittest.cc index 6c7af01..6ee8748 100644 --- a/ash/system/video_conference/video_conference_tray_controller_unittest.cc +++ b/ash/system/video_conference/video_conference_tray_controller_unittest.cc
@@ -10,7 +10,7 @@ #include "ash/strings/grit/ash_strings.h" #include "ash/system/status_area_widget.h" #include "ash/system/status_area_widget_test_helper.h" -#include "ash/system/toast/toast_manager_impl.h" +#include "ash/system/toast/anchored_nudge_manager_impl.h" #include "ash/system/video_conference/fake_video_conference_tray_controller.h" #include "ash/system/video_conference/video_conference_common.h" #include "ash/system/video_conference/video_conference_tray.h" @@ -25,11 +25,25 @@ namespace ash { namespace { -constexpr char kVideoConferenceTraySpeakOnMuteDetectedId[] = - "video_conference_tray_toast_ids.speak_on_mute_detected"; -constexpr char kVideoConferenceTrayUseWhileDisabledToastId[] = - "video_conference_tray_toast_ids.use_while_disable"; +constexpr char kVideoConferenceTraySpeakOnMuteDetectedNudgeId[] = + "video_conference_tray_nudge_ids.speak_on_mute_detected"; + +constexpr char kVideoConferenceTrayUseWhileDisabledNudgeId[] = + "video_conference_tray_nudge_ids.use_while_disabled"; + +bool IsNudgeShown(const std::string& id) { + return Shell::Get()->anchored_nudge_manager()->IsNudgeShown(id); +} + +const std::u16string& GetNudgeText(const std::string& id) { + return Shell::Get()->anchored_nudge_manager()->GetNudgeText(id); +} + +views::View* GetNudgeAnchorView(const std::string& id) { + return Shell::Get()->anchored_nudge_manager()->GetNudgeAnchorView(id); +} + } // namespace class VideoConferenceTrayControllerTest : public AshTestBase { @@ -60,6 +74,8 @@ controller_.reset(); } + // Returns the VC tray from the primary display. If testing multiple displays, + // VC nudges will be shown anchored to the tray in the active display. VideoConferenceTray* video_conference_tray() { return StatusAreaWidgetTestHelper::GetStatusAreaWidget() ->video_conference_tray(); @@ -73,6 +89,19 @@ return video_conference_tray()->audio_icon(); } + // Make the tray and buttons visible by setting `VideoConferenceMediaState`, + // and return the state so it can be modified. + VideoConferenceMediaState SetTrayAndButtonsVisible() { + VideoConferenceMediaState state; + state.has_media_app = true; + state.has_camera_permission = true; + state.has_microphone_permission = true; + state.is_capturing_screen = true; + state.is_capturing_microphone = true; + controller()->UpdateWithMediaState(state); + return state; + } + FakeVideoConferenceTrayController* controller() { return controller_.get(); } private: @@ -167,131 +196,138 @@ TEST_F(VideoConferenceTrayControllerTest, HandleCameraUsedWhileSoftwaredDisabled) { - auto* toast_manager = Shell::Get()->toast_manager(); auto* app_name = u"app_name"; auto camera_device_name = l10n_util::GetStringUTF16(IDS_ASH_VIDEO_CONFERENCE_CAMERA_NAME); + auto* nudge_id = kVideoConferenceTrayUseWhileDisabledNudgeId; + + SetTrayAndButtonsVisible(); controller()->OnCameraSWPrivacySwitchStateChanged( cros::mojom::CameraPrivacySwitchState::ON); - // No toast show be shown before `HandleDeviceUsedWhileDisabled()` is called. - EXPECT_FALSE( - toast_manager->IsRunning(kVideoConferenceTrayUseWhileDisabledToastId)); + // No nudge is shown before `HandleDeviceUsedWhileDisabled()` is called. + EXPECT_FALSE(IsNudgeShown(nudge_id)); controller()->HandleDeviceUsedWhileDisabled( crosapi::mojom::VideoConferenceMediaDevice::kCamera, app_name); - // Toast should be displayed. Showing that app is accessing while camera is + // Nudge should be displayed. Showing that app is accessing while camera is // software-muted. - EXPECT_TRUE( - toast_manager->IsRunning(kVideoConferenceTrayUseWhileDisabledToastId)); - EXPECT_EQ(l10n_util::GetStringFUTF16( + ASSERT_TRUE(IsNudgeShown(nudge_id)); + EXPECT_EQ(GetNudgeAnchorView(nudge_id), camera_icon()); + EXPECT_EQ(GetNudgeText(nudge_id), + l10n_util::GetStringFUTF16( IDS_ASH_VIDEO_CONFERENCE_TOAST_USE_WHILE_SOFTWARE_DISABLED, - app_name, camera_device_name), - toast_manager->GetCurrentToastDataForTesting().text); + app_name, camera_device_name)); } TEST_F(VideoConferenceTrayControllerTest, HandleMicrophoneUsedWhileSoftwaredDisabled) { - auto* toast_manager = Shell::Get()->toast_manager(); auto* app_name = u"app_name"; auto microphone_device_name = l10n_util::GetStringUTF16(IDS_ASH_VIDEO_CONFERENCE_MICROPHONE_NAME); + auto* nudge_id = kVideoConferenceTrayUseWhileDisabledNudgeId; + + SetTrayAndButtonsVisible(); controller()->OnInputMuteChanged( /*mute_on=*/true, CrasAudioHandler::InputMuteChangeMethod::kOther); - // No toast show be shown before `HandleDeviceUsedWhileDisabled()` is called. - EXPECT_FALSE( - toast_manager->IsRunning(kVideoConferenceTrayUseWhileDisabledToastId)); + // No nudge is shown before `HandleDeviceUsedWhileDisabled()` is called. + EXPECT_FALSE(IsNudgeShown(nudge_id)); controller()->HandleDeviceUsedWhileDisabled( crosapi::mojom::VideoConferenceMediaDevice::kMicrophone, app_name); - // Toast should be displayed. Showing that app is accessing while microphone + // Nudge should be displayed. Showing that app is accessing while microphone // is software-muted. - EXPECT_TRUE( - toast_manager->IsRunning(kVideoConferenceTrayUseWhileDisabledToastId)); - EXPECT_EQ(l10n_util::GetStringFUTF16( + ASSERT_TRUE(IsNudgeShown(nudge_id)); + EXPECT_EQ(GetNudgeAnchorView(nudge_id), audio_icon()); + EXPECT_EQ(GetNudgeText(nudge_id), + l10n_util::GetStringFUTF16( IDS_ASH_VIDEO_CONFERENCE_TOAST_USE_WHILE_SOFTWARE_DISABLED, - app_name, microphone_device_name), - toast_manager->GetCurrentToastDataForTesting().text); + app_name, microphone_device_name)); } TEST_F(VideoConferenceTrayControllerTest, HandleCameraUsedWhileHardwaredDisabled) { - auto* toast_manager = Shell::Get()->toast_manager(); auto* app_name = u"app_name"; auto camera_device_name = l10n_util::GetStringUTF16(IDS_ASH_VIDEO_CONFERENCE_CAMERA_NAME); + auto* nudge_id = kVideoConferenceTrayUseWhileDisabledNudgeId; + + SetTrayAndButtonsVisible(); controller()->OnCameraHWPrivacySwitchStateChanged( /*device_id=*/"device_id", cros::mojom::CameraPrivacySwitchState::ON); - // No toast show be shown before `HandleDeviceUsedWhileDisabled()` is called. - EXPECT_FALSE( - toast_manager->IsRunning(kVideoConferenceTrayUseWhileDisabledToastId)); + // No nudge is shown before `HandleDeviceUsedWhileDisabled()` is called. + EXPECT_FALSE(IsNudgeShown(nudge_id)); controller()->HandleDeviceUsedWhileDisabled( crosapi::mojom::VideoConferenceMediaDevice::kCamera, app_name); - // Toast should be displayed. Showing that app is accessing while camera is + // Nudge should be displayed. Showing that app is accessing while camera is // hardware-muted. - EXPECT_TRUE( - toast_manager->IsRunning(kVideoConferenceTrayUseWhileDisabledToastId)); - EXPECT_EQ(l10n_util::GetStringFUTF16( + ASSERT_TRUE(IsNudgeShown(nudge_id)); + EXPECT_EQ(GetNudgeAnchorView(nudge_id), camera_icon()); + EXPECT_EQ(GetNudgeText(nudge_id), + l10n_util::GetStringFUTF16( IDS_ASH_VIDEO_CONFERENCE_TOAST_USE_WHILE_HARDWARE_DISABLED, - app_name, camera_device_name), - toast_manager->GetCurrentToastDataForTesting().text); + app_name, camera_device_name)); } TEST_F(VideoConferenceTrayControllerTest, HandleMicrophoneUsedWhileHardwaredDisabled) { - auto* toast_manager = Shell::Get()->toast_manager(); auto* app_name = u"app_name"; auto microphone_device_name = l10n_util::GetStringUTF16(IDS_ASH_VIDEO_CONFERENCE_MICROPHONE_NAME); + auto* nudge_id = kVideoConferenceTrayUseWhileDisabledNudgeId; + + SetTrayAndButtonsVisible(); controller()->OnInputMuteChanged( /*mute_on=*/true, CrasAudioHandler::InputMuteChangeMethod::kPhysicalShutter); - // No toast show be shown before `HandleDeviceUsedWhileDisabled()` is called. - EXPECT_FALSE( - toast_manager->IsRunning(kVideoConferenceTrayUseWhileDisabledToastId)); + // No nudge is shown before `HandleDeviceUsedWhileDisabled()` is called. + EXPECT_FALSE(IsNudgeShown(nudge_id)); controller()->HandleDeviceUsedWhileDisabled( crosapi::mojom::VideoConferenceMediaDevice::kMicrophone, app_name); - // Toast should be displayed. Showing that app is accessing while microphone + // Nudge should be displayed. Showing that app is accessing while microphone // is hardware-muted. - EXPECT_TRUE( - toast_manager->IsRunning(kVideoConferenceTrayUseWhileDisabledToastId)); - EXPECT_EQ(l10n_util::GetStringFUTF16( + ASSERT_TRUE(IsNudgeShown(nudge_id)); + EXPECT_EQ(GetNudgeAnchorView(nudge_id), audio_icon()); + EXPECT_EQ(GetNudgeText(nudge_id), + l10n_util::GetStringFUTF16( IDS_ASH_VIDEO_CONFERENCE_TOAST_USE_WHILE_HARDWARE_DISABLED, - app_name, microphone_device_name), - toast_manager->GetCurrentToastDataForTesting().text); + app_name, microphone_device_name)); } -TEST_F(VideoConferenceTrayControllerTest, SpeakOnMuteToast) { - auto* toast_manager = Shell::Get()->toast_manager(); +TEST_F(VideoConferenceTrayControllerTest, SpeakOnMuteNudge) { + auto* nudge_id = kVideoConferenceTraySpeakOnMuteDetectedNudgeId; - // No toast show be shown before `OnSpeakOnMuteDetected()` is called. - EXPECT_FALSE( - toast_manager->IsRunning(kVideoConferenceTraySpeakOnMuteDetectedId)); + SetTrayAndButtonsVisible(); - // Toast should be displayed. Showing that client is speaking while on mute. + // No nudge is shown before `OnSpeakOnMuteDetected()` is called. + EXPECT_FALSE(IsNudgeShown(nudge_id)); + + // Nudge should be displayed. Showing that client is speaking while on mute. controller()->OnSpeakOnMuteDetected(); - EXPECT_TRUE( - toast_manager->IsRunning(kVideoConferenceTraySpeakOnMuteDetectedId)); + ASSERT_TRUE(IsNudgeShown(nudge_id)); + EXPECT_EQ(GetNudgeAnchorView(nudge_id), audio_icon()); + EXPECT_EQ(GetNudgeText(nudge_id), + l10n_util::GetStringUTF16( + IDS_ASH_VIDEO_CONFERENCE_TOAST_SPEAK_ON_MUTE_DETECTED)); - toast_manager->Cancel(kVideoConferenceTraySpeakOnMuteDetectedId); + Shell::Get()->anchored_nudge_manager()->Cancel(nudge_id); - // Toast should not be displayed as there is a cool down period for the toast. + // Nudge should not be displayed as there is a cool down period for the nudge. controller()->OnSpeakOnMuteDetected(); - EXPECT_FALSE( - toast_manager->IsRunning(kVideoConferenceTraySpeakOnMuteDetectedId)); + EXPECT_FALSE(IsNudgeShown(nudge_id)); controller()->OnInputMuteChanged( /*mute_on=*/false, @@ -300,11 +336,10 @@ /*mute_on=*/true, CrasAudioHandler::InputMuteChangeMethod::kPhysicalShutter); - // Toast should be displayed again as the mute action will reset the toast + // Nudge should be displayed again as the mute action will reset the nudge // cool down timer. controller()->OnSpeakOnMuteDetected(); - EXPECT_TRUE( - toast_manager->IsRunning(kVideoConferenceTraySpeakOnMuteDetectedId)); + EXPECT_TRUE(IsNudgeShown(nudge_id)); } } // namespace ash
diff --git a/ash/user_education/views/help_bubble_factory_views_ash.cc b/ash/user_education/views/help_bubble_factory_views_ash.cc index ccd4bdf..b90c598 100644 --- a/ash/user_education/views/help_bubble_factory_views_ash.cc +++ b/ash/user_education/views/help_bubble_factory_views_ash.cc
@@ -189,7 +189,6 @@ void HelpBubbleViewsAsh::OnElementBoundsChanged(ui::TrackedElement* element) { if (help_bubble_view_ && element == anchor_element_) { - help_bubble_view_->SetForceAnchorRect(element->GetScreenBounds()); OnAnchorBoundsChanged(); } }
diff --git a/ash/user_education/views/help_bubble_view_ash.cc b/ash/user_education/views/help_bubble_view_ash.cc index 4570c97..bb4b51f 100644 --- a/ash/user_education/views/help_bubble_view_ash.cc +++ b/ash/user_education/views/help_bubble_view_ash.cc
@@ -10,7 +10,11 @@ #include <string> #include <utility> +#include "ash/bubble/bubble_utils.h" #include "ash/style/style_util.h" +#include "ash/style/typography.h" +#include "ash/user_education/user_education_types.h" +#include "ash/user_education/user_education_util.h" #include "base/functional/bind.h" #include "base/memory/raw_ptr.h" #include "base/metrics/user_metrics.h" @@ -81,9 +85,15 @@ // Corner radii for the help bubble. Note that when the help bubble is not // center aligned with its anchor, the corner closest to the anchor has a // smaller radius. -constexpr int kBubbleCornerRadiusDefault = 16; +constexpr int kBubbleCornerRadiusDefault = 24; constexpr int kBubbleCornerRadiusSmall = 2; +// Margins for the help bubble. +constexpr int kBubbleMargins = 8; + +// Shadow elevation for the help bubble. +constexpr int kBubbleShadowElevation = 3; + // Translates from HelpBubbleArrow to the Views equivalent. views::BubbleBorder::Arrow TranslateArrow( user_education::HelpBubbleArrow arrow) { @@ -290,16 +300,17 @@ : BubbleDialogDelegateView(anchor.view, TranslateArrow(params.arrow), views::BubbleBorder::STANDARD_SHADOW), - id_(id) { - if (anchor.rect.has_value()) { - SetForceAnchorRect(anchor.rect.value()); - } else { - // When hosted within a `views::ScrollView`, the anchor view may be - // (partially) outside the viewport. Ensure that the anchor view is visible. - anchor.view->ScrollViewToVisible(); - } - DCHECK(anchor.view) - << "A bubble that closes on blur must be initially focused."; + id_(id), + style_(user_education_util::GetHelpBubbleStyle(params.extended_properties) + .value_or(HelpBubbleStyle::kDialog)) { + // NOTE: Nudge style help bubbles cannot activate. + SetCanActivate(style_ != HelpBubbleStyle::kNudge); + + // When hosted within a `views::ScrollView`, the anchor view may be + // (partially) outside the viewport. Ensure that the anchor view is visible. + CHECK(anchor.view); + anchor.view->ScrollViewToVisible(); + UseCompactMargins(); // Default timeout depends on whether non-close buttons are present. @@ -375,16 +386,19 @@ // Add title (optional) and body label. if (!params.title_text.empty()) { - labels_.push_back(top_text_container->AddChildView( - std::make_unique<views::Label>(params.title_text))); + labels_.push_back( + top_text_container->AddChildView(bubble_utils::CreateLabel( + TypographyToken::kCrosBody1, params.title_text))); views::Label* label = - AddChildViewAt(std::make_unique<views::Label>(params.body_text), + AddChildViewAt(bubble_utils::CreateLabel(TypographyToken::kCrosBody1, + params.body_text), GetIndexOf(button_container).value()); labels_.push_back(label); label->SetProperty(views::kElementIdentifierKey, kBodyTextIdForTesting); } else { - views::Label* label = top_text_container->AddChildView( - std::make_unique<views::Label>(params.body_text)); + views::Label* label = + top_text_container->AddChildView(bubble_utils::CreateLabel( + TypographyToken::kCrosBody1, params.body_text)); labels_.push_back(label); label->SetProperty(views::kElementIdentifierKey, kBodyTextIdForTesting); } @@ -397,24 +411,30 @@ } // Add close button. - std::u16string alt_text = params.close_button_alt_text; + // NOTE: Nudge style help bubbles do not have buttons. + if (style_ != HelpBubbleStyle::kNudge) { + std::u16string alt_text = params.close_button_alt_text; - // This can be empty if a test doesn't set it. Set a reasonable default to - // avoid an assertion (generated when a button with no text has no - // accessible name). - if (alt_text.empty()) { - alt_text = l10n_util::GetStringUTF16(IDS_CLOSE); + // This can be empty if a test doesn't set it. Set a reasonable default to + // avoid an assertion (generated when a button with no text has no + // accessible name). + if (alt_text.empty()) { + alt_text = l10n_util::GetStringUTF16(IDS_CLOSE); + } + + // Since we set the cancel callback, we will use CancelDialog() to dismiss. + close_button_ = + (params.progress ? progress_container : top_text_container) + ->AddChildView(std::make_unique<ClosePromoButton>( + alt_text, base::BindRepeating(&DialogDelegate::CancelDialog, + base::Unretained(this)))); } - // Since we set the cancel callback, we will use CancelDialog() to dismiss. - close_button_ = - (params.progress ? progress_container : top_text_container) - ->AddChildView(std::make_unique<ClosePromoButton>( - alt_text, base::BindRepeating(&DialogDelegate::CancelDialog, - base::Unretained(this)))); - // Add other buttons. + // NOTE: Nudge style help bubbles do not have buttons. if (!params.buttons.empty()) { + CHECK_NE(style_, HelpBubbleStyle::kNudge); + auto run_callback_and_close = [](HelpBubbleViewAsh* bubble_view, base::OnceClosure callback) { // We want to call the button callback before deleting the bubble in case @@ -643,6 +663,15 @@ GetWidget()->Close(); } +std::unique_ptr<views::NonClientFrameView> +HelpBubbleViewAsh::CreateNonClientFrameView(views::Widget* widget) { + auto frame = BubbleDialogDelegateView::CreateNonClientFrameView(widget); + auto* frame_ptr = static_cast<views::BubbleFrameView*>(frame.get()); + frame_ptr->bubble_border()->set_md_shadow_elevation(kBubbleShadowElevation); + frame_ptr->set_use_anchor_window_bounds(false); + return frame; +} + void HelpBubbleViewAsh::OnAnchorBoundsChanged() { views::BubbleDialogDelegateView::OnAnchorBoundsChanged(); UpdateRoundedCorners(); @@ -687,8 +716,9 @@ views::BubbleDialogDelegateView::OnThemeChanged(); const auto* color_provider = GetColorProvider(); - const SkColor background_color = - color_provider->GetColor(cros_tokens::kCrosSysDialogContainer); + const SkColor background_color = color_provider->GetColor( + style_ == HelpBubbleStyle::kDialog ? cros_tokens::kCrosSysDialogContainer + : cros_tokens::kCrosSysBaseElevated); set_color(background_color); const SkColor foreground_color = @@ -722,27 +752,39 @@ } gfx::Rect HelpBubbleViewAsh::GetAnchorRect() const { - gfx::Rect default_anchor_rect = BubbleDialogDelegateView::GetAnchorRect(); - if (!local_anchor_bounds_) { - return default_anchor_rect; + // Update `anchor_rect` to respect margins. + gfx::Rect anchor_rect = BubbleDialogDelegateView::GetAnchorRect(); + anchor_rect.Outset(kBubbleMargins); + + // Update `anchor_rect` so that the anchor view and help bubble view are + // corner-aligned instead of edge-aligned, as would be the default. + switch (GetBubbleFrameView()->bubble_border()->arrow()) { + case views::BubbleBorder::LEFT_TOP: + case views::BubbleBorder::TOP_LEFT: + anchor_rect = gfx::Rect(anchor_rect.bottom_right(), gfx::Size()); + break; + case views::BubbleBorder::RIGHT_TOP: + case views::BubbleBorder::TOP_RIGHT: + anchor_rect = gfx::Rect(anchor_rect.bottom_left(), gfx::Size()); + break; + case views::BubbleBorder::BOTTOM_LEFT: + case views::BubbleBorder::LEFT_BOTTOM: + anchor_rect = gfx::Rect(anchor_rect.top_right(), gfx::Size()); + break; + case views::BubbleBorder::BOTTOM_RIGHT: + case views::BubbleBorder::RIGHT_BOTTOM: + anchor_rect = gfx::Rect(anchor_rect.origin(), gfx::Size()); + break; + case views::BubbleBorder::BOTTOM_CENTER: + case views::BubbleBorder::LEFT_CENTER: + case views::BubbleBorder::RIGHT_CENTER: + case views::BubbleBorder::TOP_CENTER: + case views::BubbleBorder::NONE: + case views::BubbleBorder::FLOAT: + break; } - // Ensure that we are not trying to clamp the anchor bounds to a completely - // empty bounds. - gfx::Size size = default_anchor_rect.size(); - size.SetToMax({1, 1}); - - // Clamp the local bounds to the size of the anchor view. - const int left = std::clamp(local_anchor_bounds_->x(), 0, size.width() - 1); - const int right = std::clamp(local_anchor_bounds_->right(), 1, size.width()); - const int top = std::clamp(local_anchor_bounds_->y(), 0, size.height() - 1); - const int bottom = - std::clamp(local_anchor_bounds_->bottom(), 1, size.height()); - gfx::Rect result(left, top, right - left, bottom - top); - - // Translate back to screen coordinates. - result.Offset(default_anchor_rect.OffsetFromOrigin()); - return result; + return anchor_rect; } // static @@ -779,12 +821,6 @@ return non_default_buttons_[index]; } -void HelpBubbleViewAsh::SetForceAnchorRect(gfx::Rect force_anchor_rect) { - force_anchor_rect.Offset( - -views::BubbleDialogDelegateView::GetAnchorRect().OffsetFromOrigin()); - local_anchor_bounds_ = force_anchor_rect; -} - void HelpBubbleViewAsh::UpdateRoundedCorners() { if (!GetWidget()) { return; @@ -795,10 +831,10 @@ constexpr float kSmall = kBubbleCornerRadiusSmall; // Cache anchor and help bubble bounds in screen coordinates. - const gfx::Rect anchor_rect = anchor_widget()->GetWindowBoundsInScreen(); + const gfx::Rect anchor_rect = GetAnchorRect(); const gfx::Point anchor_center = anchor_rect.CenterPoint(); - const gfx::Rect bounds = GetBoundsInScreen(); - const gfx::Point bounds_center = bounds.CenterPoint(); + const gfx::Rect bounds_rect = GetBoundsInScreen(); + const gfx::Point bounds_center = bounds_rect.CenterPoint(); // When the help bubble is not center aligned with its anchor, the corner // closest to the anchor has a smaller radius.
diff --git a/ash/user_education/views/help_bubble_view_ash.h b/ash/user_education/views/help_bubble_view_ash.h index dafabf0..5520f1b6 100644 --- a/ash/user_education/views/help_bubble_view_ash.h +++ b/ash/user_education/views/help_bubble_view_ash.h
@@ -36,6 +36,7 @@ namespace ash { enum class HelpBubbleId; +enum class HelpBubbleStyle; namespace internal { @@ -45,10 +46,6 @@ struct HelpBubbleAnchorParams { // This is the View to be anchored to (mandatory). raw_ptr<views::View> view = nullptr; - - // This is an optional override of the anchor rect in screen coordinates. - // If unspecified, the bubble is anchored as normal to `view`. - absl::optional<gfx::Rect> rect; }; } // namespace internal @@ -79,12 +76,13 @@ views::LabelButton* GetDefaultButtonForTesting() const; views::LabelButton* GetNonDefaultButtonForTesting(int index) const; - void SetForceAnchorRect(gfx::Rect force_anchor_rect); - HelpBubbleId id() const { return id_; } + HelpBubbleStyle style() const { return style_; } protected: // views::BubbleDialogDelegateView: + std::unique_ptr<views::NonClientFrameView> CreateNonClientFrameView( + views::Widget* widget) override; void OnAnchorBoundsChanged() override; bool OnMousePressed(const ui::MouseEvent& event) override; std::u16string GetAccessibleWindowTitle() const override; @@ -109,9 +107,7 @@ void UpdateRoundedCorners(); const HelpBubbleId id_; - - // If set, overrides the anchor bounds within the anchor view. - absl::optional<gfx::Rect> local_anchor_bounds_; + const HelpBubbleStyle style_; raw_ptr<views::ImageView> icon_view_ = nullptr; std::vector<views::Label*> labels_;
diff --git a/ash/user_education/views/help_bubble_view_ash_pixeltest.cc b/ash/user_education/views/help_bubble_view_ash_pixeltest.cc index 9acc4b9..43f0d32 100644 --- a/ash/user_education/views/help_bubble_view_ash_pixeltest.cc +++ b/ash/user_education/views/help_bubble_view_ash_pixeltest.cc
@@ -109,7 +109,7 @@ with_body_icon(), with_buttons(), with_progress()); EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( - "appearance", /*revision_number=*/3u, help_bubble_view, + "appearance", /*revision_number=*/4u, help_bubble_view, help_bubble_view->anchor_widget())); } @@ -175,7 +175,7 @@ /*with_buttons=*/true, /*with_progress=*/true); EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( - "placement", /*revision_number=*/3u, help_bubble_view, + "placement", /*revision_number=*/4u, help_bubble_view, help_bubble_view->anchor_widget())); }
diff --git a/ash/user_education/views/help_bubble_view_ash_test_base.cc b/ash/user_education/views/help_bubble_view_ash_test_base.cc index 1809760..ddba893 100644 --- a/ash/user_education/views/help_bubble_view_ash_test_base.cc +++ b/ash/user_education/views/help_bubble_view_ash_test_base.cc
@@ -50,9 +50,6 @@ HelpBubbleParams params; params.arrow = arrow; - // NOTE: `HelpBubbleViewAsh` will never be created without body text. - params.body_text = Repeat(u"Body", /*times=*/50); - if (with_title_text) { params.title_text = Repeat(u"Title", /*times=*/25u); } @@ -76,13 +73,22 @@ params.progress = std::make_pair(2, 3); } - // Anchor the help bubble view to the test `widget_`. - internal::HelpBubbleAnchorParams anchor_params; - anchor_params.view = widget_->GetContentsView(); + // NOTE: The returned help bubble view is owned by its widget. + return CreateHelpBubbleView(std::move(params)); +} + +HelpBubbleViewAsh* HelpBubbleViewAshTestBase::CreateHelpBubbleView( + const absl::optional<HelpBubbleStyle>& style) { + HelpBubbleParams params; + params.arrow = HelpBubbleArrow::kNone; + + if (style.has_value()) { + params.extended_properties = + user_education_util::CreateExtendedProperties(style.value()); + } // NOTE: The returned help bubble view is owned by its widget. - return new HelpBubbleViewAsh(HelpBubbleId::kTest, anchor_params, - std::move(params)); + return CreateHelpBubbleView(std::move(params)); } void HelpBubbleViewAshTestBase::SetUp() { @@ -90,7 +96,7 @@ // Use a slightly larger display than is default to ensure that help bubble // views are fully on screen in all test scenarios. - UpdateDisplay("1024x768"); + UpdateDisplay("1366x1080"); // Initialize a test `widget_` to be used as an anchor for help bubble // views. Note that shadow is removed since pixel tests of help bubble views @@ -110,4 +116,18 @@ widget_->ShowInactive(); } +HelpBubbleViewAsh* HelpBubbleViewAshTestBase::CreateHelpBubbleView( + HelpBubbleParams params) { + // NOTE: `HelpBubbleViewAsh` will never be created without body text. + params.body_text = Repeat(u"Body", /*times=*/50); + + // Anchor the help bubble view to the test `widget_`. + internal::HelpBubbleAnchorParams anchor_params; + anchor_params.view = widget_->GetContentsView(); + + // NOTE: The returned help bubble view is owned by its widget. + return new HelpBubbleViewAsh(HelpBubbleId::kTest, anchor_params, + std::move(params)); +} + } // namespace ash
diff --git a/ash/user_education/views/help_bubble_view_ash_test_base.h b/ash/user_education/views/help_bubble_view_ash_test_base.h index 54cc70b5..c5490f1 100644 --- a/ash/user_education/views/help_bubble_view_ash_test_base.h +++ b/ash/user_education/views/help_bubble_view_ash_test_base.h
@@ -6,10 +6,12 @@ #define ASH_USER_EDUCATION_VIEWS_HELP_BUBBLE_VIEW_ASH_TEST_BASE_H_ #include "ash/test/ash_test_base.h" +#include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/views/widget/unique_widget_ptr.h" namespace user_education { enum class HelpBubbleArrow; +struct HelpBubbleParams; } // namespace user_education namespace ash { @@ -29,10 +31,22 @@ bool with_buttons, bool with_progress); + // Creates and returns a pointer to a new `HelpBubbleViewAsh` instance with + // the specified `style`. Note that the returned help bubble view is owned + // by its widget. + HelpBubbleViewAsh* CreateHelpBubbleView( + const absl::optional<HelpBubbleStyle>& style); + private: // AshTestBase: void SetUp() override; + // Creates and returns a pointer to a new `HelpBubbleViewAsh` instance with + // the specified `params`. Note that the returned help bubble view is owned + // by its widget. + HelpBubbleViewAsh* CreateHelpBubbleView( + user_education::HelpBubbleParams params); + // The test `widget_` to be used as an anchor for help bubble views. views::UniqueWidgetPtr widget_; };
diff --git a/ash/user_education/views/help_bubble_view_ash_unittest.cc b/ash/user_education/views/help_bubble_view_ash_unittest.cc new file mode 100644 index 0000000..de8c7c5 --- /dev/null +++ b/ash/user_education/views/help_bubble_view_ash_unittest.cc
@@ -0,0 +1,84 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/user_education/views/help_bubble_view_ash.h" + +#include <vector> + +#include "ash/user_education/user_education_types.h" +#include "ash/user_education/views/help_bubble_view_ash_test_base.h" +#include "components/user_education/common/help_bubble_params.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/abseil-cpp/absl/types/optional.h" +#include "ui/chromeos/styles/cros_tokens_color_mappings.h" +#include "ui/color/color_provider.h" + +namespace ash { +namespace { + +// Aliases. +using ::testing::Conditional; +using ::testing::Eq; +using ::user_education::HelpBubbleArrow; + +// Helpers --------------------------------------------------------------------- + +std::vector<absl::optional<HelpBubbleStyle>> GetHelpBubbleStyles() { + std::vector<absl::optional<HelpBubbleStyle>> styles; + styles.emplace_back(absl::nullopt); + for (size_t i = static_cast<size_t>(HelpBubbleStyle::kMinValue); + i <= static_cast<size_t>(HelpBubbleStyle::kMaxValue); ++i) { + styles.emplace_back(static_cast<HelpBubbleStyle>(i)); + } + return styles; +} + +} // namespace + +// HelpBubbleViewAshStyleTest -------------------------------------------------- + +// Base class for tests of `HelpBubbleViewAsh` parameterized by style. +class HelpBubbleViewAshStyleTest + : public HelpBubbleViewAshTestBase, + public ::testing::WithParamInterface<absl::optional<HelpBubbleStyle>> { + public: + // Returns the help bubble style to use given test parameterization. + const absl::optional<HelpBubbleStyle>& style() const { return GetParam(); } +}; + +INSTANTIATE_TEST_SUITE_P(All, + HelpBubbleViewAshStyleTest, + ::testing::ValuesIn(GetHelpBubbleStyles())); + +// Tests ----------------------------------------------------------------------- + +// Verifies that help bubbles have the appropriate background color given style. +TEST_P(HelpBubbleViewAshStyleTest, BackgroundColor) { + const auto* const help_bubble_view = CreateHelpBubbleView(style()); + const auto* const color_provider = help_bubble_view->GetColorProvider(); + EXPECT_THAT( + help_bubble_view->color(), + Conditional( + help_bubble_view->style() == HelpBubbleStyle::kDialog, + Eq(color_provider->GetColor(cros_tokens::kCrosSysDialogContainer)), + Eq(color_provider->GetColor(cros_tokens::kCrosSysBaseElevated)))); +} + +// Verifies that help bubbles can activate so long as they are not nudge style. +TEST_P(HelpBubbleViewAshStyleTest, CanActivate) { + const auto* const help_bubble_view = CreateHelpBubbleView(style()); + EXPECT_EQ(help_bubble_view->CanActivate(), + help_bubble_view->style() != HelpBubbleStyle::kNudge); +} + +// Verifies that style is propagated to the help bubble as expected. Note that +// if not explicitly provided, style defaults to `HelpBubbleStyle::kDialog`. +TEST_P(HelpBubbleViewAshStyleTest, Style) { + const auto* const help_bubble_view = CreateHelpBubbleView(style()); + EXPECT_EQ(help_bubble_view->style(), + style().value_or(HelpBubbleStyle::kDialog)); +} + +} // namespace ash
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_az.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_az.xtb index 43b64b5..cdd46d5e 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_az.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_az.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">Deaktiv edildi</translation> <translation id="4269820728363426813">Link ünvanını kopyalayın</translation> <translation id="428234092390943511">Səhifə miniatürü</translation> +<translation id="4349714250734879769">Chrome tərəfindən çərçivə miqyaslama</translation> <translation id="4383571725254449280">Performans jurnallarını çap edin</translation> <translation id="4445542136948522167">Foto çəkməyi dayandırın</translation> <translation id="4570032796877367747">Ön kamera</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">"Foto çəkin" rejiminə keçin</translation> <translation id="8167081290930651932">Foto olaraq yadda saxlayın</translation> <translation id="8239780215768881278">Video snepşotu çəkin</translation> +<translation id="8346544573713510785">Kamera HAL tərəfindən çərçivə miqyaslama</translation> <translation id="8425673304802773841">Aşağı əyin</translation> <translation id="8428213095426709021">Ayarlar</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_be.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_be.xtb index 62f7789..65c2252 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_be.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_be.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">Выключана</translation> <translation id="4269820728363426813">Капіраваць спасылку</translation> <translation id="428234092390943511">Мініяцюра старонкі</translation> +<translation id="4349714250734879769">Маштабаванне кадраў Chrome</translation> <translation id="4383571725254449280">Журналы прадукцыйнасці друку</translation> <translation id="4445542136948522167">Спыніць фотаздымку</translation> <translation id="4570032796877367747">Пярэдняя камера</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">Пераключыцца на здымку фота</translation> <translation id="8167081290930651932">Захаваць як фота</translation> <translation id="8239780215768881278">Зрабіць здымак экрана</translation> +<translation id="8346544573713510785">Маштабаванне кадраў камеры HAL</translation> <translation id="8425673304802773841">Нахіліць уніз</translation> <translation id="8428213095426709021">Налады</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_bn.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_bn.xtb index bfe9a0a7f9..cbb0968b 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_bn.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_bn.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">অক্ষম হয়েছে</translation> <translation id="4269820728363426813">লিঙ্ক অ্যাড্রেস কপি করুন</translation> <translation id="428234092390943511">পৃষ্ঠা থাম্বনেল</translation> +<translation id="4349714250734879769">Chrome-এর মাধ্যমে ফ্রেম স্কেল করুন</translation> <translation id="4383571725254449280">প্রিন্ট পারফর্ম্যান্স লগ</translation> <translation id="4445542136948522167">ফটো তোলা বন্ধ করুন</translation> <translation id="4570032796877367747">সামনের ক্যামেরা</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">ফটো মোডে পাল্টান</translation> <translation id="8167081290930651932">ফটো ফর্ম্যাটে সেভ করুন</translation> <translation id="8239780215768881278">ভিডিও স্ন্যাপশট নিন</translation> +<translation id="8346544573713510785">Camera HAL-এর মাধ্যমে ফ্রেম স্কেল করুন</translation> <translation id="8425673304802773841">নীচের দিকে টিল্ট করুন</translation> <translation id="8428213095426709021">সেটিংস</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ca.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ca.xtb index c9e930d..817ef374 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ca.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ca.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">Desactivat</translation> <translation id="4269820728363426813">Copia l'adreça de l'enllaç</translation> <translation id="428234092390943511">Miniatura de la pàgina</translation> +<translation id="4349714250734879769">Ajusta els fotogrames amb Chrome</translation> <translation id="4383571725254449280">Registres de rendiment d'impressió</translation> <translation id="4445542136948522167">No facis la foto</translation> <translation id="4570032796877367747">Càmera frontal</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">Canvia al mode per fer fotos</translation> <translation id="8167081290930651932">Desa com a foto</translation> <translation id="8239780215768881278">Fes una captura de vídeo</translation> +<translation id="8346544573713510785">Ajusta els fotogrames amb la càmera HAL</translation> <translation id="8425673304802773841">Inclina cap avall</translation> <translation id="8428213095426709021">Configuració</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_cs.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_cs.xtb index 59d9f094..9585e1b 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_cs.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_cs.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">Vypnuto</translation> <translation id="4269820728363426813">Zkopírovat adresu odkazu</translation> <translation id="428234092390943511">Miniatura stránky</translation> +<translation id="4349714250734879769">Upravovat měřítko snímků pomocí Chromu</translation> <translation id="4383571725254449280">Vytisknout protokoly výkonu</translation> <translation id="4445542136948522167">Zastavit focení</translation> <translation id="4570032796877367747">Přední fotoaparát</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">Přepnout na focení</translation> <translation id="8167081290930651932">Uložit jako fotku</translation> <translation id="8239780215768881278">Pořídit snímek videa</translation> +<translation id="8346544573713510785">Upravovat měřítko snímků pomocí vrstvy HAL fotoaparátu</translation> <translation id="8425673304802773841">Naklonit dolů</translation> <translation id="8428213095426709021">Nastavení</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_da.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_da.xtb index d9617b5..605ab88b 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_da.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_da.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">Deaktiveret</translation> <translation id="4269820728363426813">Kopiér linkadresse</translation> <translation id="428234092390943511">Miniature for side</translation> +<translation id="4349714250734879769">Skaler rammer i Chrome</translation> <translation id="4383571725254449280">Effektivitetslogfiler for udskrivning</translation> <translation id="4445542136948522167">Stop med at tage billedet</translation> <translation id="4570032796877367747">Frontkamera</translation> @@ -150,6 +151,7 @@ <translation id="8145038249676204903">Skift for at tage et billede</translation> <translation id="8167081290930651932">Gem som billede</translation> <translation id="8239780215768881278">Tag et videoøjebliksbillede</translation> +<translation id="8346544573713510785">Skaler billeder med kamera-HAL</translation> <translation id="8425673304802773841">Drej nedad</translation> <translation id="8428213095426709021">Indstillinger</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_es-419.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_es-419.xtb index 4793cc94..647d99d 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_es-419.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_es-419.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">Inhabilitado</translation> <translation id="4269820728363426813">Copiar dirección del vínculo</translation> <translation id="428234092390943511">Miniatura de la página</translation> +<translation id="4349714250734879769">Ajustar marcos con Chrome</translation> <translation id="4383571725254449280">Registros de rendimiento de impresión</translation> <translation id="4445542136948522167">Detener foto</translation> <translation id="4570032796877367747">Cámara frontal</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">Cambiar al modo para tomar fotos</translation> <translation id="8167081290930651932">Guardar como foto</translation> <translation id="8239780215768881278">Tomar una instantánea del video</translation> +<translation id="8346544573713510785">Ajustar marcos con la HAL de la cámara</translation> <translation id="8425673304802773841">Inclinar hacia abajo</translation> <translation id="8428213095426709021">Configuración</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_es.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_es.xtb index 652eef7..87adc66 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_es.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_es.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">Inhabilitado</translation> <translation id="4269820728363426813">Copiar la dirección del enlace</translation> <translation id="428234092390943511">Miniatura de la página</translation> +<translation id="4349714250734879769">Escalar marcos con Chrome</translation> <translation id="4383571725254449280">Imprimir registros de rendimiento</translation> <translation id="4445542136948522167">Detener foto</translation> <translation id="4570032796877367747">Cámara frontal</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">Cambiar al modo de cámara de fotos</translation> <translation id="8167081290930651932">Guardar como foto</translation> <translation id="8239780215768881278">Hacer una captura de vídeo</translation> +<translation id="8346544573713510785">Escalar marcos con cámara HAL</translation> <translation id="8425673304802773841">Inclinar hacia abajo</translation> <translation id="8428213095426709021">Configuración</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_fr-CA.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_fr-CA.xtb index 21174089..8583998 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_fr-CA.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_fr-CA.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">Désactivé</translation> <translation id="4269820728363426813">Copier l'adresse du lien</translation> <translation id="428234092390943511">Miniature de la page</translation> +<translation id="4349714250734879769">Échelonner les cadres par Chrome</translation> <translation id="4383571725254449280">Imprimer les journaux de performance</translation> <translation id="4445542136948522167">Ne pas prendre la photo</translation> <translation id="4570032796877367747">Appareil photo avant</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">Passer au mode photo</translation> <translation id="8167081290930651932">Enregistrer en tant que photo</translation> <translation id="8239780215768881278">Prendre un instantané vidéo</translation> +<translation id="8346544573713510785">Échelonner les cadres par l'appareil photo HAL</translation> <translation id="8425673304802773841">Incliner vers le bas</translation> <translation id="8428213095426709021">Paramètres</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_gl.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_gl.xtb index 9ec5dcd..d53cd8e2 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_gl.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_gl.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">Desactivado</translation> <translation id="4269820728363426813">Copiar enderezo da ligazón</translation> <translation id="428234092390943511">Miniatura da páxina</translation> +<translation id="4349714250734879769">Axustar fotogramas con Chrome</translation> <translation id="4383571725254449280">Rexistros de rendemento de impresión</translation> <translation id="4445542136948522167">Deixar de sacar foto</translation> <translation id="4570032796877367747">Cámara dianteira</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">Cambiar a modo de cámara de fotos</translation> <translation id="8167081290930651932">Gardar como foto</translation> <translation id="8239780215768881278">Crear instantánea do vídeo</translation> +<translation id="8346544573713510785">Axustar fotogramas coa HAL da cámara</translation> <translation id="8425673304802773841">Inclinar cara abaixo</translation> <translation id="8428213095426709021">Configuración</translation> <translation id="8629662593426079630">360 p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_gu.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_gu.xtb index 3d2f590..32e0fb6 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_gu.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_gu.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">અક્ષમ કરેલું</translation> <translation id="4269820728363426813">લિંક સરનામું કૉપિ કરો</translation> <translation id="428234092390943511">પેજ થંબનેલ</translation> +<translation id="4349714250734879769">Chrome દ્વારા ફ્રેમ સ્કેલ કરો</translation> <translation id="4383571725254449280">કાર્યપ્રદર્શનના લૉગ પ્રિન્ટ કરો</translation> <translation id="4445542136948522167">ફોટા લેવાનું બંધ કરો</translation> <translation id="4570032796877367747">આગળનો કૅમેરા</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">ફોટો લેવા માટે સ્વિચ કરો</translation> <translation id="8167081290930651932">ફોટો તરીકે સાચવો</translation> <translation id="8239780215768881278">વીડિયો સ્નૅપશૉટ લો</translation> +<translation id="8346544573713510785">કૅમેરા HAL દ્વારા ફ્રેમ સ્કેલ કરો</translation> <translation id="8425673304802773841">નીચે ટિલ્ટ કરો</translation> <translation id="8428213095426709021">સેટિંગ</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_hy.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_hy.xtb index 971a4ef..484e06c 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_hy.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_hy.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">Անջատված է</translation> <translation id="4269820728363426813">Պատճենել հղման հասցեն</translation> <translation id="428234092390943511">Էջի մանրապատկեր</translation> +<translation id="4349714250734879769">Մասշտաբավորել շրջանակները Chrome-ի միջոցով</translation> <translation id="4383571725254449280">Տպման վիճակագրության մատյաններ</translation> <translation id="4445542136948522167">Դադարեցնել լուսանկարումը</translation> <translation id="4570032796877367747">Առջևի տեսախցիկ</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">Լուսանկարել</translation> <translation id="8167081290930651932">Պահել որպես լուսանկար</translation> <translation id="8239780215768881278">Լուսանկարել տեսանյութի կադր</translation> +<translation id="8346544573713510785">Մասշտաբավորել շրջանակները Camera HAL-ի միջոցով</translation> <translation id="8425673304802773841">Թեքել ներքև</translation> <translation id="8428213095426709021">Կարգավորումներ</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_iw.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_iw.xtb index aa0d2dfd..f4298ae 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_iw.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_iw.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">מושבת</translation> <translation id="4269820728363426813">העתקת כתובת של קישור</translation> <translation id="428234092390943511">תמונה ממוזערת של הדף</translation> +<translation id="4349714250734879769">התאמת גודל הפריים ב-Chrome</translation> <translation id="4383571725254449280">הדפסת יומני ביצועים</translation> <translation id="4445542136948522167">הפסקת הצילום</translation> <translation id="4570032796877367747">מצלמה קדמית</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">מעבר לצילום תמונות</translation> <translation id="8167081290930651932">שמירה כתמונה</translation> <translation id="8239780215768881278">צילום תמונה מהסרטון</translation> +<translation id="8346544573713510785">התאמת גודל הפריים במצלמה עם HAL</translation> <translation id="8425673304802773841">הטייה מטה</translation> <translation id="8428213095426709021">הגדרות</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ky.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ky.xtb index a7bc01b..088121e 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ky.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ky.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">Өчүк</translation> <translation id="4269820728363426813">Шилтеме дарегин көчүрүү</translation> <translation id="428234092390943511">Беттин эскизи</translation> +<translation id="4349714250734879769">Chrome менен кадрлардын өлчөмүн өзгөртүү</translation> <translation id="4383571725254449280">Басып чыгаруу майнаптуулугунун таржымалы</translation> <translation id="4445542136948522167">Сүрөткө тартууну токтотуу</translation> <translation id="4570032796877367747">Маңдайкы камера</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">Сүрөт режимине которулуу</translation> <translation id="8167081290930651932">Сүрөт катары сактоо</translation> <translation id="8239780215768881278">Видео жаздыруу учурунда сүрөткө тартып алуу</translation> +<translation id="8346544573713510785">Camera HAL менен кадрлардын өлчөмүн өзгөртүү</translation> <translation id="8425673304802773841">Төмөн кыйшайтуу</translation> <translation id="8428213095426709021">Параметрлер</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_mk.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_mk.xtb index 01862cd..ce84f9a 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_mk.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_mk.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">Оневозможено</translation> <translation id="4269820728363426813">Копирај ја адресата на линкот</translation> <translation id="428234092390943511">Сликичка на страница</translation> +<translation id="4349714250734879769">Скалирање рамки од Chrome</translation> <translation id="4383571725254449280">Евиденција за изведба на печатењето</translation> <translation id="4445542136948522167">Сопри го фотографирањето</translation> <translation id="4570032796877367747">Предна камера</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">Префрли на фотографирање</translation> <translation id="8167081290930651932">Зачувај како фотографија</translation> <translation id="8239780215768881278">Создајте слика од видеото</translation> +<translation id="8346544573713510785">Скалирање рамки од Camera HAL</translation> <translation id="8425673304802773841">Навалете надолу</translation> <translation id="8428213095426709021">Поставки</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ml.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ml.xtb index abd7d70..eda2927 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ml.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ml.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">അപ്രാപ്തമാക്കി</translation> <translation id="4269820728363426813">ലിങ്ക് വിലാസം പകർത്തുക</translation> <translation id="428234092390943511">പേജിന്റെ ലഘുചിത്രം</translation> +<translation id="4349714250734879769">Chrome മുഖേന ഫ്രെയിമുകൾ സ്കെയിൽ ചെയ്യുക</translation> <translation id="4383571725254449280">പ്രകടന ലോഗുകൾ പ്രിന്റ് ചെയ്യുക</translation> <translation id="4445542136948522167">ഫോട്ടോ എടുക്കുന്നത് നിർത്തുക</translation> <translation id="4570032796877367747">മുൻ ക്യാമറ</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">ഫോട്ടോ എടുക്കുന്നതിലേക്ക് മാറുക</translation> <translation id="8167081290930651932">ഫോട്ടോ ആയി സംരക്ഷിക്കുക</translation> <translation id="8239780215768881278">വീഡിയോ സ്നാപ്പ്ഷോട്ട് എടുക്കുക</translation> +<translation id="8346544573713510785">ക്യാമറ HAL മുഖേന ഫ്രെയിമുകൾ സ്കെയിൽ ചെയ്യുക</translation> <translation id="8425673304802773841">താഴേക്ക് ടിൽറ്റ് ചെയ്യുക</translation> <translation id="8428213095426709021">ക്രമീകരണം</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_mn.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_mn.xtb index f13f1c6..0afb31af 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_mn.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_mn.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">Хаасан</translation> <translation id="4269820728363426813">Холбоосын хаягийг хуулах</translation> <translation id="428234092390943511">Хуудасны өнгөц зураг</translation> +<translation id="4349714250734879769">Chrome-р фреймийн хэмжээг тохируулах</translation> <translation id="4383571725254449280">Хэвлэх гүйцэтгэлийн логууд</translation> <translation id="4445542136948522167">Зураг авахыг зогсоох</translation> <translation id="4570032796877367747">Урд камер</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">Зураг авах руу сэлгэх</translation> <translation id="8167081290930651932">Зургаар хадгалах</translation> <translation id="8239780215768881278">Видео агшин зураг авах</translation> +<translation id="8346544573713510785">Камерын HAL-р фреймийн хэмжээг тохируулах</translation> <translation id="8425673304802773841">Доош хазайлгах</translation> <translation id="8428213095426709021">Тохиргоо</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ne.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ne.xtb index 7a91cce4..be909fa 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ne.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ne.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">असक्षम गरिएको</translation> <translation id="4269820728363426813">लिङ्क ठेगाना कपी गर्नुहोस्</translation> <translation id="428234092390943511">पेजको थम्बनेल</translation> +<translation id="4349714250734879769">फ्रेमहरू Chrome अनुसार मिलाउनुहोस्</translation> <translation id="4383571725254449280">प्रिन्ट सम्पादनका लगहरू</translation> <translation id="4445542136948522167">तस्बिर खिच्न छाड्नुहोस्</translation> <translation id="4570032796877367747">अगाडिको क्यामेरा</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">तस्बिर खिच्ने मोड प्रयोग गर्नुहोस्</translation> <translation id="8167081290930651932">फोटोका रूपमा सेभ गर्नुहोस्</translation> <translation id="8239780215768881278">भिडियो स्न्यापसट खिच्नुहोस्</translation> +<translation id="8346544573713510785">फ्रेमहरू क्यामेरा HAL अनुसार मिलाउनुहोस्</translation> <translation id="8425673304802773841">तलतिर ढल्काइयोस्</translation> <translation id="8428213095426709021">सेटिङहरू</translation> <translation id="8629662593426079630">३६० पिक्सेल</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_nl.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_nl.xtb index f0ff222..36bf5ba 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_nl.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_nl.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">Uitgezet</translation> <translation id="4269820728363426813">Linkadres kopiëren</translation> <translation id="428234092390943511">Paginathumbnail</translation> +<translation id="4349714250734879769">Frames schalen met Chrome</translation> <translation id="4383571725254449280">Prestatielogboeken afdrukken</translation> <translation id="4445542136948522167">Foto maken stoppen</translation> <translation id="4570032796877367747">Camera aan voorzijde</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">Naar foto maken</translation> <translation id="8167081290930651932">Opslaan als foto</translation> <translation id="8239780215768881278">Videomomentopname maken</translation> +<translation id="8346544573713510785">Frames schalen met Camera HAL</translation> <translation id="8425673304802773841">Naar beneden kantelen</translation> <translation id="8428213095426709021">Instellingen</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_or.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_or.xtb index df48b77..d327464 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_or.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_or.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">ଅକ୍ଷମ କରାଯାଇଛି</translation> <translation id="4269820728363426813">ଲିଙ୍କ୍ ଠିକଣା କପି କରନ୍ତୁ</translation> <translation id="428234092390943511">ପୃଷ୍ଠା ଥମ୍ବନେଲ</translation> +<translation id="4349714250734879769">Chrome ଦ୍ୱାରା ଫ୍ରେମଗୁଡ଼ିକୁ ସ୍କେଲ କରନ୍ତୁ</translation> <translation id="4383571725254449280">କାର୍ଯ୍ୟଦକ୍ଷତା ଲଗଗୁଡ଼ିକ ପ୍ରିଣ୍ଟ କରନ୍ତୁ</translation> <translation id="4445542136948522167">ଫଟୋ ଉଠାଇବା ବନ୍ଦ କରନ୍ତୁ</translation> <translation id="4570032796877367747">ସାମ୍ନା କ୍ୟାମେରା</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">ଫଟୋ ଉଠାଇବା ପାଇଁ ସ୍ୱିଚ୍ କରନ୍ତୁ</translation> <translation id="8167081290930651932">ଫଟୋ ଭାବେ ସେଭ୍ କରନ୍ତୁ</translation> <translation id="8239780215768881278">ଭିଡିଓର ସ୍ନାପସଟ୍ ନିଅନ୍ତୁ</translation> +<translation id="8346544573713510785">Camera HAL ଦ୍ୱାରା ଫ୍ରେମଗୁଡ଼ିକୁ ସ୍କେଲ କରନ୍ତୁ</translation> <translation id="8425673304802773841">ତଳକୁ ଟିଲ୍ଟ କରନ୍ତୁ</translation> <translation id="8428213095426709021">ସେଟିଂସ୍</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_pa.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_pa.xtb index 7a66fb9f..cf3d152 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_pa.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_pa.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">ਅਸਮਰਥਿਤ</translation> <translation id="4269820728363426813">ਲਿੰਕ ਪਤਾ ਕਾਪੀ ਕਰੋ</translation> <translation id="428234092390943511">ਪੰਨੇ ਦਾ ਲਘੂ-ਚਿੱਤਰ</translation> +<translation id="4349714250734879769">Chrome ਮੁਤਾਬਕ ਫ੍ਰੇਮਾਂ ਨੂੰ ਸਕੇਲ ਕਰੋ</translation> <translation id="4383571725254449280">ਪ੍ਰਿੰਟ ਕਾਰਗੁਜ਼ਾਰੀ ਲੌਗ</translation> <translation id="4445542136948522167">ਫ਼ੋਟੋ ਖਿੱਚਣਾ ਬੰਦ ਕਰੋ</translation> <translation id="4570032796877367747">ਅਗਲਾ ਕੈਮਰਾ</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">'ਫ਼ੋਟੋ ਖਿੱਚੋ' ਮੋਡ 'ਤੇ ਜਾਓ</translation> <translation id="8167081290930651932">ਫ਼ੋਟੋ ਵਜੋਂ ਰੱਖਿਅਤ ਕਰੋ</translation> <translation id="8239780215768881278">ਵੀਡੀਓ ਸਨੈਪਸ਼ਾਟ ਲਓ</translation> +<translation id="8346544573713510785">Camera HAL ਮੁਤਾਬਕ ਫ੍ਰੇਮਾਂ ਨੂੰ ਸਕੇਲ ਕਰੋ</translation> <translation id="8425673304802773841">ਹੇਠਾਂ ਵੱਲ ਝੁਕਾਓ</translation> <translation id="8428213095426709021">ਸੈਟਿੰਗਾਂ</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ru.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ru.xtb index 626669b..09c7513 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ru.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ru.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">Отключено</translation> <translation id="4269820728363426813">Копировать адрес ссылки</translation> <translation id="428234092390943511">Уменьшенное изображение страницы</translation> +<translation id="4349714250734879769">Масштабировать фреймы с помощью Chrome</translation> <translation id="4383571725254449280">Распечатать журнал производительности</translation> <translation id="4445542136948522167">Отменить съемку</translation> <translation id="4570032796877367747">Фронтальная камера</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">Переключиться на фотосъемку</translation> <translation id="8167081290930651932">Сохранить как фото</translation> <translation id="8239780215768881278">Сделать снимок</translation> +<translation id="8346544573713510785">Масштабировать фреймы с помощью камеры HAL</translation> <translation id="8425673304802773841">Наклонить вниз</translation> <translation id="8428213095426709021">Настройки</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_si.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_si.xtb index 788febe4..6ef57b61 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_si.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_si.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">අබල කරන ලද</translation> <translation id="4269820728363426813">ලින්ක් ලිපිනය පිටපත් කරන්න</translation> <translation id="428234092390943511">පිටුවේ සිඟිති රුව</translation> +<translation id="4349714250734879769">Chrome මගින් පරිමාණ රාමු</translation> <translation id="4383571725254449280">මුද්රණ කාර්ය සාධන සටහන්</translation> <translation id="4445542136948522167">ඡායාරූප ගැනීම නවත්වන්න</translation> <translation id="4570032796877367747">ඉදිරිපස කැමරාව</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">ඡායාරූපය ගැනීමට මාරු වන්න</translation> <translation id="8167081290930651932">ඡායාරූපයක් ලෙස සුරකින්න</translation> <translation id="8239780215768881278">වීඩියෝ සැණ රුවක් ගන්න</translation> +<translation id="8346544573713510785">කැමරා HAL මගින් පරිමාණ රාමු</translation> <translation id="8425673304802773841">පහළට ඇල කරන්න</translation> <translation id="8428213095426709021">සැකසුම්</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sl.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sl.xtb index 0a6ea52..469a4b6 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sl.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sl.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">Onemogočeno</translation> <translation id="4269820728363426813">Kopiraj naslov povezave</translation> <translation id="428234092390943511">Sličica strani</translation> +<translation id="4349714250734879769">Prilagajanje velikosti okvirov v Chromu</translation> <translation id="4383571725254449280">Tiskanje dnevnikov delovanja</translation> <translation id="4445542136948522167">Ustavitev fotografiranja</translation> <translation id="4570032796877367747">Sprednji fotoaparat</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">Preklop na fotografiranje</translation> <translation id="8167081290930651932">Shrani kot fotografijo</translation> <translation id="8239780215768881278">Posnetek videa</translation> +<translation id="8346544573713510785">Prilagodi okvire glede na HAL kamere</translation> <translation id="8425673304802773841">Nagni navzdol</translation> <translation id="8428213095426709021">Nastavitve</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sq.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sq.xtb index 6a11d151..86e94c21 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sq.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sq.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">I çaktivizuar</translation> <translation id="4269820728363426813">Kopjo adresën e lidhjes</translation> <translation id="428234092390943511">Miniatura e faqes</translation> +<translation id="4349714250734879769">Shkallëzo kuadrot me Chrome</translation> <translation id="4383571725254449280">Evidencat për cilësinë e funksionimit të printimit</translation> <translation id="4445542136948522167">Ndalo nxjerrjen e fotografive</translation> <translation id="4570032796877367747">Kamera e përparme</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">Kalo te nxjerrja e fotografive</translation> <translation id="8167081290930651932">Ruaje si fotografi</translation> <translation id="8239780215768881278">Shkrep një pamje të çastit të videos</translation> +<translation id="8346544573713510785">Shkallëzo kuadrot me shtresën HAL të kamerës</translation> <translation id="8425673304802773841">Ano për poshtë</translation> <translation id="8428213095426709021">Cilësimet</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sw.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sw.xtb index d24402c..063cc1d 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sw.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sw.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">Imezimwa</translation> <translation id="4269820728363426813">Nakili anwani ya kiungo</translation> <translation id="428234092390943511">Kijipicha cha ukurasa</translation> +<translation id="4349714250734879769">Weka fremu ya Chrome</translation> <translation id="4383571725254449280">Chapisha kumbukumbu za utendaji</translation> <translation id="4445542136948522167">Acha kupiga picha</translation> <translation id="4570032796877367747">Kamera ya mbele</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">Piga picha</translation> <translation id="8167081290930651932">Hifadhi ikiwa Picha</translation> <translation id="8239780215768881278">Rekodi muhtasari wa video</translation> +<translation id="8346544573713510785">Weka fremu ya HAL ya Kamera</translation> <translation id="8425673304802773841">Inamisha chini</translation> <translation id="8428213095426709021">Mipangilio</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ta.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ta.xtb index ad6f7ed..bf87e03 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ta.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ta.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">முடக்கப்பட்டது</translation> <translation id="4269820728363426813">இணைப்பு முகவரியை நகலெடு</translation> <translation id="428234092390943511">பக்கச் சிறுபடம்</translation> +<translation id="4349714250734879769">Chrome மூலம் ஃபிரேம்களின் அளவை மாற்றுதல்</translation> <translation id="4383571725254449280">செயல்திறன் பதிவுகளைப் பிரிண்ட் செய்தல்</translation> <translation id="4445542136948522167">படமெடுப்பதை நிறுத்து</translation> <translation id="4570032796877367747">முன்பக்கக் கேமரா</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">படமெடுக்கும் பயன்முறைக்கு மாறு</translation> <translation id="8167081290930651932">படமாகச் சேமி</translation> <translation id="8239780215768881278">வீடியோ ஸ்னாப்ஷாட்டை எடு</translation> +<translation id="8346544573713510785">கேமரா HAL மூலம் ஃபிரேம்களின் அளவை மாற்றுதல்</translation> <translation id="8425673304802773841">கீழே சாய்க்கவும்</translation> <translation id="8428213095426709021">அமைப்புகள்</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_tr.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_tr.xtb index 1c5aa674..246926894 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_tr.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_tr.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">Devre dışı</translation> <translation id="4269820728363426813">Bağlantı adresini kopyala</translation> <translation id="428234092390943511">Sayfa küçük resmi</translation> +<translation id="4349714250734879769">Çerçeveleri Chrome'a göre ölçeklendir</translation> <translation id="4383571725254449280">Performans günlüklerini yazdır</translation> <translation id="4445542136948522167">Fotoğraf çekmeyi durdur</translation> <translation id="4570032796877367747">Ön kamera</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">Fotoğraf çekme moduna geç</translation> <translation id="8167081290930651932">Fotoğraf olarak kaydet</translation> <translation id="8239780215768881278">Video anlık görüntüsü yakala</translation> +<translation id="8346544573713510785">Çerçeveleri Kamera donanım soyutlama katmanına (HAL) göre ölçeklendir</translation> <translation id="8425673304802773841">Yatır</translation> <translation id="8428213095426709021">Ayarlar</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_uk.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_uk.xtb index 52b5853..e8933112 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_uk.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_uk.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">Вимкнено</translation> <translation id="4269820728363426813">Копіювати адресу посилання</translation> <translation id="428234092390943511">Зменшене зображення сторінки</translation> +<translation id="4349714250734879769">Масштабувати фрейми за допомогою Chrome</translation> <translation id="4383571725254449280">Друкувати журнали продуктивності</translation> <translation id="4445542136948522167">Припинити фотографувати</translation> <translation id="4570032796877367747">Камера на передній панелі</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">Перейти в режим фотозйомки</translation> <translation id="8167081290930651932">Зберегти як фото</translation> <translation id="8239780215768881278">Зробити знімок відео</translation> +<translation id="8346544573713510785">Масштабувати фрейми за допомогою HAL камери</translation> <translation id="8425673304802773841">Нахилити донизу</translation> <translation id="8428213095426709021">Налаштування</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_uz.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_uz.xtb index 73f364e9b8..d8fb45f 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_uz.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_uz.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">O‘chirib qo‘yilgan</translation> <translation id="4269820728363426813">Havola manzilini nusxalash</translation> <translation id="428234092390943511">Sahifa eskizi</translation> +<translation id="4349714250734879769">Chrome yordamida freymlarni masshtablash</translation> <translation id="4383571725254449280">Unumdorlik jurnalini chop etish</translation> <translation id="4445542136948522167">Suratga olishni toʻxtatish</translation> <translation id="4570032796877367747">Old kamera</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">Suratga olish rejimi</translation> <translation id="8167081290930651932">Rasm sifatida saqlash</translation> <translation id="8239780215768881278">Video lavha olish</translation> +<translation id="8346544573713510785">HAL kamerasi yordamida freymlarni masshtablash</translation> <translation id="8425673304802773841">Pastga qiyalang</translation> <translation id="8428213095426709021">Sozlamalar</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_vi.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_vi.xtb index 9c29ec3..7daf86c 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_vi.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_vi.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">Đã tắt</translation> <translation id="4269820728363426813">Sao chép địa chỉ liên kết</translation> <translation id="428234092390943511">Hình thu nhỏ của trang</translation> +<translation id="4349714250734879769">Điều chỉnh tỷ lệ khung hình bằng Chrome</translation> <translation id="4383571725254449280">In nhật ký hiệu suất</translation> <translation id="4445542136948522167">Dừng chụp ảnh</translation> <translation id="4570032796877367747">Máy ảnh mặt trước</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">Chuyển sang chụp ảnh</translation> <translation id="8167081290930651932">Lưu dưới dạng Ảnh</translation> <translation id="8239780215768881278">Chụp ảnh từ video</translation> +<translation id="8346544573713510785">Điều chỉnh tỷ lệ khung hình bằng lớp trừu tượng phần cứng (HAL) cho máy ảnh</translation> <translation id="8425673304802773841">Xoay xuống</translation> <translation id="8428213095426709021">Cài đặt</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-CN.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-CN.xtb index f70f4e9c..626afca 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-CN.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-CN.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">已停用</translation> <translation id="4269820728363426813">复制链接地址</translation> <translation id="428234092390943511">页面缩略图</translation> +<translation id="4349714250734879769">由 Chrome 缩放帧</translation> <translation id="4383571725254449280">打印性能日志</translation> <translation id="4445542136948522167">停止拍照</translation> <translation id="4570032796877367747">前置摄像头</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">切换到拍照模式</translation> <translation id="8167081290930651932">另存为照片</translation> <translation id="8239780215768881278">拍摄视频快照</translation> +<translation id="8346544573713510785">由相机 HAL 缩放帧</translation> <translation id="8425673304802773841">向下倾斜</translation> <translation id="8428213095426709021">设置</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb index c019963..b50d6c18 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">已停用</translation> <translation id="4269820728363426813">複製連結網址</translation> <translation id="428234092390943511">頁面縮圖</translation> +<translation id="4349714250734879769">由 Chrome 縮放畫面</translation> <translation id="4383571725254449280">列印效能記錄</translation> <translation id="4445542136948522167">停止拍照</translation> <translation id="4570032796877367747">前置鏡頭</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">切換至拍照模式</translation> <translation id="8167081290930651932">儲存為相片</translation> <translation id="8239780215768881278">拍攝影片快照</translation> +<translation id="8346544573713510785">由相機 HAL 縮放畫面</translation> <translation id="8425673304802773841">向下傾斜</translation> <translation id="8428213095426709021">設定</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb index 038df81..c3fb09f1 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb
@@ -68,6 +68,7 @@ <translation id="4176463684765177261">已停用</translation> <translation id="4269820728363426813">複製連結網址</translation> <translation id="428234092390943511">頁面縮圖</translation> +<translation id="4349714250734879769">由 Chrome 縮放畫面</translation> <translation id="4383571725254449280">列印效能記錄</translation> <translation id="4445542136948522167">停止拍照</translation> <translation id="4570032796877367747">前置鏡頭</translation> @@ -149,6 +150,7 @@ <translation id="8145038249676204903">切換為拍照模式</translation> <translation id="8167081290930651932">儲存為相片</translation> <translation id="8239780215768881278">拍攝影片快照</translation> +<translation id="8346544573713510785">由相機 HAL 縮放畫面</translation> <translation id="8425673304802773841">向下傾斜</translation> <translation id="8428213095426709021">設定</translation> <translation id="8629662593426079630">360p</translation>
diff --git a/ash/webui/personalization_app/resources/js/ambient/ambient_preview_large_element.html b/ash/webui/personalization_app/resources/js/ambient/ambient_preview_large_element.html index 6ef0c75..a1120aa 100644 --- a/ash/webui/personalization_app/resources/js/ambient/ambient_preview_large_element.html +++ b/ash/webui/personalization_app/resources/js/ambient/ambient_preview_large_element.html
@@ -56,13 +56,13 @@ margin-top: 12px; } - #ambientSubpageLink { + #ambientLabel > cr-icon-button { --cr-icon-button-size: 44px; /* Make the arrow align with the thumbnail image */ margin-inline-end: -18px; } - #ambientLabel>h2 { + #ambientLabel > h2 { color: var(--cros-text-color-primary); font: var(--personalization-app-label-font); margin: 12px 0; @@ -320,7 +320,6 @@ <div id="ambientLabel" class="enterprise"> <h2>$i18n{screensaverLabel}</h2> <cr-icon-button disabled - id="ambientSubpageLink" iron-icon="cr:chevron-right"> </cr-icon-button> </div> @@ -350,7 +349,6 @@ </h2> <cr-icon-button aria-label="$i18n{ariaLabelChangeScreensaver}" class="tast-open-subpage" - id="ambientSubpageLink" iron-icon="cr:chevron-right" on-click="onClickAmbientSubpageLink_"> </cr-icon-button> @@ -435,7 +433,6 @@ </h2> <cr-icon-button aria-label="$i18n{ariaLabelChangeScreensaver}" class="tast-open-subpage" - id="ambientSubpageLink" iron-icon="cr:chevron-right" on-click="onClickAmbientSubpageLink_"> </cr-icon-button>
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_collections_element.html b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_collections_element.html index d324d5e..380ae62 100644 --- a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_collections_element.html +++ b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_collections_element.html
@@ -32,6 +32,7 @@ bottom: calc(8px + var(--cros-annotation-2-line-height)); display: flex; flex-direction: row; + justify-content: center; } wallpaper-grid-item[data-google-photos] iron-icon[icon='personalization:managed'] {
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_preview_element.html b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_preview_element.html index 8082f82..02b0611 100644 --- a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_preview_element.html +++ b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_preview_element.html
@@ -1,15 +1,4 @@ <style include="common cros-button-style"> - #wallpaperLabel { - align-items: center; - background: none; - border: none; - display: flex; - flex-flow: row nowrap; - grid-area: label; - justify-content: space-between; - margin-top: 12px; - } - #container { display: grid; grid-template-areas: @@ -23,6 +12,23 @@ height: 100%; } + #wallpaperLabel { + align-items: center; + background: none; + border: none; + display: flex; + flex-flow: row nowrap; + grid-area: label; + justify-content: space-between; + margin-top: 12px; + } + + #wallpaperLabel > cr-icon-button { + --cr-icon-button-size: 44px; + /* Make the arrow align with the thumbnail image */ + margin-inline-end: -18px; + } + #wallpaperLabel > h2 { color: var(--cros-text-color-primary); display: inline-block; @@ -34,12 +40,6 @@ --iron-icon-fill-color: var(--cros-icon-color-secondary); } - #wallpaperButton { - --cr-icon-button-size: 44px; - /* Make the arrow align with the thumbnail image */ - margin-inline-end: -18px; - } - #imageContainer, #imagePlaceholder { background-color: var(--personalization-app-grid-item-background-color); @@ -86,33 +86,24 @@ } </style> <div class="preview-container" id="container"> - <div id="wallpaperLabel"> - <template is="dom-if" if="[[showPlaceholders_(imageLoading_, image_)]]"> + <template is="dom-if" if="[[loading_]]"> + <div id="wallpaperLabel"> <h2>$i18n{wallpaperLabel}</h2> - </template> - <template is="dom-if" if="[[!showPlaceholders_(imageLoading_, image_)]]"> - <template is="dom-if" if="[[!isPolicyControlled_(image_)]]"> + </div> + <div id="imagePlaceholder" class="photo-images-container placeholder"></div> + </template> + <template is="dom-if" if="[[!loading_]]"> + <template is="dom-if" if="[[!policyControlled_]]"> + <div id="wallpaperLabel"> <h2 on-click="onClickWallpaper_" class="clickable"> $i18n{wallpaperLabel} </h2> - <cr-icon-button id="wallpaperButton" iron-icon="cr:chevron-right" - role="button" on-click="onClickWallpaper_" - class="tast-open-subpage" - aria-label="$i18n{ariaLabelChangeWallpaper}"> - </cr-icon-button> - </template> - <template is="dom-if" if="[[isPolicyControlled_(image_)]]"> - <p>$i18n{wallpaperLabel}</p> - <iron-icon icon="personalization:managed" title="$i18n{managedSetting}"> - </iron-icon> - </template> - </template> - </div> - <template is="dom-if" if="[[showPlaceholders_(imageLoading_, image_)]]"> - <div id="imagePlaceholder" class="photo-images-container placeholder"></div> - </template> - <template is="dom-if" if="[[!showPlaceholders_(imageLoading_, image_)]]"> - <template is="dom-if" if="[[!isPolicyControlled_(image_)]]"> + <cr-icon-button iron-icon="cr:chevron-right" + role="button" on-click="onClickWallpaper_" + class="tast-open-subpage" + aria-label="$i18n{ariaLabelChangeWallpaper}"> + </cr-icon-button> + </div> <div id="imageContainer" class="photo-images-container clickable" on-click="onClickWallpaper_" on-keypress="onClickWallpaper_"> <div class="photo-images-border"></div> @@ -120,7 +111,12 @@ src$="[[getWallpaperSrc_(image_)]]"> </div> </template> - <template is="dom-if" if="[[isPolicyControlled_(image_)]]"> + <template is="dom-if" if="[[policyControlled_]]"> + <div id="wallpaperLabel"> + <p>$i18n{wallpaperLabel}</p> + <iron-icon icon="personalization:managed" title="$i18n{managedSetting}"> + </iron-icon> + </div> <div id="imageContainer" class="photo-images-container"> <div class="photo-images-border"></div> <img alt$="[[getImageAltDescription_(image_)]]"
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_preview_element.ts b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_preview_element.ts index f554ef81..325a9da 100644 --- a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_preview_element.ts +++ b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_preview_element.ts
@@ -41,11 +41,21 @@ value: null, }, imageLoading_: Boolean, + loading_: { + type: Boolean, + computed: 'computeLoading_(imageLoading_, image_)', + }, + policyControlled_: { + type: Boolean, + computed: 'isPolicyControlled_(image_)', + }, }; } private image_: CurrentWallpaper|null; private imageLoading_: boolean; + private loading_: boolean; + private policyControlled_: boolean; override connectedCallback() { super.connectedCallback(); @@ -91,16 +101,12 @@ this.i18n('unknownImageAttribution')}`; } - /** - * Returns visible state of loading placeholder. - */ - private showPlaceholders_( - imageLoading: boolean, image: CurrentWallpaper|null): boolean { - return imageLoading || !image; + private computeLoading_(): boolean { + return this.imageLoading_ || !this.image_; } - private isPolicyControlled_(image: CurrentWallpaper|null): boolean { - return !!image && image.type === WallpaperType.kPolicy; + private isPolicyControlled_(): boolean { + return !!this.image_ && this.image_.type === WallpaperType.kPolicy; } }
diff --git a/ash/webui/print_management/print_management_ui.cc b/ash/webui/print_management/print_management_ui.cc index 80c804b..b787076 100644 --- a/ash/webui/print_management/print_management_ui.cc +++ b/ash/webui/print_management/print_management_ui.cc
@@ -10,6 +10,7 @@ #include "ash/webui/grit/ash_print_management_resources.h" #include "ash/webui/grit/ash_print_management_resources_map.h" #include "ash/webui/print_management/url_constants.h" +#include "base/feature_list.h" #include "chromeos/components/print_management/mojom/printing_manager.mojom.h" #include "chromeos/strings/grit/chromeos_strings.h" #include "content/public/browser/web_contents.h" @@ -39,6 +40,9 @@ IDR_WEBUI_JS_TEST_LOADER_UTIL_JS); source->AddBoolean("isJellyEnabledForPrintManagement", ash::features::IsJellyEnabledForPrintManagement()); + source->AddBoolean("isSetupAssistanceEnabled", + base::FeatureList::IsEnabled( + ash::features::kPrintManagementSetupAssistance)); } void AddPrintManagementStrings(content::WebUIDataSource* html_source) {
diff --git a/ash/webui/print_management/resources/BUILD.gn b/ash/webui/print_management/resources/BUILD.gn index 9b85e517..577543e 100644 --- a/ash/webui/print_management/resources/BUILD.gn +++ b/ash/webui/print_management/resources/BUILD.gn
@@ -25,6 +25,7 @@ "print_job_clear_history_dialog.ts", "print_job_entry.ts", "print_management.ts", + "printer_setup_info.ts", ] non_web_component_files = [ "mojo_interface_provider.ts" ]
diff --git a/ash/webui/print_management/resources/print_management.html b/ash/webui/print_management/resources/print_management.html index 499a5566..51dcacd 100644 --- a/ash/webui/print_management/resources/print_management.html +++ b/ash/webui/print_management/resources/print_management.html
@@ -103,6 +103,12 @@ margin-bottom: 0; margin-top: 0; } + + printer-setup-info { + align-items: center; + flex: 1 1 auto; + height: 100%; + } </style> <div class="main-container margin-border"> @@ -165,6 +171,8 @@ [[i18n('noPrintJobInProgress')]] </div> + <printer-setup-info hidden$="[[!showSetupAssistance]]"></printer-setup-info> + <template is="dom-if" if="[[printJobs.length]]" restamp> <div id="historyHeaderContainer" class="column-headers flex-center"> <div aria-label$="[[printJobHistoryExpirationPeriod]]">
diff --git a/ash/webui/print_management/resources/print_management.ts b/ash/webui/print_management/resources/print_management.ts index c76f50f..1827f5c3 100644 --- a/ash/webui/print_management/resources/print_management.ts +++ b/ash/webui/print_management/resources/print_management.ts
@@ -13,6 +13,7 @@ import './print_job_entry.js'; import './print_management_fonts.css.js'; import './print_management_shared.css.js'; +import './printer_setup_info.js'; import './strings.m.js'; import {IronIconElement} from '//resources/polymer/v3_0/iron-icon/iron-icon.js'; @@ -116,6 +117,13 @@ value: false, }, + showSetupAssistance: { + type: Boolean, + value: (): boolean => { + return loadTimeData.getBoolean('isSetupAssistanceEnabled'); + }, + }, + deletePrintJobHistoryAllowedByPolicy: { type: Boolean, value: true, @@ -163,6 +171,7 @@ private listBlurred: boolean; private showClearAllButton: boolean; private showClearAllDialog: boolean; + private showSetupAssistance: boolean; private deletePrintJobHistoryAllowedByPolicy: boolean; private shouldDisableClearAllButton: boolean; private printJobsObserverReceiver: PrintJobsObserverReceiver;
diff --git a/ash/webui/print_management/resources/printer_setup_info.html b/ash/webui/print_management/resources/printer_setup_info.html new file mode 100644 index 0000000..0231642f --- /dev/null +++ b/ash/webui/print_management/resources/printer_setup_info.html
@@ -0,0 +1,16 @@ +<style include="print-management-shared print-management-fonts + cros-color-overrides"> + .container { + display: flex; + flex-direction: column; + height: 100%; + text-align: center; + width: 100%; + } +</style> +<div class="container"> + <iron-icon icon="print-management:file-generic"></iron-icon> + <h2 class="message-heading">No printer jobs</h2> + <p class="message-detail">Go to Printer settings to manage your printers</p> + <cr-button class="action-button">Manage</cr-button> +</div>
diff --git a/ash/webui/print_management/resources/printer_setup_info.ts b/ash/webui/print_management/resources/printer_setup_info.ts new file mode 100644 index 0000000..bb8ab5e --- /dev/null +++ b/ash/webui/print_management/resources/printer_setup_info.ts
@@ -0,0 +1,33 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'chrome://resources/cr_elements/chromeos/cros_color_overrides.css.js'; +import 'chrome://resources/cr_elements/cr_button/cr_button.js'; +import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js'; +import './print_management_fonts.css.js'; +import './print_management_shared.css.js'; + +import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {getTemplate} from './printer_setup_info.html.js'; + +/** + * @fileoverview + * 'printer-setup-info' provides messaging on printer setup when there are no + * print jobs to display. + */ + +const PrinterSetupInfoElementIs = 'printer-setup-info'; + +export class PrinterSetupInfoElement extends PolymerElement { + static get is(): string { + return PrinterSetupInfoElementIs; + } + + static get template(): HTMLTemplateElement { + return getTemplate(); + } +} + +customElements.define(PrinterSetupInfoElement.is, PrinterSetupInfoElement);
diff --git a/ash/webui/shortcut_customization_ui/resources/css/shortcut_customization_shared.css b/ash/webui/shortcut_customization_ui/resources/css/shortcut_customization_shared.css index 1c25ff86..f60356b 100644 --- a/ash/webui/shortcut_customization_ui/resources/css/shortcut_customization_shared.css +++ b/ash/webui/shortcut_customization_ui/resources/css/shortcut_customization_shared.css
@@ -39,4 +39,18 @@ :host-context(body.jelly-enabled) cr-dialog::part(dialog) { border-radius: 20px; +} + +iron-icon[icon='shortcut-customization:lock'] { + --iron-icon-fill-color: var(--shortcuts-lock-icon-color); +} + +.lock-icon-container { + align-items: center; + display: flex; + margin-inline-start: 8px; +} + +.lock-icon-container[hidden] { + display: none; /* Required for flexbox hidden. */ } \ No newline at end of file
diff --git a/ash/webui/shortcut_customization_ui/resources/js/accelerator_lookup_manager.ts b/ash/webui/shortcut_customization_ui/resources/js/accelerator_lookup_manager.ts index 0886faae..416f430 100644 --- a/ash/webui/shortcut_customization_ui/resources/js/accelerator_lookup_manager.ts +++ b/ash/webui/shortcut_customization_ui/resources/js/accelerator_lookup_manager.ts
@@ -130,6 +130,11 @@ return this.layoutInfoProvider.getAcceleratorName(source, action); } + getAcceleratorCategory(source: number|string, action: number|string): + AcceleratorCategory { + return this.layoutInfoProvider.getAcceleratorCategory(source, action); + } + /** * Returns the uuid of an accelerator if the * accelerator exists. Otherwise returns `undefined`. @@ -433,6 +438,7 @@ type AcceleratorLayoutLookupMap = Map<AcceleratorCategory, Map<AcceleratorSubcategory, LayoutInfo[]>>; type AcceleratorNameLookupMap = Map<AcceleratorId, AcceleratorName>; +type AcceleratorCategoryLookupMap = Map<AcceleratorId, AcceleratorCategory>; interface LayoutProviderInterface { getAcceleratorLayout( @@ -442,6 +448,8 @@ Map<AcceleratorSubcategory, LayoutInfo[]>|undefined; getAcceleratorName(source: number|string, action: number|string): AcceleratorName; + getAcceleratorCategory(source: number|string, action: number|string): + AcceleratorCategory; initializeLayoutInfo(layoutInfoList: MojoLayoutInfo[]): void; resetLookupMaps(): void; } @@ -464,6 +472,11 @@ * the value as the string corresponding to the accelerator's name. */ private acceleratorNameLookup: AcceleratorNameLookupMap = new Map(); + /** + * A map with the string key formatted as `${source_id}-${action_id}` and + * the value corresponding to the accelerator's category. + */ + private acceleratorCategoryLookup: AcceleratorCategoryLookupMap = new Map(); getAcceleratorLayout( category: AcceleratorCategory, @@ -488,6 +501,16 @@ return acceleratorName; } + getAcceleratorCategory(source: number|string, action: number|string): + AcceleratorCategory { + const uuid: AcceleratorId = getAcceleratorId(source, action); + const acceleratorCategory = this.acceleratorCategoryLookup.get(uuid); + // The value of 'acceleratorCategory' could possibly be '0' (representing + // 'kGeneral'). So we should only assert that it's not 'undefined'. + assert(acceleratorCategory !== undefined); + return acceleratorCategory; + } + initializeLayoutInfo(layoutInfoList: MojoLayoutInfo[]): void { this.initializeCategoryMaps(layoutInfoList); for (const entry of layoutInfoList) { @@ -501,6 +524,8 @@ const layoutInfo = createSanitizedLayoutInfo(entry); this.getAcceleratorLayout(entry.category, entry.subCategory) .push(layoutInfo); + this.addEntrytoAcceleratorCategoryLookup( + getAcceleratorId(entry.source, entry.action), entry.category); this.addEntrytoAcceleratorNameLookup( getAcceleratorId(entry.source, entry.action), layoutInfo.description); } @@ -524,8 +549,14 @@ this.acceleratorNameLookup.set(uuid, description); } + private addEntrytoAcceleratorCategoryLookup( + uuid: string, category: AcceleratorCategory): void { + this.acceleratorCategoryLookup.set(uuid, category); + } + resetLookupMaps(): void { this.acceleratorLayoutLookup.clear(); this.acceleratorNameLookup.clear(); + this.acceleratorCategoryLookup.clear(); } }
diff --git a/ash/webui/shortcut_customization_ui/resources/js/accelerator_row.html b/ash/webui/shortcut_customization_ui/resources/js/accelerator_row.html index ddec998f..738e9a2 100644 --- a/ash/webui/shortcut_customization_ui/resources/js/accelerator_row.html +++ b/ash/webui/shortcut_customization_ui/resources/js/accelerator_row.html
@@ -7,6 +7,10 @@ grid-template-columns: minmax(min-content, 286px) 50%; } + #container:hover accelerator-view::part(edit-icon) { + opacity: 1; + } + accelerator-view, text-accelerator { line-height: 3.2; @@ -53,7 +57,8 @@ <template is="dom-if" if="[[isDefaultLayout(layoutStyle)]]"> <template is="dom-repeat" items="[[getFilteredAccelerators(acceleratorInfos)]]"> <accelerator-view class="accelerator-item" accelerator-info="[[item]]" - action="[[action]]" source="[[source]]" source-is-locked="[[isLocked]]"> + action="[[action]]" source="[[source]]" source-is-locked="[[isLocked]]" + show-edit-icon="true"> </accelerator-view> </template> <div id="noShortcutAssigned" hidden="[[!isEmptyList(acceleratorInfos)]]"> @@ -61,7 +66,8 @@ </div> </template> <template is="dom-if" if="[[isTextLayout(layoutStyle)]]"> - <text-accelerator parts="[[getTextAcceleratorParts(acceleratorInfos)]]"> + <text-accelerator parts="[[getTextAcceleratorParts(acceleratorInfos)]]" + action="[[action]]" source="[[source]]"> </text-accelerator> </template> </td>
diff --git a/ash/webui/shortcut_customization_ui/resources/js/accelerator_row.ts b/ash/webui/shortcut_customization_ui/resources/js/accelerator_row.ts index 498c0875..0199add 100644 --- a/ash/webui/shortcut_customization_ui/resources/js/accelerator_row.ts +++ b/ash/webui/shortcut_customization_ui/resources/js/accelerator_row.ts
@@ -91,7 +91,7 @@ override disconnectedCallback(): void { super.disconnectedCallback(); if (!this.isLocked) { - this.removeEventListener('click', () => this.showDialog()); + this.removeEventListener('edit-icon-clicked', () => this.showDialog()); } } @@ -100,7 +100,7 @@ .then(({isMutable}) => { this.isLocked = !isMutable; if (!this.isLocked) { - this.addEventListener('click', () => this.showDialog()); + this.addEventListener('edit-icon-clicked', () => this.showDialog()); } }); }
diff --git a/ash/webui/shortcut_customization_ui/resources/js/accelerator_subsection.html b/ash/webui/shortcut_customization_ui/resources/js/accelerator_subsection.html index 023669d..677db59 100644 --- a/ash/webui/shortcut_customization_ui/resources/js/accelerator_subsection.html +++ b/ash/webui/shortcut_customization_ui/resources/js/accelerator_subsection.html
@@ -1,4 +1,4 @@ -<style> +<style include="shortcut-customization-shared"> #container { border-spacing: 0; width: var(--cr-toolbar-field-width); @@ -28,10 +28,27 @@ * screen readers. */ display: none; } + + #title-container { + align-items: center; + display: flex; + } + + iron-icon[icon='shortcut-customization:lock'] { + --iron-icon-width: 13px; + --iron-icon-height: 13px; + } </style> <table id="container" part="container"> - <caption id="title">[[title]]</caption> + <caption> + <div id="title-container"> + <div id="title">[[title]]</div> + <div class="lock-icon-container" hidden="[[!shouldShowLockIcon()]]"> + <iron-icon icon="shortcut-customization:lock"></iron-icon> + </div> + </div> + </caption> <thead> <!-- Empty header rows are used so that ChromeVox correctly interprets this table as a data table and not a layout table.-->
diff --git a/ash/webui/shortcut_customization_ui/resources/js/accelerator_subsection.ts b/ash/webui/shortcut_customization_ui/resources/js/accelerator_subsection.ts index b2d70d92..333e304 100644 --- a/ash/webui/shortcut_customization_ui/resources/js/accelerator_subsection.ts +++ b/ash/webui/shortcut_customization_ui/resources/js/accelerator_subsection.ts
@@ -11,7 +11,7 @@ import {AcceleratorLookupManager} from './accelerator_lookup_manager.js'; import {getTemplate} from './accelerator_subsection.html.js'; import {AcceleratorCategory, AcceleratorInfo, AcceleratorState, AcceleratorSubcategory, AcceleratorType, LayoutInfo} from './shortcut_types.js'; -import {compareAcceleratorInfos, getSubcategoryNameStringId} from './shortcut_utils.js'; +import {compareAcceleratorInfos, getSubcategoryNameStringId, isCategoryLocked, isCustomizationDisabled} from './shortcut_utils.js'; /** * This interface is used to hold all the data needed by an @@ -150,6 +150,12 @@ static get template(): HTMLTemplateElement { return getTemplate(); } + + // Show lock icon next to subcategory if customization is enabled and the + // category is locked. + private shouldShowLockIcon(): boolean { + return !isCustomizationDisabled() && isCategoryLocked(this.category); + } } declare global {
diff --git a/ash/webui/shortcut_customization_ui/resources/js/accelerator_view.html b/ash/webui/shortcut_customization_ui/resources/js/accelerator_view.html index 84bc06c..65ed50a 100644 --- a/ash/webui/shortcut_customization_ui/resources/js/accelerator_view.html +++ b/ash/webui/shortcut_customization_ui/resources/js/accelerator_view.html
@@ -1,4 +1,4 @@ -<style> +<style include="shortcut-customization-shared"> .flex-row { display: flex; flex-direction: row; @@ -20,21 +20,28 @@ padding-inline-end: 5px; } - #lockIconContainer { - align-items: center; - display: flex; - } - - #lockIconContainer[hidden] { - display: none; /* Required for flexbox hidden. */ - } - - iron-icon { + iron-icon[icon='shortcut-customization:lock'] { + --iron-icon-height: 16px; --iron-icon-width: 16px; } - iron-icon[icon='shortcut-customization:lock'] { - --iron-icon-fill-color: var(--shortcuts-lock-icon-color); + #editIconContainer { + align-items: center; + display: flex; + margin-inline-start: 8px; + opacity: 0; + transition: opacity 300ms, transform 100ms; + } + + #editIconContainer[hidden] { + display: none; /* Required for flexbox hidden. */ + } + + #editButton { + --cr-icon-button-icon-size: 16px; + --cr-icon-button-fill-color: var(--cros-text-color-secondary); + --cr-icon-button-icon-start-offset: 3px; + padding-top: 3px; } </style> @@ -49,11 +56,16 @@ key-state="alpha-numeric-selected"> </input-key> </div> - <div - id="lockIconContainer" - hidden="[[!shouldShowLockIcon(acceleratorInfo.locked, sourceIsLocked)]]"> + <div class="lock-icon-container" + hidden="[[!shouldShowLockIcon(acceleratorInfo.locked, sourceIsLocked)]]"> <iron-icon icon="shortcut-customization:lock"></iron-icon> </div> + <div id="editIconContainer" part="edit-icon" on-click="onEditIconClicked" + hidden="[[!shouldShowEditIcon(acceleratorInfo.locked, sourceIsLocked)]]"> + <cr-icon-button id="editButton" class="clickable-button" + iron-icon="shortcut-customization:edit"> + </cr-icon-button> + </div> </template> <template is="dom-if" if="[[showEditView(viewState)]]"> <div id="editContainer" class="flex-row">
diff --git a/ash/webui/shortcut_customization_ui/resources/js/accelerator_view.ts b/ash/webui/shortcut_customization_ui/resources/js/accelerator_view.ts index 7e6baaf..cb15ba3 100644 --- a/ash/webui/shortcut_customization_ui/resources/js/accelerator_view.ts +++ b/ash/webui/shortcut_customization_ui/resources/js/accelerator_view.ts
@@ -19,7 +19,7 @@ import {mojoString16ToString} from './mojo_utils.js'; import {ModifierKeyCodes} from './shortcut_input.js'; import {Accelerator, AcceleratorConfigResult, AcceleratorSource, Modifier, ShortcutProviderInterface, StandardAcceleratorInfo} from './shortcut_types.js'; -import {areAcceleratorsEqual, createEmptyAcceleratorInfo, getAccelerator, getModifiersForAcceleratorInfo, isCustomizationDisabled, isFunctionKey} from './shortcut_utils.js'; +import {areAcceleratorsEqual, createEmptyAcceleratorInfo, getAccelerator, getModifiersForAcceleratorInfo, isCategoryLocked, isCustomizationDisabled, isFunctionKey} from './shortcut_utils.js'; export interface AcceleratorViewElement { $: { @@ -110,6 +110,15 @@ type: Boolean, value: false, }, + + /** + * Conditionally show the edit-icon-container in `accelerator-view`, true + * for `accelerator-row`, false for `accelerator-edit-view`. + */ + showEditIcon: { + type: Boolean, + value: false, + }, }; } @@ -120,6 +129,7 @@ action: number; source: AcceleratorSource; sourceIsLocked: boolean; + showEditIcon: boolean; protected pendingAcceleratorInfo: StandardAcceleratorInfo; private modifiers: string[]; private acceleratorOnHold: string; @@ -439,7 +449,11 @@ } private shouldShowLockIcon(): boolean { - if (isCustomizationDisabled()) { + // Do not show lock icon in each row if customization is disabled or its + // category is locked. + if (isCustomizationDisabled() || + isCategoryLocked(this.lookupManager.getAcceleratorCategory( + this.source, this.action))) { return false; } @@ -447,6 +461,24 @@ this.sourceIsLocked; } + private shouldShowEditIcon(): boolean { + // Do not show edit icon in each row if customization is disabled, category + // is locked, or the row is displayed in edit-dialog. + if (isCustomizationDisabled() || !this.showEditIcon || + isCategoryLocked(this.lookupManager.getAcceleratorCategory( + this.source, this.action))) { + return false; + } + + return !(this.acceleratorInfo && this.acceleratorInfo.locked) && + !this.sourceIsLocked; + } + + private onEditIconClicked(): void { + this.dispatchEvent( + new CustomEvent('edit-icon-clicked', {bubbles: true, composed: true})); + } + /** * Determines whether accelerator items should be tab-focusable. */
diff --git a/ash/webui/shortcut_customization_ui/resources/js/shortcut_utils.ts b/ash/webui/shortcut_customization_ui/resources/js/shortcut_utils.ts index 9f53e48..5079b847 100644 --- a/ash/webui/shortcut_customization_ui/resources/js/shortcut_utils.ts +++ b/ash/webui/shortcut_customization_ui/resources/js/shortcut_utils.ts
@@ -249,3 +249,12 @@ export const isFunctionKey = (keycode: number): boolean => { return keycode >= kF11 && keycode <= kF24; }; + +// TODO(longbowei): Update to dynamically check if all shortcuts within a +// category are locked instead of hardcoding specific categories. +export const isCategoryLocked = (category: AcceleratorCategory): boolean => { + return ( + category === AcceleratorCategory.kBrowser || + category === AcceleratorCategory.kText || + category === AcceleratorCategory.kAccessibility); +};
diff --git a/ash/webui/shortcut_customization_ui/resources/js/text_accelerator.html b/ash/webui/shortcut_customization_ui/resources/js/text_accelerator.html index d0c26c613..b88929c 100644 --- a/ash/webui/shortcut_customization_ui/resources/js/text_accelerator.html +++ b/ash/webui/shortcut_customization_ui/resources/js/text_accelerator.html
@@ -1,4 +1,4 @@ -<style> +<style include="shortcut-customization-shared"> .spacing { color: var(--cros-text-color-secondary); font: var(--cros-button-2-font); @@ -20,14 +20,9 @@ white-space: nowrap; } - iron-icon { + iron-icon[icon='shortcut-customization:lock'] { --iron-icon-width: 16px; --iron-icon-height: 16px; - --iron-icon-fill-color: var(--cros-text-color-secondary); - } - - iron-icon[icon='shortcut-customization:lock'] { - --iron-icon-fill-color: var(--shortcuts-lock-icon-color); } </style> @@ -36,8 +31,8 @@ accelerator parts. --> <div id="text-wrapper"> <div class="parts-container"></div> - <div hidden="[[!shouldShowLockIcon()]]"> - <iron-icon id="lock" icon="shortcut-customization:lock"></iron-icon> + <div class="lock-icon-container" hidden="[[!shouldShowLockIcon()]]"> + <iron-icon icon="shortcut-customization:lock"></iron-icon> </div> </div> </div> \ No newline at end of file
diff --git a/ash/webui/shortcut_customization_ui/resources/js/text_accelerator.ts b/ash/webui/shortcut_customization_ui/resources/js/text_accelerator.ts index b3acbaf..209cf97c 100644 --- a/ash/webui/shortcut_customization_ui/resources/js/text_accelerator.ts +++ b/ash/webui/shortcut_customization_ui/resources/js/text_accelerator.ts
@@ -10,10 +10,11 @@ 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 {AcceleratorLookupManager} from './accelerator_lookup_manager.js'; import {InputKeyElement, KeyInputState} from './input_key.js'; import {mojoString16ToString} from './mojo_utils.js'; -import {TextAcceleratorInfo, TextAcceleratorPart, TextAcceleratorPartType} from './shortcut_types.js'; -import {isCustomizationDisabled, isTextAcceleratorInfo} from './shortcut_utils.js'; +import {AcceleratorSource, TextAcceleratorInfo, TextAcceleratorPart, TextAcceleratorPartType} from './shortcut_types.js'; +import {isCategoryLocked, isCustomizationDisabled, isTextAcceleratorInfo} from './shortcut_utils.js'; import {getTemplate} from './text_accelerator.html.js'; /** @@ -58,12 +59,26 @@ // can be updated. observer: TextAcceleratorElement.prototype.parseAndDisplayTextParts, }, + + action: { + type: Number, + value: 0, + }, + + source: { + type: Number, + value: 0, + }, }; } parts: TextAcceleratorPart[]; narrow: boolean; highlighted: boolean; + action: number; + source: AcceleratorSource; + private lookupManager: AcceleratorLookupManager = + AcceleratorLookupManager.getInstance(); static getTextAcceleratorParts(info: TextAcceleratorInfo[]): TextAcceleratorPart[] { @@ -128,7 +143,11 @@ } private shouldShowLockIcon(): boolean { - return !isCustomizationDisabled(); + // Show lock icon in each row if customization is enabled and its + // category is not locked. + return !isCustomizationDisabled() && + !isCategoryLocked(this.lookupManager.getAcceleratorCategory( + this.source, this.action)); } private areAllPartsTextParts(): boolean {
diff --git a/ash/wm/always_on_top_controller.cc b/ash/wm/always_on_top_controller.cc index 8cacf40..eb0e144 100644 --- a/ash/wm/always_on_top_controller.cc +++ b/ash/wm/always_on_top_controller.cc
@@ -6,6 +6,7 @@ #include "ash/public/cpp/shell_window_ids.h" #include "ash/public/cpp/window_properties.h" +#include "ash/wm/desks/desk.h" #include "ash/wm/desks/desks_controller.h" #include "ash/wm/desks/desks_util.h" #include "ash/wm/window_state.h" @@ -58,14 +59,28 @@ ui::ZOrderLevel::kNormal) { aura::Window* root = always_on_top_container_->GetRootWindow(); - // TODO(afakhry): Do we need to worry about the context of |window| here? Or - // is it safe to assume that |window| should always be parented to the - // active desks' container. + DesksController* desks_controller = DesksController::Get(); + const std::string* desk_uuid_string = + window->GetProperty(aura::client::kDeskUuidKey); + if (desk_uuid_string) { + const base::Uuid desk_guid = + base::Uuid::ParseLowercase(*desk_uuid_string); + if (desk_guid.is_valid()) { + if (Desk* target_desk = desks_controller->GetDeskByUuid(desk_guid)) { + if (auto* container = target_desk->GetDeskContainerForRoot(root)) { + return container; + } + } + } + } + const int window_workspace = window->GetProperty(aura::client::kWindowWorkspaceKey); if (window_workspace != aura::client::kWindowWorkspaceUnassignedWorkspace) { + LOG(ERROR) << "AlwaysOnTopController::GetContainer 2"; auto* desk_container = - DesksController::Get()->GetDeskContainer(root, window_workspace); + desks_controller->GetDeskContainer(root, window_workspace); + LOG(ERROR) << "AlwaysOnTopController::GetContainer 3"; if (desk_container) return desk_container; }
diff --git a/ash/wm/desks/desk.cc b/ash/wm/desks/desk.cc index 6777901..0592dba1 100644 --- a/ash/wm/desks/desk.cc +++ b/ash/wm/desks/desk.cc
@@ -396,9 +396,9 @@ if (!is_desk_being_removed_ && !desks_util::IsWindowVisibleOnAllWorkspaces(window)) { // Setting the property for `kWindowWorkspaceKey` or - // `kDeskGuidKey` will trigger a save for the window state. To + // `kDeskUuidKey` will trigger a save for the window state. To // avoid doing this twice, we tell the window state to hold off on saving - // until we save the `kDeskGuidKey` value. + // until we save the `kDeskUuidKey` value. // TODO(b/265490703): We should eventually clean up this and // `GetScopedIgnorePropertyChange` when unit tests no longer need this // scoping to prevent double saves. @@ -409,7 +409,7 @@ desks_controller->GetDeskIndex(this)); } - window->SetProperty(kDeskGuidKey, uuid_.AsLowercaseString()); + window->SetProperty(aura::client::kDeskUuidKey, uuid_.AsLowercaseString()); } MaybeIncrementWeeklyActiveDesks();
diff --git a/ash/wm/desks/desks_controller.cc b/ash/wm/desks/desks_controller.cc index bcf21e2..3aa7ddb80 100644 --- a/ash/wm/desks/desks_controller.cc +++ b/ash/wm/desks/desks_controller.cc
@@ -555,6 +555,15 @@ return it != desks_.end() ? it->get() : nullptr; } +int DesksController::GetDeskIndexByUuid(const base::Uuid& desk_uuid) const { + for (size_t i = 0; i < desks_.size(); ++i) { + if (desk_uuid == desks_[i]->uuid()) { + return i; + } + } + return -1; +} + bool DesksController::CanRemoveDesks() const { return desks_.size() > 1; } @@ -1276,13 +1285,11 @@ // not be visible on all desks. if (!desks_util::IsWindowVisibleOnAllWorkspaces( existing_app_instance_window)) { - // The index of the target desk is found in `app_restore_data`. If it isn't - // set, or out of bounds, then we default to the rightmost desk. - const int rightmost_desk_index = desks_.size() - 1; - const int target_desk_index = - std::min(app_restore_data.desk_id.value_or(rightmost_desk_index), - rightmost_desk_index); - Desk* target_desk = desks_[target_desk_index].get(); + // The uuid of the target desk is found in `app_restore_data`. If it isn't + // set, or is invalid, then we default to the rightmost desk. + Desk* target_desk = app_restore_data.desk_guid.is_valid() + ? GetDeskByUuid(app_restore_data.desk_guid) + : desks_.back().get(); DCHECK(src_desk); if (src_desk != target_desk) {
diff --git a/ash/wm/desks/desks_controller.h b/ash/wm/desks/desks_controller.h index 5285c900..0330d90a 100644 --- a/ash/wm/desks/desks_controller.h +++ b/ash/wm/desks/desks_controller.h
@@ -186,6 +186,10 @@ // found. Desk* GetDeskByUuid(const base::Uuid& desk_uuid) const; + // Returns the desk index of the desk that matches the desk_uuid, and returns + // -1 if no match is found. + int GetDeskIndexByUuid(const base::Uuid& desk_uuid) const; + // Creates a new desk. CanCreateDesks() must be checked before calling this. void NewDesk(DesksCreationRemovalSource source);
diff --git a/ash/wm/desks/templates/admin_template_launch_tracker.cc b/ash/wm/desks/templates/admin_template_launch_tracker.cc index 607ca21..27a33d0 100644 --- a/ash/wm/desks/templates/admin_template_launch_tracker.cc +++ b/ash/wm/desks/templates/admin_template_launch_tracker.cc
@@ -358,9 +358,7 @@ // Set apps to launch on the current desk. auto* desks_controller = DesksController::Get(); - const int desk_index = - desks_controller->GetDeskIndex(desks_controller->active_desk()); - admin_template->SetDeskIndex(desk_index); + admin_template->SetDeskUuid(desks_controller->active_desk()->uuid()); UpdateAdminTemplateActivationIndices(*admin_template);
diff --git a/ash/wm/desks/templates/restore_data_collector.cc b/ash/wm/desks/templates/restore_data_collector.cc index ac02193..3d890f5e 100644 --- a/ash/wm/desks/templates/restore_data_collector.cc +++ b/ash/wm/desks/templates/restore_data_collector.cc
@@ -79,9 +79,10 @@ BuildWindowInfo(window, /*activation_index=*/absl::nullopt, /*for_saved_desks=*/true, mru_windows); - // Clear the desk ID in the WindowInfo that is to be stored in the template. - // It will be set to the ID of a newly created desk when launching. + // Clear the desk ID and uuid in the WindowInfo that is to be stored in the + // template. They will be set to the newly created desk when launching. window_info->desk_id.reset(); + window_info->desk_guid = base::Uuid(); ++call.pending_request_count; delegate->GetAppLaunchDataForSavedDesk(
diff --git a/ash/wm/desks/templates/saved_desk_presenter.cc b/ash/wm/desks/templates/saved_desk_presenter.cc index 5e5d3e9..b366fbf 100644 --- a/ash/wm/desks/templates/saved_desk_presenter.cc +++ b/ash/wm/desks/templates/saved_desk_presenter.cc
@@ -572,10 +572,9 @@ } } - // Copy the index of the newly created desk to the saved desk. This ensures + // Copy the uuid of the newly created desk to the saved desk. This ensures // that apps appear on the right desk even if the user switches to another. - const int desk_index = DesksController::Get()->GetDeskIndex(new_desk); - saved_desk->SetDeskIndex(desk_index); + saved_desk->SetDeskUuid(new_desk->uuid()); Shell::Get()->saved_desk_delegate()->LaunchAppsFromSavedDesk( std::move(saved_desk)); @@ -601,7 +600,7 @@ overview_session_->GetGridWithRootWindow(root_window) ->desks_bar_view() - ->NudgeDeskName(desk_index); + ->NudgeDeskName(DesksController::Get()->GetDeskIndex(new_desk)); if (saved_desk_type == DeskTemplateType::kSaveAndRecall) { // Passing nullopt as type since this indicates that we don't want to record
diff --git a/ash/wm/multitask_menu_nudge_controller_unittest.cc b/ash/wm/multitask_menu_nudge_controller_unittest.cc index e8fd1c20..719882dc 100644 --- a/ash/wm/multitask_menu_nudge_controller_unittest.cc +++ b/ash/wm/multitask_menu_nudge_controller_unittest.cc
@@ -209,6 +209,37 @@ TabletModeControllerTestApi().EnterTabletMode(); } +// Tests that there is no crash after a window is placed such that the nudge +// widget should be offscreen. Regression test for b/282994793. +TEST_F(MultitaskMenuNudgeControllerTest, + NoCrashAfterActivatingMostlyOffscreenWindowMultidisplay) { + // Crash is multidisplay related since it involves switching root windows. + UpdateDisplay("1600x1000,1601+0-1200x1000"); + + // Create two windows so we can reactivate `window2` to simulate the crash + // because the window manager will shift `window2` onscreen if we try to + // create it offscreen directly. + auto window1 = CreateAppWindow(gfx::Rect(300, 300)); + auto window2 = CreateAppWindow(gfx::Rect(1000, 300)); + + // Place `window2` mostly offscreen on primary display, such that on + // activation, the nudge widget should not be seen. + window2->SetBounds(gfx::Rect(1400, 0, 1000, 300)); + ASSERT_EQ(Shell::GetAllRootWindows()[0], window2->GetRootWindow()); + + // The nudge widget was shown on `window1` since it was created first. Dismiss + // it and advance the clock so it will show on the next window activation. + ASSERT_TRUE(GetNudgeWidgetForWindow(window1.get())); + FireDismissNudgeTimer(window1.get()); + wm::ActivateWindow(window1.get()); + test_clock_.Advance(base::Hours(26)); + + // Activate `window2`. Verify that the nudge widget is not created since the + // anchor is invisible. + wm::ActivateWindow(window2.get()); + EXPECT_FALSE(GetNudgeWidgetForWindow(window2.get())); +} + TEST_F(MultitaskMenuNudgeControllerTest, NudgeTimeout) { auto window = CreateAppWindow(gfx::Rect(300, 300)); ASSERT_TRUE(GetNudgeWidgetForWindow(window.get()));
diff --git a/ash/wm/splitview/split_view_metrics_controller.cc b/ash/wm/splitview/split_view_metrics_controller.cc index 3ae7118..ecaf7fb 100644 --- a/ash/wm/splitview/split_view_metrics_controller.cc +++ b/ash/wm/splitview/split_view_metrics_controller.cc
@@ -411,9 +411,8 @@ } // Check if the recovered window is in the current desk. - if (!window_info->desk_id.has_value() || - window_info->desk_id.value() != - DesksController::Get()->GetDeskIndex(current_desk_)) { + if (!window_info->desk_guid.is_valid() || + window_info->desk_guid != current_desk_->uuid()) { return; }
diff --git a/ash/wm/window_restore/window_restore_controller.cc b/ash/wm/window_restore/window_restore_controller.cc index 9ba435d..3c243a0 100644 --- a/ash/wm/window_restore/window_restore_controller.cc +++ b/ash/wm/window_restore/window_restore_controller.cc
@@ -14,6 +14,7 @@ #include "ash/session/session_controller_impl.h" #include "ash/shell.h" #include "ash/wm/container_finder.h" +#include "ash/wm/desks/desk.h" #include "ash/wm/desks/desks_util.h" #include "ash/wm/desks/templates/saved_desk_util.h" #include "ash/wm/float/float_controller.h" @@ -343,9 +344,18 @@ app_restore::WindowInfo* window_info = GetWindowInfo(window); if (window_info) { - const int desk_id = window_info->desk_id - ? int{*window_info->desk_id} - : aura::client::kWindowWorkspaceUnassignedWorkspace; + int desk_id = -1; + if (window_info->desk_guid.is_valid()) { + desk_id = + DesksController::Get()->GetDeskIndexByUuid(window_info->desk_guid); + } + // Its possible that the uuid is valid but it is not the uuid of any current + // desk. + if (desk_id == -1) { + desk_id = window_info->desk_id + ? static_cast<int>(*window_info->desk_id) + : aura::client::kWindowWorkspaceUnassignedWorkspace; + } window->SetProperty(aura::client::kWindowWorkspaceKey, desk_id); }
diff --git a/ash/wm/window_restore/window_restore_util.cc b/ash/wm/window_restore/window_restore_util.cc index 33e4d35..19056c5 100644 --- a/ash/wm/window_restore/window_restore_util.cc +++ b/ash/wm/window_restore/window_restore_util.cc
@@ -62,12 +62,13 @@ window_info->activation_index = window_activation_index; window_info->window = window; window_info->desk_id = window->GetProperty(aura::client::kWindowWorkspaceKey); - const std::string* desk_guid = window->GetProperty(kDeskGuidKey); + const std::string* desk_uuid = + window->GetProperty(aura::client::kDeskUuidKey); // It's possible for the desk to no longer exist or not be found in the case of // CloseAll. window_info->desk_guid = - desk_guid ? base::Uuid::ParseLowercase(*desk_guid) : base::Uuid(); + desk_uuid ? base::Uuid::ParseLowercase(*desk_uuid) : base::Uuid(); // If override bounds and window state are available (in tablet mode), save // those bounds.
diff --git a/ash/wm/window_state.cc b/ash/wm/window_state.cc index 75f2419..d80d2ae 100644 --- a/ash/wm/window_state.cc +++ b/ash/wm/window_state.cc
@@ -1376,7 +1376,8 @@ } return; } - if (key == aura::client::kWindowWorkspaceKey || key == kDeskGuidKey) { + if (key == aura::client::kWindowWorkspaceKey || + key == aura::client::kDeskUuidKey) { // Save the window for window restore purposes unless // |ignore_property_change_| is true. Note that moving windows across // displays will also trigger a kWindowWorkspaceKey change, even if the
diff --git a/base/android/java/src/org/chromium/base/metrics/CachingUmaRecorder.java b/base/android/java/src/org/chromium/base/metrics/CachingUmaRecorder.java index a1620b6..5f9658d 100644 --- a/base/android/java/src/org/chromium/base/metrics/CachingUmaRecorder.java +++ b/base/android/java/src/org/chromium/base/metrics/CachingUmaRecorder.java
@@ -330,15 +330,8 @@ for (Histogram histogram : cache.values()) { flushedHistogramSampleCount += histogram.flushTo(mDelegate); } - Log.i(TAG, "Flushed %d samples from %d histograms.", flushedHistogramSampleCount, - flushedHistogramCount); - // Using RecordHistogram here could cause an infinite recursion. - mDelegate.recordExponentialHistogram("UMA.JavaCachingRecorder.DroppedHistogramSampleCount", - droppedHistogramSampleCount, 1, 1_000_000, 50); - mDelegate.recordExponentialHistogram("UMA.JavaCachingRecorder.FlushedHistogramCount", - flushedHistogramCount, 1, 100_000, 50); - mDelegate.recordExponentialHistogram("UMA.JavaCachingRecorder.InputHistogramSampleCount", - flushedHistogramSampleCount + droppedHistogramSampleCount, 1, 1_000_000, 50); + Log.i(TAG, "Flushed %d samples from %d histograms, %d samples were dropped.", + flushedHistogramSampleCount, flushedHistogramCount, droppedHistogramSampleCount); } /** @@ -355,11 +348,8 @@ for (UserAction userAction : cache) { userAction.flushTo(mDelegate); } - // Using RecordHistogram here could cause an infinite recursion. - mDelegate.recordExponentialHistogram("UMA.JavaCachingRecorder.DroppedUserActionCount", - droppedUserActionCount, 1, 1_000, 50); - mDelegate.recordExponentialHistogram("UMA.JavaCachingRecorder.InputUserActionCount", - cache.size() + droppedUserActionCount, 1, 10_000, 50); + Log.i(TAG, "Flushed %d user action samples, %d samples were dropped.", cache.size(), + droppedUserActionCount); } /**
diff --git a/base/android/junit/src/org/chromium/base/metrics/CachingUmaRecorderTest.java b/base/android/junit/src/org/chromium/base/metrics/CachingUmaRecorderTest.java index 0d69b7a..772a0fc 100644 --- a/base/android/junit/src/org/chromium/base/metrics/CachingUmaRecorderTest.java +++ b/base/android/junit/src/org/chromium/base/metrics/CachingUmaRecorderTest.java
@@ -334,8 +334,6 @@ @Override public void recordExponentialHistogram( String name, int sample, int min, int max, int numBuckets) { - // Ignore internal cache metrics. - if (name.startsWith("UMA.JavaCachingRecorder")) return; throw new UnsupportedOperationException(); } @@ -448,8 +446,6 @@ @Override public void recordExponentialHistogram( String name, int sample, int min, int max, int numBuckets) { - // Ignore internal cache metrics. - if (name.startsWith("UMA.JavaCachingRecorder")) return; throw new UnsupportedOperationException(); }
diff --git a/base/containers/README.md b/base/containers/README.md index d7bd46a..c76b5d7 100644 --- a/base/containers/README.md +++ b/base/containers/README.md
@@ -207,7 +207,7 @@ Example: ```cpp -constexpr auto kSet = base::MakeFixedFlatSet<int>(1, 2, 3); +constexpr auto kSet = base::MakeFixedFlatSet<int>({1, 2, 3}); constexpr auto kMap = base::MakeFixedFlatMap<base::StringPiece, int>( {{"foo", 1}, {"bar", 2}, {"baz", 3}});
diff --git a/build/config/c++/libc++.natvis b/build/config/c++/libc++.natvis index 6378548..26580dbb 100644 --- a/build/config/c++/libc++.natvis +++ b/build/config/c++/libc++.natvis
@@ -11,20 +11,20 @@ * if T is empty and non-final the 3rd param is 1 and it derives from T * else it has a member variable __value_ of type T --> - <Type Name="std::Cr::__compressed_pair_elem<*,*,0>"> + <Type Name="std::__Cr::__compressed_pair_elem<*,*,0>"> <DisplayString>{__value_}</DisplayString> <Expand> <ExpandedItem>__value_</ExpandedItem> </Expand> </Type> - <Type Name="std::Cr::__compressed_pair_elem<*,*,1>"> + <Type Name="std::__Cr::__compressed_pair_elem<*,*,1>"> <DisplayString>{*($T1*)this}</DisplayString> <Expand> <ExpandedItem>*($T1*)this</ExpandedItem> </Expand> </Type> - <Type Name="std::Cr::array<*,*>"> + <Type Name="std::__Cr::array<*,*>"> <DisplayString>{{ size={$T2} }}</DisplayString> <Expand> <ArrayItems> @@ -50,7 +50,7 @@ and the inline data in the remaining storage.) --> - <Type Name="std::Cr::basic_string<char,*>"> + <Type Name="std::__Cr::basic_string<char,*>"> <!--<Intrinsic Name="is_long" Expression="((__rep*)&__r_)->__s.__size_ & 0x80" />--> <!-- The above doesn't work because of https://llvm.org/PR41615 @@ -85,7 +85,7 @@ </Expand> </Type> - <Type Name="std::Cr::basic_string<wchar_t,*>"> + <Type Name="std::__Cr::basic_string<wchar_t,*>"> <Intrinsic Name="is_long" Expression="*(((char*)this) + 3*sizeof(size_t) - 1) & 0x80" /> <DisplayString Condition="is_long()">{*(wchar_t**)this}</DisplayString> @@ -113,7 +113,7 @@ </Expand> </Type> - <Type Name="std::Cr::deque<*,*>"> + <Type Name="std::__Cr::deque<*,*>"> <Intrinsic Name="size" Expression="*(size_type*)&__size_" /> <Intrinsic Name="block_size" Expression="sizeof($T1) < 256 ? 4096 / sizeof($T1) : 16" /> @@ -129,7 +129,7 @@ </Expand> </Type> - <Type Name="std::Cr::forward_list<*>"> + <Type Name="std::__Cr::forward_list<*>"> <Intrinsic Name="head" Expression="((__node_pointer)&__before_begin_)->__next_" /> <DisplayString Condition="head() == 0">empty</DisplayString> @@ -154,7 +154,7 @@ </Expand> </Type> - <Type Name="std::Cr::list<*>"> + <Type Name="std::__Cr::list<*>"> <Intrinsic Name="size" Expression="*(size_type*)&__size_alloc_" /> <DisplayString>{{ size={size()} }}</DisplayString> <Expand> @@ -163,14 +163,14 @@ <HeadPointer>__end_.__next_</HeadPointer> <NextPointer>__next_</NextPointer> <ValueNode> - ((std::Cr::list<$T1,$T2>::__node_pointer)this) + ((std::__Cr::list<$T1,$T2>::__node_pointer)this) ->__value_ </ValueNode> </LinkedListItems> </Expand> </Type> - <Type Name="std::Cr::map<*>"> + <Type Name="std::__Cr::map<*>"> <Intrinsic Name="size" Expression="*(size_type*)&__tree_.__pair3_" /> <DisplayString>{{ size={size()} }}</DisplayString> <Expand> @@ -181,22 +181,22 @@ ((__node_pointer)&__tree_.__pair1_)->__left_ </HeadPointer> <LeftPointer> - ((std::Cr::map<$T1,$T2,$T3,$T4>::__node_pointer)this) + ((std::__Cr::map<$T1,$T2,$T3,$T4>::__node_pointer)this) ->__left_ </LeftPointer> <RightPointer> - ((std::Cr::map<$T1,$T2,$T3,$T4>::__node_pointer)this) + ((std::__Cr::map<$T1,$T2,$T3,$T4>::__node_pointer)this) ->__right_ </RightPointer> <ValueNode> - ((std::Cr::map<$T1,$T2,$T3,$T4>::__node_pointer)this) + ((std::__Cr::map<$T1,$T2,$T3,$T4>::__node_pointer)this) ->__value_.__cc_ </ValueNode> </TreeItems> </Expand> </Type> - <Type Name="std::Cr::multimap<*>"> + <Type Name="std::__Cr::multimap<*>"> <Intrinsic Name="size" Expression="*(size_type*)&__tree_.__pair3_" /> <DisplayString>{{ size={size()} }}</DisplayString> <Expand> @@ -207,22 +207,22 @@ ((__node_pointer)&__tree_.__pair1_)->__left_ </HeadPointer> <LeftPointer> - ((std::Cr::multimap<$T1,$T2,$T3,$T4>::__node_pointer)this) + ((std::__Cr::multimap<$T1,$T2,$T3,$T4>::__node_pointer)this) ->__left_ </LeftPointer> <RightPointer> - ((std::Cr::multimap<$T1,$T2,$T3,$T4>::__node_pointer)this) + ((std::__Cr::multimap<$T1,$T2,$T3,$T4>::__node_pointer)this) ->__right_ </RightPointer> <ValueNode> - ((std::Cr::multimap<$T1,$T2,$T3,$T4>::__node_pointer)this) + ((std::__Cr::multimap<$T1,$T2,$T3,$T4>::__node_pointer)this) ->__value_.__cc_ </ValueNode> </TreeItems> </Expand> </Type> - <Type Name="std::Cr::multiset<*>"> + <Type Name="std::__Cr::multiset<*>"> <Intrinsic Name="size" Expression="*(size_type*)&__tree_.__pair3_" /> <DisplayString>{{ size={size()} }}</DisplayString> <Expand> @@ -233,22 +233,22 @@ ((__base::__node_pointer)&__tree_.__pair1_)->__left_ </HeadPointer> <LeftPointer> - ((std::Cr::multiset<$T1,$T2,$T3>::__base::__node_pointer)this) + ((std::__Cr::multiset<$T1,$T2,$T3>::__base::__node_pointer)this) ->__left_ </LeftPointer> <RightPointer> - ((std::Cr::multiset<$T1,$T2,$T3>::__base::__node_pointer)this) + ((std::__Cr::multiset<$T1,$T2,$T3>::__base::__node_pointer)this) ->__right_ </RightPointer> <ValueNode> - ((std::Cr::multiset<$T1,$T2,$T3>::__base::__node_pointer)this) + ((std::__Cr::multiset<$T1,$T2,$T3>::__base::__node_pointer)this) ->__value_ </ValueNode> </TreeItems> </Expand> </Type> - <Type Name="std::Cr::priority_queue<*>"> + <Type Name="std::__Cr::priority_queue<*>"> <DisplayString>{c}</DisplayString> <Expand> <ExpandedItem>c</ExpandedItem> @@ -256,7 +256,7 @@ </Expand> </Type> - <Type Name="std::Cr::set<*>"> + <Type Name="std::__Cr::set<*>"> <Intrinsic Name="size" Expression="*(size_type*)&__tree_.__pair3_" /> <DisplayString>{{ size={size()} }}</DisplayString> <Expand> @@ -267,108 +267,108 @@ ((__base::__node_pointer)&__tree_.__pair1_)->__left_ </HeadPointer> <LeftPointer> - ((std::Cr::set<$T1,$T2,$T3>::__base::__node_pointer)this) + ((std::__Cr::set<$T1,$T2,$T3>::__base::__node_pointer)this) ->__left_ </LeftPointer> <RightPointer> - ((std::Cr::set<$T1,$T2,$T3>::__base::__node_pointer)this) + ((std::__Cr::set<$T1,$T2,$T3>::__base::__node_pointer)this) ->__right_ </RightPointer> <ValueNode> - ((std::Cr::set<$T1,$T2,$T3>::__base::__node_pointer)this) + ((std::__Cr::set<$T1,$T2,$T3>::__base::__node_pointer)this) ->__value_ </ValueNode> </TreeItems> </Expand> </Type> - <Type Name="std::Cr::stack<*>"> - <AlternativeType Name="std::Cr::queue<*>" /> + <Type Name="std::__Cr::stack<*>"> + <AlternativeType Name="std::__Cr::queue<*>" /> <DisplayString>{c}</DisplayString> <Expand> <ExpandedItem>c</ExpandedItem> </Expand> </Type> - <Type Name="std::Cr::__tuple_leaf<*,*,0>"> + <Type Name="std::__Cr::__tuple_leaf<*,*,0>"> <DisplayString>{__value_}</DisplayString> </Type> - <Type Name="std::Cr::tuple<>"> + <Type Name="std::__Cr::tuple<>"> <DisplayString>()</DisplayString> </Type> - <Type Name="std::Cr::tuple<*>"> - <DisplayString>({(std::Cr::__tuple_leaf<0,$T1,0>)__base_})</DisplayString> + <Type Name="std::__Cr::tuple<*>"> + <DisplayString>({(std::__Cr::__tuple_leaf<0,$T1,0>)__base_})</DisplayString> <Expand> - <Item Name="[0]">(std::Cr::__tuple_leaf<0,$T1,0>)__base_</Item> + <Item Name="[0]">(std::__Cr::__tuple_leaf<0,$T1,0>)__base_</Item> </Expand> </Type> - <Type Name="std::Cr::tuple<*,*>"> - <DisplayString>({(std::Cr::__tuple_leaf<0,$T1,0>)__base_}, {(std::Cr::__tuple_leaf<1,$T2,0>)__base_})</DisplayString> + <Type Name="std::__Cr::tuple<*,*>"> + <DisplayString>({(std::__Cr::__tuple_leaf<0,$T1,0>)__base_}, {(std::__Cr::__tuple_leaf<1,$T2,0>)__base_})</DisplayString> <Expand> - <Item Name="[0]">(std::Cr::__tuple_leaf<0,$T1,0>)__base_</Item> - <Item Name="[1]">(std::Cr::__tuple_leaf<1,$T2,0>)__base_</Item> + <Item Name="[0]">(std::__Cr::__tuple_leaf<0,$T1,0>)__base_</Item> + <Item Name="[1]">(std::__Cr::__tuple_leaf<1,$T2,0>)__base_</Item> </Expand> </Type> - <Type Name="std::Cr::tuple<*,*,*>"> - <DisplayString>({(std::Cr::__tuple_leaf<0,$T1,0>)__base_}, {(std::Cr::__tuple_leaf<1,$T2,0>)__base_}, {(std::Cr::__tuple_leaf<2,$T3,0>)__base_})</DisplayString> + <Type Name="std::__Cr::tuple<*,*,*>"> + <DisplayString>({(std::__Cr::__tuple_leaf<0,$T1,0>)__base_}, {(std::__Cr::__tuple_leaf<1,$T2,0>)__base_}, {(std::__Cr::__tuple_leaf<2,$T3,0>)__base_})</DisplayString> <Expand> - <Item Name="[0]">(std::Cr::__tuple_leaf<0,$T1,0>)__base_</Item> - <Item Name="[1]">(std::Cr::__tuple_leaf<1,$T2,0>)__base_</Item> - <Item Name="[2]">(std::Cr::__tuple_leaf<2,$T3,0>)__base_</Item> + <Item Name="[0]">(std::__Cr::__tuple_leaf<0,$T1,0>)__base_</Item> + <Item Name="[1]">(std::__Cr::__tuple_leaf<1,$T2,0>)__base_</Item> + <Item Name="[2]">(std::__Cr::__tuple_leaf<2,$T3,0>)__base_</Item> </Expand> </Type> - <Type Name="std::Cr::tuple<*,*,*,*>"> - <DisplayString>({(std::Cr::__tuple_leaf<0,$T1,0>)__base_}, {(std::Cr::__tuple_leaf<1,$T2,0>)__base_}, {(std::Cr::__tuple_leaf<2,$T3,0>)__base_}, {(std::Cr::__tuple_leaf<3,$T4,0>)__base_})</DisplayString> + <Type Name="std::__Cr::tuple<*,*,*,*>"> + <DisplayString>({(std::__Cr::__tuple_leaf<0,$T1,0>)__base_}, {(std::__Cr::__tuple_leaf<1,$T2,0>)__base_}, {(std::__Cr::__tuple_leaf<2,$T3,0>)__base_}, {(std::__Cr::__tuple_leaf<3,$T4,0>)__base_})</DisplayString> <Expand> - <Item Name="[0]">(std::Cr::__tuple_leaf<0,$T1,0>)__base_</Item> - <Item Name="[1]">(std::Cr::__tuple_leaf<1,$T2,0>)__base_</Item> - <Item Name="[2]">(std::Cr::__tuple_leaf<2,$T3,0>)__base_</Item> - <Item Name="[3]">(std::Cr::__tuple_leaf<3,$T4,0>)__base_</Item> + <Item Name="[0]">(std::__Cr::__tuple_leaf<0,$T1,0>)__base_</Item> + <Item Name="[1]">(std::__Cr::__tuple_leaf<1,$T2,0>)__base_</Item> + <Item Name="[2]">(std::__Cr::__tuple_leaf<2,$T3,0>)__base_</Item> + <Item Name="[3]">(std::__Cr::__tuple_leaf<3,$T4,0>)__base_</Item> </Expand> </Type> - <Type Name="std::Cr::tuple<*,*,*,*,*>"> - <DisplayString>({(std::Cr::__tuple_leaf<0,$T1,0>)__base_}, {(std::Cr::__tuple_leaf<1,$T2,0>)__base_}, {(std::Cr::__tuple_leaf<2,$T3,0>)__base_}, {(std::Cr::__tuple_leaf<3,$T4,0>)__base_}, {(std::Cr::__tuple_leaf<4,$T5,0>)__base_})</DisplayString> + <Type Name="std::__Cr::tuple<*,*,*,*,*>"> + <DisplayString>({(std::__Cr::__tuple_leaf<0,$T1,0>)__base_}, {(std::__Cr::__tuple_leaf<1,$T2,0>)__base_}, {(std::__Cr::__tuple_leaf<2,$T3,0>)__base_}, {(std::__Cr::__tuple_leaf<3,$T4,0>)__base_}, {(std::__Cr::__tuple_leaf<4,$T5,0>)__base_})</DisplayString> <Expand> - <Item Name="[0]">(std::Cr::__tuple_leaf<0,$T1,0>)__base_</Item> - <Item Name="[1]">(std::Cr::__tuple_leaf<1,$T2,0>)__base_</Item> - <Item Name="[2]">(std::Cr::__tuple_leaf<2,$T3,0>)__base_</Item> - <Item Name="[3]">(std::Cr::__tuple_leaf<3,$T4,0>)__base_</Item> - <Item Name="[4]">(std::Cr::__tuple_leaf<4,$T5,0>)__base_</Item> + <Item Name="[0]">(std::__Cr::__tuple_leaf<0,$T1,0>)__base_</Item> + <Item Name="[1]">(std::__Cr::__tuple_leaf<1,$T2,0>)__base_</Item> + <Item Name="[2]">(std::__Cr::__tuple_leaf<2,$T3,0>)__base_</Item> + <Item Name="[3]">(std::__Cr::__tuple_leaf<3,$T4,0>)__base_</Item> + <Item Name="[4]">(std::__Cr::__tuple_leaf<4,$T5,0>)__base_</Item> </Expand> </Type> - <Type Name="std::Cr::tuple<*,*,*,*,*,*>"> - <DisplayString>({(std::Cr::__tuple_leaf<0,$T1,0>)__base_}, {(std::Cr::__tuple_leaf<1,$T2,0>)__base_}, {(std::Cr::__tuple_leaf<2,$T3,0>)__base_}, {(std::Cr::__tuple_leaf<3,$T4,0>)__base_}, {(std::Cr::__tuple_leaf<4,$T5,0>)__base_}, {(std::Cr::__tuple_leaf<5,$T6,0>)__base_})</DisplayString> + <Type Name="std::__Cr::tuple<*,*,*,*,*,*>"> + <DisplayString>({(std::__Cr::__tuple_leaf<0,$T1,0>)__base_}, {(std::__Cr::__tuple_leaf<1,$T2,0>)__base_}, {(std::__Cr::__tuple_leaf<2,$T3,0>)__base_}, {(std::__Cr::__tuple_leaf<3,$T4,0>)__base_}, {(std::__Cr::__tuple_leaf<4,$T5,0>)__base_}, {(std::__Cr::__tuple_leaf<5,$T6,0>)__base_})</DisplayString> <Expand> - <Item Name="[0]">(std::Cr::__tuple_leaf<0,$T1,0>)__base_</Item> - <Item Name="[1]">(std::Cr::__tuple_leaf<1,$T2,0>)__base_</Item> - <Item Name="[2]">(std::Cr::__tuple_leaf<2,$T3,0>)__base_</Item> - <Item Name="[3]">(std::Cr::__tuple_leaf<3,$T4,0>)__base_</Item> - <Item Name="[4]">(std::Cr::__tuple_leaf<4,$T5,0>)__base_</Item> - <Item Name="[5]">(std::Cr::__tuple_leaf<5,$T6,0>)__base_</Item> + <Item Name="[0]">(std::__Cr::__tuple_leaf<0,$T1,0>)__base_</Item> + <Item Name="[1]">(std::__Cr::__tuple_leaf<1,$T2,0>)__base_</Item> + <Item Name="[2]">(std::__Cr::__tuple_leaf<2,$T3,0>)__base_</Item> + <Item Name="[3]">(std::__Cr::__tuple_leaf<3,$T4,0>)__base_</Item> + <Item Name="[4]">(std::__Cr::__tuple_leaf<4,$T5,0>)__base_</Item> + <Item Name="[5]">(std::__Cr::__tuple_leaf<5,$T6,0>)__base_</Item> </Expand> </Type> - <Type Name="std::Cr::tuple<*,*,*,*,*,*,*>"> - <DisplayString>({(std::Cr::__tuple_leaf<0,$T1,0>)__base_}, {(std::Cr::__tuple_leaf<1,$T2,0>)__base_}, {(std::Cr::__tuple_leaf<2,$T3,0>)__base_}, {(std::Cr::__tuple_leaf<3,$T4,0>)__base_}, {(std::Cr::__tuple_leaf<4,$T5,0>)__base_}, {(std::Cr::__tuple_leaf<5,$T6,0>)__base_}, {(std::Cr::__tuple_leaf<6,$T7,0>)__base_})</DisplayString> + <Type Name="std::__Cr::tuple<*,*,*,*,*,*,*>"> + <DisplayString>({(std::__Cr::__tuple_leaf<0,$T1,0>)__base_}, {(std::__Cr::__tuple_leaf<1,$T2,0>)__base_}, {(std::__Cr::__tuple_leaf<2,$T3,0>)__base_}, {(std::__Cr::__tuple_leaf<3,$T4,0>)__base_}, {(std::__Cr::__tuple_leaf<4,$T5,0>)__base_}, {(std::__Cr::__tuple_leaf<5,$T6,0>)__base_}, {(std::__Cr::__tuple_leaf<6,$T7,0>)__base_})</DisplayString> <Expand> - <Item Name="[0]">(std::Cr::__tuple_leaf<0,$T1,0>)__base_</Item> - <Item Name="[1]">(std::Cr::__tuple_leaf<1,$T2,0>)__base_</Item> - <Item Name="[2]">(std::Cr::__tuple_leaf<2,$T3,0>)__base_</Item> - <Item Name="[3]">(std::Cr::__tuple_leaf<3,$T4,0>)__base_</Item> - <Item Name="[4]">(std::Cr::__tuple_leaf<4,$T5,0>)__base_</Item> - <Item Name="[5]">(std::Cr::__tuple_leaf<5,$T6,0>)__base_</Item> - <Item Name="[6]">(std::Cr::__tuple_leaf<6,$T7,0>)__base_</Item> + <Item Name="[0]">(std::__Cr::__tuple_leaf<0,$T1,0>)__base_</Item> + <Item Name="[1]">(std::__Cr::__tuple_leaf<1,$T2,0>)__base_</Item> + <Item Name="[2]">(std::__Cr::__tuple_leaf<2,$T3,0>)__base_</Item> + <Item Name="[3]">(std::__Cr::__tuple_leaf<3,$T4,0>)__base_</Item> + <Item Name="[4]">(std::__Cr::__tuple_leaf<4,$T5,0>)__base_</Item> + <Item Name="[5]">(std::__Cr::__tuple_leaf<5,$T6,0>)__base_</Item> + <Item Name="[6]">(std::__Cr::__tuple_leaf<6,$T7,0>)__base_</Item> </Expand> </Type> - <Type Name="std::Cr::unique_ptr<*>"> + <Type Name="std::__Cr::unique_ptr<*>"> <Intrinsic Name="value" Expression="*($T1**)&__ptr_" /> <SmartPointer Usage="Minimal">value()</SmartPointer> <DisplayString Condition="value() == 0">empty</DisplayString> @@ -379,10 +379,10 @@ </Expand> </Type> -<Type Name="std::Cr::unordered_map<*>"> - <AlternativeType Name="std::Cr::unordered_multimap<*>" /> - <AlternativeType Name="std::Cr::unordered_multiset<*>" /> - <AlternativeType Name="std::Cr::unordered_set<*>" /> +<Type Name="std::__Cr::unordered_map<*>"> + <AlternativeType Name="std::__Cr::unordered_multimap<*>" /> + <AlternativeType Name="std::__Cr::unordered_multiset<*>" /> + <AlternativeType Name="std::__Cr::unordered_set<*>" /> <Intrinsic Name="size" Expression="*(size_type*)&__table_.__p2_" /> <Intrinsic Name="bucket_count" Expression="*(size_type*)& @@ -415,14 +415,14 @@ <!-- This is the node __value_ of an unordered_(multi)map. Expand it through a separate formatter instead of in the <Item> expression above so that the same <Type> works for unordered_(multi)set and unordered_(multi)map. --> - <Type Name="std::Cr::__hash_value_type<*>"> + <Type Name="std::__Cr::__hash_value_type<*>"> <DisplayString>{__cc}</DisplayString> <Expand> <ExpandedItem>__cc</ExpandedItem> </Expand> </Type> - <Type Name="std::Cr::vector<*>"> + <Type Name="std::__Cr::vector<*>"> <Intrinsic Name="size" Expression="__end_ - __begin_" /> <DisplayString>{{ size={size()} }}</DisplayString> <Expand>
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn index d2f591a..23a8da45 100644 --- a/build/config/compiler/BUILD.gn +++ b/build/config/compiler/BUILD.gn
@@ -219,7 +219,8 @@ # another variable. chrome_orderfile_path = default_chrome_orderfile } else if (is_chromeos_ash && is_chromeos_device) { - if (chromeos_afdo_platform == "arm" || chromeos_afdo_platform == "arm-exp") { + if (chromeos_afdo_platform == "arm" || + chromeos_afdo_platform == "arm-exp") { chrome_orderfile_path = "//chromeos/profiles/chromeos.arm.orderfile.txt" } else { chrome_orderfile_path = "//chromeos/profiles/chromeos.orderfile.txt" @@ -769,6 +770,11 @@ # arm32. if (!is_android || current_cpu == "arm64") { cflags += [ "-fwhole-program-vtables" ] + + # whole-program-vtables implies -fsplit-lto-unit, and Rust needs to match + # behaviour. + rustflags += [ "-Zsplit-lto-unit" ] + if (!is_win) { ldflags += [ "-fwhole-program-vtables" ] }
diff --git a/build/config/sanitizers/BUILD.gn b/build/config/sanitizers/BUILD.gn index c320ed8..8ac3c464 100644 --- a/build/config/sanitizers/BUILD.gn +++ b/build/config/sanitizers/BUILD.gn
@@ -303,6 +303,7 @@ config("cfi_flags") { cflags = [] + rustflags = [] if (is_cfi && current_toolchain == default_toolchain) { if (!defined(cfi_ignorelist_path)) { cfi_ignorelist_path = @@ -313,6 +314,11 @@ "-fsanitize-ignorelist=$cfi_ignorelist_path", ] + # sanitize=cfi implies -fsplit-lto-unit, and Rust needs to match + # behaviour. + # TODO(crbug.com/1442331): Add -Zsanitize=cfi instead. + rustflags += [ "-Zsplit-lto-unit" ] + if (use_cfi_cast) { cflags += [ "-fsanitize=cfi-derived-cast", @@ -322,6 +328,10 @@ if (use_cfi_icall) { cflags += [ "-fsanitize=cfi-icall" ] + # TODO(crbug.com/1442331): Add cflags += [ + # "-fsanitize-cfi-icall-experimental-normalize-integers" ] + # TODO(crbug.com/1442331): Add rustflags += [ + # "-Zsanitizer-cfi-normalize-integers" ]. } if (use_cfi_diag) {
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1 index f48a7294..2f4e14ee 100644 --- a/build/fuchsia/linux_internal.sdk.sha1 +++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@ -12.20230519.0.1 +12.20230519.2.1
diff --git a/build/install-build-deps.py b/build/install-build-deps.py index 34120e7f..81a78d0 100755 --- a/build/install-build-deps.py +++ b/build/install-build-deps.py
@@ -191,6 +191,7 @@ # Packages needed for development def dev_list(): packages = [ + "binutils", "bison", "bzip2", "cdbs", @@ -458,11 +459,10 @@ # g++-X.Y-multilib gives us the 32-bit support that we need. Find out the # appropriate value of X and Y by seeing what version the current # distribution's g++-multilib package depends on. - lines = (subprocess.check_output( - ["apt-cache", "depends", "g++-multilib", - "--important"]).decode().splitlines()) + lines = subprocess.check_output( + ["apt-cache", "depends", "g++-multilib", "--important"]).decode() pattern = re.compile(r"g\+\+-[0-9.]+-multilib") - packages.extend(line.strip() for line in lines if pattern.match(line)) + packages += re.findall(pattern, lines) return packages
diff --git a/cc/animation/animation.cc b/cc/animation/animation.cc index 7137f568..5d3543e 100644 --- a/cc/animation/animation.cc +++ b/cc/animation/animation.cc
@@ -155,8 +155,7 @@ // time and then ticks it which side-steps the start time altogether. See // crbug.com/1076012 for alternative design choices considered for future // improvement. - keyframe_effect()->Pause(tick_time - base::TimeTicks(), - PauseCondition::kAfterStart); + keyframe_effect()->Pause(tick_time, PauseCondition::kAfterStart); keyframe_effect()->Tick(base::TimeTicks()); } else { DCHECK(!tick_time.is_null());
diff --git a/cc/animation/keyframe_effect.cc b/cc/animation/keyframe_effect.cc index 93cd301d..b598b483 100644 --- a/cc/animation/keyframe_effect.cc +++ b/cc/animation/keyframe_effect.cc
@@ -170,7 +170,7 @@ } } -void KeyframeEffect::Pause(base::TimeDelta pause_offset, +void KeyframeEffect::Pause(base::TimeTicks timeline_time, PauseCondition pause_condition) { bool did_pause = false; for (auto& keyframe_model : keyframe_models()) { @@ -184,7 +184,9 @@ gfx::KeyframeModel::WAITING_FOR_TARGET_AVAILABILITY || keyframe_model->run_state() == gfx::KeyframeModel::STARTING)) continue; - keyframe_model->Pause(pause_offset); + // Convert the timeline_time to the effective local time for each + // KeyframeModel's start time. + keyframe_model->Pause(timeline_time - keyframe_model->start_time()); did_pause = true; }
diff --git a/cc/animation/keyframe_effect.h b/cc/animation/keyframe_effect.h index a735ec9..15a19e6 100644 --- a/cc/animation/keyframe_effect.h +++ b/cc/animation/keyframe_effect.h
@@ -98,7 +98,7 @@ void UpdateState(bool start_ready_keyframe_models, AnimationEvents* events); void UpdateTickingState(); - void Pause(base::TimeDelta pause_offset, + void Pause(base::TimeTicks timeline_time, PauseCondition = PauseCondition::kUnconditional); void AddKeyframeModel(
diff --git a/cc/animation/worklet_animation.cc b/cc/animation/worklet_animation.cc index 7ef14bb..becef534 100644 --- a/cc/animation/worklet_animation.cc +++ b/cc/animation/worklet_animation.cc
@@ -69,7 +69,7 @@ // animations lifecycle. To avoid this we pause the underlying keyframe effect // at the local time obtained from the user script - essentially turning each // call to |WorkletAnimation::Tick| into a seek in the effect. - keyframe_effect()->Pause(local_time_.Read(*this).value()); + keyframe_effect()->Pause(base::TimeTicks() + local_time_.Read(*this).value()); keyframe_effect()->Tick(base::TimeTicks()); }
diff --git a/cc/paint/oop_pixeltest.cc b/cc/paint/oop_pixeltest.cc index 261acd7..ac63480 100644 --- a/cc/paint/oop_pixeltest.cc +++ b/cc/paint/oop_pixeltest.cc
@@ -1670,14 +1670,14 @@ GetTextBlobStrategy(GetParam()) == TextBlobStrategy::kRecordFilter; error_pixels_percentage = std::max(is_record_filter ? 12.f : 0.2f, error_pixels_percentage); - max_abs_error = std::max(is_record_filter ? 220 : 2, max_abs_error); - avg_error = std::max(is_record_filter ? 50.f : 2.f, avg_error); + max_abs_error = std::max(is_record_filter ? 246 : 2, max_abs_error); + avg_error = std::max(is_record_filter ? 59.1f : 2.f, avg_error); } else if (GetMatrixStrategy(GetParam()) == MatrixStrategy::kPerspective) { switch (GetTextBlobStrategy(GetParam())) { case TextBlobStrategy::kRecordFilter: error_pixels_percentage = std::max(13.f, error_pixels_percentage); max_abs_error = std::max(255, max_abs_error); - avg_error = std::max(60.f, avg_error); + avg_error = std::max(62.4f, avg_error); break; case TextBlobStrategy::kRecordShader: // For kRecordShader+kPerspective the scale factor used to draw the
diff --git a/chrome/VERSION b/chrome/VERSION index 4dbdc9f..ea01df6 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=115 MINOR=0 -BUILD=5781 +BUILD=5782 PATCH=0
diff --git a/chrome/android/expectations/lint-baseline.xml b/chrome/android/expectations/lint-baseline.xml index 31f1f59..651074c 100644 --- a/chrome/android/expectations/lint-baseline.xml +++ b/chrome/android/expectations/lint-baseline.xml
@@ -7092,17 +7092,6 @@ <issue id="AssertionSideEffect" - message="Assertion condition has a side effect: sValuesReturned.boolValues.put(preferenceName, flag)" - errorLine1=" assert ChromeFeatureList.sInstantStart.isEnabled();" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="../../chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTab.java" - line="300" - column="20"/> - </issue> - - <issue - id="AssertionSideEffect" message="Assertion condition has a side effect: sHaveAccessNetworkState =
 ApiCompatibilityUtils.checkPermission(ContextUtils.getApplicationContext(),
 Manifest.permission.ACCESS_NETWORK_STATE, Process.myPid(),
 Process.myUid())
 == PackageManager.PERMISSION_GRANTED" errorLine1=" assert isSupported();" errorLine2=" ~~~~~~~~~~~~~">
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayout.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayout.java index ed30a69..b0020d0 100644 --- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayout.java +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayout.java
@@ -101,9 +101,6 @@ // Always use getCarouselOrSingleTabListDelegate() instead to make sure it's not null. @Nullable private TabSwitcher.TabListDelegate mCarouselOrSingleTabListDelegate; - - // To force Toolbar finishes its animation when this Layout finished hiding. - private final LayoutTab mDummyLayoutTab; private boolean mIsInitialized; // Only access this value via isTabGtsAnimationEnabled. Caches the value to avoid repeated @@ -128,8 +125,6 @@ LayoutRenderHost renderHost, StartSurface startSurface, ViewGroup tabSwitcherScrimAnchor, ScrimCoordinator scrimCoordinator) { super(context, updateHost, renderHost); - mDummyLayoutTab = createLayoutTab(Tab.INVALID_TAB_ID, false); - mDummyLayoutTab.setShowToolbar(true); mStartSurface = startSurface; mStartSurface.setOnTabSelectingListener(this::onTabSelecting); mScrimAnchor = tabSwitcherScrimAnchor; @@ -211,11 +206,6 @@ } @Override - public LayoutTab getLayoutTab(int id) { - return mDummyLayoutTab; - } - - @Override public void destroy() { if (mStartSurface != null) { mStartSurface.removeTabSwitcherViewObserver(mTabSwitcherObserver);
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTab.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTab.java index 14e7ab6..1d06681 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTab.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTab.java
@@ -297,7 +297,7 @@ private static @Nullable List<Tab> getRelatedTabList( @NonNull TabModelSelector tabModelSelector, int tabId) { if (!tabModelSelector.isTabStateInitialized()) { - assert ChromeFeatureList.sInstantStart.isEnabled(); + if (!ChromeFeatureList.sInstantStart.isEnabled()) throw new IllegalStateException(); return null; } TabModelFilterProvider provider = tabModelSelector.getTabModelFilterProvider();
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator.java index b47015c..80c7ce7f 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator.java
@@ -216,7 +216,7 @@ }; mLayoutStateObserver = new LayoutStateProvider.LayoutStateObserver() { @Override - public void onStartedShowing(@LayoutType int layoutType, boolean showToolbar) { + public void onStartedShowing(@LayoutType int layoutType) { if (layoutType == LayoutType.TAB_SWITCHER || layoutType == LayoutType.START_SURFACE) { mIsShowingOverViewMode = true;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherLayout.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherLayout.java index 702010d..5d63192 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherLayout.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherLayout.java
@@ -93,9 +93,6 @@ private final ScrimCoordinator mScrimCoordinator; private final TabSwitcher.TabListDelegate mGridTabListDelegate; - // Force the toolbar to finish its animation when this Layout finished hiding by setting - // setShowToolbar(true) on this dummy tab. - private final LayoutTab mDummyLayoutTab; private boolean mIsInitialized; // Only access this value via isTabGtsAnimationEnabled. Caches the value to avoid repeated @@ -127,8 +124,6 @@ @Nullable ViewGroup tabSwitcherScrimAnchor, @Nullable ScrimCoordinator scrimCoordinator) { super(context, updateHost, renderHost); - mDummyLayoutTab = createLayoutTab(Tab.INVALID_TAB_ID, false); - mDummyLayoutTab.setShowToolbar(true); mTabSwitcher = tabSwitcher; mController = mTabSwitcher.getController(); mTabSwitcher.setOnTabSelectingListener(this::onTabSelecting); @@ -211,11 +206,6 @@ } @Override - public LayoutTab getLayoutTab(int id) { - return mDummyLayoutTab; - } - - @Override public void destroy() { mController.removeTabSwitcherViewObserver(mTabSwitcherObserver); }
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherTabletTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherTabletTest.java index 43c8885..488c9fa 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherTabletTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherTabletTest.java
@@ -126,7 +126,7 @@ } @Override - public void onStartedShowing(int layoutType, boolean showToolbar) { + public void onStartedShowing(int layoutType) { if (layoutType != LayoutType.TAB_SWITCHER) { return; }
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediatorUnitTest.java index 7cc5cbf5..17223c66 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediatorUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediatorUnitTest.java
@@ -779,7 +779,7 @@ assertThat(mTabGroupUiMediator.getIsShowingOverViewModeForTesting(), equalTo(false)); // Simulate the overview mode is showing, which hides the strip. - mLayoutStateObserverCaptor.getValue().onStartedShowing(layoutType, true); + mLayoutStateObserverCaptor.getValue().onStartedShowing(layoutType); assertThat(mTabGroupUiMediator.getIsShowingOverViewModeForTesting(), equalTo(true)); mVisibilityControllerInOrder.verify(mVisibilityController).setBottomControlsVisible(false); @@ -807,7 +807,7 @@ private void overViewStartedShowingImpl(@LayoutType int layoutType) { initAndAssertProperties(mTab1); - mLayoutStateObserverCaptor.getValue().onStartedShowing(layoutType, true); + mLayoutStateObserverCaptor.getValue().onStartedShowing(layoutType); verifyResetStrip(false, null); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ActivityTabProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/ActivityTabProvider.java index 581545e70..49c549f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ActivityTabProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ActivityTabProvider.java
@@ -144,7 +144,7 @@ } @Override - public void onStartedShowing(@LayoutType int layout, boolean showToolbar) { + public void onStartedShowing(@LayoutType int layout) { // The {@link SimpleAnimationLayout} is a special case, the intent is not to switch // tabs, but to merely run an animation. In this case, do nothing. If the animation // layout does result in a new tab {@link TabModelObserver#didSelectTab} will
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java index e1efb10a..d996c96 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java
@@ -4,6 +4,8 @@ package org.chromium.chrome.browser; +import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; + import static org.chromium.chrome.browser.base.SplitCompatApplication.CHROME_SPLIT_NAME; import android.app.ActivityManager.TaskDescription; @@ -401,6 +403,21 @@ } @Override + public void addContentView(View view, ViewGroup.LayoutParams params) { + if (BuildInfo.getInstance().isAutomotive && params.width == MATCH_PARENT + && params.height == MATCH_PARENT) { + ViewGroup automotiveLayout = (ViewGroup) getLayoutInflater().inflate( + R.layout.automotive_layout_with_back_button_toolbar, null); + super.addContentView( + automotiveLayout, new LinearLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT)); + setAutomotiveToolbarBackButtonAction(); + automotiveLayout.addView(view, params); + } else { + super.addContentView(view, params); + } + } + + @Override protected void onResume() { if (BuildInfo.getInstance().isAutomotive && getAutomotiveToolbarImplementation()
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 9029ad4..558284c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -292,6 +292,7 @@ private TabbedModeTabModelOrchestrator mTabModelOrchestrator; private TabModelSelectorBase mTabModelSelector; + private TabModelSelectorObserver mTabModelSelectorObserver; private TabModelSelectorTabObserver mTabModelSelectorTabObserver; private TabModelSelectorTabModelObserver mTabModelObserver; private HistoricalTabModelObserver mHistoricalTabModelObserver; @@ -1964,7 +1965,7 @@ } mTabModelSelector = mTabModelOrchestrator.getTabModelSelector(); - mTabModelSelector.addObserver(new TabModelSelectorObserver() { + mTabModelSelectorObserver = new TabModelSelectorObserver() { @Override public void onTabStateInitialized() { if (mMultiInstanceManager != null) { @@ -1976,7 +1977,8 @@ TabModel model = mTabModelSelector.getModel(false); TasksUma.recordTasksUma(model); } - }); + }; + mTabModelSelector.addObserver(mTabModelSelectorObserver); mTabModelSelectorTabObserver = new TabModelSelectorTabObserver(mTabModelSelector) { @Override @@ -1997,6 +1999,21 @@ if (startIncognito) mTabModelSelector.selectModel(true); } + @VisibleForTesting + TabModelSelectorObserver getTabModelSelectorObserverForTesting() { + return mTabModelSelectorObserver; + } + + @VisibleForTesting + boolean getCreatedTabOnStartupForTesting() { + return mCreatedTabOnStartup; + } + + @VisibleForTesting + void setCreatedTabOnStartupForTesting(boolean createdTabOnStartup) { + mCreatedTabOnStartup = createdTabOnStartup; + } + @Override protected LaunchCauseMetrics createLaunchCauseMetrics() { return new TabbedActivityLaunchCauseMetrics(this); @@ -2098,7 +2115,7 @@ || getLayoutManager().getNextLayoutType() == LayoutType.START_SURFACE) { getLayoutManager().addObserver(new LayoutStateProvider.LayoutStateObserver() { @Override - public void onStartedShowing(int layoutType, boolean showToolbar) { + public void onStartedShowing(int layoutType) { if (layoutType != LayoutType.TAB_SWITCHER && layoutType != LayoutType.START_SURFACE) { return;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchBridge.java index 79b12e9..20185abd 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchBridge.java
@@ -36,13 +36,13 @@ } /** - * @return AuxiliarySearchGroup, which is necessary for the auxiliary search. + * @return AuxiliarySearchGroup for bookmarks, which is necessary for the auxiliary search. */ - public @Nullable AuxiliarySearchGroup getSearchableData() { + public @Nullable AuxiliarySearchGroup getBookmarksSearchableData() { if (mNativeBridge != 0) { try { return AuxiliarySearchGroup.parseFrom( - AuxiliarySearchBridgeJni.get().getSearchableData(mNativeBridge)); + AuxiliarySearchBridgeJni.get().getBookmarksSearchableData(mNativeBridge)); } catch (InvalidProtocolBufferException e) { } @@ -55,6 +55,6 @@ @VisibleForTesting public interface Natives { long getForProfile(Profile profile); - byte[] getSearchableData(long nativeAuxiliarySearchProvider); + byte[] getBookmarksSearchableData(long nativeAuxiliarySearchProvider); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchBridgeTest.java b/chrome/android/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchBridgeTest.java index 4e0af8af..5c52d39b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchBridgeTest.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchBridgeTest.java
@@ -23,6 +23,7 @@ import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.util.JniMocker; import org.chromium.chrome.browser.auxiliary_search.AuxiliarySearchGroupProto.AuxiliarySearchGroup; +import org.chromium.chrome.browser.auxiliary_search.AuxiliarySearchGroupProto.GroupType; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.test.util.browser.Features; @@ -35,9 +36,9 @@ @Features.EnableFeatures({ChromeFeatureList.ANDROID_APP_INTEGRATION}) public final class AuxiliarySearchBridgeTest { private static final String TAB_TITLE = "tab"; - private static final String BOOKMAEK_TITLE = "bookmark"; + private static final String BOOKMARK_TITLE = "bookmark"; private static final String TAB_URL = "https://tab.google.com"; - private static final String BOOKMAEK_URL = "https://bookmark.google.com"; + private static final String BOOKMARK_URL = "https://bookmark.google.com"; private static final long FAKE_NATIVE_PROVIDER = 1; @Mock @@ -73,29 +74,28 @@ public void getSearchableDataTest() { doReturn(false).when(mProfile).isOffTheRecord(); - var tab = - AuxiliarySearchGroup.Entry.newBuilder().setTitle(TAB_TITLE).setUrl(TAB_URL).build(); var bookmark = AuxiliarySearchGroup.Entry.newBuilder() - .setTitle(BOOKMAEK_TITLE) - .setUrl(BOOKMAEK_URL) + .setTitle(BOOKMARK_TITLE) + .setUrl(BOOKMARK_URL) .build(); - var proto = AuxiliarySearchGroup.newBuilder().addTabs(tab).addBookmarks(bookmark).build(); + var proto = AuxiliarySearchGroup.newBuilder() + .addEntry(bookmark) + .setGroupType(GroupType.BOOKMARK_GROUP) + .build(); doReturn(FAKE_NATIVE_PROVIDER).when(mMockAuxiliarySearchBridgeJni).getForProfile(mProfile); doReturn(proto.toByteArray()) .when(mMockAuxiliarySearchBridgeJni) - .getSearchableData(FAKE_NATIVE_PROVIDER); + .getBookmarksSearchableData(FAKE_NATIVE_PROVIDER); AuxiliarySearchBridge bridge = new AuxiliarySearchBridge(mProfile); verify(mMockAuxiliarySearchBridgeJni).getForProfile(mProfile); - AuxiliarySearchGroup group = bridge.getSearchableData(); + AuxiliarySearchGroup group = bridge.getBookmarksSearchableData(); - assertEquals(group.getTabsCount(), 1); - assertEquals(group.getBookmarksCount(), 1); - assertEquals(group.getTabs(0).getTitle(), TAB_TITLE); - assertEquals(group.getTabs(0).getUrl(), TAB_URL); - assertEquals(group.getBookmarks(0).getTitle(), BOOKMAEK_TITLE); - assertEquals(group.getBookmarks(0).getUrl(), BOOKMAEK_URL); + assertEquals(group.getEntryCount(), 1); + assertEquals(group.getEntry(0).getTitle(), BOOKMARK_TITLE); + assertEquals(group.getEntry(0).getUrl(), BOOKMARK_URL); + assertEquals(group.getGroupType(), GroupType.BOOKMARK_GROUP); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/Layout.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/Layout.java index 81c6c85..a15e94d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/Layout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/Layout.java
@@ -660,19 +660,6 @@ } /** - * @param id The id of the {@link LayoutTab} to search for. - * @return A {@link LayoutTab} represented by a {@link Tab} with an id of {@code id}. - */ - public LayoutTab getLayoutTab(int id) { - if (mLayoutTabs != null) { - for (int i = 0; i < mLayoutTabs.length; i++) { - if (mLayoutTabs[i].getId() == id) return mLayoutTabs[i]; - } - } - return null; - } - - /** * @return Whether the layout is handling the model updates when a tab is closing. */ public boolean handlesTabClosing() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java index fe3aa2a..51f798e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java
@@ -17,7 +17,6 @@ import org.chromium.base.supplier.Supplier; import org.chromium.chrome.browser.accessibility_tab_switcher.OverviewListLayout; import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; -import org.chromium.chrome.browser.compositor.layouts.components.LayoutTab; import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; import org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutHelperManager; import org.chromium.chrome.browser.device.DeviceClassManager; @@ -394,32 +393,6 @@ } @Override - protected boolean shouldDelayHideAnimation(Layout layoutBeingHidden) { - return mEnableAnimations - && (layoutBeingHidden == mOverviewLayout || layoutBeingHidden == mTabSwitcherLayout) - && mCreatingNtp - && !TabUiFeatureUtilities.isGridTabSwitcherEnabled(mHost.getContext()); - } - - @Override - protected boolean shouldShowToolbarAnimationOnShow(boolean isAnimate) { - return isAnimate - && (!mEnableAnimations || getTabModelSelector().getCurrentModel().getCount() <= 0); - } - - @Override - protected boolean shouldShowToolbarAnimationOnHide(Layout layoutBeingHidden, int nextTabId) { - boolean showAnimation = true; - if (mEnableAnimations - && (layoutBeingHidden == mOverviewLayout - || layoutBeingHidden == mTabSwitcherLayout)) { - final LayoutTab tab = layoutBeingHidden.getLayoutTab(nextTabId); - showAnimation = tab == null || !tab.showToolbar(); - } - return showAnimation; - } - - @Override protected void tabCreated(int id, int sourceId, @TabLaunchType int launchType, boolean incognito, boolean willBeSelected, float originX, float originY) { Tab newTab = TabModelUtils.getTabById(getTabModelSelector().getModel(incognito), id);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java index 2900e10..d1eaf39 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java
@@ -955,9 +955,7 @@ Layout layoutBeingHidden = getActiveLayout(); for (LayoutStateObserver observer : mLayoutObservers) { - observer.onStartedHiding(layoutBeingHidden.getLayoutType(), - shouldShowToolbarAnimationOnHide(layoutBeingHidden, nextTabId), - shouldDelayHideAnimation(layoutBeingHidden)); + observer.onStartedHiding(layoutBeingHidden.getLayoutType()); } } @@ -1081,8 +1079,7 @@ } for (LayoutStateObserver observer : mLayoutObservers) { - observer.onStartedShowing( - layout.getLayoutType(), shouldShowToolbarAnimationOnShow(animate)); + observer.onStartedShowing(layout.getLayoutType()); } } } @@ -1267,16 +1264,4 @@ public void removeObserver(LayoutStateObserver listener) { mLayoutObservers.removeObserver(listener); } - - protected boolean shouldShowToolbarAnimationOnShow(boolean isAnimate) { - return false; - } - - protected boolean shouldShowToolbarAnimationOnHide(Layout layoutBeingHidden, int nextTabId) { - return false; - } - - protected boolean shouldDelayHideAnimation(Layout layoutBeingHidden) { - return false; - } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/SceneChangeObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/SceneChangeObserver.java index bc6f3c9c..d9e9548 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/SceneChangeObserver.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/SceneChangeObserver.java
@@ -26,7 +26,7 @@ * Called when the active {@link Layout} changes. * @param layout The new active {@link Layout}. * - * DEPRECATED, please use {@link LayoutStateObserver#onStartedShowing(int, boolean)} instead. + * DEPRECATED, please use {@link LayoutStateObserver#onStartedShowing(int)} instead. */ void onSceneChange(Layout layout); } \ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java index f636b1f..b66a6229 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java
@@ -208,14 +208,13 @@ */ class TabSwitcherLayoutObserver implements LayoutStateObserver { @Override - public void onStartedShowing(@LayoutType int layoutType, boolean showToolbar) { + public void onStartedShowing(@LayoutType int layoutType) { if (layoutType != LayoutType.TAB_SWITCHER) return; mBrowserScrimShowing = true; } @Override - public void onStartedHiding( - @LayoutType int layoutType, boolean showToolbar, boolean delayAnimation) { + public void onStartedHiding(@LayoutType int layoutType) { if (layoutType != LayoutType.TAB_SWITCHER) return; mBrowserScrimShowing = false; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/device_dialog/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/device_dialog/OWNERS index ff41043..c82c4e3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/device_dialog/OWNERS +++ b/chrome/android/java/src/org/chromium/chrome/browser/device_dialog/OWNERS
@@ -1 +1,3 @@ +chengweih@chromium.org +mattreynolds@chromium.org reillyg@chromium.org
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoTabbedSnapshotController.java b/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoTabbedSnapshotController.java index 597228f..e8d919c9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoTabbedSnapshotController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoTabbedSnapshotController.java
@@ -117,14 +117,13 @@ mLayoutStateObserver = new FilterLayoutStateObserver(LayoutType.TAB_SWITCHER, new LayoutStateObserver() { @Override - public void onStartedShowing(int layoutType, boolean showToolbar) { + public void onStartedShowing(int layoutType) { assert layoutType == LayoutType.TAB_SWITCHER; updateIncognitoTabSnapshotState(); } @Override - public void onStartedHiding( - int layoutType, boolean showToolbar, boolean delayAnimation) { + public void onStartedHiding(int layoutType) { assert layoutType == LayoutType.TAB_SWITCHER; updateIncognitoTabSnapshotState(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/messages/ChromeMessageQueueMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/messages/ChromeMessageQueueMediator.java index 7dee002..e72ea15 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/messages/ChromeMessageQueueMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/messages/ChromeMessageQueueMediator.java
@@ -63,7 +63,7 @@ // Suspend the queue until browsing mode is visible. @Override - public void onStartedShowing(@LayoutType int layoutType, boolean showToolbar) { + public void onStartedShowing(@LayoutType int layoutType) { if (mToken == TokenHolder.INVALID_TOKEN && layoutType != LayoutType.BROWSING) { mToken = suspendQueue(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManager.java b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManager.java index 761a195..dd6db94 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManager.java
@@ -35,6 +35,7 @@ import org.chromium.chrome.browser.lifecycle.RecreateObserver; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.TabModelSelector; +import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabModelObserver; import org.chromium.chrome.browser.util.AndroidTaskUtils; import org.chromium.components.browser_ui.widget.MenuOrKeyboardActionController; import org.chromium.ui.display.DisplayAndroidManager; @@ -79,6 +80,8 @@ private final ActivityLifecycleDispatcher mActivityLifecycleDispatcher; private final MenuOrKeyboardActionController mMenuOrKeyboardActionController; + protected TabModelSelectorTabModelObserver mTabModelObserver; + private int mActivityTaskId; private boolean mNativeInitialized; private DisplayManager.DisplayListener mDisplayListener; @@ -548,4 +551,14 @@ public static void setTestDisplayIds(List<Integer> testDisplayIds) { sTestDisplayIds = testDisplayIds; } + + @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE) + public TabModelSelectorTabModelObserver getTabModelObserverForTesting() { + return mTabModelObserver; + } + + @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE) + public void setTabModelObserverForTesting(TabModelSelectorTabModelObserver tabModelObserver) { + mTabModelObserver = tabModelObserver; + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31.java b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31.java index 331e2ab6..8ae575e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31.java
@@ -68,7 +68,6 @@ // Instance ID for the activity associated with this manager. private int mInstanceId = INVALID_INSTANCE_ID; - private TabModelSelectorTabModelObserver mTabModelObserver; private Tab mActiveTab; private TabObserver mActiveTabObserver = new EmptyTabObserver() { @Override @@ -694,9 +693,4 @@ prefs.writeLong(ChromePreferenceKeys.MULTI_INSTANCE_START_TIME, 0); } } - - @VisibleForTesting - TabModelSelectorTabModelObserver getTabModelObserverForTesting() { - return mTabModelObserver; - } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentUiService.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentUiService.java index eddd402..9d88e26 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentUiService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentUiService.java
@@ -305,7 +305,7 @@ // Implements LayoutStateObserver: @Override - public void onStartedShowing(int layoutType, boolean showToolbar) { + public void onStartedShowing(int layoutType) { mDelegate.onLeavingCurrentTab(ErrorStrings.TAB_OVERVIEW_MODE); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController.java index 84356e53..4236ef72 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController.java
@@ -142,14 +142,13 @@ mLayoutStateObserver = new FilterLayoutStateObserver(LayoutType.TAB_SWITCHER, new LayoutStateObserver() { @Override - public void onStartedShowing(int layoutType, boolean showToolbar) { + public void onStartedShowing(int layoutType) { mOverviewModeHiding = false; updateNavigationBarColor(); } @Override - public void onStartedHiding( - int layoutType, boolean showToolbar, boolean delayAnimation) { + public void onStartedHiding(int layoutType) { mOverviewModeHiding = true; updateNavigationBarColor(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java index e09f98f..ec5cfc5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
@@ -494,7 +494,7 @@ mCompositorViewHolderSupplier.get()::removeTouchEventObserver, mLayoutManager); mGestureNavLayoutObserver = new LayoutStateProvider.LayoutStateObserver() { @Override - public void onStartedShowing(int layoutType, boolean showToolbar) { + public void onStartedShowing(int layoutType) { if (layoutType == LayoutType.TAB_SWITCHER) mHistoryNavigationCoordinator.reset(); } };
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java index f5f5b6c..18b403cf 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java
@@ -24,8 +24,13 @@ import org.chromium.chrome.browser.app.tab_activity_glue.ReparentingDelegateFactory; import org.chromium.chrome.browser.app.tab_activity_glue.ReparentingTask; import org.chromium.chrome.browser.compositor.CompositorViewHolder; +import org.chromium.chrome.browser.flags.ChromeFeatureList; +import org.chromium.chrome.browser.incognito.IncognitoUtils; import org.chromium.chrome.browser.ntp.NewTabPageLaunchOrigin; import org.chromium.chrome.browser.ntp.NewTabPageUtils; +import org.chromium.chrome.browser.prefetch.settings.PreloadPagesSettingsBridge; +import org.chromium.chrome.browser.prefetch.settings.PreloadPagesState; +import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.tab.RedirectHandlerTabHelper; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabAssociatedApp; @@ -148,6 +153,28 @@ } } + /** + * Preconnect to the URL and its subresources as the tab is being created. + * @param url URL to be preconnected to. + */ + private void maybePreconnectUrlAndSubResources(GURL url) { + // This is an experimental performance optimization behind a flag that can speed up + // navigation by starting the connection earlier. + if (!ChromeFeatureList.isEnabled(ChromeFeatureList.PRECONNECT_ON_TAB_CREATION)) return; + + // We don't want to trigger preconnect for low end devices with low resources. + if (SysUtils.isLowEndDevice()) return; + + // Skip preconnecting an empty URL. + if (url.isEmpty()) return; + + // Only preconnect if we are allowed to trigger preloading. + if (PreloadPagesSettingsBridge.getState() == PreloadPagesState.NO_PRELOADING) return; + + Profile profile = IncognitoUtils.getProfileFromWindowAndroid(mNativeWindow, mIncognito); + WarmupManager.getInstance().maybePreconnectUrlAndSubResources(profile, url.getScheme()); + } + @Override public boolean createsTabsAsynchronously() { return false; @@ -271,6 +298,9 @@ loadUrlParams.setTransitionType( getTransitionType(type, intent, loadUrlParams.getTransitionType())); + // Preconnect to the URL and its subresources as the tab is being created. + maybePreconnectUrlAndSubResources(url); + // Check if the tab is being created asynchronously. int assignedTabId = IntentHandler.getTabId(intent); AsyncTabParams asyncParams = mAsyncTabParamsManager.remove(assignedTabId);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tasks/JourneyManager.java b/chrome/android/java/src/org/chromium/chrome/browser/tasks/JourneyManager.java index 4788033..995bd4c6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tasks/JourneyManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tasks/JourneyManager.java
@@ -153,7 +153,7 @@ mLayoutStateObserver = new FilterLayoutStateObserver(LayoutType.TAB_SWITCHER, new LayoutStateObserver() { @Override - public void onStartedShowing(int layoutType, boolean showToolbar) { + public void onStartedShowing(int layoutType) { handleTabEngagementStopped(mCurrentTab); } });
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/AppThemeColorProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/AppThemeColorProvider.java index 632ca85..472bec5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/AppThemeColorProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/AppThemeColorProvider.java
@@ -51,7 +51,7 @@ mLayoutStateObserver = new LayoutStateProvider.LayoutStateObserver() { @Override - public void onStartedShowing(@LayoutType int layoutType, boolean showToolbar) { + public void onStartedShowing(@LayoutType int layoutType) { if (layoutType == LayoutType.TAB_SWITCHER) { mIsOverviewVisible = true; updateTheme(); @@ -59,8 +59,7 @@ } @Override - public void onStartedHiding( - @LayoutType int layoutType, boolean showToolbar, boolean delayAnimation) { + public void onStartedHiding(@LayoutType int layoutType) { if (layoutType == LayoutType.TAB_SWITCHER) { mIsOverviewVisible = false; updateTheme();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java index b415d37..9711b9cd 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
@@ -946,8 +946,8 @@ mLayoutStateObserver = new LayoutStateProvider.LayoutStateObserver() { @Override - public void onStartedShowing(@LayoutType int layoutType, boolean showToolbar) { - updateForLayout(layoutType, showToolbar); + public void onStartedShowing(@LayoutType int layoutType) { + updateForLayout(layoutType); } @Override @@ -961,12 +961,11 @@ } @Override - public void onStartedHiding( - @LayoutType int layoutType, boolean showToolbar, boolean delayAnimation) { + public void onStartedHiding(@LayoutType int layoutType) { if (layoutType == LayoutType.TAB_SWITCHER || layoutType == LayoutType.START_SURFACE) { mLocationBarModel.updateForNonStaticLayout(false, false); - mToolbar.setTabSwitcherMode(false, showToolbar, delayAnimation); + mToolbar.setTabSwitcherMode(false); updateButtonStatus(); if (mToolbar.setForceTextureCapture(true)) { mControlContainer.invalidateBitmap(); @@ -1068,9 +1067,8 @@ /** * Handle a layout change event. * @param layoutType The layout being switched to. - * @param showToolbar Whether the toolbar should be shown. */ - private void updateForLayout(@LayoutType int layoutType, boolean showToolbar) { + private void updateForLayout(@LayoutType int layoutType) { if (mIsStartSurfaceRefactorEnabled) { mToolbar.updateStartSurfaceToolbarState(null, layoutType == LayoutType.TAB_SWITCHER @@ -1080,7 +1078,7 @@ if (layoutType == LayoutType.TAB_SWITCHER || layoutType == LayoutType.START_SURFACE) { mLocationBarModel.updateForNonStaticLayout( layoutType == LayoutType.TAB_SWITCHER, layoutType == LayoutType.START_SURFACE); - mToolbar.setTabSwitcherMode(true, showToolbar, false); + mToolbar.setTabSwitcherMode(true); updateButtonStatus(); if (mLocationBarModel.shouldShowLocationBarInOverviewMode()) { assert mLocationBar instanceof LocationBarCoordinator; @@ -2090,10 +2088,10 @@ // it. if (mLayoutStateProvider.isLayoutVisible(LayoutType.TAB_SWITCHER)) { mControlContainer.post(mCallbackController.makeCancelable( - () -> updateForLayout(LayoutType.TAB_SWITCHER, true))); + () -> updateForLayout(LayoutType.TAB_SWITCHER))); } else if (mLayoutStateProvider.isLayoutVisible(LayoutType.START_SURFACE)) { mControlContainer.post(mCallbackController.makeCancelable( - () -> updateForLayout(LayoutType.START_SURFACE, true))); + () -> updateForLayout(LayoutType.START_SURFACE))); } mAppThemeColorProvider.setLayoutStateProvider(mLayoutStateProvider);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/BottomSheetManager.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/BottomSheetManager.java index 42d58a28..183e543 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ui/BottomSheetManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/BottomSheetManager.java
@@ -333,8 +333,7 @@ // state. Use onStartedHiding to avoid the bottom sheet being visible during the // transition if there is one. @Override - public void onStartedHiding( - int layoutType, boolean showToolbar, boolean delayAnimation) { + public void onStartedHiding(int layoutType) { if (layoutType != LayoutType.SIMPLE_ANIMATION) { mSheetController.clearRequestsAndHide(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java index ded10ef..5ee5d0a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java
@@ -1273,7 +1273,7 @@ mLayoutStateProvider = layoutStateProvider; mLayoutStateObserver = new LayoutStateProvider.LayoutStateObserver() { @Override - public void onStartedShowing(int layoutType, boolean showToolbar) { + public void onStartedShowing(int layoutType) { if (layoutType != LayoutType.BROWSING && layoutType != LayoutType.SIMPLE_ANIMATION) { // Hide contextual search. @@ -1304,8 +1304,7 @@ } @Override - public void onStartedHiding( - int layoutType, boolean showToolbar, boolean delayAnimation) { + public void onStartedHiding(int layoutType) { if (layoutType == LayoutType.TAB_SWITCHER) { hideAppMenu(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/system/StatusBarColorController.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/system/StatusBarColorController.java index 017245e3..b5a595c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ui/system/StatusBarColorController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/system/StatusBarColorController.java
@@ -204,7 +204,7 @@ mLayoutStateProvider = layoutManager; mLayoutStateObserver = new LayoutStateObserver() { @Override - public void onStartedShowing(int layoutType, boolean showToolbar) { + public void onStartedShowing(int layoutType) { if (layoutType != LayoutType.TAB_SWITCHER && layoutType != LayoutType.START_SURFACE) { return;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ChromeTabbedActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ChromeTabbedActivityTest.java index d5940280..631217b 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/ChromeTabbedActivityTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ChromeTabbedActivityTest.java
@@ -6,6 +6,7 @@ import android.content.Intent; import android.net.Uri; +import android.os.Build; import android.provider.Browser; import androidx.test.filters.MediumTest; @@ -27,6 +28,7 @@ import org.chromium.base.test.util.Criteria; import org.chromium.base.test.util.CriteriaHelper; import org.chromium.base.test.util.DisabledTest; +import org.chromium.base.test.util.MinAndroidSdkLevel; import org.chromium.chrome.browser.device.DeviceClassManager; import org.chromium.chrome.browser.document.ChromeLauncherActivity; import org.chromium.chrome.browser.flags.ChromeSwitches; @@ -120,6 +122,30 @@ Assert.assertEquals(animationsEnabled, DeviceClassManager.enableAnimations()); } + // Tests the fix for the regression reported in crbug.com/1444638. + @Test + @SmallTest + @MinAndroidSdkLevel(Build.VERSION_CODES.S) + public void testTabModelSelectorObserverOnTabStateInitialized() { + // Get the original value of |mCreatedTabOnStartup|. + boolean createdTabOnStartup = mActivity.getCreatedTabOnStartupForTesting(); + + // Reset the values of |mCreatedTabOnStartup| and |MultiInstanceManager.mTabModelObserver|. + // This tab model selector observer should be registered in MultiInstanceManager on tab + // state initialization irrespective of the value of |mCreatedTabOnStartup|. + mActivity.setCreatedTabOnStartupForTesting(false); + mActivity.getMultiInstanceMangerForTesting().setTabModelObserverForTesting(null); + + var tabModelSelectorObserver = mActivity.getTabModelSelectorObserverForTesting(); + TestThreadUtils.runOnUiThreadBlocking(tabModelSelectorObserver::onTabStateInitialized); + Assert.assertNotNull( + "A TabModelSelectorTabModelObserver should be registered by MultiInstanceManager on tab state initialization.", + mActivity.getMultiInstanceMangerForTesting().getTabModelObserverForTesting()); + + // Restore the original value of |mCreatedTabOnStartup|. + mActivity.setCreatedTabOnStartupForTesting(createdTabOnStartup); + } + @Test @MediumTest @DisabledTest(message = "https://crbug.com/1347506")
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/automotive/backbuttontoolbar/BackButtonToolbarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/automotive/backbuttontoolbar/BackButtonToolbarTest.java index 459caa3d..5325976 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/automotive/backbuttontoolbar/BackButtonToolbarTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/automotive/backbuttontoolbar/BackButtonToolbarTest.java
@@ -4,6 +4,8 @@ package org.chromium.chrome.browser.automotive.backbuttontoolbar; +import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; + import static androidx.appcompat.app.ActionBar.DISPLAY_HOME_AS_UP; import static androidx.test.espresso.matcher.ViewMatchers.assertThat; @@ -18,6 +20,7 @@ import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; +import android.view.ViewGroup.LayoutParams; import androidx.activity.ComponentDialog; import androidx.activity.OnBackPressedCallback; @@ -90,8 +93,8 @@ // Check that the automotive toolbar is present with only a back button. assertTrue(chromeTabbedActivity.getSupportActionBar().isShowing()); - assertEquals("Automotive toolbar should only contain a back button", - chromeTabbedActivity.getSupportActionBar().getDisplayOptions(), DISPLAY_HOME_AS_UP); + assertEquals("Automotive toolbar should only contain a back button", DISPLAY_HOME_AS_UP, + chromeTabbedActivity.getSupportActionBar().getDisplayOptions()); // Simulate a back button press on the automotive toolbar. addOnBackPressedCallback(chromeTabbedActivity, mBackPressCallbackHelper); @@ -117,8 +120,8 @@ // Check that the automotive toolbar is present with only a back button. Toolbar toolbar = settingsActivity.findViewById(R.id.back_button_toolbar); assertNotNull(toolbar); - assertEquals("Toolbar not visible", toolbar.getVisibility(), View.VISIBLE); - assertEquals("Toolbar should only contain a back button", toolbar.getChildCount(), 1); + assertEquals("Toolbar not visible", View.VISIBLE, toolbar.getVisibility()); + assertEquals("Toolbar should only contain a back button", 1, toolbar.getChildCount()); assertThat(toolbar.getChildAt(0), instanceOf(AppCompatImageButton.class)); // Click the back button in the automotive toolbar. @@ -141,7 +144,7 @@ Toolbar toolbar = dialog.findViewById(R.id.back_button_toolbar); assertNotNull(toolbar); assertEquals("Toolbar not visible", toolbar.getVisibility(), View.VISIBLE); - assertEquals("Toolbar should only contain a back button", toolbar.getChildCount(), 1); + assertEquals("Toolbar should only contain a back button", 1, toolbar.getChildCount()); assertThat(toolbar.getChildAt(0), instanceOf(AppCompatImageButton.class)); // Click the back button in the automotive toolbar. @@ -164,7 +167,7 @@ Toolbar toolbar = dialog.findViewById(R.id.back_button_toolbar); assertNotNull(toolbar); assertEquals("Toolbar not visible", toolbar.getVisibility(), View.VISIBLE); - assertEquals("Toolbar should only contain a back button", toolbar.getChildCount(), 1); + assertEquals("Toolbar should only contain a back button", 1, toolbar.getChildCount()); assertThat(toolbar.getChildAt(0), instanceOf(AppCompatImageButton.class)); // Click the back button in the automotive toolbar. @@ -179,15 +182,38 @@ @SmallTest @Restriction(DeviceRestriction.RESTRICTION_TYPE_AUTO) @Feature({"Automotive Toolbar"}) - public void testAutomotiveToolbar_FullscreenChromeDialog() throws Exception { + public void testAutomotiveToolbar_FullscreenChromeDialog_setContentView() throws Exception { // Display a full screen AlertDialog created using FullscreenAlertDialog.Builder. - ChromeDialog dialog = createAndShowFullscreenChromeDialog(getActivity()); + ChromeDialog dialog = createAndShowFullscreenChromeDialog(getActivity(), true); // Check that the automotive toolbar is present with only a back button. Toolbar toolbar = dialog.findViewById(R.id.back_button_toolbar); assertNotNull(toolbar); assertEquals("Toolbar not visible", toolbar.getVisibility(), View.VISIBLE); - assertEquals("Toolbar should only contain a back button", toolbar.getChildCount(), 1); + assertEquals("Toolbar should only contain a back button", 1, toolbar.getChildCount()); + assertThat(toolbar.getChildAt(0), instanceOf(AppCompatImageButton.class)); + + // Click the back button in the automotive toolbar. + addOnBackPressedCallback(dialog, mBackPressCallbackHelper); + TestThreadUtils.runOnUiThreadBlocking(() -> { toolbar.getChildAt(0).performClick(); }); + + // Verify that #onBackPressed was called. + mBackPressCallbackHelper.waitForFirst(); + } + + @Test + @SmallTest + @Restriction(DeviceRestriction.RESTRICTION_TYPE_AUTO) + @Feature({"Automotive Toolbar"}) + public void testAutomotiveToolbar_FullscreenChromeDialog_addContentView() throws Exception { + // Display a full screen AlertDialog created using FullscreenAlertDialog.Builder. + ChromeDialog dialog = createAndShowFullscreenChromeDialog(getActivity(), false); + + // Check that the automotive toolbar is present with only a back button. + Toolbar toolbar = dialog.findViewById(R.id.back_button_toolbar); + assertNotNull(toolbar); + assertEquals("Toolbar not visible", toolbar.getVisibility(), View.VISIBLE); + assertEquals("Toolbar should only contain a back button", 1, toolbar.getChildCount()); assertThat(toolbar.getChildAt(0), instanceOf(AppCompatImageButton.class)); // Click the back button in the automotive toolbar. @@ -248,11 +274,18 @@ }); } - private ChromeDialog createAndShowFullscreenChromeDialog(Context context) throws Exception { + private ChromeDialog createAndShowFullscreenChromeDialog( + Context context, boolean setContentView) throws Exception { return TestThreadUtils.runOnUiThreadBlocking(() -> { final ChromeDialog dialog = new ChromeDialog(context, R.style.ThemeOverlay_BrowserUI_Fullscreen); - dialog.setContentView(TEST_DIALOG_LAYOUT); + if (setContentView) { + dialog.setContentView(TEST_DIALOG_LAYOUT); + } else { + dialog.addContentView( + LayoutInflater.from(context).inflate(TEST_DIALOG_LAYOUT, null), + new LayoutParams(MATCH_PARENT, MATCH_PARENT)); + } dialog.show(); return dialog; });
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java index 82a9959..b1a2961 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java
@@ -670,7 +670,7 @@ initializeLayoutManagerPhone(2, 0); mManager.addObserver(new LayoutStateProvider.LayoutStateObserver() { @Override - public void onStartedShowing(int layoutType, boolean showToolbar) { + public void onStartedShowing(int layoutType) { Log.d(TAG, "Started to show: " + layoutType); startedShowingCallback.layoutType = layoutType; startedShowingCallback.notifyCalled(); @@ -684,8 +684,7 @@ } @Override - public void onStartedHiding( - int layoutType, boolean showToolbar, boolean delayAnimation) { + public void onStartedHiding(int layoutType) { Log.d(TAG, "Started to hide: " + layoutType); startedHidingCallback.layoutType = layoutType; startedHidingCallback.notifyCalled(); @@ -898,7 +897,7 @@ Assert.assertNotNull("Must be called after initialization", layoutManagerChrome); layoutManagerChrome.addObserver(new LayoutStateProvider.LayoutStateObserver() { @Override - public void onStartedShowing(int layoutType, boolean showToolbar) { + public void onStartedShowing(int layoutType) { observationSequence.add( new LayoutStateLayoutType(LayoutState.STARTING_TO_SHOW, layoutType)); } @@ -910,8 +909,7 @@ } @Override - public void onStartedHiding( - int layoutType, boolean showToolbar, boolean delayAnimation) { + public void onStartedHiding(int layoutType) { observationSequence.add( new LayoutStateLayoutType(LayoutState.STARTING_TO_HIDE, layoutType)); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxActionsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxActionsTest.java index b0f069e..a218f37 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxActionsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxActionsTest.java
@@ -160,8 +160,8 @@ private AutocompleteMatch createDummyActionInSuggest(ActionInfo.ActionType... types) { var actions = new ArrayList<OmniboxAction>(); for (var type : types) { - actions.add(new OmniboxActionInSuggest( - "hint", ActionInfo.newBuilder().setActionType(type).build())); + actions.add( + new OmniboxActionInSuggest("hint", type.getNumber(), "https://www.google.com")); } return createDummySuggestion(actions);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninFirstRunFragmentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninFirstRunFragmentTest.java index e218d409..e9b55968 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninFirstRunFragmentTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninFirstRunFragmentTest.java
@@ -676,6 +676,7 @@ verify(mFirstRunPageDelegateMock).advanceToNextPage(); } + @DisabledTest(message = "https:://crbug.com/1447085") @Test @MediumTest public void testDismissButtonWhenUserIsSignedIn() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/survey/ChromeSurveyControllerIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/survey/ChromeSurveyControllerIntegrationTest.java index 9dbd8ef..89584aa 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/survey/ChromeSurveyControllerIntegrationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/survey/ChromeSurveyControllerIntegrationTest.java
@@ -20,6 +20,7 @@ import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.CriteriaHelper; +import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Restriction; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeSwitches; @@ -119,6 +120,7 @@ mTestSurveyController.showSurveyCallbackHelper.getCallCount()); } + @DisabledTest(message = "https:://crbug.com/1447085") @Test @MediumTest public void testMessageDismissed() throws TimeoutException, ExecutionException { @@ -128,6 +130,7 @@ () -> mMessageDispatcher.dismissMessage(message, DismissReason.GESTURE)); } + @DisabledTest(message = "https:://crbug.com/1447085") @Test @MediumTest public void testNoMessageInNewTab() throws InterruptedException, ExecutionException {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/incognito/IncognitoTabbedSnapshotControllerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/incognito/IncognitoTabbedSnapshotControllerTest.java index 839c8d9..2de4f87 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/incognito/IncognitoTabbedSnapshotControllerTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/incognito/IncognitoTabbedSnapshotControllerTest.java
@@ -217,7 +217,7 @@ mIsInOverviewMode = false; // Come out of overview mode. - mFilterLayoutStateObserver.onStartedHiding(LayoutType.TAB_SWITCHER, false, false); + mFilterLayoutStateObserver.onStartedHiding(LayoutType.TAB_SWITCHER); assertFalse("isShowingIncognito should return false ", mIsIncognitoShowingSupplier.get()); } @@ -238,7 +238,7 @@ mIsInOverviewMode = true; // Enter overview mode. - mFilterLayoutStateObserver.onStartedShowing(LayoutType.TAB_SWITCHER, false); + mFilterLayoutStateObserver.onStartedShowing(LayoutType.TAB_SWITCHER); assertFalse("isShowingIncognito should return false ", mIsIncognitoShowingSupplier.get()); } @@ -258,7 +258,7 @@ mIsInOverviewMode = true; // Enter overview mode. - mFilterLayoutStateObserver.onStartedShowing(LayoutType.TAB_SWITCHER, false); + mFilterLayoutStateObserver.onStartedShowing(LayoutType.TAB_SWITCHER); assertTrue("isShowingIncognito should be true", mIsIncognitoShowingSupplier.get()); }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/messages/ChromeMessageQueueMediatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/messages/ChromeMessageQueueMediatorTest.java index dcf3775d..0f6f173 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/messages/ChromeMessageQueueMediatorTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/messages/ChromeMessageQueueMediatorTest.java
@@ -119,7 +119,7 @@ ArgumentCaptor.forClass(LayoutStateObserver.class); doNothing().when(mLayoutStateProvider).addObserver(observer.capture()); initMediator(); - observer.getValue().onStartedShowing(LayoutType.TAB_SWITCHER, false); + observer.getValue().onStartedShowing(LayoutType.TAB_SWITCHER); verify(mMessageDispatcher).suspend(); observer.getValue().onFinishedShowing(LayoutType.BROWSING); verify(mMessageDispatcher).resume(EXPECTED_TOKEN);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31UnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31UnitTest.java index d8e414c2..89e2a50 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31UnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31UnitTest.java
@@ -7,6 +7,8 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.when; @@ -473,7 +475,11 @@ mMultiWindowModeStateDispatcher, mActivityLifecycleDispatcher, mModalDialogManagerSupplier, mMenuOrKeyboardActionController); multiInstanceManager.initialize(INSTANCE_ID_1, TASK_ID_57); + assertNull("TabModelSelectorTabModelObserver should be null.", + multiInstanceManager.getTabModelObserverForTesting()); multiInstanceManager.onTabStateInitialized(); + assertNotNull("TabModelSelectorTabModelObserver should not be null.", + multiInstanceManager.getTabModelObserverForTesting()); TabModelObserver tabModelObserver = multiInstanceManager.getTabModelObserverForTesting(); triggerSelectTab(tabModelObserver, mTab1); @@ -533,7 +539,11 @@ mMultiWindowModeStateDispatcher, mActivityLifecycleDispatcher, mModalDialogManagerSupplier, mMenuOrKeyboardActionController); multiInstanceManager.initialize(INSTANCE_ID_1, TASK_ID_57); + assertNull("TabModelSelectorTabModelObserver should be null.", + multiInstanceManager.getTabModelObserverForTesting()); multiInstanceManager.onTabStateInitialized(); + assertNotNull("TabModelSelectorTabModelObserver should not be null.", + multiInstanceManager.getTabModelObserverForTesting()); TabModelObserver tabModelObserver = multiInstanceManager.getTabModelObserverForTesting(); when(mTab1.isIncognito()).thenReturn(false); @@ -601,7 +611,11 @@ mMultiWindowModeStateDispatcher, mActivityLifecycleDispatcher, mModalDialogManagerSupplier, mMenuOrKeyboardActionController); multiInstanceManager.initialize(INSTANCE_ID_1, TASK_ID_57); + assertNull("TabModelSelectorTabModelObserver should be null.", + multiInstanceManager.getTabModelObserverForTesting()); multiInstanceManager.onTabStateInitialized(); + assertNotNull("TabModelSelectorTabModelObserver should not be null.", + multiInstanceManager.getTabModelObserverForTesting()); TabModelObserver tabModelObserver = multiInstanceManager.getTabModelObserverForTesting(); triggerAddTab(tabModelObserver, mTab1);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/tasks/JourneyManagerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/tasks/JourneyManagerTest.java index 4016b96..34d2ddf 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/tasks/JourneyManagerTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/tasks/JourneyManagerTest.java
@@ -194,7 +194,7 @@ // Advance time. doReturn(BASE_TIME_MS + LAST_ENGAGEMENT_ELAPSED_MS).when(mEngagementTimeUtil).currentTime(); - mLayoutStateObserver.onStartedShowing(LayoutType.TAB_SWITCHER, true); + mLayoutStateObserver.onStartedShowing(LayoutType.TAB_SWITCHER); flushAsyncPrefs(); assertEquals(BASE_TIME_MS + LAST_ENGAGEMENT_ELAPSED_MS,
diff --git a/chrome/app/password_manager_ui_strings.grdp b/chrome/app/password_manager_ui_strings.grdp index 57af4d23..b5fb877 100644 --- a/chrome/app/password_manager_ui_strings.grdp +++ b/chrome/app/password_manager_ui_strings.grdp
@@ -282,11 +282,11 @@ <message name="IDS_PASSWORD_MANAGER_UI_PASSWORD_LABEL" desc="Label for the sites for which the password is used."> Password </message> - <message name="IDS_PASSWORD_MANAGER_UI_NOTES_LABEL" desc="Label for the password notes."> - Notes + <message name="IDS_PASSWORD_MANAGER_UI_NOTE_LABEL" desc="Label for the password note."> + Note </message> - <message name="IDS_PASSWORD_MANAGER_UI_NO_NOTE_SAVED" desc="Label for the password note when the note is empty."> - No notes saved + <message name="IDS_PASSWORD_MANAGER_UI_NO_NOTE_ADDED" desc="Label for the password note when the note is empty."> + No note added </message> <message name="IDS_PASSWORD_MANAGER_UI_COPY_PASSWORD" desc="Label for the button which allows to copy a password."> Copy password
diff --git a/chrome/app/password_manager_ui_strings_grdp/IDS_PASSWORD_MANAGER_UI_NOTES_LABEL.png.sha1 b/chrome/app/password_manager_ui_strings_grdp/IDS_PASSWORD_MANAGER_UI_NOTES_LABEL.png.sha1 deleted file mode 100644 index 7be5cdc..0000000 --- a/chrome/app/password_manager_ui_strings_grdp/IDS_PASSWORD_MANAGER_UI_NOTES_LABEL.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -2d957ab6bdbaafe89daa0ea6ceddebb71179267e \ No newline at end of file
diff --git a/chrome/app/password_manager_ui_strings_grdp/IDS_PASSWORD_MANAGER_UI_NOTE_LABEL.png.sha1 b/chrome/app/password_manager_ui_strings_grdp/IDS_PASSWORD_MANAGER_UI_NOTE_LABEL.png.sha1 new file mode 100644 index 0000000..f7d79d0 --- /dev/null +++ b/chrome/app/password_manager_ui_strings_grdp/IDS_PASSWORD_MANAGER_UI_NOTE_LABEL.png.sha1
@@ -0,0 +1 @@ +486c397424da5c6edd0fbf6da0bd2fa1a11e25cc \ No newline at end of file
diff --git a/chrome/app/password_manager_ui_strings_grdp/IDS_PASSWORD_MANAGER_UI_NO_NOTE_ADDED.png.sha1 b/chrome/app/password_manager_ui_strings_grdp/IDS_PASSWORD_MANAGER_UI_NO_NOTE_ADDED.png.sha1 new file mode 100644 index 0000000..f7d79d0 --- /dev/null +++ b/chrome/app/password_manager_ui_strings_grdp/IDS_PASSWORD_MANAGER_UI_NO_NOTE_ADDED.png.sha1
@@ -0,0 +1 @@ +486c397424da5c6edd0fbf6da0bd2fa1a11e25cc \ No newline at end of file
diff --git a/chrome/app/password_manager_ui_strings_grdp/IDS_PASSWORD_MANAGER_UI_NO_NOTE_SAVED.png.sha1 b/chrome/app/password_manager_ui_strings_grdp/IDS_PASSWORD_MANAGER_UI_NO_NOTE_SAVED.png.sha1 deleted file mode 100644 index 7be5cdc..0000000 --- a/chrome/app/password_manager_ui_strings_grdp/IDS_PASSWORD_MANAGER_UI_NO_NOTE_SAVED.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -2d957ab6bdbaafe89daa0ea6ceddebb71179267e \ No newline at end of file
diff --git a/chrome/app/resources/chromium_strings_be.xtb b/chrome/app/resources/chromium_strings_be.xtb index 10caf4f..d642d8c 100644 --- a/chrome/app/resources/chromium_strings_be.xtb +++ b/chrome/app/resources/chromium_strings_be.xtb
@@ -94,6 +94,7 @@ <translation id="3179665906251668410">Адкрыць спасылку ў акне інко&гніта ў Chromium</translation> <translation id="3185330573522821672">Наладзьце новы профіль Chromium</translation> <translation id="3190315855212034486">Памылка! Збой Chromium. Перазапусціць?</translation> +<translation id="3255926992597692024">Chromium спрабуе замяніць налады запаўнення спосабаў аплаты.</translation> <translation id="3258596308407688501">Chromium не можа чытаць з каталога даных і запісваць у яго: <ph name="USER_DATA_DIRECTORY" /></translation> @@ -199,6 +200,7 @@ <translation id="5653831366781983928">Перазапусціце Chromium</translation> <translation id="5690427481109656848">Google LLC</translation> <translation id="5698481217667032250">Паказваць інтэрфейс браўзера Chromium на гэтай мове</translation> +<translation id="585620188971323280">змяніць налады запаўнення спосабаў аплаты.</translation> <translation id="5862307444128926510">Вас вітае Chromium</translation> <translation id="5883558403894052917">Браўзер Chromium выявіў, што наступныя элементы змяшчаюць шкоднае ПЗ:</translation> <translation id="5895138241574237353">Перазапусціць</translation>
diff --git a/chrome/app/resources/chromium_strings_sw.xtb b/chrome/app/resources/chromium_strings_sw.xtb index 104733af..e1e60b0 100644 --- a/chrome/app/resources/chromium_strings_sw.xtb +++ b/chrome/app/resources/chromium_strings_sw.xtb
@@ -203,7 +203,7 @@ <translation id="585620188971323280">kurekebisha mipangilio kwa ajili ya kujaza njia za kulipa.</translation> <translation id="5862307444128926510">Karibu kwenye Chromium</translation> <translation id="5883558403894052917">Chromium imegundua kwamba vipengee hivi vina programu hasidi:</translation> -<translation id="5895138241574237353">Zzima na uwashe</translation> +<translation id="5895138241574237353">Zima na uwashe</translation> <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - Kuingia katika Akaunti ya Mtandao</translation> <translation id="5924017743176219022">Inaunganisha kwenye Intaneti...</translation> <translation id="5941711191222866238">Punguza</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index 7f800d14..136fbfc0 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -527,6 +527,7 @@ <translation id="146000042969587795">تمّ حجب هذا الإطار لتضمّنه بعض المحتوى غير الآمن.</translation> <translation id="1461041542809785877">الأداء</translation> <translation id="1461177659295855031">النقل إلى مجلد "شريط الإشارات"</translation> +<translation id="1461288887896722288">لقد سجّلت دخولك إلى حساب مُدار. في حال إنشاء ملف شخصي مُدار جديد، ستتمكَّن من الوصول إلى بعض الموارد المرتبطة بهذا الحساب.</translation> <translation id="146219525117638703">حالة ONC</translation> <translation id="146220085323579959">تم قطع الاتصال بالإنترنت. يُرجى التحقق من الاتصال بالإنترنت وإعادة المحاولة.</translation> <translation id="1462850958694534228">مراجعة التعديل الذي تم إجراؤه على الرمز</translation> @@ -1882,6 +1883,7 @@ <translation id="2575407791320728464">عنوان URL غير صالح. يجب تنسيق العنوان بشكل صحيح.</translation> <translation id="2575441894380764255">المواقع الإلكترونية التي لا يُسمح لها بعرض الإعلانات المضلِّلة أو غير المرغوب فيها</translation> <translation id="2575713839157415345">{YEARS,plural, =1{سيتم حفظ بيانات هذا الجهاز لمدة سنة واحدة ويمكنك توصيله بدون استخدام رمز في المرة القادمة. تم ضبط هذا الإعداد من قِبل المشرف.}zero{سيتم حفظ بيانات هذا الجهاز لمدة {YEARS} سنة ويمكنك توصيله بدون استخدام رمز في المرة القادمة. تم ضبط هذا الإعداد من قِبل المشرف.}two{سيتم حفظ بيانات هذا الجهاز لمدة سنتَين ({YEARS}) ويمكنك توصيله بدون استخدام رمز في المرة القادمة. تم ضبط هذا الإعداد من قِبل المشرف.}few{سيتم حفظ بيانات هذا الجهاز لمدة {YEARS} سنوات ويمكنك توصيله بدون استخدام رمز في المرة القادمة. تم ضبط هذا الإعداد من قِبل المشرف.}many{سيتم حفظ بيانات هذا الجهاز لمدة {YEARS} سنة ويمكنك توصيله بدون استخدام رمز في المرة القادمة. تم ضبط هذا الإعداد من قِبل المشرف.}other{سيتم حفظ بيانات هذا الجهاز لمدة {YEARS} سنة ويمكنك توصيله بدون استخدام رمز في المرة القادمة. تم ضبط هذا الإعداد من قِبل المشرف.}}</translation> +<translation id="2577446426265992344">بدون المربّع المتعدد الاستخدامات</translation> <translation id="257779572837908839">الإعداد كجهاز Chromebox للاجتماعات</translation> <translation id="2579309488038515659">تفعيل نقطة الاتصال</translation> <translation id="2579596474754516455">يمكنك مسح صور PDF ضوئيًا لتحويل النص فيها إلى كلام لقراءته باستخدام قارئ الشاشة عند الضرورة.</translation> @@ -6584,6 +6586,7 @@ <translation id="6787097042755590313">علامة تبويب أخرى</translation> <translation id="6787839852456839824">اختصارات لوحة المفاتيح</translation> <translation id="6788210894632713004">إضافة تم فك حزمتها</translation> +<translation id="678939393857169499">تفعيل تصميم سطح المكتب الجديد</translation> <translation id="6789592661892473991">تقسيم أفقي</translation> <translation id="6789834167207639931">أعِد إدخال كلمة مرور حسابك على Google في الشاشة التالية لإكمال عملية الاسترداد.</translation> <translation id="6790428901817661496">التشغيل</translation> @@ -7381,6 +7384,7 @@ <translation id="7481312909269577407">إلى الأمام</translation> <translation id="7481358317100446445">جاهزة</translation> <translation id="748138892655239008">القيود الأساسية على الشهادة</translation> +<translation id="7483145199632798061">Chrome Refresh 2023</translation> <translation id="7484645889979462775">عدم حفظ كلمة المرور لهذا الموقع</translation> <translation id="7487141338393529395">تفعيل التدقيق الإملائي المُحسَّن</translation> <translation id="7487969577036436319">لم يتم تثبيت أي مكونات</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index 507f96e..703734e 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">Tab yenidən aktivdir</translation> <translation id="1003088604756913841">Linki yeni <ph name="APP" /> Pənəcərəsində açın</translation> <translation id="100323615638474026">USB cihazı (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Google Güvənli Axtarış</translation> <translation id="1004218526896219317">Sayt girişi</translation> <translation id="1005274289863221750">Mikrofonunuzu və kameranızı istifadə edin</translation> <translation id="1005333234656240382">ADB sazlaması aktivləşdirilsin?</translation> @@ -522,6 +523,7 @@ <translation id="146000042969587795">Bu çərçivə güvənsiz kontent içərdiyi üçün bloklandı.</translation> <translation id="1461041542809785877">Performans</translation> <translation id="1461177659295855031">Əlfəcin Paneli qovluğuna köçürün</translation> +<translation id="1461288887896722288">İdarə olunan hesaba daxil oldunuz. İdarə olunan profil yaratmaqla hesabla əlaqələndirilmiş bəzi resurslara daxil ola biləcəksiniz.</translation> <translation id="146219525117638703">ONC Durumu</translation> <translation id="146220085323579959">İnternet kəsildi. internet bağlantınızı yoxlayın və yenidən cəhd edin.</translation> <translation id="1462850958694534228">İkona güncəlləməsini nəzərdən keçirin</translation> @@ -897,6 +899,7 @@ <translation id="1769104665586091481">Linki Yeni Pəncərədə Açın</translation> <translation id="1770407692401984718">Şəkli buraya dartın və ya</translation> <translation id="177053719077591686">Android t'tbiql'rini Google Diskdə yedəkləyin.</translation> +<translation id="1771075623623424448">Brauzerin cihaz jurnalı səhifəsini axtarırsınız? Daxil olun: <ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="177336675152937177">Aparıcı Tətbiq datası</translation> <translation id="1776712937009046120">İstifadəçi əlavə edin</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> @@ -1682,6 +1685,15 @@ <translation id="2422125132043002186">Linux bərpası ləğv edildi</translation> <translation id="2423578206845792524">Şəklin saxlanma formatı:</translation> <translation id="2424424966051154874">{0,plural, =1{Qonaq}other{Qonaq (#)}}</translation> +<translation id="242684489663276773">Nəticədə: + <ph name="LINE_BREAKS" /> + • Chrome ayarları və Chrome qısayolları sıfırlanacaq + <ph name="LINE_BREAK" /> + • Artırmalar deaktiv ediləcək + <ph name="LINE_BREAK" /> + • Kukilər və digər müvəqqəti sayt datası silinəcək + <ph name="LINE_BREAKS" /> + Əlfəcin, tarixçə və yadda saxlanmış parollar təsirə məruz qalmayacaq.</translation> <translation id="2428510569851653187">Tabda xəta baş verdiyi zaman nə etdiyinizi təsvir edin</translation> <translation id="2428939361789119025">Wi-Fi şəbəkəsini deaktiv edin</translation> <translation id="2428978615149723410">bu arabalar</translation> @@ -1865,6 +1877,7 @@ <translation id="2575407791320728464">Yanlış URL. Onun düzgün format edildiyinə əmin olun.</translation> <translation id="2575441894380764255">Müdaxiləçi və ya yanıldıcı reklamların göstərilməsinə icazə verilməyib</translation> <translation id="2575713839157415345">{YEARS,plural, =1{Bu cihaz 1 il saxlanacaq və növbəti dəfə kod olmadan qoşula bilərsiniz. Bu, administratorunuz tərəfindən ayarlanıb.}other{Bu cihaz {YEARS} il saxlanacaq və növbəti dəfə kod olmadan qoşula bilərsiniz. Bu, administratorunuz tərəfindən ayarlanıb.}}</translation> +<translation id="2577446426265992344">Omnibox olmadan</translation> <translation id="257779572837908839">Görüşlər üçün Chromebox olaraq ayarlayın</translation> <translation id="2579309488038515659">Hotspot'un aktiv edilməsi</translation> <translation id="2579596474754516455">Lazım olduqda ekran oxuyucusuna mətni çevirmək üçün PDF şəkillərini skan edin</translation> @@ -4453,6 +4466,7 @@ <translation id="4876895919560854374">Ekranı kiliddəyin və kiliddən çıxarın</translation> <translation id="4877276003880815204">Elementləri Yoxlayın</translation> <translation id="4877652723592270843">ChromeOS Flex üçün daxili ekran oxuyucusu olan ChromeVox'u aktiv etmək istəyirsiniz? Belədirsə, hər iki səs düyməsinə beş saniyə basıb saxlayın.</translation> +<translation id="4878261017150799673">Saytı aktiv saxlayın</translation> <translation id="4878634973244289103">Rəy göndərmək mümkün deyil. Sonra cəhd edin.</translation> <translation id="4878653975845355462">Fərdi arxa fonlar administratorunuz tərəfindən deaktiv edilib</translation> <translation id="4878718769565915065">Bu təhlükəsizlik açarına barmaq izinin əlavə edilməsi alınmadı</translation> @@ -5240,6 +5254,9 @@ <translation id="5602765853043467355">Bu cihazda əlfəcin, tarixçə, parollar və daha çoxunu silin</translation> <translation id="5605758115928394442">Kimliyinizi doğrulamaq üçün telefona bildiriş göndərildi.</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{Bu artırma bloklanıb}other{Bu artırmalar bloklanıb}}</translation> +<translation id="560743070587960985">Bu fayl virus və ya zərərli proqram ola bilər. + +Təhlükəli olub-olmadığını yoxlamaq üçün onu Google-a göndərə bilərsiniz. Skan bir neçə saniyə çəkir.</translation> <translation id="560834977503641186">Wi-Fi Sinxronlaşdırması, Ətraflı Məlumat</translation> <translation id="5608580678041221894">Kəsilmiş hissəni tənzimləmək və ya köçürmək üçün aşağıdakı düymələrə toxunun</translation> <translation id="5609231933459083978">Görünür tətbiq yanlışdır.</translation> @@ -5975,6 +5992,7 @@ <translation id="6254892857036829079">Mükəmməl</translation> <translation id="6257602895346497974">Sinxronizasiyanı aktiv edin...</translation> <translation id="62586649943626337">Tablarınızı tab qrupları ilə təşkil edin</translation> +<translation id="6260092874648348841">Saytı aktiv saxlayın</translation> <translation id="6262371516389954471">Yedəkləmələriniz Google'a yüklənir və Google Hesabı parolunuzdan istifadə etməklə şifrlənir.</translation> <translation id="6263082573641595914">Microsoft CA Versiyası</translation> <translation id="6263284346895336537">Əhəmiyyətli deyil</translation> @@ -6552,6 +6570,7 @@ <translation id="6787097042755590313">Digər Tab</translation> <translation id="6787839852456839824">Klaviatura qısayolları</translation> <translation id="6788210894632713004">Paketlənməmiş artırma</translation> +<translation id="678939393857169499">Yeni masaüstü dizaynını aktivləşdirir.</translation> <translation id="6789592661892473991">Horizontal bölün</translation> <translation id="6789834167207639931">Bərpanı başa çatdırmaq üçün növbəti ekranda Google Hesab parolunuzu yenidən daxil edin</translation> <translation id="6790428901817661496">Oxudun</translation> @@ -7349,6 +7368,7 @@ <translation id="7481312909269577407">İrəli</translation> <translation id="7481358317100446445">Hazırdır</translation> <translation id="748138892655239008">Sertifikat əsas maneələr</translation> +<translation id="7483145199632798061">Chrome Refresh 2023</translation> <translation id="7484645889979462775">Bu sayt üçün heç vaxt</translation> <translation id="7487141338393529395">Qabaqcıl orfoqrafik yoxlamanı aktiv edin</translation> <translation id="7487969577036436319">Heç bir komponent quraşdırılmadı</translation> @@ -7510,6 +7530,7 @@ <translation id="7634280112532283638">Spam və dələduzluğun azaldılması</translation> <translation id="7634337648687970851">Lokal data bərpası hazırda dəstəklənmir.</translation> <translation id="7634566076839829401">Xəta baş verdi. Yenidən cəhd edin.</translation> +<translation id="763472884969134151">Təhlil edib: <ph name="LINK" /></translation> <translation id="7635048370253485243">Administratorunuz tərəfindən bərkidilib</translation> <translation id="7635711411613274199">Baxış keçirdiyiniz zaman gördüyünüz reklamın fərdiləşdirilmiş olub-olmaması bu ayardan, <ph name="BEGIN_LINK1" />Reklam mövzularından<ph name="LINK_END1" />, <ph name="BEGIN_LINK2" />kuki ayarlarınızdan<ph name="LINK_END2" /> və baxdığınız saytın reklamları fərdiləşdirib-fərdiləşdirməməsindən asılıdır</translation> <translation id="7636919061354591437">Bu cihazda quraşdırın</translation> @@ -8188,6 +8209,7 @@ <translation id="8195737548602430447">Subtitrləri hədəf dilə avtomatik tərcümə edin.</translation> <translation id="8197673340773315084">İş və ya Şəxsi kimi ad və ya etiket əlavə edin</translation> <translation id="8198456017687137612">Yayım tabı</translation> +<translation id="8198457270656084773">Sistemin cihaz jurnalı səhifəsini axtarırsınız? Daxil olun: <ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="8198511718495409170">"<ph name="EXTENSION_NAME" />" üzrə yenilənmiş ayarları sayta tətbiq etmək üçün bu səhifəni yenidən yükləyin</translation> <translation id="8199300056570174101">Şəbəkə (Xidmət) və Cihaz xüsusiyyətləri</translation> <translation id="8200772114523450471">Davam edin</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb index 34158244..b0d8546 100644 --- a/chrome/app/resources/generated_resources_be.xtb +++ b/chrome/app/resources/generated_resources_be.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">Укладка зноў актыўная</translation> <translation id="1003088604756913841">Адкрыць спасылку ў новым акне <ph name="APP" /></translation> <translation id="100323615638474026">Прылада USB (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Google Бяспечны прагляд</translation> <translation id="1004218526896219317">Доступ да сайтаў</translation> <translation id="1005274289863221750">Выкарыстанне мікрафона і камеры</translation> <translation id="1005333234656240382">Уключыць адладку ADB?</translation> @@ -78,6 +79,7 @@ <translation id="1061904396131502319">Набліжаецца час блакіроўкі</translation> <translation id="1062407476771304334">Замяніць</translation> <translation id="1062628064301375934">Дапамажыце нам павысіць прыватнасць прагляду інтэрнэту для ўсіх карыстальнікаў</translation> +<translation id="1066964438793906105">Сканіраваць для пошуку шкодных праграм</translation> <translation id="1067048845568873861">Створаны</translation> <translation id="1067661089446014701">Дзеля дадатковай бяспекі, перш чым захоўваць паролі ва Уліковым запісе Google, вы можаце зашыфроўваць іх на прыладзе</translation> <translation id="1067922213147265141">Іншыя сэрвісы Google</translation> @@ -142,6 +144,7 @@ <translation id="1116639326869298217">Не ўдалося спраўдзіць вашу асобу</translation> <translation id="1116694919640316211">Інфармацыя</translation> <translation id="1116779635164066733">Гэтай наладай кіруе пашырэнне "<ph name="NAME" />".</translation> +<translation id="1118428905044642028">Паролі і аўтазапаўненне</translation> <translation id="1118738876271697201">Сістэме не ўдалося вызначыць мадэль прылады або яе серыйны нумар.</translation> <translation id="1119447706177454957">Унутраная памылка</translation> <translation id="1122068467107743258">Праца</translation> @@ -525,6 +528,7 @@ <translation id="146000042969587795">Гэты фрэйм заблакіраваны, бо ён утрымлівае небяспечнае змесціва.</translation> <translation id="1461041542809785877">Прадукцыйнасць</translation> <translation id="1461177659295855031">Перамясціць у папку "Панэль закладак"</translation> +<translation id="1461288887896722288">Вы толькі што ўвайшлі ва ўліковы запіс пад кіраваннем. Стварэнне новага кіраванага профілю дазволіць вам атрымаць доступ да некаторых рэсурсаў, звязаных з гэтым уліковым запісам.</translation> <translation id="146219525117638703">Стан ONC</translation> <translation id="146220085323579959">Інтэрнэт адключаны. Праверце падключэнне да інтэрнэту і паўтарыце спробу.</translation> <translation id="1462850958694534228">Праверце новы значок</translation> @@ -902,6 +906,7 @@ <translation id="1769104665586091481">Адкрыць спасылку ў новым &акне</translation> <translation id="1770407692401984718">Перацягніце відарыс сюды або</translation> <translation id="177053719077591686">Рэзервовае капіраванне праграм для Android на Google Дыск.</translation> +<translation id="1771075623623424448">Шукаеце старонку журнала прылад браўзера? Наведаць <ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="177336675152937177">Даныя размешчанай праграмы</translation> <translation id="1776712937009046120">Дадаванне карыстальніка</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> @@ -1293,6 +1298,7 @@ <ph name="BEGIN_BOLD" />Заўвага.<ph name="END_BOLD" /> Пасля запуску гэтага працэсу сістэма перазагрузіцца.</translation> <translation id="2095774564753225041">Тыпы файлаў, якія падтрымліваюцца</translation> <translation id="2097616539631531348">Пакуль укладка была неактыўнай, рэжым эканоміі памяці вызваліў месца для іншых задач.</translation> +<translation id="2097950021134740304">Скасаваць выдаленне падпіскі</translation> <translation id="2098805196501063469">Праверыць астатнія паролі</translation> <translation id="2099686503067610784">Выдаліць сертыфікат сервера "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="2100273922101894616">Аўтаматычны ўваход</translation> @@ -1683,6 +1689,15 @@ <translation id="2422125132043002186">Аднаўленне кантэйнера Linux скасавана</translation> <translation id="2423578206845792524">За&хаваць відарыс як...</translation> <translation id="2424424966051154874">{0,plural, =1{Госць}one{Госць (#)}few{Госць (#)}many{Госць (#)}other{Госць (#)}}</translation> +<translation id="242684489663276773">У выніку гэтага дзеяння будуць: + <ph name="LINE_BREAKS" /> + • скінуты налады і спалучэнні клавіш Chrome; + <ph name="LINE_BREAK" /> + • адключаны пашырэнні; + <ph name="LINE_BREAK" /> + • выдалены файлы cookie і іншыя часовыя даныя сайтаў. + <ph name="LINE_BREAKS" /> + Гэтае дзеянне не закране закладкі, гісторыю і захаваныя паролі.</translation> <translation id="2428510569851653187">Апішыце, што вы рабілі, калі ўкладка дала збой</translation> <translation id="2428939361789119025">Выключыць Wi-Fi</translation> <translation id="2428978615149723410">гэтыя кошыкі</translation> @@ -1866,6 +1881,7 @@ <translation id="2575407791320728464">Няправільны URL-адрас. Упэўніцеся, што ён мае правільны фармат.</translation> <translation id="2575441894380764255">Не дазволена паказваць назойлівую рэкламу або рэкламу, якая ўводзіць у зман</translation> <translation id="2575713839157415345">{YEARS,plural, =1{Прылада будзе захавана на 1 год – наступны раз можна будзе падключыцца без кода. Гэты параметр вызначаецца адміністратарам.}one{Прылада будзе захавана на {YEARS} год – наступны раз можна будзе падключыцца без кода. Гэты параметр вызначаецца адміністратарам.}few{Прылада будзе захавана на {YEARS} гады – наступны раз можна будзе падключыцца без кода. Гэты параметр вызначаецца адміністратарам.}many{Прылада будзе захавана на {YEARS} гадоў – наступны раз можна будзе падключыцца без кода. Гэты параметр вызначаецца адміністратарам.}other{Прылада будзе захавана на {YEARS} года – наступны раз можна будзе падключыцца без кода. Гэты параметр вызначаецца адміністратарам.}}</translation> +<translation id="2577446426265992344">без амнібокса</translation> <translation id="257779572837908839">Задаць як Chromebox для сустрэч</translation> <translation id="2579309488038515659">Уключэнне хот-спота</translation> <translation id="2579596474754516455">Калі ўзнікае такая неабходнасць, сканіраваць PDF-відарысы і пераўтвараць іх у тэкст для праграмы чытання з экрана</translation> @@ -2882,6 +2898,7 @@ <translation id="3484869148456018791">Стварыць новы сертыфікат</translation> <translation id="3486950712960783074">Ваша паездка</translation> <translation id="3487007233252413104">ананімная функцыя</translation> +<translation id="3487649228420469005">Сканіраванне скончана</translation> <translation id="3490695139702884919">Ідзе спампоўванне… <ph name="PERCENT" />%</translation> <translation id="3491669675709357988">Для ўліковага запісу вашага дзіцяці не наладжаны бацькоўскі кантроль Family Link. Вы можаце дадаць функцыю бацькоўскага кантролю па завяршэнні наладкі. Інфармацыю пра бацькоўскі кантроль можна знайсці ў праграме "Агляд".</translation> <translation id="3491678231052507920">Сайты звычайна выкарыстоўваюць даныя і прылады віртуальнай рэальнасці для запуску сеансаў VR</translation> @@ -3436,6 +3453,7 @@ <translation id="3957844511978444971">Націсніце кнопку "Прыняць", каб пацвердзіць выбар гэтых налад сэрвісаў Google.</translation> <translation id="3958088479270651626">Імпарт закладак і налад</translation> <translation id="3958110062351175311">Пашырэнню дазволена паказваць запыты на панэлі інструментаў</translation> +<translation id="3959747296451923142">Пацвердзіць выдаленне падпіскі</translation> <translation id="3960566196862329469">ONC</translation> <translation id="3961005895395968120">Іншыя дзеянні з нумарам "<ph name="IBAN_DESCRIPTION" />"</translation> <translation id="3962119236270174787">Стандартная абарона ад вэб-сайтаў, спамповак і пашырэнняў, вядомых як небяспечныя</translation> @@ -3925,6 +3943,7 @@ <translation id="4408599188496843485">Да&ведка</translation> <translation id="4409271659088619928">Ваша пошукавая сістэма – <ph name="DSE" />. Каб выдаліць гісторыю пошуку, выканайце інструкцыі гэтай сістэмы (калі яны даступныя).</translation> <translation id="4409697491990005945">Палі</translation> +<translation id="4409779593816003679">Паролі і аўтазапаўненне</translation> <translation id="4410545552906060960">Выкарыстоўвайце свой PIN-код замест пароля для разблакіроўкі прылады. Каб задаць PIN-код пазней, перайдзіце ў налады.</translation> <translation id="4411578466613447185">Сертыфікат, які падпісвае код</translation> <translation id="4411719918614785832">Ключы доступу захоўваюцца ў Windows Hello на гэтым камп'ютары, а не ва Уліковым запісе Google.</translation> @@ -4266,6 +4285,7 @@ <translation id="470644585772471629">Інверсія колераў</translation> <translation id="4707337002099455863">Заўсёды на ўсіх сайтах</translation> <translation id="4708849949179781599">Выйсці з браўзера <ph name="PRODUCT_NAME" /></translation> +<translation id="4708892882822652439">Дазволіць таксама прайграванне гуку з укладкі</translation> <translation id="4711638718396952945">Аднавіць налады</translation> <translation id="4713409221649555176">Выдаляць пры закрыцці ўсіх вокнаў</translation> <translation id="4715631922189108923">Змяніць імя карыстальніка</translation> @@ -4293,6 +4313,7 @@ <translation id="4735506354605317060">Вылучэнне ўказальніка кружком</translation> <translation id="4735793370946506039">Даведацца больш пра Палепшаны Бяспечны прагляд.</translation> <translation id="4735803855089279419">Сістэма не змагла вызначыць ідэнтыфікатары прылад для гэтай прылады.</translation> +<translation id="4735846817388402006">Націсніце, каб дазволіць пашырэнню "<ph name="EXTENSIONS_REQUESTING_ACCESS" />" доступ да сайта <ph name="ORIGIN" /></translation> <translation id="473775607612524610">Абнавіць</translation> <translation id="473936925429402449">Выбрана, дадатковае змесціва: <ph name="CURRENT_ELEMENT" /> з <ph name="TOTAL_ELEMENTS" /></translation> <translation id="4739639199548674512">Білеты</translation> @@ -4449,6 +4470,7 @@ <translation id="4876895919560854374">Блакіроўка і разблакіроўка экрана</translation> <translation id="4877276003880815204">Праверыць элементы</translation> <translation id="4877652723592270843">Актываваць ChromeVox – убудаваную праграму чытання з экрана для Chrome OS Flex? Для актывацыі націсніце і ўтрымлівайце пяць секунд абедзве клавішы гучнасці.</translation> +<translation id="4878261017150799673">Падтрымліваць актыўнасць сайта</translation> <translation id="4878634973244289103">Не ўдалося адправіць водгук. Паўтарыце спробу пазней.</translation> <translation id="4878653975845355462">Адміністратар забараніў наладжванне ўласных фонаў</translation> <translation id="4878718769565915065">Не ўдалося дадаць адбітак пальца ў гэты ключ бяспекі</translation> @@ -5236,6 +5258,9 @@ <translation id="5602765853043467355">Выдаліць закладкі, гісторыю, паролі і іншае з гэтай прылады</translation> <translation id="5605758115928394442">Вам на тэлефон для пацвярджэння вашай асобы адпраўлена апавяшчэнне.</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{Гэта пашырэнне заблакіравана}one{Гэтыя пашырэнні заблакіраваны}few{Гэтыя пашырэнні заблакіраваны}many{Гэтыя пашырэнні заблакіраваны}other{Гэтыя пашырэнні заблакіраваны}}</translation> +<translation id="560743070587960985">Гэты файл можа з'яўляцца вірусам або шкоднай праграмай. + +Вы можаце адправіць яго на праверку ў Google. Сканіраванне можа заняць некалькі хвілін.</translation> <translation id="560834977503641186">Сінхранізацыя параметраў Wi-Fi, даведацца больш</translation> <translation id="5608580678041221894">Каб змяніць або перамясціць вобласць абрэзкі, выкарыстоўвайце наступныя клавішы</translation> <translation id="5609231933459083978">Здаецца, праграма недапушчальная.</translation> @@ -5289,6 +5314,7 @@ <translation id="5648166631817621825">За апошнія 7 дзён</translation> <translation id="5651308944918885595">Абагульванне паблізу: бачнасць</translation> <translation id="5653154844073528838">У вас некалькі (<ph name="PRINTER_COUNT" />) захаваных прынтараў.</translation> +<translation id="565515993087783098">Выдаленне інфармацыі пра гэтую сетку прывядзе да выдалення падпіскі Passpoint і звязаных з ёй сетак.</translation> <translation id="5655296450510165335">Рэгістрацыя прылады</translation> <translation id="5656845498778518563">Адправіць водгук у Google</translation> <translation id="5657156137487675418">Дазволіць усе файлы cookie</translation> @@ -5972,6 +5998,7 @@ <translation id="6254892857036829079">Выдатная</translation> <translation id="6257602895346497974">Уключыць сінхранізацыю...</translation> <translation id="62586649943626337">Упарадкоўвайце свае ўкладкі з дапамогай груп укладак</translation> +<translation id="6260092874648348841">Падтрымліваць актыўнасць сайта</translation> <translation id="6262371516389954471">Рэзервовыя копіі запампоўваюцца ў Google і шыфруюцца пад паролем ад вашага Уліковага запісу Google.</translation> <translation id="6263082573641595914">Версія ЦС Microsoft</translation> <translation id="6263284346895336537">Не крытычнае</translation> @@ -6537,6 +6564,7 @@ <translation id="6776589734354015877">Карыстайцеся дадатковымі функцыямі</translation> <translation id="6776729248872343918">Уключыць хуткае спалучэнне</translation> <translation id="6777817260680419853">Перанакіраванне заблакіравана</translation> +<translation id="6777845730143344223">Даведацца больш пра падпіскі Passpoint</translation> <translation id="6779092717724412415">Каб стварыць такое вылучэнне, як гэта, выберыце які-небудзь тэкст і націсніце на яго правай кнопкай мышы.</translation> <translation id="6779447100905857289">вашы кошыкі</translation> <translation id="677965093459947883">Вельмі дробны</translation> @@ -6554,6 +6582,7 @@ <translation id="6787097042755590313">Іншая ўкладка</translation> <translation id="6787839852456839824">Спалучэнні клавіш</translation> <translation id="6788210894632713004">Распакаванае пашырэнне</translation> +<translation id="678939393857169499">Новы дызайн Chrome на ПК.</translation> <translation id="6789592661892473991">Падзяліць гарызантальна</translation> <translation id="6789834167207639931">Увядзіце пароль ад свайго Уліковага запісу Google яшчэ раз на наступным экране, каб завяршыць аднаўленне</translation> <translation id="6790428901817661496">Прайграць</translation> @@ -7220,6 +7249,7 @@ <translation id="7380622428988553498">Назва прылады змяшчае недапушчальныя сімвалы</translation> <translation id="7380768571499464492">Прынтар "<ph name="PRINTER_NAME" />" абноўлены</translation> <translation id="7382085868019811559">Функцыя "Падтрымка браўзераў ранейшых версій" дазваляе адкрываць асобныя шаблоны URL-адрасоў у альтэрнатыўных браўзерах, якія падтрымліваюць устарэлыя функцыі, неабходныя для належнай работы гэтых сайтаў.</translation> +<translation id="7382980704744807223">Падазроны</translation> <translation id="738322632977123193">Запампаваць файл не ўдалося. Відарыс павінен мець адзін з наступных фарматаў: .jpg, .gif, .png, .bmp, .tif або .webp.</translation> <translation id="73843634555824551">Спосабы ўводу і раскладкі клавіятуры</translation> <translation id="7384687527486377545">Аўтаматычны паўтор уводу на клавіятуры</translation> @@ -7350,6 +7380,7 @@ <translation id="7481312909269577407">Далей</translation> <translation id="7481358317100446445">Гатова</translation> <translation id="748138892655239008">Асноўныя абмежаванні сертыфікатаў</translation> +<translation id="7483145199632798061">Абнаўленне Chrome 2023</translation> <translation id="7484645889979462775">Ніколі для гэтага сайта</translation> <translation id="7487141338393529395">Уключэнне палепшанай праверкі правапісу</translation> <translation id="7487969577036436319">Кампаненты не ўсталяваны</translation> @@ -7480,6 +7511,7 @@ <translation id="7607002721634913082">Прыпынена</translation> <translation id="7608810328871051088">Налады Android</translation> <translation id="7609148976235050828">Падключыцеся да інтэрнэту і паўтарыце спробу.</translation> +<translation id="7611713099524036757">клавіша Meta</translation> <translation id="7612401678989660900">Даць доступ праграмам і сайтам, якія маюць дазвол выкарыстоўваць мікрафон</translation> <translation id="7612655942094160088">Уключэнне функцый падключанага тэлефона.</translation> <translation id="7612989789287281429">Выконваецца ўваход…</translation> @@ -7510,6 +7542,7 @@ <translation id="7634280112532283638">Змаганне са спамам і махлярствам</translation> <translation id="7634337648687970851">Аднаўленне лакальных даных зараз не падтрымліваецца.</translation> <translation id="7634566076839829401">Нешта пайшло не так. Паўтарыце спробу.</translation> +<translation id="763472884969134151">Аналіз зроблены <ph name="LINK" /></translation> <translation id="7635048370253485243">Замацавана вашым адміністратарам</translation> <translation id="7635711411613274199">Ці будзе ажыццяўляцца персаналізацыя рэкламы, якая вам паказваецца, залежыць ад гэтай налады, <ph name="BEGIN_LINK1" />тэм рэкламы<ph name="LINK_END1" />, <ph name="BEGIN_LINK2" />налад файлаў cookie<ph name="LINK_END2" />, а таксама ад таго, ці персаналізуе рэкламу сам сайт, які вы наведваеце</translation> <translation id="7636919061354591437">Усталяваць на гэту прыладу</translation> @@ -8188,6 +8221,7 @@ <translation id="8195737548602430447">Аўтаматычны пераклад субцітраў на выбраную мову.</translation> <translation id="8197673340773315084">Дадайце назву або метку (напрыклад, "Праца" або "Асабістае")</translation> <translation id="8198456017687137612">Ідзе трансляцыя ўкладкі</translation> +<translation id="8198457270656084773">Шукаеце старонку журнала сістэмных прылад? Наведаць <ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="8198511718495409170">Каб прымяніць абноўленыя налады да гэтага сайта для пашырэння "<ph name="EXTENSION_NAME" />", перазагрузіце старонку</translation> <translation id="8199300056570174101">Уласцівасці прылады і сеткі (сэрвісу)</translation> <translation id="8200772114523450471">Узнавіць</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index cdeb37c..1a73ac7d 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">আবার ট্যাব অ্যাক্টিভ করে</translation> <translation id="1003088604756913841">নতুন <ph name="APP" /> উইন্ডোতে লিঙ্ক খুলুন</translation> <translation id="100323615638474026">ইউএসবি ডিভাইস (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Google Safe Browsing</translation> <translation id="1004218526896219317">অ্যাক্সেস করতে পারে এমন সাইট</translation> <translation id="1005274289863221750">আপনার মাইক্রোফোন ও ক্যামেরা ব্যবহার করুন</translation> <translation id="1005333234656240382">ADB ডিবাগিং চালু করতে চান?</translation> @@ -528,6 +529,7 @@ <translation id="146000042969587795">নিরাপদ নয় এমন কন্টেন্ট থাকার কারণে এই ফ্রেমটি আটকানো হয়্ছে৷</translation> <translation id="1461041542809785877">কর্ম সম্পাদন</translation> <translation id="1461177659295855031">বুকমার্ক বার ফোল্ডারে যান</translation> +<translation id="1461288887896722288">আপনি এইমাত্র ম্যানেজ করা অ্যাকাউন্টে সাইন-ইন করেছেন, ম্যানেজ করা নতুন প্রোফাইল তৈরি করার মাধ্যমে সেই অ্যাকাউন্টের সাথে লিঙ্ক করা কিছু রিসোর্স অ্যাক্সেস করবেন।</translation> <translation id="146219525117638703">ONC অবস্থা</translation> <translation id="146220085323579959">ইন্টারনেট সংযোগ বিচ্ছিন্ন হয়েছে৷ অনুগ্রহ করে আপনার ইন্টারনেট সংযোগ পরীক্ষা করুন এবং আবার চেষ্টা করুন৷</translation> <translation id="1462850958694534228">আইকনের আপডেট দেখে নিন</translation> @@ -913,6 +915,7 @@ <translation id="1769104665586091481">নতুন &উইন্ডোতে লিঙ্ক খুলুন</translation> <translation id="1770407692401984718">এখানে একটি ছবি টেনে আনুন অথবা</translation> <translation id="177053719077591686">Google Drive-এ Android অ্যাপের ব্যাক-আপ নিন।</translation> +<translation id="1771075623623424448">ব্রাউজারেরর ডিভাইস-লগ পৃষ্ঠা খুঁজছেন? <ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" />দেখুন।</translation> <translation id="177336675152937177">হোস্ট করা অ্যাপ্লিকেশান ডেটা</translation> <translation id="1776712937009046120">ব্যবহারকারী যুক্ত করুন</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> @@ -1699,6 +1702,15 @@ <translation id="2422125132043002186">Linux ফিরিয়ে আনা বাতিল করা হয়ছে</translation> <translation id="2423578206845792524">এই হিসেবে ছবি সেভ করুন...</translation> <translation id="2424424966051154874">{0,plural, =1{গেস্ট}one{গেস্ট (#)}other{গেস্ট (#)}}</translation> +<translation id="242684489663276773">এই অ্যাকশন: + <ph name="LINE_BREAKS" /> + • কিছু Chrome সেটিংস ও Chrome শর্টকাট রিসেট করবে + <ph name="LINE_BREAK" /> + • এক্সটেনশন বন্ধ করবে + <ph name="LINE_BREAK" /> + • কুকি ও সাইটের অন্যান্য অস্থায়ী ডেটা মুছে দেবে + <ph name="LINE_BREAKS" /> + বুকমার্ক, ইতিহাস ও সেভ করে রাখা পাসওয়ার্ডে প্রভাব পড়বে না।</translation> <translation id="2428510569851653187">ট্যাবটি ক্র্যাশ হওয়ার সময় আপনি কি করছিলেন তা বর্ণনা করুন</translation> <translation id="2428939361789119025">ওয়াই-ফাই বন্ধ করুন</translation> <translation id="2428978615149723410">এই কার্টগুলি</translation> @@ -1882,6 +1894,7 @@ <translation id="2575407791320728464">সঠিক URL নয়। এটি সঠিকভাবে ফর্ম্যাট করা আছে কিনা দেখে নিন।</translation> <translation id="2575441894380764255">ব্যাঘাত সৃষ্টিকারী অথবা বিভ্রান্তিকর বিজ্ঞাপন দেখানোর অনুমতি দেওয়া হয়নি</translation> <translation id="2575713839157415345">{YEARS,plural, =1{এই ডিভাইসটি ১ বছরের জন্য সেভ করা হবে এবং পরের বার কোনও কোড ছাড়াই কানেক্ট করতে পারবেন। এটি আপনার অ্যাডমিনিস্ট্রেটরের মাধ্যমে সেট করা হয়েছে।}one{এই ডিভাইসটি {YEARS} বছরের জন্য সেভ করা হবে এবং পরের বার কোনও কোড ছাড়াই কানেক্ট করতে পারবেন। এটি আপনার অ্যাডমিনিস্ট্রেটরের মাধ্যমে সেট করা হয়েছে।}other{এই ডিভাইসটি {YEARS} বছরের জন্য সেভ করা হবে এবং পরের বার কোনও কোড ছাড়াই কানেক্ট করতে পারবেন। এটি আপনার অ্যাডমিনিস্ট্রেটরের মাধ্যমে সেট করা হয়েছে।}}</translation> +<translation id="2577446426265992344">বহুউপযোগী ক্ষেত্র ছাড়াই</translation> <translation id="257779572837908839">মিটিংয়ের জন্য Chromebox সেট-আপ করুন</translation> <translation id="2579309488038515659">হটস্পট চালু করুন</translation> <translation id="2579596474754516455">প্রয়োজন হলে স্ক্রিন রিডারের জন্য টেক্সট কনভার্ট করতে পিডিএফ ছবি স্ক্যান করুন</translation> @@ -4474,6 +4487,7 @@ <translation id="4876895919560854374">স্ক্রীণ লক ও আনলক করুন</translation> <translation id="4877276003880815204">এলিমেন্টগুলি দেখুন</translation> <translation id="4877652723592270843">আপনি কি ChromeOS Flex-এর বিল্ট-ইন স্ক্রিন রিডার ChromeVox অ্যাক্টিভেট চালু করতে চাইছেন? উত্তর হ্যাঁ হলে, দু'টি ভলিউম কী পাঁচ সেকেন্ডের জন্য প্রেস করে ধরে রাখুন।</translation> +<translation id="4878261017150799673">সাইট চালু রাখুন</translation> <translation id="4878634973244289103">মতামত পাঠানো যায়নি। পরে আবার চেষ্টা করুন।</translation> <translation id="4878653975845355462">আপনার অ্যাডমিনিস্ট্রেটর কাস্টম ব্যাকগ্রাউন্ড বন্ধ করে দিয়েছেন</translation> <translation id="4878718769565915065">এই নিরাপত্তা কীয়ের জন্য একটি আঙুলের ছাপ যোগ করা যায়নি</translation> @@ -5261,6 +5275,9 @@ <translation id="5602765853043467355">এই ডিভাইসের বুকমার্ক, ইতিহাস, পাসওয়ার্ড এবং আরও অনেক কিছু খালি করুন</translation> <translation id="5605758115928394442">এটি যে আপনি তা কনফার্ম করতে আপনার ফোনে একটি বিজ্ঞপ্তি পাঠানো হয়েছে।</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{এই এক্সটেনশন ব্লক করা আছে}one{এই এক্সটেনশন ব্লক করা আছে}other{এই এক্সটেনশন ব্লক করা আছে}}</translation> +<translation id="560743070587960985">এই ফাইলটি ভাইরাস বা ম্যালওয়্যার হতে পারে। + +আপনি এটি অসুরক্ষিত কিনা তা চেক করতে Google-এর কাছে পাঠাতে পারেন। স্ক্যান করতে সাধারণ কয়েক সেকেন্ড সময় লাগে।</translation> <translation id="560834977503641186">Wi-Fi সিঙ্ক, আরও জানুন</translation> <translation id="5608580678041221894">কাটছাঁট করার এলাকা সমন্বয় করতে বা সরাতে নীচের কী’গুলি আলতো চাপুন</translation> <translation id="5609231933459083978">অ্যাপটি ভুল বলে মনে হচ্ছে৷</translation> @@ -6000,6 +6017,7 @@ <translation id="6254892857036829079">নিখুঁত</translation> <translation id="6257602895346497974">সিঙ্ক চালু করুন...</translation> <translation id="62586649943626337">ট্যাব গ্রুপের মাধ্যমে আপনার ট্যাবগুলি সংগঠিত করুন</translation> +<translation id="6260092874648348841">সাইট চালু রাখুন</translation> <translation id="6262371516389954471">আপনার ব্যাক-আপ ডেটা Google-এ আপলোড করা হয় এবং আপনার Google অ্যাকাউন্টের পাসওয়ার্ড ব্যবহার করে সেগুলিকে এনক্রিপ্ট করা হয়।</translation> <translation id="6263082573641595914">Microsoft CA সংস্করণ</translation> <translation id="6263284346895336537">জটিল নয়</translation> @@ -6579,6 +6597,7 @@ <translation id="6787097042755590313">অন্য ট্যাব</translation> <translation id="6787839852456839824">কীবোর্ড শর্টকাটগুলি</translation> <translation id="6788210894632713004">এক্সটেনশন আনপ্যাক করুন</translation> +<translation id="678939393857169499">নতুন ডেস্কটপ ডিজাইন চালু করুন।</translation> <translation id="6789592661892473991">হরিজন্টাল স্প্লিট করুন</translation> <translation id="6789834167207639931">রিকভারি শেষ করার জন্য পরের স্ক্রিনে আবার Google অ্যাকাউন্ট পাসওয়ার্ড লিখুন</translation> <translation id="6790428901817661496">চালু করুন</translation> @@ -7376,6 +7395,7 @@ <translation id="7481312909269577407">ফরওয়ার্ড</translation> <translation id="7481358317100446445">প্রস্তুত</translation> <translation id="748138892655239008">সার্টিফিকেট প্রাথমিক বাধ্যবাধকতা</translation> +<translation id="7483145199632798061">Chrome Refresh 2023</translation> <translation id="7484645889979462775">এই সাইটের জন্য কখনই নয়</translation> <translation id="7487141338393529395">উন্নত বানান পরীক্ষা চালু করুন</translation> <translation id="7487969577036436319">কোন উপাদান ইনস্টল ইনস্টল নেই</translation> @@ -7537,6 +7557,7 @@ <translation id="7634280112532283638">স্প্যাম এবং জালিয়াতি হ্রাস</translation> <translation id="7634337648687970851">স্থানীয় ডেটা আগের অবস্থায় ফেরানোর সুবিধা বর্তমানে কাজ করছে না।</translation> <translation id="7634566076839829401">কিছু গন্ডগোল হয়েছে৷ দয়া করে আবার চেষ্টা করুন৷</translation> +<translation id="763472884969134151"><ph name="LINK" />-এর মাধ্যমে বিশ্লেষণ করা হয়েছে</translation> <translation id="7635048370253485243">আপনার অ্যাডমিনিস্ট্রেটর পিন করেছে</translation> <translation id="7635711411613274199">আপনি ব্রাউজ করার সময়, আপনাকে পছন্দমতো বিজ্ঞাপন দেখানো হবে কিনা তা এই সেটিংয়ের ভিত্তিতে নির্ধারিত হয়, যেমন <ph name="BEGIN_LINK1" />বিজ্ঞাপনের বিষয়<ph name="LINK_END1" />, আপনার <ph name="BEGIN_LINK2" />কুকি সেটিংস<ph name="LINK_END2" /> এবং আপনার দেখা সাইটটি পছন্দমতো বিজ্ঞাপন সাজায় কিনা</translation> <translation id="7636919061354591437">এই ডিভাইসে ইনস্টল করুন</translation> @@ -8215,6 +8236,7 @@ <translation id="8195737548602430447">টার্গেট ভাষায় অটোমেটিক ক্যাপশন অনুবাদ করুন।</translation> <translation id="8197673340773315084">নাম বা লেবেল যোগ করুন, যেমন, অফিস বা ব্যক্তিগত</translation> <translation id="8198456017687137612">কাস্ট করার ট্যাব</translation> +<translation id="8198457270656084773">সিস্টেমের ডিভাইস-লগ পৃষ্ঠা খুঁজছেন? <ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" />দেখুন।</translation> <translation id="8198511718495409170">এই সেটিংসে "<ph name="EXTENSION_NAME" />" আপডেট করা সেটিংস প্রয়োগ করতে পৃষ্ঠাটি আবার লোড করুন</translation> <translation id="8199300056570174101">নেটওয়ার্ক (পরিষেবা) এবং ডিভাইসের বৈশিষ্ট্য</translation> <translation id="8200772114523450471">আবার চালু করা</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index a2ddd8c..45c1aaa 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -530,6 +530,7 @@ <translation id="146000042969587795">Okvir je blokiran jer ima nesiguran sadržaj.</translation> <translation id="1461041542809785877">Performanse</translation> <translation id="1461177659295855031">Premjesti u folder trake oznaka</translation> +<translation id="1461288887896722288">Upravo ste se prijavili na upravljani račun. Kreiranje novog upravljanog profila će vam omogućiti da pristupite određenim izvorima povezanim s tim računom.</translation> <translation id="146219525117638703">Stanje ONC-a</translation> <translation id="146220085323579959">Veza s internetom je prekinuta. Provjerite internetsku vezu i pokušajte ponovo.</translation> <translation id="1462850958694534228">Pregledajte ažuriranje ikone</translation> @@ -1891,6 +1892,7 @@ <translation id="2575407791320728464">Nevažeći URL. Vodite računa da je ispravno formatiran.</translation> <translation id="2575441894380764255">Nije dozvoljeno prikazivanje ometajućih ili obmanjujućih oglasa</translation> <translation id="2575713839157415345">{YEARS,plural, =1{Ovaj uređaj će biti sačuvan 1 godinu i sljedeći put se možete povezati bez koda. Ovo je postavio vaš administrator.}one{Ovaj uređaj će biti sačuvan {YEARS} godinu i sljedeći put se možete povezati bez koda. Ovo je postavio vaš administrator.}few{Ovaj uređaj će biti sačuvan {YEARS} godine i sljedeći put se možete povezati bez koda. Ovo je postavio vaš administrator.}other{Ovaj uređaj će biti sačuvan {YEARS} godina i sljedeći put se možete povezati bez koda. Ovo je postavio vaš administrator.}}</translation> +<translation id="2577446426265992344">bez Omniboxa</translation> <translation id="257779572837908839">Postavite kao Chromebox za sastanke</translation> <translation id="2579309488038515659">Omogućavanje pristupne tačke</translation> <translation id="2579596474754516455">Skenirajte PDF slike da po potrebi konvertirate tekst za čitača ekrana</translation> @@ -6592,6 +6594,7 @@ <translation id="6787097042755590313">Druga kartica</translation> <translation id="6787839852456839824">Prečice tastature</translation> <translation id="6788210894632713004">Neotpakovana ekstenzija</translation> +<translation id="678939393857169499">Omogućava novi dizajn radne površine.</translation> <translation id="6789592661892473991">Podjela po horizontali</translation> <translation id="6789834167207639931">Da završite oporavak, ponovo unesite lozinku Google računa na sljedećem ekranu</translation> <translation id="6790428901817661496">Pokreni</translation> @@ -7389,6 +7392,7 @@ <translation id="7481312909269577407">Proslijedi</translation> <translation id="7481358317100446445">Spremno</translation> <translation id="748138892655239008">Osnovna ograničenja potvrde</translation> +<translation id="7483145199632798061">Chrome Refresh 2023</translation> <translation id="7484645889979462775">Nikada za ovu web lokaciju</translation> <translation id="7487141338393529395">Uključiti poboljšanu provjeru pravopisa</translation> <translation id="7487969577036436319">Nijedna komponenta nije instalirana</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index bed0af9..f775378 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">La pestanya torna a estar activa</translation> <translation id="1003088604756913841">Obre l'enllaç en una nova finestra de l'aplicació <ph name="APP" /></translation> <translation id="100323615638474026">Dispositiu USB (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Navegació segura de Google</translation> <translation id="1004218526896219317">Accés al lloc web</translation> <translation id="1005274289863221750">Utilitzar el micròfon i la càmera</translation> <translation id="1005333234656240382">Vols activar la depuració d'ADB?</translation> @@ -524,6 +525,7 @@ <translation id="146000042969587795">S'ha bloquejat aquest marc perquè inclou contingut no segur.</translation> <translation id="1461041542809785877">Rendiment</translation> <translation id="1461177659295855031">Mou a la carpeta Barra d'adreces d'interès</translation> +<translation id="1461288887896722288">Acabes d'iniciar la sessió en un compte gestionat. Si crees un perfil gestionat nou podràs accedir a alguns recursos que hi estan enllaçats.</translation> <translation id="146219525117638703">Estat d'ONC</translation> <translation id="146220085323579959">S'ha desconnectat Internet. Comproveu la connexió a Internet i torneu-ho a provar.</translation> <translation id="1462850958694534228">Revisa l'actualització de la icona</translation> @@ -901,6 +903,7 @@ <translation id="1769104665586091481">Obre l'enllaç en una &finestra nova</translation> <translation id="1770407692401984718">Arrossega una imatge aquí o</translation> <translation id="177053719077591686">Crea una còpia de seguretat de les aplicacions d'Android a Google Drive.</translation> +<translation id="1771075623623424448">Busques la pàgina de registre de dispositius del navegador? Ves a <ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="177336675152937177">Dades d'aplicacions allotjades</translation> <translation id="1776712937009046120">Afegeix un usuari</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> @@ -1683,6 +1686,15 @@ <translation id="2422125132043002186">S'ha cancel·lat la restauració de Linux</translation> <translation id="2423578206845792524">De&sa la imatge com a...</translation> <translation id="2424424966051154874">{0,plural, =1{Convidat}other{Convidat (#)}}</translation> +<translation id="242684489663276773">Amb aquesta acció: + <ph name="LINE_BREAKS" /> + • Es restabliran algunes opcions de configuració i dreceres de Chrome. + <ph name="LINE_BREAK" /> + • Es desactivaran les extensions. + <ph name="LINE_BREAK" /> + • Se suprimiran les galetes i altres dades temporals dels llocs web. + <ph name="LINE_BREAKS" /> + Les adreces d'interès, l'historial i les contrasenyes desades no es veuran afectats.</translation> <translation id="2428510569851653187">Descriu què feies quan la pestanya s'ha bloquejat</translation> <translation id="2428939361789119025">Desactiva la Wi‑Fi</translation> <translation id="2428978615149723410">aquests carretons</translation> @@ -1866,6 +1878,7 @@ <translation id="2575407791320728464">L'URL no és vàlid. Comprova que té el format correcte.</translation> <translation id="2575441894380764255">Sense permís per mostrar anuncis intrusius o enganyosos</translation> <translation id="2575713839157415345">{YEARS,plural, =1{Aquest dispositiu es desarà durant 1 any i et podràs connectar sense un codi la propera vegada. Això ho ha establert el teu administrador.}other{Aquest dispositiu es desarà durant {YEARS} anys i et podràs connectar sense un codi la propera vegada. Això ho ha establert el teu administrador.}}</translation> +<translation id="2577446426265992344">sense omnibox</translation> <translation id="257779572837908839">Estableix com a Chromebox per a reunions</translation> <translation id="2579309488038515659">Activa el punt d'accés Wi‐Fi</translation> <translation id="2579596474754516455">Escaneja imatges en PDF per convertir-les en text per a lectors de pantalla quan sigui necessari</translation> @@ -4455,6 +4468,7 @@ <translation id="4876895919560854374">Bloqueja i desbloqueja la pantalla</translation> <translation id="4877276003880815204">Inspecciona els elements</translation> <translation id="4877652723592270843">Vols activar ChromeVox, el lector de pantalla integrat per a ChromeOS Flex? Si és així, mantén premudes les dues tecles de volum durant cinc segons.</translation> +<translation id="4878261017150799673">Mantén actiu el lloc web</translation> <translation id="4878634973244289103">No es poden enviar els suggeriments. Torna-ho a provar més tard.</translation> <translation id="4878653975845355462">L'administrador ha desactivat els fons personalitzats</translation> <translation id="4878718769565915065">No s'ha pogut afegir una empremta digital a aquesta clau de seguretat</translation> @@ -5243,6 +5257,9 @@ <translation id="5602765853043467355">Esborra les adreces d'interès, l'historial, les contrasenyes i altres dades d'aquest dispositiu</translation> <translation id="5605758115928394442">S'ha enviat una notificació al teu telèfon per confirmar la teva identitat.</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{Aquesta extensió està bloquejada}other{Aquestes extensions estan bloquejades}}</translation> +<translation id="560743070587960985">Aquest fitxer pot ser un virus o programari maliciós. + +Pots enviar-lo a Google per comprovar si no és segur. Les anàlisis solen tardar uns quants segons.</translation> <translation id="560834977503641186">Sincronització Wi‑Fi, més informació</translation> <translation id="5608580678041221894">Toca aquestes tecles per ajustar o moure l'àrea per retallar</translation> <translation id="5609231933459083978">Sembla que l'aplicació no és vàlida.</translation> @@ -5978,6 +5995,7 @@ <translation id="6254892857036829079">Perfecta</translation> <translation id="6257602895346497974">Activa la sincronització...</translation> <translation id="62586649943626337">Organitza les pestanyes amb els grups de pestanyes</translation> +<translation id="6260092874648348841">Mantén actiu el lloc web</translation> <translation id="6262371516389954471">Les còpies de seguretat es pengen a Google i s'encripten amb la contrasenya del teu Compte de Google.</translation> <translation id="6263082573641595914">Versió de CA de Microsoft</translation> <translation id="6263284346895336537">No crítica</translation> @@ -6555,6 +6573,7 @@ <translation id="6787097042755590313">Una altra pestanya</translation> <translation id="6787839852456839824">Tecles de drecera</translation> <translation id="6788210894632713004">Extensió sense empaquetar</translation> +<translation id="678939393857169499">Activa el nou disseny d'escriptori.</translation> <translation id="6789592661892473991">Divisió horitzontal</translation> <translation id="6789834167207639931">Torna a introduir la contrasenya del teu Compte de Google a la pantalla següent per finalitzar la recuperació</translation> <translation id="6790428901817661496">Reprodueix</translation> @@ -7352,6 +7371,7 @@ <translation id="7481312909269577407">Endavant</translation> <translation id="7481358317100446445">A punt</translation> <translation id="748138892655239008">Restriccions bàsiques de certificats</translation> +<translation id="7483145199632798061">Actualització de Chrome 2023</translation> <translation id="7484645889979462775">Mai per a aquest lloc</translation> <translation id="7487141338393529395">Activa el corrector ortogràfic millorat</translation> <translation id="7487969577036436319">No hi ha cap component instal·lat</translation> @@ -7513,6 +7533,7 @@ <translation id="7634280112532283638">Reducció del frau i del contingut brossa</translation> <translation id="7634337648687970851">Actualment no s'admet la recuperació de dades locals.</translation> <translation id="7634566076839829401">S'ha produït un error; torna-ho a provar.</translation> +<translation id="763472884969134151">Anàlisi feta per <ph name="LINK" /></translation> <translation id="7635048370253485243">Fixada per l'administrador</translation> <translation id="7635711411613274199">El fet que els anuncis que veus mentre navegues es personalitzin o no dependrà d'aquesta opció de configuració, dels <ph name="BEGIN_LINK1" />temes d'anuncis<ph name="LINK_END1" />, de la <ph name="BEGIN_LINK2" />configuració de galetes<ph name="LINK_END2" /> i de si el lloc web que estàs visitant personalitza els anuncis</translation> <translation id="7636919061354591437">Instal·la en aquest dispositiu</translation> @@ -8192,6 +8213,7 @@ <translation id="8195737548602430447">Tradueix els subtítols a un idioma d'arribada automàticament.</translation> <translation id="8197673340773315084">Afegeix un nom o una etiqueta, com ara Feina o Personal</translation> <translation id="8198456017687137612">S'està emetent la pestanya</translation> +<translation id="8198457270656084773">Busques la pàgina de registre de dispositius del sistema? Ves a <ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="8198511718495409170">Per aplicar la configuració actualitzada per a "<ph name="EXTENSION_NAME" />" en aquest lloc web, torna a carregar aquesta pàgina</translation> <translation id="8199300056570174101">Xarxa (servei) i propietats del dispositiu</translation> <translation id="8200772114523450471">Reprèn</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index 9e10d670..69fc784 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">Karta je opět aktivní</translation> <translation id="1003088604756913841">Otevřít odkaz v novém okně aplikace <ph name="APP" /></translation> <translation id="100323615638474026">Zařízení USB (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Bezpečné prohlížení Google</translation> <translation id="1004218526896219317">Přístup k webu</translation> <translation id="1005274289863221750">Používat mikrofon a fotoaparát</translation> <translation id="1005333234656240382">Aktivovat ladění ADB?</translation> @@ -526,6 +527,7 @@ <translation id="146000042969587795">Tento rámec byl blokován, protože obsahuje určitý nezabezpečený obsah.</translation> <translation id="1461041542809785877">Výkon</translation> <translation id="1461177659295855031">Přesunout do složky Lišta záložek</translation> +<translation id="1461288887896722288">Právě jste se přihlásili ke spravovanému účtu. Vytvoření nového spravovaného profilu vám umožní přístup k některým zdrojům propojeným s tímto účtem.</translation> <translation id="146219525117638703">Stav ONC</translation> <translation id="146220085323579959">Došlo k odpojení internetu. Zkontrolujte prosím připojení k internetu a zkuste to znovu.</translation> <translation id="1462850958694534228">Zkontrolujte změnu ikony</translation> @@ -903,6 +905,7 @@ <translation id="1769104665586091481">Otevřít odkaz v &novém okně</translation> <translation id="1770407692401984718">Přetáhněte obrázek sem nebo</translation> <translation id="177053719077591686">Zálohování aplikací pro Android na Disk Google.</translation> +<translation id="1771075623623424448">Hledáte stránku protokolu zařízení prohlížeče? Přejděte na stránku <ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="177336675152937177">Údaje hostovaných aplikací</translation> <translation id="1776712937009046120">Přidat uživatele</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> @@ -1685,6 +1688,15 @@ <translation id="2422125132043002186">Obnovování kontejneru systému Linux bylo zrušeno</translation> <translation id="2423578206845792524">Uložit o&brázek jako...</translation> <translation id="2424424966051154874">{0,plural, =1{Host}few{Host (#)}many{Host (#)}other{Host (#)}}</translation> +<translation id="242684489663276773">Budou provedeny tyto akce: + <ph name="LINE_BREAKS" /> + • Resetují se některá nastavení a zkratky Chromu. + <ph name="LINE_BREAK" /> + • Deaktivují se rozšíření. + <ph name="LINE_BREAK" /> + • Smažou se soubory cookie a jiná dočasná data webů. + <ph name="LINE_BREAKS" /> + Záložky, historie ani uložená hesla nebudou dotčeny.</translation> <translation id="2428510569851653187">Popište, co jste dělali, když karta selhala</translation> <translation id="2428939361789119025">Vypnout Wi-Fi</translation> <translation id="2428978615149723410">tyto karty</translation> @@ -1868,6 +1880,7 @@ <translation id="2575407791320728464">Neplatná adresa URL. Zajistěte, aby byla ve správném formátu.</translation> <translation id="2575441894380764255">Zákaz zobrazovat rušivé nebo zavádějící reklamy</translation> <translation id="2575713839157415345">{YEARS,plural, =1{Toto zařízení bude 1 rok uloženo a příště se budete moci připojit bez kódu. Toto nastavuje váš administrátor.}few{Toto zařízení bude {YEARS} roky uloženo a příště se budete moci připojit bez kódu. Toto nastavuje váš administrátor.}many{Toto zařízení bude {YEARS} roku uloženo a příště se budete moci připojit bez kódu. Toto nastavuje váš administrátor.}other{Toto zařízení bude {YEARS} let uloženo a příště se budete moci připojit bez kódu. Toto nastavuje váš administrátor.}}</translation> +<translation id="2577446426265992344">bez omniboxu</translation> <translation id="257779572837908839">Nastavit jako Chromebox pro videokonference</translation> <translation id="2579309488038515659">Zapnutí hotspotu</translation> <translation id="2579596474754516455">V případě potřeby skenovat obrázky PDF a převádět je na text pro čtečku obrazovky</translation> @@ -4457,6 +4470,7 @@ <translation id="4876895919560854374">Uzamknutí a odemknutí obrazovky</translation> <translation id="4877276003880815204">Prozkoumat prvky</translation> <translation id="4877652723592270843">Chcete aktivovat čtečku ChromeVox, integrovanou čtečku obrazovky pro systém ChromeOS Flex? Pokud ano, na pět sekund podržte obě tlačítka hlasitosti.</translation> +<translation id="4878261017150799673">Ponechat web aktivní</translation> <translation id="4878634973244289103">Zpětnou vazbu nebylo možné odeslat. Zopakujte akci později.</translation> <translation id="4878653975845355462">Administrátor vlastní pozadí vypnul</translation> <translation id="4878718769565915065">Přidání otisku prstu k tomuto bezpečnostnímu klíči se nezdařilo</translation> @@ -5244,6 +5258,9 @@ <translation id="5602765853043467355">Vymazat z tohoto zařízení záložky, historii, hesla a další údaje</translation> <translation id="5605758115928394442">Odeslali jsme vám na telefon oznámení, abychom si ověřili, zda jste to skutečně vy.</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{Toto rozšíření je blokováno}few{Tato rozšíření jsou blokována}many{Tato rozšíření jsou blokována}other{Tato rozšíření jsou blokována}}</translation> +<translation id="560743070587960985">Tento soubor může být vir nebo malware. + +Můžete ho odeslat do Googlu ke kontrole, zda je bezpečný. Kontrola obvykle trvá několik sekund.</translation> <translation id="560834977503641186">Synchronizace Wi-Fi, další informace</translation> <translation id="5608580678041221894">Oblast oříznutí můžete upravit nebo přesunout klepnutím na následující klávesy</translation> <translation id="5609231933459083978">Aplikace je pravděpodobně neplatná.</translation> @@ -5978,6 +5995,7 @@ <translation id="6254892857036829079">Perfektní</translation> <translation id="6257602895346497974">Zapnout synchronizaci...</translation> <translation id="62586649943626337">Uspořádejte si karty pomocí skupin karet</translation> +<translation id="6260092874648348841">Ponechat web aktivní</translation> <translation id="6262371516389954471">Zálohy se nahrávají do Googlu a šifrují pomocí hesla účtu Google.</translation> <translation id="6263082573641595914">Verze CA Microsoft</translation> <translation id="6263284346895336537">Nekritický</translation> @@ -6559,6 +6577,7 @@ <translation id="6787097042755590313">Jiná karta</translation> <translation id="6787839852456839824">Klávesové zkratky</translation> <translation id="6788210894632713004">Rozbalené rozšíření</translation> +<translation id="678939393857169499">Zapne nový vzhled pracovní plochy.</translation> <translation id="6789592661892473991">Vodorovně rozdělit</translation> <translation id="6789834167207639931">K dokončení obnovení na další obrazovce znovu zadejte heslo ke svému účtu Google</translation> <translation id="6790428901817661496">Přehrát</translation> @@ -7355,6 +7374,7 @@ <translation id="7481312909269577407">Vpřed</translation> <translation id="7481358317100446445">Připraveno</translation> <translation id="748138892655239008">Základní omezení certifikátu</translation> +<translation id="7483145199632798061">Chrome Refresh 2023</translation> <translation id="7484645889979462775">Nikdy v případě těchto stránek</translation> <translation id="7487141338393529395">Zapnout vylepšenou kontrolu pravopisu</translation> <translation id="7487969577036436319">Nejsou nainstalovány žádné komponenty</translation> @@ -7516,6 +7536,7 @@ <translation id="7634280112532283638">Omezení spamu a podvodů</translation> <translation id="7634337648687970851">Obnovení místních dat aktuálně není podporováno.</translation> <translation id="7634566076839829401">Něco se pokazilo. Zkuste to znovu.</translation> +<translation id="763472884969134151">Analýzu provedla služba <ph name="LINK" /></translation> <translation id="7635048370253485243">Připnuto administrátorem</translation> <translation id="7635711411613274199">Když procházíte internet, závisí personalizace reklam na tomto nastavení, <ph name="BEGIN_LINK1" />tématech reklam<ph name="LINK_END1" />, <ph name="BEGIN_LINK2" />nastavení souborů cookie<ph name="LINK_END2" /> a na tom, zda zobrazená stránka personalizuje reklamy.</translation> <translation id="7636919061354591437">Nainstalovat na toto zařízení</translation> @@ -8195,6 +8216,7 @@ <translation id="8195737548602430447">Automaticky překládat titulky do cílového jazyka.</translation> <translation id="8197673340773315084">Přidejte jméno nebo štítek, například Pracovní nebo Osobní</translation> <translation id="8198456017687137612">Odesílání karty</translation> +<translation id="8198457270656084773">Hledáte stránku systémového protokolu zařízení? Přejděte na stránku <ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="8198511718495409170">Pokud pro tento web chcete použít aktualizované nastavení rozšíření <ph name="EXTENSION_NAME" />, načtěte tuto stránku znovu</translation> <translation id="8199300056570174101">Vlastnosti sítě (služba) a zařízení</translation> <translation id="8200772114523450471">Pokračovat</translation>
diff --git a/chrome/app/resources/generated_resources_cy.xtb b/chrome/app/resources/generated_resources_cy.xtb index d37c254..0089b22f 100644 --- a/chrome/app/resources/generated_resources_cy.xtb +++ b/chrome/app/resources/generated_resources_cy.xtb
@@ -532,6 +532,7 @@ <translation id="146000042969587795">Cafodd y ffrâm hon ei rhwystro gan ei bod yn cynnwys deunydd anniogel.</translation> <translation id="1461041542809785877">Perfformiad</translation> <translation id="1461177659295855031">Symud i'r ffolder Bar Nodau Tudalen</translation> +<translation id="1461288887896722288">Rydych chi newydd fewngofnodi i gyfrif a reolir, a bydd creu proffil newydd a reolir yn eich galluogi i gael mynediad at rai adnoddau sy'n gysylltiedig â'r cyfrif hwnnw.</translation> <translation id="146219525117638703">Cyflwr ONC</translation> <translation id="146220085323579959">Mae'r rhyngrwyd wedi'i ddatgysylltu. Gwiriwch eich cysylltiad â'r rhyngrwyd a rhowch gynnig arall arni.</translation> <translation id="1462850958694534228">Adolygu diweddariad eicon</translation> @@ -1895,6 +1896,7 @@ <translation id="2575407791320728464">URL annilys. Gwnewch yn siŵr ei bod wedi'i fformatio'n gywir.</translation> <translation id="2575441894380764255">Ni chaniateir dangos hysbysebion ymwthiol neu gamarweiniol</translation> <translation id="2575713839157415345">{YEARS,plural, =1{Bydd y ddyfais hon yn cael ei chadw am 1 flwyddyn a gallwch gysylltu heb god y tro nesaf. Mae hyn yn cael ei osod gan eich gweinyddwr.}zero{Bydd y ddyfais hon yn cael ei chadw am {YEARS} blynedd a gallwch gysylltu heb god y tro nesaf. Mae hyn yn cael ei osod gan eich gweinyddwr.}two{Bydd y ddyfais hon yn cael ei chadw am {YEARS} flynedd a gallwch gysylltu heb god y tro nesaf. Mae hyn yn cael ei osod gan eich gweinyddwr.}few{Bydd y ddyfais hon yn cael ei chadw am {YEARS} o flynyddoedd a gallwch gysylltu heb god y tro nesaf. Mae hyn yn cael ei osod gan eich gweinyddwr.}many{Bydd y ddyfais hon yn cael ei chadw am {YEARS} o flynyddoedd a gallwch gysylltu heb god y tro nesaf. Mae hyn yn cael ei osod gan eich gweinyddwr.}other{Bydd y ddyfais hon yn cael ei chadw am {YEARS} o flynyddoedd a gallwch gysylltu heb god y tro nesaf. Mae hyn yn cael ei osod gan eich gweinyddwr.}}</translation> +<translation id="2577446426265992344">heb Omniflwch</translation> <translation id="257779572837908839">Gosod fel Chromebox ar gyfer cyfarfodydd</translation> <translation id="2579309488038515659">Galluogi poethfan</translation> <translation id="2579596474754516455">Sganiwch luniau PDF i drosi testun ar gyfer darllenydd sgrîn pan fo angen</translation> @@ -6600,6 +6602,7 @@ <translation id="6787097042755590313">Tab Arall</translation> <translation id="6787839852456839824">Llwybrau byr bysellfwrdd</translation> <translation id="6788210894632713004">Wedi dadbacio'r estyniad</translation> +<translation id="678939393857169499">Yn galluogi'r dyluniad bwrdd gwaith newydd.</translation> <translation id="6789592661892473991">Hollti'n Llorweddol</translation> <translation id="6789834167207639931">Rhowch eich cyfrinair Cyfrif Google eto ar y sgrîn nesaf i orffen yr adferiad</translation> <translation id="6790428901817661496">Chwarae</translation> @@ -7397,6 +7400,7 @@ <translation id="7481312909269577407">Ymlaen</translation> <translation id="7481358317100446445">Yn barod</translation> <translation id="748138892655239008">Cyfyngiadau Sylfaenol Tystysgrif</translation> +<translation id="7483145199632798061">Chrome Refresh 2023</translation> <translation id="7484645889979462775">Byth ar gyfer y wefan hon</translation> <translation id="7487141338393529395">Troi Gwell Gwirio Sillafu ymlaen</translation> <translation id="7487969577036436319">Nid oes unrhyw gydrannau wedi'u gosod</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index 8e51003..8ac3049 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">Fanen er aktiv igen</translation> <translation id="1003088604756913841">Åbn linket i et nyt <ph name="APP" />-vindue</translation> <translation id="100323615638474026">USB-enhed (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Google Beskyttet browsing</translation> <translation id="1004218526896219317">Websiteadgang</translation> <translation id="1005274289863221750">Bruge din mikrofon og dit kamera</translation> <translation id="1005333234656240382">Vil du aktivere ADB-fejlretning?</translation> @@ -914,6 +915,7 @@ <translation id="1769104665586091481">Åbn link i nyt &vindue</translation> <translation id="1770407692401984718">Træk et billede hertil, eller</translation> <translation id="177053719077591686">Sikkerhedskopiér Android-apps til Google Drev.</translation> +<translation id="1771075623623424448">Leder du efter siden med browserens enhedslog? Gå til<ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="177336675152937177">Hostede appdata</translation> <translation id="1776712937009046120">Tilføj bruger</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> @@ -1700,6 +1702,15 @@ <translation id="2422125132043002186">Linux-gendannelsen blev annulleret</translation> <translation id="2423578206845792524">&Gem billede som...</translation> <translation id="2424424966051154874">{0,plural, =1{Gæst}one{Gæst (#)}other{Gæst (#)}}</translation> +<translation id="242684489663276773">Denne handling gør følgende: + <ph name="LINE_BREAKS" /> + • Nulstiller visse Chrome-indstillinger og Chrome-genveje + <ph name="LINE_BREAK" /> + • Deaktiverer udvidelser + <ph name="LINE_BREAK" /> + • Sletter cookies og andre midlertidige websitedata + <ph name="LINE_BREAKS" /> + Bogmærker, historik og gemte adgangskoder påvirkes ikke</translation> <translation id="2428510569851653187">Beskriv, hvad du foretog dig, da fanen gik ned</translation> <translation id="2428939361789119025">Deaktiver Wi-Fi</translation> <translation id="2428978615149723410">disse indkøbskurve</translation> @@ -4475,6 +4486,7 @@ <translation id="4876895919560854374">Låse skærmen/låse skærmen op</translation> <translation id="4877276003880815204">Inspect Elements (Undersøg elementer)</translation> <translation id="4877652723592270843">Vil du aktivere ChromeVox, som er den indbyggede skærmlæser til ChromeOS Flex? Hold begge lydstyrkeknapper nede i fem sekunder for at aktivere.</translation> +<translation id="4878261017150799673">Hold websitet aktivt</translation> <translation id="4878634973244289103">Din feedback kunne ikke indsendes. Prøv igen senere.</translation> <translation id="4878653975845355462">Tilpassede baggrunde er blevet deaktiveret af din administrator</translation> <translation id="4878718769565915065">Der blev ikke føjet et fingeraftryk til denne sikkerhedsnøgle</translation> @@ -5262,6 +5274,9 @@ <translation id="5602765853043467355">Ryd bogmærker, historik, adgangskoder osv. fra denne enhed</translation> <translation id="5605758115928394442">Der blev sendt en notifikation til din telefon til bekræftelse af din identitet.</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{Denne udvidelse er blokeret}one{Denne udvidelse er blokeret}other{Disse udvidelser er blokeret}}</translation> +<translation id="560743070587960985">Denne fil kan være en virus eller malware. + +Du kan sende den til Google for at tjekke, om den er usikker. Det tager normalt et par sekunder at scanne filer.</translation> <translation id="560834977503641186">Wi-Fi-synkronisering, Få flere oplysninger</translation> <translation id="5608580678041221894">Tryk på følgende taster for at tilpasse eller flytte beskæringsområdet</translation> <translation id="5609231933459083978">Applikationen ser ud til at være ugyldig.</translation> @@ -5999,6 +6014,7 @@ <translation id="6254892857036829079">Perfekt</translation> <translation id="6257602895346497974">Aktivér synkronisering...</translation> <translation id="62586649943626337">Organiser dine faner med fanegrupper</translation> +<translation id="6260092874648348841">Hold websitet aktivt</translation> <translation id="6262371516389954471">Dine backups uploades til Google og krypteres ved hjælp af adgangskoden til din Google-konto.</translation> <translation id="6263082573641595914">Version af Microsoft-nøglecenter</translation> <translation id="6263284346895336537">Ikke kritisk</translation> @@ -7538,6 +7554,7 @@ <translation id="7634280112532283638">Reducering af spam og svindel</translation> <translation id="7634337648687970851">Gendannelse af lokale data understøttes ikke i øjeblikket.</translation> <translation id="7634566076839829401">Noget gik galt. Prøv igen.</translation> +<translation id="763472884969134151">Analyse udført af <ph name="LINK" /></translation> <translation id="7635048370253485243">Fastgjort af din administrator</translation> <translation id="7635711411613274199">Om de annoncer, du ser på nettet, er personligt tilpasset, afhænger af denne indstilling, dvs. <ph name="BEGIN_LINK1" />Annonceemner<ph name="LINK_END1" />, dine <ph name="BEGIN_LINK2" />cookieindstillinger<ph name="LINK_END2" />, og om det website, du besøger, tilpasser annoncer</translation> <translation id="7636919061354591437">Installer på denne enhed</translation> @@ -8216,6 +8233,7 @@ <translation id="8195737548602430447">Oversæt automatisk undertekster til et målsprog.</translation> <translation id="8197673340773315084">Tilføj et navn eller en etiket, f.eks. Arbejde eller Privat</translation> <translation id="8198456017687137612">Caster fane</translation> +<translation id="8198457270656084773">Leder du efter siden med systemets enhedslog? Gå til<ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="8198511718495409170">Genindlæs denne side for at anvende dine opdaterede indstillinger for "<ph name="EXTENSION_NAME" />" på dette website</translation> <translation id="8199300056570174101">Egenskaber for netværkstjeneste og enhed</translation> <translation id="8200772114523450471">Genoptag</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index 1b6c895f..eb8ff70 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -528,6 +528,7 @@ <translation id="146000042969587795">This frame was blocked because it contains some insecure content.</translation> <translation id="1461041542809785877">Performance</translation> <translation id="1461177659295855031">Move to bookmarks bar folder</translation> +<translation id="1461288887896722288">You've just signed in to a managed account: creating a new managed profile will allow you to access some resources linked to that account.</translation> <translation id="146219525117638703">ONC State</translation> <translation id="146220085323579959">Internet disconnected. Please check your internet connection and try again.</translation> <translation id="1462850958694534228">Review icon update</translation> @@ -1892,6 +1893,7 @@ <translation id="2575407791320728464">Invalid URL. Make sure that it is formatted properly.</translation> <translation id="2575441894380764255">Not allowed to show intrusive or misleading ads</translation> <translation id="2575713839157415345">{YEARS,plural, =1{This device will be saved for one year and you can connect without a code next time. This is set by your administrator.}other{This device will be saved for {YEARS} years and you can connect without a code next time. This is set by your administrator.}}</translation> +<translation id="2577446426265992344">without Omnibox</translation> <translation id="257779572837908839">Set up as Chromebox for meetings</translation> <translation id="2579309488038515659">Hotspot enable</translation> <translation id="2579596474754516455">Scan PDF images to convert text for screen reader when necessary</translation> @@ -6589,6 +6591,7 @@ <translation id="6787097042755590313">Other Tab</translation> <translation id="6787839852456839824">Keyboard shortcuts</translation> <translation id="6788210894632713004">Unpacked extension</translation> +<translation id="678939393857169499">Enables the new desktop design.</translation> <translation id="6789592661892473991">Split horizontal</translation> <translation id="6789834167207639931">Enter your Google Account password again on the next screen to finish recovery</translation> <translation id="6790428901817661496">Play</translation> @@ -7386,6 +7389,7 @@ <translation id="7481312909269577407">Forward</translation> <translation id="7481358317100446445">Ready</translation> <translation id="748138892655239008">Certificate Basic Constraints</translation> +<translation id="7483145199632798061">Chrome refresh 2023</translation> <translation id="7484645889979462775">Never for this site</translation> <translation id="7487141338393529395">Turn on enhanced spell check</translation> <translation id="7487969577036436319">No components are installed</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index a4111462..cef0a9b 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">Se volvió a activar la pestaña</translation> <translation id="1003088604756913841">Abrir vínculo en una ventana nueva de <ph name="APP" /></translation> <translation id="100323615638474026">Dispositivo USB (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Navegación segura de Google</translation> <translation id="1004218526896219317">Acceso al sitio</translation> <translation id="1005274289863221750">Usar tu micrófono y tu cámara</translation> <translation id="1005333234656240382">¿Quieres habilitar la depuración de adb?</translation> @@ -524,6 +525,7 @@ <translation id="146000042969587795">Este marco se ha bloqueado porque incluye contenido no seguro.</translation> <translation id="1461041542809785877">Rendimiento</translation> <translation id="1461177659295855031">Mover a la carpeta Barra de favoritos</translation> +<translation id="1461288887896722288">Acabas de acceder a una cuenta administrada. Si creas un nuevo perfil administrado, podrás acceder a algunos recursos vinculados a esa cuenta.</translation> <translation id="146219525117638703">Estado de ONC</translation> <translation id="146220085323579959">Internet está desconectada. Verifica tu conexión a Internet y vuelve a intentarlo.</translation> <translation id="1462850958694534228">Revisar actualización del ícono</translation> @@ -898,6 +900,7 @@ <translation id="1769104665586091481">Abrir vínculo en una ventana &nueva</translation> <translation id="1770407692401984718">Arrastra una imagen hasta aquí o</translation> <translation id="177053719077591686">Crea copias de seguridad de las apps para Android en Google Drive.</translation> +<translation id="1771075623623424448">¿Buscas la página de registro de dispositivo del navegador? Visita <ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="177336675152937177">Datos de aplicaciones alojadas</translation> <translation id="1776712937009046120">Agregar usuario</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> @@ -1680,6 +1683,15 @@ <translation id="2422125132043002186">Se canceló la restauración de Linux</translation> <translation id="2423578206845792524">Guar&dar imagen como...</translation> <translation id="2424424966051154874">{0,plural, =1{Invitado}other{Invitado (#)}}</translation> +<translation id="242684489663276773">Si realizas esta acción, sucederá lo siguiente: + <ph name="LINE_BREAKS" /> + • Se restablecerá parte de la configuración y los accesos directos de Chrome. + <ph name="LINE_BREAK" /> + • Se inhabilitarán las extensiones. + <ph name="LINE_BREAK" /> + • Se borrarán las cookies y otros datos temporales de sitios. + <ph name="LINE_BREAKS" /> + Esta acción no afectará los favoritos, el historial ni las contraseñas guardadas.</translation> <translation id="2428510569851653187">Describir lo que estabas haciendo cuando se bloqueó la pestaña</translation> <translation id="2428939361789119025">Desactivar Wi-Fi</translation> <translation id="2428978615149723410">estos carritos</translation> @@ -1863,6 +1875,7 @@ <translation id="2575407791320728464">La URL no es válida. Asegúrate de que esté en el formato correcto.</translation> <translation id="2575441894380764255">No puede mostrar anuncios intrusivos o engañosos</translation> <translation id="2575713839157415345">{YEARS,plural, =1{Este dispositivo se guardará por 1 año y no necesitarás un código la próxima vez que te conectes. Esto lo estableció el administrador.}other{Este dispositivo se guardará por {YEARS} años y no necesitarás un código la próxima vez que te conectes. Esto lo estableció el administrador.}}</translation> +<translation id="2577446426265992344">sin cuadro multifunción</translation> <translation id="257779572837908839">Configurar como Chromebox para reuniones</translation> <translation id="2579309488038515659">Habilitación de hotspot</translation> <translation id="2579596474754516455">Escanea imágenes de PDF a fin de convertir el texto para el lector de pantalla cuando sea necesario.</translation> @@ -2533,7 +2546,7 @@ <translation id="3160928651883997588">Preferencias de VPN</translation> <translation id="3161522574479303604">Todos los idiomas</translation> <translation id="3162853326462195145">Cuenta de una institución educativa</translation> -<translation id="3162899666601560689">Los sitios pueden usar cookies para mejorar la experiencia de navegación, por ejemplo, para mantener el acceso a ellos o recordar elementos del carrito de compras.</translation> +<translation id="3162899666601560689">Los sitios pueden usar cookies para mejorar la experiencia de navegación, por ejemplo, para mantener el acceso a ellos o recordar artículos del carrito de compras.</translation> <translation id="3163201441334626963">Producto desconocido <ph name="PRODUCT_ID" /> del proveedor <ph name="VENDOR_ID" /></translation> <translation id="3163511056918491211">Cambia de dispositivo o restablece tus datos fácilmente en cualquier momento. Las copias de seguridad se suben a Google y se encriptan con la contraseña de tu Cuenta de Google.</translation> <translation id="3164329792803560526">Compartiendo esta pestaña en <ph name="APP_NAME" /></translation> @@ -4453,6 +4466,7 @@ <translation id="4876895919560854374">Bloquear y desbloquear la pantalla</translation> <translation id="4877276003880815204">Analizar elementos</translation> <translation id="4877652723592270843">¿Deseas activar ChromeVox, el lector de pantalla integrado de Chrome OS Flex? En ese caso, mantén presionadas ambas teclas de volumen durante cinco segundos.</translation> +<translation id="4878261017150799673">Mantener el sitio activo</translation> <translation id="4878634973244289103">No se pueden enviar los comentarios. Vuelve a intentarlo más tarde.</translation> <translation id="4878653975845355462">El administrador desactivó los fondos personalizados</translation> <translation id="4878718769565915065">No se pudo agregar una huella dactilar en esta llave de seguridad</translation> @@ -5240,6 +5254,9 @@ <translation id="5602765853043467355">Borrar favoritos, historial, contraseñas y otras opciones de configuración de este dispositivo</translation> <translation id="5605758115928394442">Se envió una notificación a tu teléfono para confirmar que eres tú</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{Se bloqueó esta extensión}other{Se bloquearon estas extensiones}}</translation> +<translation id="560743070587960985">Este archivo puede ser un virus o software malicioso. + +Puedes enviarlo a Google para comprobar que sea seguro. Los análisis suelen tardar unos segundos.</translation> <translation id="560834977503641186">Sincronización Wi-Fi, Más información</translation> <translation id="5608580678041221894">Presionar las siguientes teclas para ajustar o mover el área recortada</translation> <translation id="5609231933459083978">Parece que la aplicación no es válida.</translation> @@ -5977,6 +5994,7 @@ <translation id="6254892857036829079">Perfecta</translation> <translation id="6257602895346497974">Activar la sincronización…</translation> <translation id="62586649943626337">Organiza tus pestañas con los grupos de pestañas</translation> +<translation id="6260092874648348841">Mantener el sitio activo</translation> <translation id="6262371516389954471">Se suben las copias de seguridad a Google y se encriptan con la contraseña de tu Cuenta de Google.</translation> <translation id="6263082573641595914">Versión de entidad de certificación de Microsoft</translation> <translation id="6263284346895336537">No crítico</translation> @@ -6554,6 +6572,7 @@ <translation id="6787097042755590313">Otra pestaña</translation> <translation id="6787839852456839824">Accesos directos</translation> <translation id="6788210894632713004">Extensión sin empaquetar</translation> +<translation id="678939393857169499">Permite habilitar el nuevo diseño de escritorio.</translation> <translation id="6789592661892473991">División horizontal</translation> <translation id="6789834167207639931">Vuelve a ingresar la contraseña de tu Cuenta de Google en la siguiente pantalla para finalizar la recuperación</translation> <translation id="6790428901817661496">Reproducir</translation> @@ -7351,6 +7370,7 @@ <translation id="7481312909269577407">Adelante</translation> <translation id="7481358317100446445">Listo</translation> <translation id="748138892655239008">Restricciones básicas del certificado</translation> +<translation id="7483145199632798061">Actualización de 2023 para Chrome</translation> <translation id="7484645889979462775">Jamás para este sitio</translation> <translation id="7487141338393529395">Activa el corrector ortográfico mejorado</translation> <translation id="7487969577036436319">No hay componentes instalados.</translation> @@ -7403,7 +7423,7 @@ <translation id="7531779363494549572">Ve a Configuración > Apps y notificaciones > Notificaciones.</translation> <translation id="7532009420053991888"><ph name="LINUX_APP_NAME" /> no responde. Selecciona "Forzar cierre" para cerrar la app.</translation> <translation id="7535730537657706072">Para borrar del dispositivo el historial de navegación en modo Incógnito, cierra todas las pestañas de incógnito.</translation> -<translation id="7537451260744431038">Los sitios no pueden usar cookies para mejorar la experiencia de navegación, por ejemplo, para mantener el acceso a ellos o recordar elementos del carrito de compras.</translation> +<translation id="7537451260744431038">Los sitios no pueden usar cookies para mejorar la experiencia de navegación, por ejemplo, para mantener el acceso a ellos o recordar artículos del carrito de compras.</translation> <translation id="7538088324298143359">Buscar en la imagen con <ph name="SEARCH_ENGINE" /></translation> <translation id="7540972813190816353">Se produjo un error al buscar actualizaciones: <ph name="ERROR" /></translation> <translation id="7541076351905098232"><ph name="MANAGER" /> revirtió este dispositivo a una versión anterior. Guarda los archivos importantes y, luego, reinicia el sistema. Se borrarán todos los datos del dispositivo.</translation> @@ -7512,6 +7532,7 @@ <translation id="7634280112532283638">Reducción de spam y fraude</translation> <translation id="7634337648687970851">Por el momento, no se admite la recuperación de datos locales.</translation> <translation id="7634566076839829401">Se produjo un error. Vuelve a intentarlo.</translation> +<translation id="763472884969134151"><ph name="LINK" /> realizó el análisis</translation> <translation id="7635048370253485243">Fijado por tu administrador</translation> <translation id="7635711411613274199">Mientras navegas, la personalización de un anuncio que ves depende de este parámetro de configuración, los <ph name="BEGIN_LINK1" />temas de los anuncios<ph name="LINK_END1" />, tu <ph name="BEGIN_LINK2" />configuración de cookies<ph name="LINK_END2" /> y si el sitio que estás viendo personaliza los anuncios.</translation> <translation id="7636919061354591437">Instalar en este dispositivo</translation> @@ -8191,6 +8212,7 @@ <translation id="8195737548602430447">Traduce subtítulos a un idioma de destino de forma automática.</translation> <translation id="8197673340773315084">Agrega un nombre o etiqueta, como "Trabajo"</translation> <translation id="8198456017687137612">Pestaña de transmisión</translation> +<translation id="8198457270656084773">¿Buscas la página de registro de dispositivo del sistema? Visita <ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="8198511718495409170">Para aplicar la configuración actualizada de "<ph name="EXTENSION_NAME" />" en este sitio, vuelve a cargar la página</translation> <translation id="8199300056570174101">Propiedades de la red (servicio) y del dispositivo</translation> <translation id="8200772114523450471">Reanudar</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index 6fe6495..c456365 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">Pestaña activa de nuevo</translation> <translation id="1003088604756913841">Abrir enlace en una ventana nueva de <ph name="APP" /></translation> <translation id="100323615638474026">Dispositivo USB (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Navegación segura de Google</translation> <translation id="1004218526896219317">Acceso al sitio web</translation> <translation id="1005274289863221750">Utilizar el micrófono y la cámara</translation> <translation id="1005333234656240382">¿Quieres habilitar la depuración ADB?</translation> @@ -902,6 +903,7 @@ <translation id="1769104665586091481">Abrir enlace en una &ventana nueva</translation> <translation id="1770407692401984718">Arrastra una imagen aquí o</translation> <translation id="177053719077591686">Haz una copia de seguridad de las aplicaciones Android en Google Drive.</translation> +<translation id="1771075623623424448">¿Buscas la página de registro de dispositivos del navegador? Accede a <ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="177336675152937177">Datos de aplicaciones alojadas</translation> <translation id="1776712937009046120">Añadir usuario</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> @@ -1685,6 +1687,15 @@ <translation id="2422125132043002186">Restauración de Linux cancelada</translation> <translation id="2423578206845792524">Guar&dar imagen como...</translation> <translation id="2424424966051154874">{0,plural, =1{Invitado}other{Invitado (#)}}</translation> +<translation id="242684489663276773">Al realizar esta acción: + <ph name="LINE_BREAKS" /> + • Se restablecerán algunos ajustes y combinaciones de teclas de Chrome + <ph name="LINE_BREAK" /> + • Se inhabilitarán las extensiones + <ph name="LINE_BREAK" /> + • Se eliminarán las cookies y otros datos temporales de sitios + <ph name="LINE_BREAKS" /> + Los marcadores, el historial y las contraseñas guardadas no se verán afectados.</translation> <translation id="2428510569851653187">Describe qué estabas haciendo cuando la pestaña se bloqueó</translation> <translation id="2428939361789119025">Desactivar Wi‑Fi</translation> <translation id="2428978615149723410">estos carritos</translation> @@ -4458,6 +4469,7 @@ <translation id="4876895919560854374">Bloquear y desbloquear la pantalla</translation> <translation id="4877276003880815204">Inspeccionar elementos</translation> <translation id="4877652723592270843">¿Quieres activar ChromeVox, el lector de pantalla integrado de ChromeOS Flex? Si es así, mantén pulsadas las dos teclas de volumen durante cinco segundos.</translation> +<translation id="4878261017150799673">Mantener el sitio activo</translation> <translation id="4878634973244289103">No se pueden enviar los comentarios. Vuelve a intentarlo más tarde.</translation> <translation id="4878653975845355462">El administrador ha desactivado los fondos personalizados</translation> <translation id="4878718769565915065">No se ha podido añadir una huella digital a esta llave de seguridad</translation> @@ -5245,6 +5257,9 @@ <translation id="5602765853043467355">Borrar marcadores, historial, contraseñas, etc. de este dispositivo</translation> <translation id="5605758115928394442">Se ha enviado una notificación a tu teléfono para confirmar que eres tú.</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{Esta extensión está bloqueada}other{Estas extensiones están bloqueadas}}</translation> +<translation id="560743070587960985">Este archivo podría ser un virus o malware. + +Puedes enviarlo a Google para comprobar si no es seguro. Los análisis suelen tardar unos segundos.</translation> <translation id="560834977503641186">Más información sobre Sincronización Wi‑Fi</translation> <translation id="5608580678041221894">Toca las siguientes teclas para ajustar o mover la zona para recortar</translation> <translation id="5609231933459083978">Parece que la aplicación no es válida.</translation> @@ -5982,6 +5997,7 @@ <translation id="6254892857036829079">Perfecta</translation> <translation id="6257602895346497974">Activar sincronización...</translation> <translation id="62586649943626337">Organiza tus pestañas con los grupos de pestañas</translation> +<translation id="6260092874648348841">Mantener el sitio activo</translation> <translation id="6262371516389954471">Tus copias de seguridad se suben a Google y se cifran con la contraseña de tu cuenta de Google.</translation> <translation id="6263082573641595914">Versión de entidad emisora de certificados de Microsoft</translation> <translation id="6263284346895336537">No crítica</translation> @@ -7519,6 +7535,7 @@ <translation id="7634280112532283638">Reducción del spam y el fraude</translation> <translation id="7634337648687970851">Actualmente no se admite la recuperación de datos locales.</translation> <translation id="7634566076839829401">Se ha producido un error. Vuelve a intentarlo.</translation> +<translation id="763472884969134151">Análisis realizado por <ph name="LINK" /></translation> <translation id="7635048370253485243">Fijada por tu administrador</translation> <translation id="7635711411613274199">Mientras navegas, la personalización de los anuncios que ves depende de esta opción, de los <ph name="BEGIN_LINK1" />temas de anuncios<ph name="LINK_END1" />, de la <ph name="BEGIN_LINK2" />configuración de las cookies<ph name="LINK_END2" /> y de si el sitio que estás viendo personaliza los anuncios.</translation> <translation id="7636919061354591437">Instalar en este dispositivo</translation> @@ -8198,6 +8215,7 @@ <translation id="8195737548602430447">Traduce automáticamente los subtítulos a un idioma de destino.</translation> <translation id="8197673340773315084">Añade un nombre o una etiqueta, como Trabajo</translation> <translation id="8198456017687137612">Enviando pestaña</translation> +<translation id="8198457270656084773">¿Buscas la página de registro de dispositivos del sistema? Accede a <ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="8198511718495409170">Para aplicar la configuración actualizada de "<ph name="EXTENSION_NAME" />" a este sitio, vuelve a cargar esta página</translation> <translation id="8199300056570174101">Propiedades de los dispositivos y las redes (servicio)</translation> <translation id="8200772114523450471">Reanudar</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb index 38ef548..8dc8717 100644 --- a/chrome/app/resources/generated_resources_eu.xtb +++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -525,6 +525,7 @@ <translation id="146000042969587795">Markoa blokeatu da segurua ez den edukia duelako.</translation> <translation id="1461041542809785877">Errendimendua</translation> <translation id="1461177659295855031">Eraman laster-marken barraren karpetara</translation> +<translation id="1461288887896722288">Kontu kudeatu batean saioa hasi berri duzu. Profil kudeatu bat sortuz gero, kontu horretara lotutako baliabide batzuk erabili ahal izango dituzu.</translation> <translation id="146219525117638703">ONC egoera</translation> <translation id="146220085323579959">Internet deskonektatuta dago. Egiaztatu Internetera konektatuta zaudela eta saiatu berriro.</translation> <translation id="1462850958694534228">Berrikusi aldatutako ikonoa</translation> @@ -1877,6 +1878,7 @@ <translation id="2575407791320728464">URLak ez du balio. Ziurtatu formatu zuzena duela.</translation> <translation id="2575441894380764255">Ezin dituzte erakutsi iragarki oztopatzaileak edo iruzurrezkoak</translation> <translation id="2575713839157415345">{YEARS,plural, =1{Gailua urtebetez gordeko da; hurrengoan, koderik erabili gabe konektatu ahal izango zara. Administratzaileak ezarri du arau hori.}other{Gailua {YEARS} urtez gordeko da; hurrengoan, koderik erabili gabe konektatu ahal izango zara. Administratzaileak ezarri du arau hori.}}</translation> +<translation id="2577446426265992344">arakatzaileko barrarik gabe</translation> <translation id="257779572837908839">Konfiguratu bileretarako Chromebox gisa</translation> <translation id="2579309488038515659">Gaitu wifi-gunea</translation> <translation id="2579596474754516455">Eskaneatu PDF irudiak pantaila-irakurgailuetarako testu bihurtzeko beharrezkoa denean</translation> @@ -4090,7 +4092,7 @@ <translation id="4538417792467843292">Ezabatu hitza</translation> <translation id="4538792345715658285">Enpresaren gidalerroen arabera instalatuta.</translation> <translation id="4541123282641193691">Ezin izan da egiaztatu kontua. Saiatu berriro edo berrabiarazi Chromebook-a.</translation> -<translation id="4541662893742891060">Ezin da konektatu profil honetara. Laguntza teknikoa eskuratzeko, jarri harremanetan operadorearekin.</translation> +<translation id="4541662893742891060">Ezin da konektatu profil honetara. Laguntza teknikoa eskuratzeko, jarri operadorearekin harremanetan.</translation> <translation id="4541706525461326392">Profila kentzen. Agian minutu batzuk beharko dira.</translation> <translation id="4542332958571335077">{NUM_PASSWORDS,plural, =1{Gailuko pasahitz bat Google-ren Pasahitz-kudeatzailea zerbitzura inportatu da}other{Gailuko {NUM_PASSWORDS} pasahitz Google-ren Pasahitz-kudeatzailea zerbitzura inportatu dira}}</translation> <translation id="4542520061254486227">Irakurri <ph name="WEBSITE_1" /> eta <ph name="WEBSITE_2" /> webguneetan dituzun datuak</translation> @@ -6046,7 +6048,7 @@ <translation id="6309443618838462258">Administratzaileak ez du onartzen idazketa-metodo hau</translation> <translation id="630948338437014525">oroitzapenak</translation> <translation id="6309510305002439352">Mikrofonoa erabiltzeko baimena desaktibatuta dago</translation> -<translation id="6310141306111263820">Ezin izan da instalatu eSIMaren profila. Laguntza eskuratzeko, jarri harremanetan operadorearekin.</translation> +<translation id="6310141306111263820">Ezin izan da instalatu eSIMaren profila. Laguntza eskuratzeko, jarri operadorearekin harremanetan.</translation> <translation id="6311220991371174222">Ezin da Chrome abiarazi arazoren bat izan delako profila irekitzean. Berrabiarazi Chrome.</translation> <translation id="6312567056350025599">{NUM_DAYS,plural, =1{Atzo egin zen segurtasun-egiaztapena}other{Duela {NUM_DAYS} egun egin zen segurtasun-egiaztapena}}</translation> <translation id="6312638141433622592">Eskaini artikuluak irakurgailu moduan erakusteko aukera, halakorik onartzen bada</translation> @@ -6570,6 +6572,7 @@ <translation id="6787097042755590313">Beste fitxa bat</translation> <translation id="6787839852456839824">Laster-teklak</translation> <translation id="6788210894632713004">Paketetik ateratako luzapena</translation> +<translation id="678939393857169499">Mahaigainaren diseinu berria gaitzen du.</translation> <translation id="6789592661892473991">Zatitu horizontalki</translation> <translation id="6789834167207639931">Berreskuratze-prozesua amaitzeko, idatzi berriro Google-ko kontuko pasahitza</translation> <translation id="6790428901817661496">Erreproduzitu</translation> @@ -7366,6 +7369,7 @@ <translation id="7481312909269577407">Aurrera</translation> <translation id="7481358317100446445">Prest</translation> <translation id="748138892655239008">Oinarrizko murriztapenen ziurtagiria</translation> +<translation id="7483145199632798061">Chrome Refresh 2023</translation> <translation id="7484645889979462775">Inoiz ez webgune honetan</translation> <translation id="7487141338393529395">Aktibatu ortografia-zuzentzaile hobetua</translation> <translation id="7487969577036436319">Ez dago osagairik instalatuta</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index abb5a1c..365b3da 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -529,6 +529,7 @@ <translation id="146000042969587795">این قاب مسدود شد چون شامل چند محتوای ناامن است.</translation> <translation id="1461041542809785877">کارآیی</translation> <translation id="1461177659295855031">رفتن به پوشه «نوار نشانکها»</translation> +<translation id="1461288887896722288">بهتازگی به سیستم حساب مدیریتشدهای وارد شدهاید که با ایجاد نمایه مدیریتشده جدید به شما امکان میدهد به برخیاز منابع پیوندشده با آن حساب دسترسی داشته باشید.</translation> <translation id="146219525117638703">وضعیت ONC</translation> <translation id="146220085323579959">اتصال اینترنت قطع شد. لطفاً اتصال اینترنت خود را بررسی کنید و دوباره سعی کنید.</translation> <translation id="1462850958694534228">مرور بهروزرسانی نماد</translation> @@ -1889,6 +1890,7 @@ <translation id="2575407791320728464">نشانی وب نامعتبر است. مطمئن شوید قالببندی درستی داشته باشد.</translation> <translation id="2575441894380764255">اجازه ندارد آگهیهای مزاحم یا گمراهکننده نشان دهد</translation> <translation id="2575713839157415345">{YEARS,plural, =1{این دستگاه بهمدت یک سال ذخیره خواهد شد و دفعه بعد میتوانید بدون کد متصل شوید. سرپرستتان این مورد را تنظیم کرده است.}one{این دستگاه بهمدت {YEARS} سال ذخیره خواهد شد و دفعه بعد میتوانید بدون کد متصل شوید. سرپرستتان این مورد را تنظیم کرده است.}other{این دستگاه بهمدت {YEARS} سال ذخیره خواهد شد و دفعه بعد میتوانید بدون کد متصل شوید. سرپرستتان این مورد را تنظیم کرده است.}}</translation> +<translation id="2577446426265992344">بدون Omnibox</translation> <translation id="257779572837908839">راهاندازی بهعنوان Chromebox برای جلسات</translation> <translation id="2579309488038515659">نقطه اتصال فعال شد</translation> <translation id="2579596474754516455">تصاویر PDF را اسکن کنید تا درصورت لزوم بتوانید نوشتار را برای صفحهخوان تبدیل کنید</translation> @@ -6588,6 +6590,7 @@ <translation id="6787097042755590313">برگه دیگر</translation> <translation id="6787839852456839824">میانبرهای صفحهکلید</translation> <translation id="6788210894632713004">افزونه غیر فشرده</translation> +<translation id="678939393857169499">طراحی میز کار جدید را فعال میکند.</translation> <translation id="6789592661892473991">تقسیم افقی</translation> <translation id="6789834167207639931">برای تکمیل بازیابی، گذرواژه «حساب Google» خود را دوباره در صفحه بعدی وارد کنید.</translation> <translation id="6790428901817661496">پخش</translation> @@ -7385,6 +7388,7 @@ <translation id="7481312909269577407">ارسال کردن</translation> <translation id="7481358317100446445">آماده</translation> <translation id="748138892655239008">محدودیتهای اصلی گواهی</translation> +<translation id="7483145199632798061">بازآوری Chrome - ۲۰۲۳</translation> <translation id="7484645889979462775">هرگز برای این سایت</translation> <translation id="7487141338393529395">روشن کردن غلطگیر املای بهبودیافته</translation> <translation id="7487969577036436319">هیچ مؤلفهای نصب نشده است</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index 7d3ab2b..7f4fc37 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -528,6 +528,7 @@ <translation id="146000042969587795">Kehys estettiin, koska se sisältää suojaamatonta sisältöä.</translation> <translation id="1461041542809785877">Suorituskyky</translation> <translation id="1461177659295855031">Siirrä Kirjanmerkkipalkki-kansioon</translation> +<translation id="1461288887896722288">Kirjauduit juuri hallinnoidulle tilille. Uuden tilin luominen antaa sinulle pääsyn joihinkin tilille linkitettyihin materiaaleihin.</translation> <translation id="146219525117638703">ONC-tila</translation> <translation id="146220085323579959">Internetyhteys katkaistu. Tarkista internetyhteytesi ja yritä uudelleen.</translation> <translation id="1462850958694534228">Katso kuvakkeen muutos</translation> @@ -1891,6 +1892,7 @@ <translation id="2575407791320728464">Virheellinen URL-osoite. Varmista, että se on muotoiltu oikein.</translation> <translation id="2575441894380764255">Häiritsevien tai harhaanjohtavien mainosten näyttäminen kielletty</translation> <translation id="2575713839157415345">{YEARS,plural, =1{Laite tallennetaan vuodeksi, ja seuraavalla kerralla voit luoda yhteyden ilman koodia. Järjestelmänvalvoja asettaa sen.}other{Laite tallennetaan {YEARS} vuodeksi, ja seuraavalla kerralla voit luoda yhteyden ilman koodia. Järjestelmänvalvoja asettaa sen.}}</translation> +<translation id="2577446426265992344">ilman Omniboxia</translation> <translation id="257779572837908839">Määritä Chromebox kokouksille ‑tilaan</translation> <translation id="2579309488038515659">Hotspot käytössä</translation> <translation id="2579596474754516455">Skannaa PDF-kuvia ja muunna teksti tarvittaessa näytönlukuohjelmille sopivaksi</translation> @@ -6585,6 +6587,7 @@ <translation id="6787097042755590313">Muu välilehti</translation> <translation id="6787839852456839824">Pikanäppäimet</translation> <translation id="6788210894632713004">Pakkaamaton laajennus</translation> +<translation id="678939393857169499">Ottaa käyttöön uuden työpöydän ulkoasun.</translation> <translation id="6789592661892473991">Vaakasuuntainen jako</translation> <translation id="6789834167207639931">Viimeistele palautus lisäämällä Google-tilisi salasana uudelleen seuraavalla näytöllä</translation> <translation id="6790428901817661496">Toista</translation> @@ -7382,6 +7385,7 @@ <translation id="7481312909269577407">Seuraava</translation> <translation id="7481358317100446445">Valmis</translation> <translation id="748138892655239008">Varmenteen perusrajoitukset</translation> +<translation id="7483145199632798061">2023 Chrome-päivitys</translation> <translation id="7484645889979462775">Ei koskaan tälle sivustolle</translation> <translation id="7487141338393529395">Ota käyttöön parannettu oikeinkirjoituksen tarkistus</translation> <translation id="7487969577036436319">Ei asennettuja osia</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb index e327e72..2056057c 100644 --- a/chrome/app/resources/generated_resources_fr-CA.xtb +++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">Onglet à nouveau actif</translation> <translation id="1003088604756913841">Ouvrir le lien dans une nouvelle fenêtre <ph name="APP" /></translation> <translation id="100323615638474026">Appareil USB (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">navigation sécurisée Google</translation> <translation id="1004218526896219317">Accès au site</translation> <translation id="1005274289863221750">Utiliser votre microphone et votre caméra</translation> <translation id="1005333234656240382">Activer le débogage PDA?</translation> @@ -523,6 +524,7 @@ <translation id="146000042969587795">Ce cadre a été bloqué, car il contient des éléments non sécurisés.</translation> <translation id="1461041542809785877">Performance</translation> <translation id="1461177659295855031">Déplacer vers le dossier de la barre de favoris</translation> +<translation id="1461288887896722288">Vous venez de vous connecter à un compte géré. La création d'un nouveau profil géré vous permettra d'accéder à certaines ressources liées à ce compte.</translation> <translation id="146219525117638703">État ONC</translation> <translation id="146220085323579959">Aucune connexion à Internet. Veuillez vérifier votre connexion, puis réessayer.</translation> <translation id="1462850958694534228">Vérifier la mise à jour de l'icône</translation> @@ -900,6 +902,7 @@ <translation id="1769104665586091481">Ouvrir le lien dans une nouvelle &fenêtre</translation> <translation id="1770407692401984718">Faire glisser une image ici ou</translation> <translation id="177053719077591686">Sauvegarder les applications Android sur Google Disque.</translation> +<translation id="1771075623623424448">Vous recherchez la page de journal de l'appareil du navigateur? Consultez<ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="177336675152937177">Données d'application hébergée</translation> <translation id="1776712937009046120">Ajouter un utilisateur</translation> <translation id="1776883657531386793"><ph name="OID" /> : <ph name="INFO" /></translation> @@ -1679,6 +1682,15 @@ <translation id="2422125132043002186">Restauration Linux annulée</translation> <translation id="2423578206845792524">En&registrer l'image sous...</translation> <translation id="2424424966051154874">{0,plural, =1{Fenêtre d'invité}one{Fenêtre d'invité (#)}other{Fenêtres d'invité (#)}}</translation> +<translation id="242684489663276773">Cette action va : + <ph name="LINE_BREAKS" /> + Réinitialiser les paramètres et les raccourcis de Chrome + <ph name="LINE_BREAK" /> + Désactiver les extensions + <ph name="LINE_BREAK" /> + Supprimer les témoins et d'autres données temporaires relatives aux sites + <ph name="LINE_BREAKS" /> + Les signets, l'historique et les mots de passe enregistrés ne seront pas touchés.</translation> <translation id="2428510569851653187">Décrivez ce que vous faisiez lorsque l'onglet a planté</translation> <translation id="2428939361789119025">Désactiver le Wi-Fi</translation> <translation id="2428978615149723410">ces paniers</translation> @@ -1863,6 +1875,7 @@ <translation id="2575407791320728464">URL incorrecte. Assurez-vous qu'elle est correctement formatée.</translation> <translation id="2575441894380764255">Non autorisés à afficher des annonces intrusives ou trompeuses</translation> <translation id="2575713839157415345">{YEARS,plural, =1{Cet appareil sera mémorisé pendant 1 an, et vous pourrez vous connecter sans code la prochaine fois. Ce paramètre est défini par votre administrateur.}one{Cet appareil sera mémorisé pendant {YEARS} an, et vous pourrez vous connecter sans code la prochaine fois. Ce paramètre est défini par votre administrateur.}other{Cet appareil sera mémorisé pendant {YEARS} ans, et vous pourrez vous connecter sans code la prochaine fois. Ce paramètre est défini par votre administrateur.}}</translation> +<translation id="2577446426265992344">sans Omnibox</translation> <translation id="257779572837908839">Configurer en tant que Chromebox pour les réunions</translation> <translation id="2579309488038515659">Activer le point d'accès sans fil</translation> <translation id="2579596474754516455">Numérisez des images PDF pour convertir du texte destiné au lecteur d'écran au besoin</translation> @@ -4432,6 +4445,7 @@ <translation id="4876895919560854374">Verrouiller et déverrouiller l'écran</translation> <translation id="4877276003880815204">Inspecter des éléments</translation> <translation id="4877652723592270843">Voulez-vous activer ChromeVox, le lecteur d'écran intégré de Chrome OS Flex? Le cas échéant, maintenez les deux touches de volume enfoncées pendant cinq secondes.</translation> +<translation id="4878261017150799673">Gardez le site actif</translation> <translation id="4878634973244289103">Impossible d'envoyer les commentaires. Veuillez réessayer plus tard.</translation> <translation id="4878653975845355462">Les arrière-plans personnalisés ont été désactivés par votre administrateur</translation> <translation id="4878718769565915065">L'ajout d'une empreinte digitale à cette clé de sécurité a échoué</translation> @@ -5216,6 +5230,9 @@ <translation id="5602765853043467355">Effacer les favoris, l'historique, les mots de passe et autres de cet appareil</translation> <translation id="5605758115928394442">Nous avons envoyé une notification à votre téléphone pour confirmer votre identité.</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{Cette extension est bloquée}one{Cette extension est bloquée}other{Ces extensions sont bloquées}}</translation> +<translation id="560743070587960985">Ce fichier peut être un virus ou un logiciel malveillant. + +Vous pouvez l'envoyer à Google pour vérifier s'il est dangereux. Les analyses prennent généralement quelques secondes.</translation> <translation id="560834977503641186">Synchronisation Wi-Fi, en savoir plus</translation> <translation id="5608580678041221894">Touchez les touches suivantes pour ajuster ou déplacer la zone de recadrage</translation> <translation id="5609231933459083978">L'application ne semble pas valide.</translation> @@ -5951,6 +5968,7 @@ <translation id="6254892857036829079">Parfaite</translation> <translation id="6257602895346497974">Activer la synchronisation…</translation> <translation id="62586649943626337">Organisez vos onglets avec des groupes d'onglets</translation> +<translation id="6260092874648348841">Gardez le site actif</translation> <translation id="6262371516389954471">Vos sauvegardes sont téléversées vers les serveurs de Google et sont chiffrées en utilisant le mot de passe de votre compte Google.</translation> <translation id="6263082573641595914">Version de l'autorité de certification Microsoft</translation> <translation id="6263284346895336537">Non essentielle</translation> @@ -6529,6 +6547,7 @@ <translation id="6787097042755590313">Autre onglet</translation> <translation id="6787839852456839824">Raccourcis clavier</translation> <translation id="6788210894632713004">Extension non compressée</translation> +<translation id="678939393857169499">Active la nouvelle conception du bureau.</translation> <translation id="6789592661892473991">Séparation horizontale</translation> <translation id="6789834167207639931">Entrez à nouveau le mot de passe de votre compte Google sur l'écran suivant afin de terminer la récupération</translation> <translation id="6790428901817661496">Jouer</translation> @@ -7318,6 +7337,7 @@ <translation id="7481312909269577407">Suivant</translation> <translation id="7481358317100446445">Prêt</translation> <translation id="748138892655239008">Contraintes de base du certificat</translation> +<translation id="7483145199632798061">Actualisation Chrome 2023</translation> <translation id="7484645889979462775">Jamais pour ce site</translation> <translation id="7487141338393529395">Activer le correcteur orthographique amélioré</translation> <translation id="7487969577036436319">Aucun composant installé</translation> @@ -7479,6 +7499,7 @@ <translation id="7634280112532283638">Réduction des pourriels et de la fraude</translation> <translation id="7634337648687970851">La récupération de données locales n'est actuellement pas prise en charge.</translation> <translation id="7634566076839829401">Une erreur s'est produite. Veuillez réessayer.</translation> +<translation id="763472884969134151">Analyse effectuée par <ph name="LINK" /></translation> <translation id="7635048370253485243">Épinglée par votre administrateur</translation> <translation id="7635711411613274199">Lorsque vous naviguez, la personnalisation d’une annonce dépend de ce paramètre, du <ph name="BEGIN_LINK1" />sujet des annonces<ph name="LINK_END1" />, des <ph name="BEGIN_LINK2" />paramètres des témoins<ph name="LINK_END2" />, et du fait que le site que vous consultez personnalise les annonces</translation> <translation id="7636919061354591437">Installer sur cet appareil</translation> @@ -8154,6 +8175,7 @@ <translation id="8195737548602430447">Traduisez automatiquement les sous-titres dans une langue cible.</translation> <translation id="8197673340773315084">Ajoutez un nom ou une étiquette, comme Travail ou Personnel</translation> <translation id="8198456017687137612">Diffusion de l'onglet en cours…</translation> +<translation id="8198457270656084773">Vous recherchez la page du journal de l'appareil du système? Consultez<ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="8198511718495409170">Pour appliquer vos paramètres mis à jour pour « <ph name="EXTENSION_NAME" /> » à ce site, actualisez cette page</translation> <translation id="8199300056570174101">(Service) réseau et propriétés de l’appareil</translation> <translation id="8200772114523450471">Reprendre</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index 86a3e6ae..b8230961 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -526,6 +526,7 @@ <translation id="146000042969587795">Ce cadre a été bloqué, car il contient des éléments non sécurisés.</translation> <translation id="1461041542809785877">Performances</translation> <translation id="1461177659295855031">Déplacer vers le dossier "Barre de favoris"</translation> +<translation id="1461288887896722288">Vous venez de vous connecter à un compte géré. Si vous créez un profil géré, vous pourrez accéder à certaines ressources associées à ce compte.</translation> <translation id="146219525117638703">État ONC</translation> <translation id="146220085323579959">Internet a été déconnecté. Veuillez vérifier votre connexion, puis réessayer.</translation> <translation id="1462850958694534228">Examiner la modification de l'icône</translation> @@ -1878,6 +1879,7 @@ <translation id="2575407791320728464">URL non valide. Vérifiez qu'elle est correctement formatée.</translation> <translation id="2575441894380764255">Non autorisé à afficher des annonces intrusives ou trompeuses</translation> <translation id="2575713839157415345">{YEARS,plural, =1{Pendant 1 an, cet appareil sera enregistré et vous n'aurez pas besoin de code pour vous reconnecter. Ce paramètre est défini par votre administrateur.}one{Pendant {YEARS} an, cet appareil sera enregistré et vous n'aurez pas besoin de code pour vous reconnecter. Ce paramètre est défini par votre administrateur.}other{Pendant {YEARS} ans, cet appareil sera enregistré et vous n'aurez pas besoin de code pour vous reconnecter. Ce paramètre est défini par votre administrateur.}}</translation> +<translation id="2577446426265992344">sans omnibox</translation> <translation id="257779572837908839">Configurer en tant que Chromebox pour la visioconférence</translation> <translation id="2579309488038515659">Activation du point d'accès</translation> <translation id="2579596474754516455">Scannez des images PDF afin de convertir le texte pour un lecteur d'écran, si nécessaire</translation> @@ -6577,6 +6579,7 @@ <translation id="6787097042755590313">Autre onglet</translation> <translation id="6787839852456839824">Raccourcis clavier</translation> <translation id="6788210894632713004">Extension non empaquetée</translation> +<translation id="678939393857169499">Active la nouvelle interface pour ordinateur.</translation> <translation id="6789592661892473991">Séparation horizontale</translation> <translation id="6789834167207639931">Saisissez à nouveau le mot de passe de votre compte Google sur l'écran suivant pour terminer la restauration</translation> <translation id="6790428901817661496">Lire</translation> @@ -7374,6 +7377,7 @@ <translation id="7481312909269577407">Avancer</translation> <translation id="7481358317100446445">Prêt</translation> <translation id="748138892655239008">Contraintes de base du certificat</translation> +<translation id="7483145199632798061">Chrome Refresh 2023</translation> <translation id="7484645889979462775">Jamais pour ce site</translation> <translation id="7487141338393529395">Activer le correcteur orthographique amélioré</translation> <translation id="7487969577036436319">Aucun composant installé</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb index f6579bfa..d507870 100644 --- a/chrome/app/resources/generated_resources_gl.xtb +++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">Pestana activa de novo</translation> <translation id="1003088604756913841">Abrir ligazón nunha nova ventá da aplicación <ph name="APP" /></translation> <translation id="100323615638474026">Dispositivo USB (<ph name="VENDOR_ID" />: <ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Navegación segura de Google</translation> <translation id="1004218526896219317">Acceso a sitios</translation> <translation id="1005274289863221750">Utilizar o micrófono e a cámara</translation> <translation id="1005333234656240382">Queres activar a depuración de ADB?</translation> @@ -524,6 +525,7 @@ <translation id="146000042969587795">Bloqueouse este marco porque contén algúns contidos non seguros.</translation> <translation id="1461041542809785877">Rendemento</translation> <translation id="1461177659295855031">Mover ao cartafol da barra de marcadores</translation> +<translation id="1461288887896722288">Acabas de iniciar sesión nunha conta xestionada. Se creas un perfil xestionado, poderás acceder a algúns recursos vinculados a ela.</translation> <translation id="146219525117638703">Estado de ONC</translation> <translation id="146220085323579959">Desconectouse Internet. Comproba a túa conexión a Internet e téntao de novo.</translation> <translation id="1462850958694534228">Revisa o cambio da icona</translation> @@ -900,6 +902,7 @@ <translation id="1769104665586091481">Abrir a ligazón nunha &ventá nova</translation> <translation id="1770407692401984718">Arrastra unha imaxe aquí ou</translation> <translation id="177053719077591686">Facer unha copia de seguranza das aplicacións para Android en Google Drive.</translation> +<translation id="1771075623623424448">Buscas a páxina de rexistro de dispositivos do navegador? Visita <ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="177336675152937177">Datos da aplicación aloxada</translation> <translation id="1776712937009046120">Engadir usuario</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> @@ -1682,6 +1685,15 @@ <translation id="2422125132043002186">Cancelouse a restauración de Linux</translation> <translation id="2423578206845792524">Gar&dar imaxe como...</translation> <translation id="2424424966051154874">{0,plural, =1{Invitado}other{Invitado (#)}}</translation> +<translation id="242684489663276773">Ao levar a cabo esta acción: + <ph name="LINE_BREAKS" /> + • Restableceranse algunhas opcións de configuración e atallos de Chrome. + <ph name="LINE_BREAK" /> + • Desactivaranse as extensións. + <ph name="LINE_BREAK" /> + • Eliminaranse as cookies e outros datos temporais dos sitios. + <ph name="LINE_BREAKS" /> + Os marcadores, o historial e os contrasinais gardados non se verán afectados.</translation> <translation id="2428510569851653187">Describe que estabas facendo cando se bloqueou a pestana</translation> <translation id="2428939361789119025">Desactivar wifi</translation> <translation id="2428978615149723410">estes carros</translation> @@ -1865,6 +1877,7 @@ <translation id="2575407791320728464">O URL non é válido. Comproba que teña un formato adecuado.</translation> <translation id="2575441894380764255">Sitios que non poden mostrar anuncios enganosos ou intrusivos</translation> <translation id="2575713839157415345">{YEARS,plural, =1{Este dispositivo gardarase durante 1 ano e poderás conectarte sen código a próxima vez. Esta preferencia definiuna o teu administrador.}other{Este dispositivo gardarase durante {YEARS} anos e poderás conectarte sen código a próxima vez. Esta preferencia definiuna o teu administrador.}}</translation> +<translation id="2577446426265992344">sen omnibox</translation> <translation id="257779572837908839">Configurar como Chromebox para reunións</translation> <translation id="2579309488038515659">Activar zona wifi</translation> <translation id="2579596474754516455">Escanea imaxes en PDF co fin de convertelas en texto para o lector de pantalla cando sexa necesario</translation> @@ -4455,6 +4468,7 @@ <translation id="4876895919560854374">Bloquear e desbloquear a pantalla</translation> <translation id="4877276003880815204">Inspeccionar elementos</translation> <translation id="4877652723592270843">Queres activar ChromeVox, o lector de pantalla integrado en Chrome OS Flex? En caso afirmativo, mantén premidas as dúas teclas de volume durante cinco segundos.</translation> +<translation id="4878261017150799673">Manter activo o sitio</translation> <translation id="4878634973244289103">Non se puido enviar o comentario. Téntao de novo máis tarde.</translation> <translation id="4878653975845355462">O teu administrador desactivou os fondos personalizados</translation> <translation id="4878718769565915065">Produciuse un erro ao engadir unha impresión dixital a esta chave de seguranza</translation> @@ -5242,6 +5256,9 @@ <translation id="5602765853043467355">Borrar marcadores, historial, contrasinais etc., deste dispositivo</translation> <translation id="5605758115928394442">Enviouse unha notificación ao teu teléfono para confirmar a túa identidade.</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{Esta extensión está bloqueada}other{Estas extensións están bloqueadas}}</translation> +<translation id="560743070587960985">Este ficheiro podería ser un virus ou software malicioso. + +Podes envialo a Google para comprobar se é seguro ou non. As análises adoitan tardar uns segundos.</translation> <translation id="560834977503641186">Sincronización wifi; máis información</translation> <translation id="5608580678041221894">Toca as seguintes teclas para axustar ou mover a zona que se recortará</translation> <translation id="5609231933459083978">Parece que a aplicación non é válida.</translation> @@ -5976,6 +5993,7 @@ <translation id="6254892857036829079">Perfecto</translation> <translation id="6257602895346497974">Activar sincronización…</translation> <translation id="62586649943626337">Organiza as túas pestanas en grupos</translation> +<translation id="6260092874648348841">Manter activo o sitio</translation> <translation id="6262371516389954471">As copias de seguranza cárganse en Google e encríptanse co contrasinal da túa Conta de Google.</translation> <translation id="6263082573641595914">Versión de entidade emisora de certificados de Microsoft</translation> <translation id="6263284346895336537">Non crítica</translation> @@ -6553,6 +6571,7 @@ <translation id="6787097042755590313">Outra pestana</translation> <translation id="6787839852456839824">Atallos do teclado</translation> <translation id="6788210894632713004">Extensión descomprimida</translation> +<translation id="678939393857169499">Activa o novo deseño de escritorio.</translation> <translation id="6789592661892473991">Dividir horizontalmente</translation> <translation id="6789834167207639931">Volve escribir o contrasinal da túa Conta de Google na seguinte pantalla para rematar a recuperación</translation> <translation id="6790428901817661496">Reproducir</translation> @@ -7350,6 +7369,7 @@ <translation id="7481312909269577407">Adiante</translation> <translation id="7481358317100446445">Listo</translation> <translation id="748138892655239008">Restricións básicas do certificado</translation> +<translation id="7483145199632798061">Actualización de Chrome de 2023</translation> <translation id="7484645889979462775">Nunca neste sitio</translation> <translation id="7487141338393529395">Activar corrector ortográfico mellorado</translation> <translation id="7487969577036436319">Non se instalou ningún compoñente</translation> @@ -7511,6 +7531,7 @@ <translation id="7634280112532283638">Redución do spam e da fraude</translation> <translation id="7634337648687970851">Nestes momentos non se admite a recuperación de datos locais.</translation> <translation id="7634566076839829401">Produciuse un erro. Téntao de novo.</translation> +<translation id="763472884969134151">Análise feita por <ph name="LINK" /></translation> <translation id="7635048370253485243">Fixada polo teu administrador</translation> <translation id="7635711411613274199">A medida que navegues pola Web, os anuncios que vexas personalizaranse en función desta opción de configuración, da opción <ph name="BEGIN_LINK1" />Temas de anuncios<ph name="LINK_END1" />, da <ph name="BEGIN_LINK2" />configuración de cookies<ph name="LINK_END2" /> e de se o sitio que esteas visitando personaliza os anuncios</translation> <translation id="7636919061354591437">Instalar neste dispositivo</translation> @@ -8189,6 +8210,7 @@ <translation id="8195737548602430447">Traduce automaticamente os subtítulos a un idioma obxectivo.</translation> <translation id="8197673340773315084">Engade un nome ou etiqueta, como "Traballo" ou "Persoal"</translation> <translation id="8198456017687137612">Recibindo emisión de pestana</translation> +<translation id="8198457270656084773">Buscas a páxina de rexistro de dispositivos do sistema? Visita <ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="8198511718495409170">Para aplicar neste sitio a configuración actualizada de <ph name="EXTENSION_NAME" />, volve cargar esta páxina</translation> <translation id="8199300056570174101">Propiedades do dispositivo e da rede (mantemento)</translation> <translation id="8200772114523450471">Retomar</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index e056fe8..5a0b05f 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">ટૅબ ફરી સક્રિય કરો</translation> <translation id="1003088604756913841">નવી <ph name="APP" /> વિંડોમાં લિંક ખોલો</translation> <translation id="100323615638474026">USB ડિવાઇસ (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Google Safe Browsing</translation> <translation id="1004218526896219317">સાઇટ ઍક્સેસ</translation> <translation id="1005274289863221750">તમારા માઇક્રોફોનનો અને કૅમેરાનો ઉપયોગ કરો</translation> <translation id="1005333234656240382">ADB ડિબગીંગ ચાલુ કરીએ?</translation> @@ -525,6 +526,7 @@ <translation id="146000042969587795">આ ફ્રેમ બ્લૉક કરવામાં આવી હતી કારણ કે તેમાં અમુક અસુરક્ષિત કન્ટેન્ટ છે.</translation> <translation id="1461041542809785877">ભજવણી</translation> <translation id="1461177659295855031">બુકમાર્ક બાર ફોલ્ડર પર ખસેડો</translation> +<translation id="1461288887896722288">તમે હમણાં જ મેનેજ કરેલા એકાઉન્ટમાં સાઇન ઇન થયા છો, મેનેજ કરેલી નવી પ્રોફાઇલ બનાવવાથી તમે તે એકાઉન્ટ સાથે લિંક કરેલા કેટલાક સંસાધનો ઍક્સેસ કરી શકશો.</translation> <translation id="146219525117638703">ONC સ્થિતિ</translation> <translation id="146220085323579959">ઇન્ટરનેટ ડિસ્કનેક્ટ થયું, કૃપા કરીને તમારું ઇન્ટરનેટ કનેક્શન તપાસો અને ફરી પ્રયાસ કરો.</translation> <translation id="1462850958694534228">અપડેટ કરેલા આઇકનનો રિવ્યૂ કરો</translation> @@ -898,6 +900,7 @@ <translation id="1769104665586091481">નવી &વિંડોમાં લિંક ખોલો</translation> <translation id="1770407692401984718">અહીં કોઈ છબી ખેંચો અથવા</translation> <translation id="177053719077591686">Google Drive પર Android ઍપનું બૅકઅપ લો.</translation> +<translation id="1771075623623424448">બ્રાઉઝર ડિવાઇસ-લૉગનું પેજ શોધી રહ્યાં છો? <ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" />ની મુલાકાત લો.</translation> <translation id="177336675152937177">હોસ્ટ કરેલ ઍપ્લિકેશન ડેટા</translation> <translation id="1776712937009046120">વપરાશકર્તા ઉમેરો</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> @@ -1681,6 +1684,15 @@ <translation id="2422125132043002186">Linux પાછું મેળવવાનું રદ કર્યું</translation> <translation id="2423578206845792524">છબીને આ રૂપે સા&ચવો...</translation> <translation id="2424424966051154874">{0,plural, =1{અતિથિ}one{અતિથિ (#)}other{અતિથિ (#)}}</translation> +<translation id="242684489663276773">આમ કરવાથી: + <ph name="LINE_BREAKS" /> + • Chromeના અમુક સેટિંગ અને Chrome શૉર્ટકટ રીસેટ થઈ જશે + <ph name="LINE_BREAK" /> + • એક્સ્ટેન્શન બંધ થઈ જશે + <ph name="LINE_BREAK" /> + • કુકી અને સાઇટનો અન્ય હંગામી ડેટા ડિલીટ થઈ જશે + <ph name="LINE_BREAKS" /> + બુકમાર્ક, ઇતિહાસ અને સાચવેલા પાસવર્ડને કોઈ અસર થશે નહીં.</translation> <translation id="2428510569851653187">ટૅબ ક્રેશ થઈ ત્યારે તમે શું કરતા હતા તેનું વર્ણન કરો</translation> <translation id="2428939361789119025">વાઇ-ફાઇ બંધ કરો</translation> <translation id="2428978615149723410">આ કાર્ટ</translation> @@ -1864,6 +1876,7 @@ <translation id="2575407791320728464">અમાન્ય URL. તે યોગ્ય રીતે ફૉર્મેટ કરેલું હોવાની ખાતરી કરો.</translation> <translation id="2575441894380764255">ઘૃણાસ્પદ અથવા ભ્રામક જાહેરાતો બતાવવાની મંજૂરી નથી</translation> <translation id="2575713839157415345">{YEARS,plural, =1{આ ડિવાઇસ 1 વર્ષ માટે સચવાશે અને તમે આગલી વખતે કોડ વિના કનેક્ટ કરી શકશો. આ તમારા ઍડમિનિસ્ટ્રેટર દ્વારા સેટ કરાય છે.}one{આ ડિવાઇસ {YEARS} વર્ષ માટે સચવાશે અને તમે આગલી વખતે કોડ વિના કનેક્ટ કરી શકશો. આ તમારા ઍડમિનિસ્ટ્રેટર દ્વારા સેટ કરાય છે.}other{આ ડિવાઇસ {YEARS} વર્ષ માટે સચવાશે અને તમે આગલી વખતે કોડ વિના કનેક્ટ કરી શકશો. આ તમારા ઍડમિનિસ્ટ્રેટર દ્વારા સેટ કરાય છે.}}</translation> +<translation id="2577446426265992344">ઑમ્નિબૉક્સ વિના</translation> <translation id="257779572837908839">મીટિંગ માટે Chromebox તરીકે સેટ કરો</translation> <translation id="2579309488038515659">હૉટસ્પૉટ ચાલુ</translation> <translation id="2579596474754516455">જ્યારે જરૂરી હોય ત્યારે સ્ક્રીન રીડર માટે ટેક્સ્ટમાં બદલવા, PDF છબીઓને સ્કૅન કરો</translation> @@ -4454,6 +4467,7 @@ <translation id="4876895919560854374">સ્ક્રીન લૉક કરો અને અનલૉક કરો</translation> <translation id="4877276003880815204">ઘટકો તપાસો</translation> <translation id="4877652723592270843">શું તમે ChromeOS Flex માટેનું બિલ્ટ-ઇન સ્ક્રીન રીડર, ChromeVox સક્રિય કરવા માગો છો? જો હા હોય, તો પાંચ સેકન્ડ માટે બન્ને વૉલ્યૂમ કી દબાવી રાખો.</translation> +<translation id="4878261017150799673">સાઇટને સક્રિય રાખો</translation> <translation id="4878634973244289103">પ્રતિસાદ મોકલી શકતા નથી. કૃપા કરીને પછીથી ફરી પ્રયાસ કરો.</translation> <translation id="4878653975845355462">તમારા વ્યવસ્થાપક દ્વારા કસ્ટમ બૅકગ્રાઉન્ડ બંધ કરવામાં આવ્યાં છે</translation> <translation id="4878718769565915065">આ સિક્યુરિટી કીમાં ફિંગરપ્રિન્ટ ઉમેરવાનું નિષ્ફળ રહ્યું</translation> @@ -5241,6 +5255,9 @@ <translation id="5602765853043467355">આ ડિવાઇસમાંથી બુકમાર્ક, ઇતિહાસ, પાસવર્ડ અને વધુ સાફ કરો</translation> <translation id="5605758115928394442">તમે જ છો તે કન્ફર્મ કરવા માટે તમારા ફોન પર નોટિફિકેશન મોકલવામાં આવ્યું હતું.</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{આ એક્સ્ટેન્શનને બ્લૉક કરવામાં આવ્યું છે}one{આ એક્સ્ટેન્શનને બ્લૉક કરવામાં આવ્યું છે}other{આ એક્સ્ટેન્શનને બ્લૉક કરવામાં આવ્યા છે}}</translation> +<translation id="560743070587960985">આ ફાઇલ વાયરસ અથવા માલવેર હોઈ શકે છે. + +તે અસુરક્ષિત છે કે કેમ તે ચેક કરવા માટે તમે તેને Googleને મોકલી શકો છો. સ્કૅન કરવામાં સામાન્ય રીતે થોડી સેકન્ડ લાગે છે.</translation> <translation id="560834977503641186">વાઇ-ફાઇ સિંક, વધુ જાણો</translation> <translation id="5608580678041221894">કાપવા માટેના ક્ષેત્રને સમાયોજિત કરવા અથવા ખસેડવા માટે નીચેની કીને ટૅપ કરો</translation> <translation id="5609231933459083978">ઍપ્લિકેશન અમાન્ય હોય તેવું લાગે છે.</translation> @@ -5980,6 +5997,7 @@ <translation id="6254892857036829079">ઉત્તમ</translation> <translation id="6257602895346497974">સિંક કરવું ચાલુ કરો…</translation> <translation id="62586649943626337">ટૅબનાં ગ્રૂપ વડે તમારી ટૅબ વ્યવસ્થિત રાખો</translation> +<translation id="6260092874648348841">સાઇટને સક્રિય રાખો</translation> <translation id="6262371516389954471">તમારું બૅકઅપ Google પર અપલોડ કરવામાં આવે છે અને તમારા Google એકાઉન્ટ પાસવર્ડનો ઉપયોગ કરીને એન્ક્રિપ્ટ કરવામાં આવે છે.</translation> <translation id="6263082573641595914">Microsoft CA વર્ઝન</translation> <translation id="6263284346895336537">મહત્વપૂર્ણ નથી</translation> @@ -6559,6 +6577,7 @@ <translation id="6787097042755590313">અન્ય ટૅબ</translation> <translation id="6787839852456839824">કીબોર્ડ શોર્ટકટ્સ</translation> <translation id="6788210894632713004">અનપૅક કરેલ એક્સ્ટેન્શન</translation> +<translation id="678939393857169499">નવી ડેસ્કટૉપ ડિઝાઇન ચાલુ કરે છે.</translation> <translation id="6789592661892473991">સ્ક્રીનને આડી વિભાજિત કરો</translation> <translation id="6789834167207639931">રિકવરી પૂર્ણ કરવા માટે, આગલી સ્ક્રીનમાં તમારા Google એકાઉન્ટનો પાસવર્ડ ફરીથી દાખલ કરો</translation> <translation id="6790428901817661496">ચલાવો</translation> @@ -7356,6 +7375,7 @@ <translation id="7481312909269577407">ફોર્વર્ડ કરો</translation> <translation id="7481358317100446445">હવે તૈયાર</translation> <translation id="748138892655239008">પ્રમાણપત્રની મૂળભૂત મર્યાદાઓ</translation> +<translation id="7483145199632798061">Chrome Refresh 2023</translation> <translation id="7484645889979462775">આ સાઇટ માટે ક્યારેય નહીં</translation> <translation id="7487141338393529395">વધુ સારી બનાવાયેલી જોડણીની તપાસ ચાલુ કરો</translation> <translation id="7487969577036436319">કોઈ ઘટકો ઇન્સ્ટોલ કરેલા નથી</translation> @@ -7517,6 +7537,7 @@ <translation id="7634280112532283638">સ્પામ અને કપટમાં ઘટાડો</translation> <translation id="7634337648687970851">સ્થાનિક ડેટા રિકવરીને હાલમાં સપોર્ટ કરવામાં આવતો નથી.</translation> <translation id="7634566076839829401">કંઈક ખોટું થયું હતું. કૃપા કરીને ફરીથી પ્રયાસ કરો.</translation> +<translation id="763472884969134151"><ph name="LINK" /> દ્વારા વિશ્લેષણ કરવામાં આવેલું છે</translation> <translation id="7635048370253485243">તમારા વ્યવસ્થાપકે પિન કરેલું છે</translation> <translation id="7635711411613274199">જેમ-જેમ તમે બ્રાઉઝ કરો, તેમ-તેમ તમને દેખાતી જાહેરાત મનગમતી બનાવેલી હોય કે નહીં અને તમે જોઈ રહ્યાં હો તે સાઇટ જાહેરાતોને મનગમતી બનાવે છે કે નહીં એ બાબત આ સેટિંગ, <ph name="BEGIN_LINK1" />જાહેરાતના વિષયો<ph name="LINK_END1" /> તથા તમારી <ph name="BEGIN_LINK2" />કુકીના સેટિંગ<ph name="LINK_END2" /> પર આધારિત હોય છે</translation> <translation id="7636919061354591437">આ ડિવાઇસ પર ઇન્સ્ટૉલ કરો</translation> @@ -8190,6 +8211,7 @@ <translation id="8195737548602430447">લક્ષિત ભાષામાં કૅપ્શનનો ઑટોમૅટિક રીતે અનુવાદ કરો.</translation> <translation id="8197673340773315084">ઑફિસ કે વ્યક્તિગત જેવું નામ કે લેબલ ઉમેરો</translation> <translation id="8198456017687137612">ટૅબ કાસ્ટ કરી રહ્યાં છીએ</translation> +<translation id="8198457270656084773">સિસ્ટમ ડિવાઇસ-લૉગનું પેજ શોધી રહ્યાં છો? <ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" />ની મુલાકાત લો.</translation> <translation id="8198511718495409170">"<ph name="EXTENSION_NAME" />" માટે આ સાઇટ પર તમારા અપડેટ કરેલા સેટિંગ લાગુ પાડવા માટે, આ પેજને ફરીથી લોડ કરો</translation> <translation id="8199300056570174101">નેટવર્ક (સેવા) અને ઉપકરણના ગુણધર્મો</translation> <translation id="8200772114523450471">રિઝ્યુમે</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index fb0cf60..f9f663c 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -529,6 +529,7 @@ <translation id="146000042969587795">यह फ़्रेम ब्लॉक किया गया था क्योंकि इसमें कुछ असुरक्षित सामग्री मौजूद है.</translation> <translation id="1461041542809785877">प्रदर्शन</translation> <translation id="1461177659295855031">बुकमार्क बार वाले फ़ोल्डर में ले जाएं</translation> +<translation id="1461288887896722288">आपने अभी-अभी मैनेज किए जा रहे खाते से साइन इन किया है. मैनेज की जा रही नई प्रोफ़ाइल बनाने पर, आपको उस खाते से जुड़े कुछ संसाधनों का ऐक्सेस मिल जाएगा.</translation> <translation id="146219525117638703">ONC स्थिति</translation> <translation id="146220085323579959">इंटरनेट डिस्कनेक्ट हो गया है. कृपया अपना इंटरनेट कनेक्शन जाँचें और फिर से कोशिश करें.</translation> <translation id="1462850958694534228">आइकॉन में हुआ बदलाव देखें</translation> @@ -1893,6 +1894,7 @@ <translation id="2575407791320728464">यूआरएल गलत है. पक्का करें कि इसका फ़ॉर्मैट सही हो.</translation> <translation id="2575441894380764255">तंग करने वाले या गुमराह करने वाले विज्ञापन दिखाने की अनुमति नहीं है</translation> <translation id="2575713839157415345">{YEARS,plural, =1{इस डिवाइस की पहचान को 1 साल के लिए सेव किया जाएगा और इस दौरान, इसे बिना कोड के कनेक्ट किया जा सकता है. इसे आपका एडमिन सेट करता है.}one{इस डिवाइस की पहचान को {YEARS} साल के लिए सेव किया जाएगा और इस दौरान, इसे बिना कोड के कनेक्ट किया जा सकता है. इसे आपका एडमिन सेट करता है.}other{इस डिवाइस की पहचान को {YEARS} साल के लिए सेव किया जाएगा और इस दौरान, इसे बिना कोड के कनेक्ट किया जा सकता है. इसे आपका एडमिन सेट करता है.}}</translation> +<translation id="2577446426265992344">खोज बार (खोज क्वेरी डालने वाला बार) के बिना</translation> <translation id="257779572837908839">मीटिंग के लिए Chromebox के रूप में सेट अप करें</translation> <translation id="2579309488038515659">हॉटस्पॉट चालू करें</translation> <translation id="2579596474754516455">PDF इमेज को स्क्रीन रीडर के लिए स्कैन करें, ताकि ज़रूरत पड़ने पर, इमेज से टेक्स्ट निकाला जा सके</translation> @@ -6591,6 +6593,7 @@ <translation id="6787097042755590313">अन्य टैब</translation> <translation id="6787839852456839824">कीबोर्ड शॉर्टकट</translation> <translation id="6788210894632713004">पैक नहीं किया गया एक्सटेंशन</translation> +<translation id="678939393857169499">डेस्कटॉप के नए डिज़ाइन को चालू करता है.</translation> <translation id="6789592661892473991">हाॅरिज़ॉन्टल (बाईं से दाईं ओर) रूप से छोटे-छोटे हिस्सों में बांटें यानी स्प्लिट करें</translation> <translation id="6789834167207639931">रिकवरी की प्रक्रिया पूरी करने के लिए, अगली स्क्रीन पर अपने Google खाते का पासवर्ड फिर से डालें</translation> <translation id="6790428901817661496">चलाएं</translation> @@ -7387,6 +7390,7 @@ <translation id="7481312909269577407">आगे जाएं</translation> <translation id="7481358317100446445">तैयार</translation> <translation id="748138892655239008">प्रमाणपत्र मूल बाध्यताएं</translation> +<translation id="7483145199632798061">Chrome Refresh 2023</translation> <translation id="7484645889979462775">इस साइट के लिए कभी नहीं</translation> <translation id="7487141338393529395">'बेहतर स्पेलिंग जाँच' चालू करें</translation> <translation id="7487969577036436319">कोई घटक इंस्टॉल नहीं हैं</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index 00e74415..dab075c 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -527,6 +527,7 @@ <translation id="146000042969587795">Ovaj je okvir blokiran jer sadrži određeni nesiguran sadržaj.</translation> <translation id="1461041542809785877">Izvedba</translation> <translation id="1461177659295855031">Premjesti u mapu Traka oznaka</translation> +<translation id="1461288887896722288">Upravo ste se prijavili na upravljani račun i izrada novog upravljanog profila omogućit će vam pristup nekim resursima povezanima s tim računom.</translation> <translation id="146219525117638703">Stanje ONC-a</translation> <translation id="146220085323579959">Internet je isključen. Provjerite internetsku vezu i pokušajte ponovo.</translation> <translation id="1462850958694534228">Pregled ažuriranja ikona</translation> @@ -1880,6 +1881,7 @@ <translation id="2575407791320728464">URL nije važeći. Provjerite je li pravilno formatiran.</translation> <translation id="2575441894380764255">Nije dopušteno prikazivanje ometajućih ili obmanjujućih oglasa</translation> <translation id="2575713839157415345">{YEARS,plural, =1{Uređaj će biti spremljen jednu godinu te se sljedeći put možete povezati bez koda. To postavlja vaš administrator.}one{Uređaj će biti spremljen {YEARS} godinu te se sljedeći put možete povezati bez koda. To postavlja vaš administrator.}few{Uređaj će biti spremljen {YEARS} godine te se sljedeći put možete povezati bez koda. To postavlja vaš administrator.}other{Uređaj će biti spremljen {YEARS} godina te se sljedeći put možete povezati bez koda. To postavlja vaš administrator.}}</translation> +<translation id="2577446426265992344">bez višenamjenskog okvira</translation> <translation id="257779572837908839">Postavi kao Chromebox za videokonferencije</translation> <translation id="2579309488038515659">Omogući žarišnu točku</translation> <translation id="2579596474754516455">Skenirajte PDF slike da biste po potrebi konvertirali tekst za čitač zaslona</translation> @@ -6577,6 +6579,7 @@ <translation id="6787097042755590313">Druga kartica</translation> <translation id="6787839852456839824">Tipkovnički prečaci</translation> <translation id="6788210894632713004">Raspakirano proširenje</translation> +<translation id="678939393857169499">Omogućuje novi dizajn za računala.</translation> <translation id="6789592661892473991">Podijeli vodoravno</translation> <translation id="6789834167207639931">Na sljedećem zaslonu ponovo unesite zaporku Google računa da biste dovršili oporavak</translation> <translation id="6790428901817661496">Reproduciraj</translation> @@ -7374,6 +7377,7 @@ <translation id="7481312909269577407">Naprijed</translation> <translation id="7481358317100446445">Spremno</translation> <translation id="748138892655239008">Osnovno ograničenje certifikata</translation> +<translation id="7483145199632798061">Osvježavanje Chromea 2023.</translation> <translation id="7484645889979462775">Nikad za ovu web lokaciju</translation> <translation id="7487141338393529395">Uključivanje poboljšane provjere pravopisa</translation> <translation id="7487969577036436319">Nema instaliranih komponenti</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index 1902a5f..da79257 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -204,6 +204,7 @@ <translation id="1166212789817575481">A jobbra eső lapok bezárása</translation> <translation id="1166583374608765787">Névvel módosításának áttekintése</translation> <translation id="1166596238782048887">A(z) <ph name="TAB_TITLE" /> a következő számítógéphez tartozik: <ph name="DESK_TITLE" /></translation> +<translation id="1167262726334064738">Próbálkozás új jelszóval</translation> <translation id="1168020859489941584">Megnyitás <ph name="TIME_REMAINING" /> múlva...</translation> <translation id="116896278675803795">A nyelv automatikus módosítása, hogy igazodjon a kijelölt tartalomhoz</translation> <translation id="1169266963600477608">Játékvezérlők</translation> @@ -918,6 +919,7 @@ <translation id="177336675152937177">Tárolt alkalmazás adatai</translation> <translation id="1776712937009046120">Felhasználó hozzáadása</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="177814385589420211">A keresőgomb nyomva tartásával válthat a funkcióbillentyűk és rendszer felső sorban lévő billentyűi között</translation> <translation id="1778457539567749232">Megjelölés olvasatlanként</translation> <translation id="1778991607452011493">Hibakeresési naplók küldése (javasolt)</translation> <translation id="1779441632304440041">A gyenge jelszavakat könnyű kitalálni. Figyeljen arra, hogy erős jelszavakat hozzon létre.</translation> @@ -1359,6 +1361,7 @@ <translation id="2142582065325732898">Kapcsolja be a <ph name="LINK1_BEGIN" />Chrome-szinkronizálást<ph name="LINK1_END" /> a nemrég megnyitott Chrome-lapok megtekintéséhez. <ph name="LINK2_BEGIN" />További információ<ph name="LINK2_END" />.</translation> <translation id="2143765403545170146">Eszköztár mindig látható teljes képernyős módban</translation> <translation id="2143778271340628265">Proxy beállítása kézzel</translation> +<translation id="2143808295261240440">A javasolt jelszó használata</translation> <translation id="2143915448548023856">Megjelenítési beállítások</translation> <translation id="2144536955299248197">Tanúsítványmegtekintő: <ph name="CERTIFICATE_NAME" /></translation> <translation id="2144557304298909478">Android-alkalmazás fejlesztése Linuxra</translation> @@ -2347,6 +2350,7 @@ <translation id="2963151496262057773">Az alábbi beépülő modulok nem válaszolnak: <ph name="PLUGIN_NAME" />. Szeretné leállítani?</translation> <translation id="2964193600955408481">Wi-Fi letiltása</translation> <translation id="2964245677645334031">Közeli megosztás láthatóság</translation> +<translation id="2966705348606485669"><ph name="FOLDER_TITLE" /> könyvjelzőmappa további beállításai</translation> <translation id="2966937470348689686">Android-beállítások kezelése</translation> <translation id="2967926928600500959">Az ezeknek a szabályoknak megfelelő URL-eket a megadott böngészőben kényszeríti megnyitásra a rendszer.</translation> <translation id="2972581237482394796">&Újra</translation> @@ -2636,6 +2640,7 @@ <translation id="3244294424315804309">Némítás megtartása</translation> <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> – Hálózati hiba</translation> <translation id="3248902735035392926">A biztonság fontos. Szánjon egy pillanatot <ph name="BEGIN_LINK" />bővítményeinek ellenőrzésére<ph name="END_LINK" />.</translation> +<translation id="3249323165366527554">Gyorsabban regisztrálhat és bejelentkezhet, ha jelszavát automatikusan menti a következő fiókhoz tartozó <ph name="GOOGLE_PASSWORD_MANAGER" /> szolgáltatásba: <ph name="EMAIL" />.</translation> <translation id="3251714896659475029">A Google Segéd használatának engedélyezése <ph name="SUPERVISED_USER_NAME" /> számára az „Ok Google” paranccsal</translation> <translation id="3251759466064201842"><Nem része a tanúsítványnak></translation> <translation id="325238099842880997">Digitális alapszabályok beállításával segíthet a gyermekeknek a játékban, a felfedezésben és az iskolai feladatok otthoni elvégzésében.</translation> @@ -4130,6 +4135,7 @@ <translation id="4556194354084985730">Egyszerűen bejelentkezhet a webhelyekre és az alkalmazásokba a mentett jelszavakkal. Ha a funkció ki van kapcsolva, a bejelentkezés előtt megerősítést kér a rendszer.</translation> <translation id="4558426062282641716">Automatikus indítási engedély kérelmezve</translation> <translation id="4559617833001311418">Ez a webhely hozzáfér az Ön mozgás- vagy fényérzékelőihez.</translation> +<translation id="4560728518401799797"><ph name="FOLDER_TITLE" /> könyvjelző további beállításai</translation> <translation id="4561893854334016293">Nincsenek nemrégiben módosított engedélyek</translation> <translation id="4562155214028662640">Ujjlenyomat hozzáadása</translation> <translation id="4563210852471260509">Az alapértelmezett beviteli nyelv a kínai</translation> @@ -4413,6 +4419,7 @@ <translation id="4819323978093861656">{0,plural, =0{Bezárás most.}=1{Bezárás 1 másodperc múlva}other{Bezárás # másodperc múlva}}</translation> <translation id="4819607494758673676">Google Segéd-értesítések</translation> <translation id="4820236583224459650">Beállítás aktív jegyként</translation> +<translation id="4820795723433418303">Funkcióbillentyűk használata a felső sor billentyűiként</translation> <translation id="4821935166599369261">&Profilozás bekapcsolva</translation> <translation id="4823484602432206655">A felhasználó és az eszköz beállításainak olvasása és módosítása</translation> <translation id="4824037980212326045">Biztonsági mentés és helyreállítás Linuxon</translation> @@ -4544,6 +4551,7 @@ <translation id="4925320384394644410">Itt jelennek majd meg a portok</translation> <translation id="49265687513387605">Nem sikerült átküldeni a képernyő tartalmát. Ellenőrizze, hogy megerősítette-e a képernyő megosztásának megkezdésére vonatkozó kérdést.</translation> <translation id="4927753642311223124">Itt nincs semmi, továbbmehet.</translation> +<translation id="4928629450964837566">Biztonságosabb jelszó használata</translation> <translation id="4929386379796360314">Nyomtatási helyek</translation> <translation id="4930447554870711875">Fejlesztők</translation> <translation id="4930714375720679147">Bekapcsolás</translation> @@ -4626,6 +4634,7 @@ <translation id="5010886807652684893">Vizuális nézet</translation> <translation id="5015344424288992913">Proxy azonosítása folyamatban...</translation> <translation id="5016491575926936899">Számítógépről küldhet SMS-t, megoszthatja az internetkapcsolatot, válaszolhat a beszélgetések értesítéseire, és feloldhatja <ph name="DEVICE_TYPE" /> eszköze zárolását a telefonjával.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" />.</translation> +<translation id="5016983299133677671">Próbálkozás új jelszóval</translation> <translation id="5017643436812738274">Az oldalakon szövegkurzorral navigálhat. A funkció kikapcsolásához használja a Ctrl + Keresés + 7 billentyűkombinációt.</translation> <translation id="5018207570537526145">Bővítmény webhelyének megnyitása</translation> <translation id="5018526990965779848">Használati és diagnosztikai adatok küldése. Segítsen az Android-élmény továbbfejlesztésében azzal, hogy automatikusan diagnosztikai, valamint eszköz- és alkalmazáshasználati adatokat küld a Google-nak. Az adatok a rendszer- és alkalmazásstabilitás javításában, valamint más fejlesztésekben segítenek. Bizonyos összesített adatok a Google-alkalmazásoknak és -partnereknek, például az Android-fejlesztőknek is segítenek. Ha az Internetes és alkalmazástevékenységek beállítás is be van kapcsolva, akkor a rendszer ezeket az adatokat az Ön Google-fiókjába is mentheti.</translation> @@ -4694,6 +4703,7 @@ <translation id="5078638979202084724">Összes lap hozzáadása a könyvjelzőkhöz</translation> <translation id="5078796286268621944">Helytelen PIN-kód</translation> <translation id="5079010647467150187">Beépített VPN hozzáadása…</translation> +<translation id="5079699784114005398">A bekapcsolást követően az alkalmazások rendelkezésre állnak majd minden ChromeOS-eszközön, miután bejelentkezett Google-fiókjával. A Chrome böngészőből telepített internetes alkalmazások szinkronizálása akkor is megtörténik, ha a böngésző szinkronizálása ki van kapcsolva.</translation> <translation id="508059534790499809">Kerberos-jegy frissítése</translation> <translation id="5081960376148623587">Válassza ki, hogy szeretne-e előtölteni oldalakat</translation> <translation id="5084328598860513926">Megszakadt az ellátási folyamat. Próbálja újra, illetve forduljon az eszköz tulajdonosához vagy rendszergazdájához. Hibakód: <ph name="ERROR_CODE" />.</translation> @@ -4769,6 +4779,7 @@ <translation id="5145464978649806571">Ha eltávolodik az eszközétől, a képernyőt automatikusan lezárja a rendszer. Amikor az eszköze előtt tartózkodik, a képernyő hosszabb ideig nem kapcsol ki. Ha a lezárási képernyő le van tiltva, akkor eszköze lezárás helyett alvó módba lép.</translation> <translation id="514575469079499857">IP-cím használata a tartózkodási hely megállapítására (alapértelmezett)</translation> <translation id="5146896637028965135">Rendszerhang</translation> +<translation id="5147992672778369947">A javasolt jelszó használata</translation> <translation id="5148277445782867161">A Google helyszolgáltatásai olyan forrásokat használnak eszköze helyének becsléséhez, mint a Wi-Fi- vagy mobilhálózatok és az érzékelők.</translation> <translation id="5150254825601720210">Netscape tanúsítvány - SSL-szerver neve</translation> <translation id="5151354047782775295">Szabadítson fel tárhelyet, vagy bizonyos adatok automatikusan törlődhetnek</translation> @@ -5056,6 +5067,7 @@ <translation id="5414566801737831689">A felkeresett webhelyek ikonjainak olvasása</translation> <translation id="5414836363063783498">Ellenőrzés...</translation> <translation id="5417312524372586921">Böngészőtémák</translation> +<translation id="5417353542809767994">Gyorsan erős jelszót használhat</translation> <translation id="541737483547792035">Képernyő nagyítása</translation> <translation id="5419405654816502573">Voice Match</translation> <translation id="5420274697768050645">A fokozott biztonság érdekében jelszó megadására van szükség az eszköz feloldásához</translation> @@ -5176,6 +5188,7 @@ <translation id="5517412723934627386"><ph name="NETWORK_TYPE" /> – <ph name="NETWORK_DISPLAY_NAME" /></translation> <translation id="5518949581554491184">Beállítás androidos telefonnal</translation> <translation id="5519195206574732858">LTE</translation> +<translation id="5519900055135507385">Védje fiókját erős jelszóval. A következő fiókhoz társított <ph name="GOOGLE_PASSWORD_MANAGER" /> alkalmazásba menti a rendszer: <ph name="EMAIL" />.</translation> <translation id="5521078259930077036">Erre a kezdőoldalra számított?</translation> <translation id="5522156646677899028">Ez a bővítmény komoly biztonsági rést tartalmaz.</translation> <translation id="5522403133543437426">A címsávban használt keresőmotor.</translation> @@ -5795,6 +5808,7 @@ <translation id="6070311415473175157">A kereséshez válassza ki a kívánt képterületet</translation> <translation id="6071181508177083058">jelszó megerősítése</translation> <translation id="6071576563962215370">A rendszer nem tudta zárolni az eszköz telepítésiidő-attribútumait.</translation> +<translation id="6071938745001252305"><ph name="MEMORY_VALUE" /> memória megtakarítva</translation> <translation id="6072442788591997866">A(z) <ph name="APP_NAME" /> használata nem engedélyezett ezen az eszközön. Forduljon a rendszergazdához. Hibakód: <ph name="ERROR_CODE" />.</translation> <translation id="6073451960410192870">Felvétel leállítása</translation> <translation id="6073903501322152803">Kisegítő lehetőségek hozzáadása</translation> @@ -5842,6 +5856,7 @@ <translation id="6104068876731806426">Google-fiók</translation> <translation id="6104311680260824317">Nem sikerült csatlakoztatni az eszközt a domainre. A szerver nem támogatja a megadott Kerberos-titkosítástípusokat. A titkosítási beállításokat a „További lehetőségek” részben találja.</translation> <translation id="6104796831253957966">A nyomtató várólistája megtelt</translation> +<translation id="6104929924898022309">A funkcióbillentyűk viselkedésének módosítása a keresőgombbal</translation> <translation id="6106167152849320869">Ha az előző lépésben elküldte a diagnosztikai és használati adatokat, akkor a rendszer gyűjti majd ezeket az adatokat a telepített alkalmazások esetében.</translation> <translation id="6111972606040028426">A Google Segéd aktiválása</translation> <translation id="6112294629795967147">Érintse meg az átméretezéshez</translation> @@ -5983,6 +5998,7 @@ <translation id="6234108445915742946">A Chrome Általános Szerződési Feltételei március 31-én módosulnak</translation> <translation id="6234474535228214774">Telepítés függőben</translation> <translation id="6235208551686043831">Az eszköz kamerája bekapcsolt. Helyezze az eSIM QR-kódját a kamera elé.</translation> +<translation id="6237297174664969437">A Chrome beállításai között bármikor módosíthatja a szinkronizálni kívánt böngészőadatokat. Az <ph name="LINK_BEGIN" />eszköz beállításaiban<ph name="LINK_END" /> kezelheti a Chrome böngészőből telepített internetes alkalmazások szinkronizálását. A Google az Ön előzményei alapján személyre szabhatja a Keresőt és más szolgáltatásokat.</translation> <translation id="6237474966939441970">Érintőceruza jegyzetelő alkalmazása</translation> <translation id="623755660902014047">Olvasási mód</translation> <translation id="6238767809035845642">Más eszközről megosztott szöveg</translation> @@ -6316,6 +6332,7 @@ <translation id="6537613839935722475">A névben betűket, számokat és kötőjeleket (-) használhat</translation> <translation id="6538098297809675636">Nem sikerült a kód észlelése</translation> <translation id="653920215766444089">Mutatóeszköz keresése…</translation> +<translation id="6539674013849300372">Biztonságban maradhat az interneten, ha erős jelszót használ. A következő fiókhoz társított <ph name="GOOGLE_PASSWORD_MANAGER" /> alkalmazásba menti a rendszer: <ph name="EMAIL" />.</translation> <translation id="653983593749614101">Folytatás…</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Megjegyzés:<ph name="END_BOLD" /> csak akkor engedélyezze, ha tisztában van a következményekkel, vagy megkérték rá, mivel az adatok gyűjtése csökkentheti a teljesítményt.</translation> <translation id="6541638731489116978">Ennél a webhelynél le van tiltva a mozgásérzékelőkhöz való hozzáférés.</translation> @@ -6510,6 +6527,7 @@ <translation id="671226373742585927">Az „X” gombra kattintva bezárhatja az oldalsó panelt</translation> <translation id="6712943853047024245">Már mentett jelszót ezzel a felhasználónévvel a következőhöz: <ph name="WEBSITE" /></translation> <translation id="6713233729292711163">Munkaprofil hozzáadása</translation> +<translation id="6713441551032149301">Az Indító billentyű nyomva tartásával válthat a funkcióbillentyűk és rendszer felső sorban lévő billentyűi között</translation> <translation id="6713668088933662563">Soha ne ajánljon fel fordítást ezekről a nyelvekről</translation> <translation id="6715803357256707211">Hiba történt a Linux-alkalmazás telepítése során. Részletekért kattintson az értesítésre.</translation> <translation id="671619610707606484">Ezzel törli a webhelyek által tárolt összesen <ph name="TOTAL_USAGE" />-nyi adatot</translation> @@ -6631,6 +6649,7 @@ <translation id="6811034713472274749">Az oldal megtekinthető</translation> <translation id="6811151703183939603">Erős</translation> <translation id="6811332638216701903">DHCP-gazdagépnév</translation> +<translation id="6811792477922751991">A funkcióbillentyűk viselkedésének módosítása az Indító billentyűvel</translation> <translation id="6812349420832218321">A <ph name="PRODUCT_NAME" /> nem futtatható rootként.</translation> <translation id="6812841287760418429">Módosítások megtartása</translation> <translation id="6813907279658683733">Teljes képernyő</translation> @@ -7824,6 +7843,7 @@ <translation id="7851720427268294554">IPP-elemző</translation> <translation id="78526636422538552">A további Google-fiókok hozzáadása ki van kapcsolva</translation> <translation id="7853747251428735">További esz&közök</translation> +<translation id="7853999103056713222">Biztonságosabb jelszó használata</translation> <translation id="7855678561139483478">Lap áthelyezése új ablakba</translation> <translation id="7857004848504343806">Számítógépe olyan biztonsági modult tartalmaz, amely számos kritikus biztonsági funkció megvalósítására szolgál a ChromeOS Flex rendszerben. További információt a Chromebook Súgóban talál: https://support.google.com/chromebook/?p=tpm</translation> <translation id="7857093393627376423">Szöveges javaslatok</translation> @@ -8379,6 +8399,7 @@ <translation id="8325413836429495820">Nem használhatják a vágólapot</translation> <translation id="8326478304147373412">PKCS #7, tanúsítványlánc</translation> <translation id="8327386430364625757">Matematikai betűtípus</translation> +<translation id="8327538105740918488">Ezt a jelszót később bármikor módosíthatja. A következő fiókhoz társított <ph name="GOOGLE_PASSWORD_MANAGER" /> alkalmazásba menti a rendszer: <ph name="EMAIL" />.</translation> <translation id="8327676037044516220">Engedélyek és tartalombeállítások</translation> <translation id="8330617762701840933">Olyan webhelyek listája, amelyek átirányítanak alternatív böngészőkre.</translation> <translation id="8330689128072902965">A közelben lévő ismerősei megoszthatnak Önnel tartalmakat. Kattintson a módosításhoz.</translation> @@ -8524,6 +8545,7 @@ <translation id="8449836157089738489">Az összes megnyitása új lapcsoportban</translation> <translation id="8451512073679317615">segéd</translation> <translation id="845702320058262034">Nem sikerült kapcsolódni. Ne felejtse el bekapcsolni a telefon Bluetooth funkcióját.</translation> +<translation id="8457251154056341970">Ezen az oldalon többé nem jelennek meg <ph name="MODULE_NAME" /></translation> <translation id="8457451314607652708">Könyvjelzők importálása</translation> <translation id="8458341576712814616">Gyorsparancs</translation> <translation id="8458627787104127436">Összes (<ph name="URL_COUNT" />) megnyitása új ablakban</translation> @@ -8596,6 +8618,7 @@ <translation id="8514955299594277296">A webhelyek nem menthetnek adatokat az eszközre (nem ajánlott)</translation> <translation id="8517759303731677493">Szerkesztés…</translation> <translation id="8519895319663397036">Nem lehet importálni a jelszavakat. A fájl mérete nem érheti el a 150 kB-ot.</translation> +<translation id="851991974800416566">Gyorsan erős jelszót használhat</translation> <translation id="8523493869875972733">Módosítások megtartása</translation> <translation id="8523849605371521713">Házirend adta hozzá</translation> <translation id="8524783101666974011">Kártyák mentése a Google-fiókjába</translation> @@ -8753,6 +8776,7 @@ <translation id="8665110742939124773">Helytelen hozzáférési kódot adott meg. Próbálja újra.</translation> <translation id="8665180165765946056">A biztonsági mentés befejeződött</translation> <translation id="866611985033792019">Bízzon meg ebben a tanúsítványban e-mail-felhasználók azonosításakor</translation> +<translation id="8666268818656583275">Az F-billentyűk most a rendszer felső sorának billentyűiként viselkednek</translation> <translation id="8666321716757704924">Újból megadta az engedélyeket a következő számára: <ph name="WEBSITE" /></translation> <translation id="8666759526542103597">A hirdetések böngészőalapú személyre szabásáról</translation> <translation id="8667261224612332309">Vannak olyan jelszavai, amelyeken lehet javítani</translation> @@ -9435,6 +9459,7 @@ <translation id="950307215746360464">Beállítási útmutató</translation> <translation id="951991426597076286">Elutasítás</translation> <translation id="952471655966876828">Az eszköz automatikusan csatlakozik, amikor bekapcsolásra kerül, vagy használatban van</translation> +<translation id="952880932803612259">A tartózkodási hely használatának engedélyezése az alkalmazások, a webhelyek és a rendszerszolgáltatások számára. Eszköze helyének meghatározásához a helyszolgáltatás a Wi-Fi- és mobilhálózatok, továbbá az érzékelők adatait használhatja fel.</translation> <translation id="953434574221655299">Tudhatják, hogy Ön mikor használja aktívan az eszközt</translation> <translation id="956500788634395331">Védelmet élvez a potenciálisan kártékony bővítményekkel szemben</translation> <translation id="957179356621191750">6 pontos</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb index a186c0eb..c3ac7e4 100644 --- a/chrome/app/resources/generated_resources_hy.xtb +++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">Ներդիրը կրկին ակտիվ է</translation> <translation id="1003088604756913841">Բացել հղումը նոր <ph name="APP" /> պատուհանում</translation> <translation id="100323615638474026">USB սարք (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Google Ապահով դիտարկում</translation> <translation id="1004218526896219317">Կայքի հասանելիություն</translation> <translation id="1005274289863221750">Օգտագործել ձեր խոսափողը և տեսախցիկը</translation> <translation id="1005333234656240382">Միացնե՞լ ADB վրիպազերծումը</translation> @@ -904,6 +905,7 @@ <translation id="1769104665586091481">Բացել հղումը նոր &պատուհանով</translation> <translation id="1770407692401984718">Քաշեք պատկերն այստեղ կամ</translation> <translation id="177053719077591686">Android-ի հավելվածների պահուստավորումը Google Drive-ում</translation> +<translation id="1771075623623424448">Դիտարկիչի սարքերի մատյա՞նն եք փնտրում։ Անցեք <ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" />։</translation> <translation id="177336675152937177">Խնամվող հավելվածների տվյալները</translation> <translation id="1776712937009046120">Ավելացնել օգտատեր</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> @@ -1686,6 +1688,15 @@ <translation id="2422125132043002186">Լինուքսի վերականգնումը չեղարկվել է</translation> <translation id="2423578206845792524">Պա&հել պատկերը որպես…</translation> <translation id="2424424966051154874">{0,plural, =1{Հյուր}one{Հյուր (#)}other{Հյուր (#)}}</translation> +<translation id="242684489663276773">Այս գործողության արդյունքում տեղի կունենա հետևյալը․ + <ph name="LINE_BREAKS" /> + • Chrome-ի որոշ կարգավորումներ և դյուրանցումներ կզրոյացվեն + <ph name="LINE_BREAK" /> + • Ընդլայնումները կանջատվեն + <ph name="LINE_BREAK" /> + • Քուքիները և կայքերի մյուս ժամանակավոր տվյալները կջնջվեն + <ph name="LINE_BREAKS" /> + Էջանիշները, պատմությունը և պահված գաղտնաբառերը կպահպանվեն</translation> <translation id="2428510569851653187">Նկարագրեք ձեր գործողությունները նախքան ներդիրի աշխատանքի խափանվելը</translation> <translation id="2428939361789119025">Անջատել Wi-Fi-ը</translation> <translation id="2428978615149723410">այս զամբյուղները</translation> @@ -4461,6 +4472,7 @@ <translation id="4876895919560854374">Կողպել և ապակողպել էկրանը</translation> <translation id="4877276003880815204">Ստուգել տարրերը</translation> <translation id="4877652723592270843">Ակտիվացնե՞լ ChromeVox-ը՝ էկրանի ներկառուցված ընթերցիչը ChromeOS Flex-ի համար։ Եթե այո, ապա սեղմեք և հինգ վայրկյան պահեք ձայնի ուժգնության երկու կոճակները։</translation> +<translation id="4878261017150799673">Թողնել կայքն ակտիվ</translation> <translation id="4878634973244289103">Չհաջողվեց ուղարկել կարծիքը։ Փորձեք ավելի ուշ։</translation> <translation id="4878653975845355462">Ձեր ադմինիստրատորն անջատել է անհատականացված ֆոները։</translation> <translation id="4878718769565915065">Չհաջողվեց ավելացնել մատնահետք անվտանգության այս բանալուն</translation> @@ -5250,6 +5262,9 @@ <translation id="5602765853043467355">Մաքրել այս սարքի էջանիշները, պատմությունը, գաղտնաբառերն ու մյուս տվյալները</translation> <translation id="5605758115928394442">Ձեր ինքնությունը հաստատելու համար ձեր հեռախոսին ծանուցում է ուղարկվել:</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{Այս ընդլայնումն արգելափակված է}one{Այս ընդլայնումն արգելափակված է}other{Այս ընդլայնումներն արգելափակված են}}</translation> +<translation id="560743070587960985">Այս ֆայլը կարող է վիրուս կամ վնասագիր լինել։ + +Ուղարկեք Google-ին՝ ստուգելու, թե արդյոք ֆայլն անվտանգ է։ Սկանավորումը սովորաբար մի քանի վայրկյան է տևում։</translation> <translation id="560834977503641186">Մանրամասն Wi-Fi համաժամացման մասին</translation> <translation id="5608580678041221894">Սեղմեք հետևյալ ստեղները` եզրատվող տարածքը ճշգրտելու կամ տեղաշարժելու համար</translation> <translation id="5609231933459083978">Հավելվածն անվավեր է:</translation> @@ -5984,6 +5999,7 @@ <translation id="6254892857036829079">Կատարյալ</translation> <translation id="6257602895346497974">Միացնել համաժամացումը…</translation> <translation id="62586649943626337">Միավորեք ներդիրները խմբերում</translation> +<translation id="6260092874648348841">Թողնել կայքն ակտիվ</translation> <translation id="6262371516389954471">Կրկնօրինակները վերբեռնվում են Google և գաղտնագրվում ձեր Google հաշվի գաղտնաբառի միջոցով։</translation> <translation id="6263082573641595914">Microsoft-ի CA-ի տարբերակ</translation> <translation id="6263284346895336537">Ոչ վճռական</translation> @@ -7523,6 +7539,7 @@ <translation id="7634280112532283638">Պայքար սպամի և խարդախության դեմ</translation> <translation id="7634337648687970851">Սարքի տվյալների վերականգնումն այս պահին չի աջակցվում։</translation> <translation id="7634566076839829401">Ինչ-որ սխալ առաջացավ: Նորից փորձեք:</translation> +<translation id="763472884969134151">Վերլուծությունը կատարվել է <ph name="LINK" />-ի կողմից</translation> <translation id="7635048370253485243">Ամրացվել է ադմինիստրատորի կողմից</translation> <translation id="7635711411613274199">Գովազդի անհատականացումը կախված է այս կարգավորումից, <ph name="BEGIN_LINK1" />գովազդի թեմաներից<ph name="LINK_END1" />, <ph name="BEGIN_LINK2" />քուքիների կարգավորումներից<ph name="LINK_END2" /> և այն կայքի կարգավորումներից, որը դուք դիտում եք</translation> <translation id="7636919061354591437">Տեղադրել այս սարքում</translation> @@ -8200,6 +8217,7 @@ <translation id="8195737548602430447">Ավտոմատ թարգմանել ենթագրերը թիրախային լեզվով։</translation> <translation id="8197673340773315084">Ավելացրեք անվանում կամ պիտակ, օրինակ՝ «Աշխատանքային» կամ «Անձնական»</translation> <translation id="8198456017687137612">Ներդիրի հեռարձակում</translation> +<translation id="8198457270656084773">Համակարգի սարքերի մատյա՞նն եք փնտրում։ Անցեք <ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" />։</translation> <translation id="8198511718495409170">Կայքի թարմացված կարգավորումները «<ph name="EXTENSION_NAME" />» ընդլայնումում կիրառելու համար վերաբեռնեք այս էջը</translation> <translation id="8199300056570174101">Ցանցի (ծառայության) և սարքի կարգավորումներ</translation> <translation id="8200772114523450471">Շարունակել</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index 894c521..ee9cf7d 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -528,6 +528,7 @@ <translation id="146000042969587795">Bingkai ini diblokir karena berisi sejumlah konten tidak aman.</translation> <translation id="1461041542809785877">Performa</translation> <translation id="1461177659295855031">Pindahkan ke folder Kolom Bookmark</translation> +<translation id="1461288887896722288">Anda baru saja login ke akun terkelola. Membuat profil terkelola baru akan membuat Anda dapat mengakses beberapa resource yang ditautkan ke akun tersebut.</translation> <translation id="146219525117638703">Status ONC</translation> <translation id="146220085323579959">Internet terputus. Periksa koneksi internet Anda dan coba lagi.</translation> <translation id="1462850958694534228">Tinjau pembaruan ikon</translation> @@ -1892,6 +1893,7 @@ <translation id="2575407791320728464">URL tidak valid. Pastikan URL diformat dengan benar.</translation> <translation id="2575441894380764255">Tidak diizinkan menampilkan iklan yang mengganggu atau menyesatkan</translation> <translation id="2575713839157415345">{YEARS,plural, =1{Perangkat ini akan disimpan selama 1 tahun dan Anda dapat terhubung pada waktu berikutnya tanpa kode. Ini disetel oleh administrator Anda.}other{Perangkat ini akan disimpan selama {YEARS} tahun dan Anda dapat terhubung pada waktu berikutnya tanpa kode. Ini disetel oleh administrator Anda.}}</translation> +<translation id="2577446426265992344">tanpa Omnibox</translation> <translation id="257779572837908839">Siapkan sebagai Chromebox untuk meeting</translation> <translation id="2579309488038515659">Hotspot diaktifkan</translation> <translation id="2579596474754516455">Pindai gambar PDF guna mengonversi teks untuk pembaca layar saat diperlukan</translation> @@ -6589,6 +6591,7 @@ <translation id="6787097042755590313">Tab Lainnya</translation> <translation id="6787839852456839824">Pintasan keyboard</translation> <translation id="6788210894632713004">Ektensi yang belum dibuka</translation> +<translation id="678939393857169499">Memungkinkan desain desktop baru.</translation> <translation id="6789592661892473991">Pisahkan Horizontal</translation> <translation id="6789834167207639931">Masukkan sandi Akun Google Anda lagi di layar berikutnya untuk menyelesaikan pemulihan</translation> <translation id="6790428901817661496">Putar</translation> @@ -7385,6 +7388,7 @@ <translation id="7481312909269577407">Maju</translation> <translation id="7481358317100446445">Siap</translation> <translation id="748138892655239008">Kendala Dasar Sertifikat</translation> +<translation id="7483145199632798061">Chrome Refresh 2023</translation> <translation id="7484645889979462775">Jangan untuk situs ini</translation> <translation id="7487141338393529395">Aktifkan fitur Periksa Ejaan yang Disempurnakan</translation> <translation id="7487969577036436319">Tidak ada komponen yang dipasang</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index 4ce23c42..877f813 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -2549,7 +2549,7 @@ <translation id="3160928651883997588">Preferenze VPN</translation> <translation id="3161522574479303604">Tutte le lingue</translation> <translation id="3162853326462195145">Account della scuola</translation> -<translation id="3162899666601560689">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</translation> +<translation id="3162899666601560689">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.</translation> <translation id="3163201441334626963">Prodotto sconosciuto <ph name="PRODUCT_ID" /> del fornitore <ph name="VENDOR_ID" /></translation> <translation id="3163511056918491211">Ripristina i dati o cambia dispositivo facilmente in qualsiasi momento. Le copie di backup vengono caricate su Google e criptate usando la password del tuo Account Google.</translation> <translation id="3164329792803560526">Condivisione di questa scheda con <ph name="APP_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index f76e8bb..a42ffe4 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">הכרטיסייה חזרה לפעול</translation> <translation id="1003088604756913841">פתיחת הקישור בחלון חדש של <ph name="APP" /></translation> <translation id="100323615638474026">התקן USB (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">גלישה בטוחה של Google</translation> <translation id="1004218526896219317">גישה לאתרים</translation> <translation id="1005274289863221750">להשתמש במיקרופון ובמצלמה</translation> <translation id="1005333234656240382">להפעיל ניפוי באגים באמצעות ADB?</translation> @@ -527,6 +528,7 @@ <translation id="146000042969587795">מסגרת זו נחסמה משום שהיא מכילה תוכן לא בטוח.</translation> <translation id="1461041542809785877">ביצועים</translation> <translation id="1461177659295855031">העברה לתיקייה 'סרגל הסימניות'</translation> +<translation id="1461288887896722288">נכנסת לחשבון מנוהל. יצירת פרופיל מנוהל חדש תאפשר לך לגשת לחלק מהמשאבים שמקושרים לחשבון הזה.</translation> <translation id="146219525117638703">מצב ONC</translation> <translation id="146220085323579959">האינטרנט מנותק. יש לבדוק את חיבור האינטרנט שלך ולנסות שוב.</translation> <translation id="1462850958694534228">בדיקת העדכון של הסמל</translation> @@ -909,6 +911,7 @@ <translation id="1769104665586091481">פתיחת קישור &בחלון חדש</translation> <translation id="1770407692401984718">אפשר לגרור לכאן תמונה או</translation> <translation id="177053719077591686">גיבוי אפליקציות ל-Android ב-Google Drive.</translation> +<translation id="1771075623623424448">רוצה לאתר את דף יומן המכשיר של הדפדפן? צריך לעבור אל <ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="177336675152937177">נתוני יישומים מתארחים</translation> <translation id="1776712937009046120">הוספת משתמש</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> @@ -1692,6 +1695,15 @@ <translation id="2422125132043002186">שחזור Linux בוטל</translation> <translation id="2423578206845792524">שמ&ירת תמונה בשם...</translation> <translation id="2424424966051154874">{0,plural, =1{מצב אורח}one{מצב אורח (#)}two{מצב אורח (#)}other{מצב אורח (#)}}</translation> +<translation id="242684489663276773">בעקבות האיפוס: + <ph name="LINE_BREAKS" /> + • יתאפסו חלק מההגדרות ומקיצורי הדרך של Chrome + <ph name="LINE_BREAK" /> + • התוספים יושבתו + <ph name="LINE_BREAK" /> + • יימחקו קובצי cookie ונתונים זמניים אחרים מאתרים + <ph name="LINE_BREAKS" /> + לא תהיה השפעה על סימניות, היסטוריה וסיסמאות שמורות.</translation> <translation id="2428510569851653187">יש לתאר מה עשית לפני שהכרטיסייה קרסה</translation> <translation id="2428939361789119025">כיבוי Wi-Fi</translation> <translation id="2428978615149723410">עגלות הקניות האלה</translation> @@ -1875,6 +1887,7 @@ <translation id="2575407791320728464">כתובת ה-URL לא תקינה. יש לוודא שהפורמט שלה תקין.</translation> <translation id="2575441894380764255">לא מורשים להציג מודעות מפריעות או מטעות</translation> <translation id="2575713839157415345">{YEARS,plural, =1{המכשיר הזה יישמר למשך שנה אחת ותהיה לך אפשרות להתחבר ללא קוד בפעם הבאה. ההגדרה נקבעת על ידי האדמין שלך.}one{המכשיר הזה יישמר למשך {YEARS} שנים ותהיה לך אפשרות להתחבר ללא קוד בפעם הבאה. ההגדרה נקבעת על ידי האדמין שלך.}two{המכשיר הזה יישמר למשך שנתיים ({YEARS}) ותהיה לך אפשרות להתחבר ללא קוד בפעם הבאה. ההגדרה נקבעת על ידי האדמין שלך.}other{המכשיר הזה יישמר למשך {YEARS} שנים ותהיה לך אפשרות להתחבר ללא קוד בפעם הבאה. ההגדרה נקבעת על ידי האדמין שלך.}}</translation> +<translation id="2577446426265992344">ללא סרגל הכתובות</translation> <translation id="257779572837908839">הגדרה כ-Chromebox לניהול פגישות</translation> <translation id="2579309488038515659">הפעלת הנקודה לשיתוף האינטרנט</translation> <translation id="2579596474754516455">במקרה הצורך, ניתן לסרוק תמונות ב-PDF כדי להמיר טקסט לקורא המסך</translation> @@ -4447,6 +4460,7 @@ <translation id="4876895919560854374">נעילה ושחרור של המסך</translation> <translation id="4877276003880815204">בדיקת רכיבים</translation> <translation id="4877652723592270843">רוצה להפעיל את ChromeVox, קורא המסך המובנה של ChromeOS Flex? אם כן, יש ללחוץ לחיצה ארוכה על 2 הלחצנים של עוצמת הקול למשך 5 שניות.</translation> +<translation id="4878261017150799673">שמירה על האתר פעיל</translation> <translation id="4878634973244289103">לא ניתן לשלוח משוב. ניתן לנסות שוב מאוחר יותר.</translation> <translation id="4878653975845355462">מנהל המערכת השבית את הרקעים המותאמים אישית</translation> <translation id="4878718769565915065">הוספה של טביעת אצבע אל מפתח האבטחה הזה נכשלה</translation> @@ -5231,6 +5245,9 @@ <translation id="5602765853043467355">ניקוי הסימניות, ההיסטוריה, הסיסמאות ונתונים נוספים מהמכשיר הזה</translation> <translation id="5605758115928394442">הודעה נשלחה לטלפון שלך כדי לאשר את זהותך.</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{התוסף הזה נחסם}one{התוספים האלה נחסמו}two{התוספים האלה נחסמו}other{התוספים האלה נחסמו}}</translation> +<translation id="560743070587960985">הקובץ עשוי להיות וירוס או תוכנה זדונית. + +ניתן לשלוח אותו ל-Google כדי לבדוק אם הוא לא בטוח. בדרך כלל סריקות נמשכות כמה שניות.</translation> <translation id="560834977503641186">מידע נוסף על סנכרון Wi-Fi</translation> <translation id="5608580678041221894">יש להקיש על המקשים הבאים כדי לשנות או להזיז את אזור החיתוך</translation> <translation id="5609231933459083978">נראה שהיישום אינו חוקי.</translation> @@ -5966,6 +5983,7 @@ <translation id="6254892857036829079">מושלם</translation> <translation id="6257602895346497974">הפעלת סנכרון...</translation> <translation id="62586649943626337">מארגנים את הכרטיסיות באמצעות קבוצות כרטיסיות</translation> +<translation id="6260092874648348841">שמירה על האתר פעיל</translation> <translation id="6262371516389954471">הגיבויים נשמרים ב-Google ומוצפנים באמצעות הסיסמה של חשבון Google שלך.</translation> <translation id="6263082573641595914">גרסת רשות אישורים של Microsoft</translation> <translation id="6263284346895336537">לא קריטי</translation> @@ -6546,6 +6564,7 @@ <translation id="6787097042755590313">כרטיסייה אחרת</translation> <translation id="6787839852456839824">מקשי קיצור</translation> <translation id="6788210894632713004">תוסף Unpacked</translation> +<translation id="678939393857169499">הפעלת העיצוב החדש של שולחן העבודה</translation> <translation id="6789592661892473991">פיצול אופקי</translation> <translation id="6789834167207639931">יש להזין שוב את הסיסמה לחשבון Google במסך הבא כדי להשלים את השחזור</translation> <translation id="6790428901817661496">הפעלה</translation> @@ -7335,6 +7354,7 @@ <translation id="7481312909269577407">קדימה</translation> <translation id="7481358317100446445">מוכן</translation> <translation id="748138892655239008">מגבלות בסיסיות של אישור </translation> +<translation id="7483145199632798061">Chrome Refresh 2023</translation> <translation id="7484645889979462775">לעולם לא עבור אתר זה</translation> <translation id="7487141338393529395">הפעלה של בדיקת איות משופרת</translation> <translation id="7487969577036436319">לא מותקנים רכיבים</translation> @@ -7496,6 +7516,7 @@ <translation id="7634280112532283638">הפחתת ספאם והונאות</translation> <translation id="7634337648687970851">בשלב זה, אין תמיכה בשחזור נתונים מקומיים.</translation> <translation id="7634566076839829401">משהו השתבש. יש לנסות שוב.</translation> +<translation id="763472884969134151">הניתוח בוצע על ידי <ph name="LINK" /></translation> <translation id="7635048370253485243">מנהל המערכת הצמיד את התוסף הזה</translation> <translation id="7635711411613274199">במהלך הגלישה, יוצגו מודעות עם או בלי התאמה אישית בהתאם להגדרה הזו, <ph name="BEGIN_LINK1" />לנושאים של המודעות<ph name="LINK_END1" />, ל<ph name="BEGIN_LINK2" />הגדרות קובצי ה-cookie<ph name="LINK_END2" /> ולמצב ההתאמה האישית של מודעות באתר (פעילה או מושבתת)</translation> <translation id="7636919061354591437">התקנה במכשיר זה</translation> @@ -8173,6 +8194,7 @@ <translation id="8195737548602430447">תרגום אוטומטי של הכתוביות לשפת היעד.</translation> <translation id="8197673340773315084">יש להוסיף שם או תווית, כמו 'עבודה' או 'אישי'</translation> <translation id="8198456017687137612">העברת הכרטיסייה</translation> +<translation id="8198457270656084773">רוצה לאתר את דף יומן המכשיר של המערכת? צריך לעבור אל <ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="8198511718495409170">כדי להחיל באתר הזה את ההגדרות המעודכנות לתוסף '<ph name="EXTENSION_NAME" />', יש לטעון מחדש את הדף</translation> <translation id="8199300056570174101">מאפייני רשת (שירות) ומכשיר</translation> <translation id="8200772114523450471">חידוש</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb index fd7de977..32f51f9 100644 --- a/chrome/app/resources/generated_resources_kk.xtb +++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -525,6 +525,7 @@ <translation id="146000042969587795">Бұл жақтауға тыйым салынды, себебі ол кейбір қауіпті контентті қамтиды.</translation> <translation id="1461041542809785877">Өнімділік</translation> <translation id="1461177659295855031">"Бетбелгілер жолағы" қалтасына жылжыту</translation> +<translation id="1461288887896722288">Жаңа ғана басқарылатын аккаунтқа кірдіңіз, жаңа басқарылатын профиль жасау әрекеті сол аккаунтпен байланыстырылған кейбір ресурстарды пайдалануға мүмкіндік береді.</translation> <translation id="146219525117638703">ONC күйі</translation> <translation id="146220085323579959">Интернет ажыратылды. Интернет байланысын тексеріп, әрекетті қайталаңыз.</translation> <translation id="1462850958694534228">Өзгертілген белгішені қарау</translation> @@ -1874,6 +1875,7 @@ <translation id="2575407791320728464">URL мекенжайы жарамсыз. Оның дұрыс форматталғанына көз жеткізіңіз.</translation> <translation id="2575441894380764255">Мазалайтын немесе жалған ақпаратты жарнамаларды көрсетуге рұқсаты жоқтар</translation> <translation id="2575713839157415345">{YEARS,plural, =1{Бұл құрылғы 1 жыл сақталады және келесіде кодсыз қосыла аласыз. Оны әкімші орнатады.}other{Бұл құрылғы {YEARS} жыл сақталады және келесіде кодсыз қосыла аласыз. Оны әкімші орнатады.}}</translation> +<translation id="2577446426265992344">Omnibox жолағынсыз</translation> <translation id="257779572837908839">Кездесулерге арналған Chromebox құрылғысы ретінде реттеу</translation> <translation id="2579309488038515659">Хотспотты қосу</translation> <translation id="2579596474754516455">Қажет кезде экран оқу құралына мәтінді түрлендіру үшін PDF кескіндерін сканерлеу</translation> @@ -6567,6 +6569,7 @@ <translation id="6787097042755590313">Басқа қойынды</translation> <translation id="6787839852456839824">Пернелер тіркесімі</translation> <translation id="6788210894632713004">Пакеттен шығарылған кеңейтім</translation> +<translation id="678939393857169499">Жаңа жұмыс үстелі дизайнын қосады.</translation> <translation id="6789592661892473991">Көлденеңінен бөлу</translation> <translation id="6789834167207639931">Қалпына келтіруді аяқтау үшін келесі экранда Google аккаунтының құпия сөзін қайта енгізіңіз.</translation> <translation id="6790428901817661496">Ойнату</translation> @@ -7363,6 +7366,7 @@ <translation id="7481312909269577407">Басқаға жіберу</translation> <translation id="7481358317100446445">Дайын</translation> <translation id="748138892655239008">Сертификаттың негізгі шектеулері</translation> +<translation id="7483145199632798061">Chrome 2023 жаңартуы</translation> <translation id="7484645889979462775">Бұл сайт үшін ешқашан</translation> <translation id="7487141338393529395">Жетілдірілген емле тексеру құралын іске қосу</translation> <translation id="7487969577036436319">Құрамдастар орнатылмаған</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb index 9349e8f8..6fa12c4 100644 --- a/chrome/app/resources/generated_resources_km.xtb +++ b/chrome/app/resources/generated_resources_km.xtb
@@ -204,6 +204,7 @@ <translation id="1166212789817575481">បិទផ្ទាំងទៅខាងស្តាំ</translation> <translation id="1166583374608765787">ពិនិត្យមើលការប្ដូរឈ្មោះ</translation> <translation id="1166596238782048887"><ph name="TAB_TITLE" /> ជារបស់តុ <ph name="DESK_TITLE" /></translation> +<translation id="1167262726334064738">សាកល្បងប្រើពាក្យសម្ងាត់ថ្មី</translation> <translation id="1168020859489941584">កំពុងបើកនៅក្នុង <ph name="TIME_REMAINING" />...</translation> <translation id="116896278675803795">ប្ដូរភាសាដោយស្វ័យប្រវត្តិ ដើម្បីឱ្យត្រូវនឹងខ្លឹមសារដែលបានជ្រើសរើស</translation> <translation id="1169266963600477608">ការគ្រប់គ្រងហ្គេម</translation> @@ -918,6 +919,7 @@ <translation id="177336675152937177">ទិន្នន័យកម្មវិធីតំឡើងលើអ៊ីនធឺណិត</translation> <translation id="1776712937009046120">បន្ថែមអ្នកប្រើ</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="177814385589420211">ចុចប៊ូតុងស្វែងរកឱ្យជាប់ ដើម្បីប្ដូររវាងគ្រាប់ចុច Function និងគ្រាប់ចុចជួរខាងលើរបស់ប្រព័ន្ធ</translation> <translation id="1778457539567749232">សម្គាល់ថាមិនទាន់អាន</translation> <translation id="1778991607452011493">ផ្ញើកំណត់ហេតុនៃការជួសជុល (បានណែនាំ)</translation> <translation id="1779441632304440041">ពាក្យសម្ងាត់ខ្សោយមានភាពងាយស្រួលក្នុងការទាយ។ សូមប្រាកដថាអ្នកកំពុងបង្កើតពាក្យសម្ងាត់ខ្លាំង។</translation> @@ -1360,6 +1362,7 @@ <translation id="2142582065325732898">បើក <ph name="LINK1_BEGIN" />Chrome សមកាលកម្ម<ph name="LINK1_END" /> ដើម្បីមើលផ្ទាំង Chrome ថ្មីៗ។ <ph name="LINK2_BEGIN" />ស្វែងយល់បន្ថែម<ph name="LINK2_END" /></translation> <translation id="2143765403545170146">បង្ហាញរបារឧបករណ៍ពេញអេក្រង់ជានិច្ច</translation> <translation id="2143778271340628265">ការតំឡើងប្រូកស៊ីដោយខ្លូនឯង</translation> +<translation id="2143808295261240440">ប្រើពាក្យសម្ងាត់ដែលបានណែនាំ</translation> <translation id="2143915448548023856">បង្ហាញការកំណត់</translation> <translation id="2144536955299248197">អ្នកមើលដែលមានវិញ្ញាបនប័ត្រ <ph name="CERTIFICATE_NAME" /></translation> <translation id="2144557304298909478">ការអភិវឌ្ឍកម្មវិធី Android នៅក្នុង Linux</translation> @@ -2348,6 +2351,7 @@ <translation id="2963151496262057773">កម្មវិធីជំនួយខាងក្រោមគ្មានការឆ្លើយតប៖ <ph name="PLUGIN_NAME" />តើអ្នកចង់បញ្ឈប់វាឬទេ?</translation> <translation id="2964193600955408481">បិទដំណើរការ Wi-Fi</translation> <translation id="2964245677645334031">លទ្ធភាពមើលឃើញការចែករំលែកនៅជិត</translation> +<translation id="2966705348606485669">ជម្រើសច្រើនទៀតសម្រាប់ថតចំណាំ <ph name="FOLDER_TITLE" /></translation> <translation id="2966937470348689686">គ្រប់គ្រងចំណូលចិត្ត Android</translation> <translation id="2967926928600500959">URL ដែលត្រូវនឹងវិធានទាំងនេះនឹងត្រូវបានបង្ខំឱ្យបើកនៅក្នុងកម្មវិធីរុករកតាមអ៊ីនធឺណិតជាក់លាក់។</translation> <translation id="2972581237482394796">ធ្វើវិញ</translation> @@ -2637,6 +2641,7 @@ <translation id="3244294424315804309">បន្តបិទសំឡេង</translation> <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> - បណ្តាញមានបញ្ហា</translation> <translation id="3248902735035392926">សុវត្ថិភាពពិតជាសំខាន់។ ចំណាយពេលបន្តិច ដើម្បី<ph name="BEGIN_LINK" />ពិនិត្យមើលកម្មវិធីបន្ថែមរបស់អ្នកឥឡូវនេះ<ph name="END_LINK" /></translation> +<translation id="3249323165366527554">ចុះឈ្មោះ រួចចូលគណនីបានកាន់តែរហ័ស នៅពេលដែលពាក្យសម្ងាត់របស់អ្នកត្រូវបានរក្សាទុកដោយស្វ័យប្រវត្តិនៅក្នុង<ph name="GOOGLE_PASSWORD_MANAGER" />សម្រាប់ <ph name="EMAIL" />។</translation> <translation id="3251714896659475029">អនុញ្ញាតឱ្យ <ph name="SUPERVISED_USER_NAME" /> ចូលប្រើ Google ជំនួយការដោយនិយាយថា “Ok Google”</translation> <translation id="3251759466064201842"><មិនមែនផ្នែកនៃវិញ្ញាបនប័ត្រទេ></translation> <translation id="325238099842880997">កំណត់គោលការណ៍មូលដ្ឋានផ្នែកឌីជីថល ដើម្បីជួយដល់ការលេង ការរុករក និងការធ្វើកិច្ចការសាលារបស់កុមារនៅផ្ទះ</translation> @@ -4132,6 +4137,7 @@ <translation id="4556194354084985730">ចូលគេហទំព័រ និងកម្មវិធីបានយ៉ាងងាយស្រួលដោយប្រើពាក្យសម្ងាត់ដែលបានរក្សាទុករបស់អ្នក។ នៅពេលបិទ អ្នកនឹងត្រូវបានសួរ មុនពេលចូល។</translation> <translation id="4558426062282641716">ការអនុញ្ញាតបើកដំណើរការដោយស្វ័យប្រវត្តិត្រូវបានស្នើសុំ</translation> <translation id="4559617833001311418">គេហទំព័រនេះកំពុងចូលប្រើឧបករណ៍ចាប់ពន្លឺ ឬឧបករណ៍ចាប់ចលនារបស់អ្នក។</translation> +<translation id="4560728518401799797">ជម្រើសច្រើនទៀតសម្រាប់ចំណាំ <ph name="FOLDER_TITLE" /></translation> <translation id="4561893854334016293">មិនមានការអនុញ្ញាតដែលបានផ្លាស់ប្ដូរថ្មីៗទេ</translation> <translation id="4562155214028662640">បញ្ចូលស្នាមម្រាមដៃ</translation> <translation id="4563210852471260509">ភាសាបញ្ចូលដើមគឺភាសាចិន</translation> @@ -4415,6 +4421,7 @@ <translation id="4819323978093861656">{0,plural, =0{កំពុងបិទឥឡូវនេះ។}=1{នឹងបិទក្នុងរយៈពេល៖ 1 វិនាទី}other{នឹងបិទក្នុងរយៈពេល៖ # វិនាទី}}</translation> <translation id="4819607494758673676">ការជូនដំណឹងរបស់ Google ជំនួយការ</translation> <translation id="4820236583224459650">កំណត់ជាសំបុត្រសកម្ម</translation> +<translation id="4820795723433418303">ប្រើគ្រាប់ចុច Function ជាគ្រាប់ចុចជួរខាងលើ</translation> <translation id="4821935166599369261">បើកដំណើរការទម្រង់</translation> <translation id="4823484602432206655">អាន និងប្តូរអ្នកប្រើប្រាស់ និងការកំណត់ឧបករណ៍</translation> <translation id="4824037980212326045">ការបម្រុងទុក និងការស្ដារ Linux</translation> @@ -4546,6 +4553,7 @@ <translation id="4925320384394644410">ច្រករបស់អ្នកនឹងបង្ហាញនៅទីនេះ</translation> <translation id="49265687513387605">មិនអាចភ្ជាប់អេក្រង់បានទេ។ សូមពិនិត្យមើលថាតើអ្នកបានបញ្ជាក់លើសារដែលប្រាប់ឱ្យចាប់ផ្ដើមចែករំលែកអេក្រង់របស់អ្នកឬអត់។</translation> <translation id="4927753642311223124">គ្មានអ្វីដែលគួរមើលនៅទីនេះទេ ទៅមុខបន្ត។</translation> +<translation id="4928629450964837566">ប្រើពាក្យសម្ងាត់ដែលកាន់តែមានសុវត្ថិភាព</translation> <translation id="4929386379796360314">ទិសដៅបោះពុម្ព</translation> <translation id="4930447554870711875">អ្នកអភិវឌ្ឍន៍</translation> <translation id="4930714375720679147">បើក</translation> @@ -4628,6 +4636,7 @@ <translation id="5010886807652684893">ទិដ្ឋភាពមើលឃើញ</translation> <translation id="5015344424288992913">កំពុងដោះស្រាយប្រូកស៊ី...</translation> <translation id="5016491575926936899">អ្នកអាចផ្ញើសារជាអក្សរពីកុំព្យូទ័រ ចែករំលែកការតភ្ជាប់អ៊ីនធឺណិត ឆ្លើយតបនឹងការជូនដំណឹងអំពីការសន្ទនា និងដោះសោ <ph name="DEVICE_TYPE" /> របស់អ្នកដោយប្រើទូរសព្ទរបស់អ្នក។<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />ស្វែងយល់បន្ថែម<ph name="LINK_END" /></translation> +<translation id="5016983299133677671">សាកល្បងប្រើពាក្យសម្ងាត់ថ្មី</translation> <translation id="5017643436812738274">អ្នកអាចរុករកទំព័រដោយប្រើទស្សន៍ទ្រនិចអក្សរ។ ចុច Ctrl+Search+7 ដើម្បីបិទ។</translation> <translation id="5018207570537526145">បើកគេហទំព័រកម្មវិធីបន្ថែម</translation> <translation id="5018526990965779848">បញ្ជូនទិន្នន័យនៃការប្រើប្រាស់ និងការវិភាគ។ ជួយធ្វើឱ្យបទពិសោធន៍ប្រើប្រាស់ Android របស់អ្នកប្រសើរឡើង ដោយបញ្ជូនទិន្នន័យនៃការវិភាគ ឧបករណ៍ និងការប្រើប្រាស់កម្មវិធីទៅ Google ដោយស្វ័យប្រវត្តិ។ ការធ្វើបែបនេះនឹងជួយដល់ស្ថិរភាពកម្មវិធី និងប្រព័ន្ធ ព្រមទាំងការកែលម្អផ្សេងទៀត។ ទិន្នន័យប្រមូលបានមួយចំនួនក៏នឹងជួយដល់កម្មវិធី និងដៃគូ Google ដូចជាអ្នកអភិវឌ្ឍន៍ Android ផងដែរ។ ប្រសិនបើការកំណត់សកម្មភាពកម្មវិធី និងគេហទំព័របន្ថែមរបស់អ្នកត្រូវបានបើក នោះទិន្នន័យនេះអាចត្រូវបានរក្សាទុកទៅក្នុងគណនី Google របស់អ្នក។</translation> @@ -4696,6 +4705,7 @@ <translation id="5078638979202084724">ចំណាំផ្ទាំងទាំងអស់</translation> <translation id="5078796286268621944">លេខសម្គាល់មិនត្រឹមត្រូវ</translation> <translation id="5079010647467150187">បញ្ចូល VPN ដែលភ្ជាប់មកជាមួយស្រាប់...</translation> +<translation id="5079699784114005398">ពេលបើក កម្មវិធីរបស់អ្នកនឹងអាចប្រើបាននៅលើឧបករណ៍ ChromeOS ទាំងឡាយ បន្ទាប់ពីអ្នកចូលដោយប្រើគណនី Google របស់អ្នក។ កម្មវិធីវេបដែលបានដំឡើងពីកម្មវិធីរុករកតាមអ៊ីនធឺណិត Chrome នឹងត្រូវបានធ្វើសមកាលកម្ម ទោះបីជាបិទសមកាលកម្មកម្មវិធីរុករកតាមអ៊ីនធឺណិតក៏ដោយ។</translation> <translation id="508059534790499809">ផ្ទុកសំបុត្រ Kerberos ឡើងវិញ</translation> <translation id="5081960376148623587">ជ្រើសរើសថាតើត្រូវផ្ទុកទំព័រជាមុនឬអត់</translation> <translation id="5084328598860513926">ដំណើរការរៀបចំត្រូវបានកាត់ផ្ដាច់។ សូមព្យាយាមម្ដងទៀត ឬទាក់ទងអ្នកគ្រប់គ្រង ឬម្ចាស់ឧបករណ៍របស់អ្នក។ លេខកូដបញ្ហា៖ <ph name="ERROR_CODE" />។</translation> @@ -4771,6 +4781,7 @@ <translation id="5145464978649806571">ប្រសិនបើអ្នកចេញឆ្ងាយពីឧបករណ៍របស់អ្នក អេក្រង់របស់អ្នកនឹងចាក់សោដោយស្វ័យប្រវត្តិ។ នៅពេលអ្នកស្ថិតនៅពីមុខឧបករណ៍របស់អ្នក អេក្រង់របស់អ្នកនឹងទុកឱ្យបើកចោលកាន់តែយូរ។ ប្រសិនបើបិទអេក្រង់ចាក់សោ ឧបករណ៍របស់អ្នកនឹងដេកជំនួសឱ្យការចាក់សោ។</translation> <translation id="514575469079499857">ប្រើអាសយដ្ឋាន IP របស់អ្នក ដើម្បីកំណត់ទីតាំង (លំនាំដើម)</translation> <translation id="5146896637028965135">សំឡេងរបស់ប្រព័ន្ធ</translation> +<translation id="5147992672778369947">ប្រើពាក្យសម្ងាត់ដែលបានណែនាំ</translation> <translation id="5148277445782867161">សេវាកម្មទីតាំងរបស់ Google ប្រើប្រាស់ប្រភពដូចជា Wi-Fi, បណ្ដាញទូរសព្ទចល័ត និងឧបករណ៍ចាប់សញ្ញាផ្សេងៗ ដើម្បីជួយប៉ាន់ស្មានទីតាំងរបស់ឧបករណ៍អ្នក។</translation> <translation id="5150254825601720210">ឈ្មោះម៉ាស៊ីនមេ SSL វិញ្ញបនប័ត្រ Netscape</translation> <translation id="5151354047782775295">បង្កើនទំហំផ្ទុកក្នុងថាស បើមិនដូច្នោះទេ ទិន្នន័យដែលបានជ្រើសនឹងត្រូវបានលុបដោយស្វ័យប្រវត្តិ</translation> @@ -5057,6 +5068,7 @@ <translation id="5414566801737831689">អានរូបតំណាងគេហទំព័រដែលអ្នកទៅកាន់</translation> <translation id="5414836363063783498">កំពុងផ្ទៀងផ្ទាត់…</translation> <translation id="5417312524372586921">រចនាប័ទ្មកម្មវិធីរុករកតាមអ៊ីនធឺណិត</translation> +<translation id="5417353542809767994">ប្រើពាក្យសម្ងាត់ខ្លាំងបានយ៉ាងរហ័ស</translation> <translation id="541737483547792035">ពង្រីកអេក្រង់</translation> <translation id="5419405654816502573">Voice Match</translation> <translation id="5420274697768050645">តម្រូវឱ្យមានពាក្យសម្ងាត់ ដើម្បីដោះសោឧបករណ៍សម្រាប់សុវត្ថិភាពបន្ថែម</translation> @@ -5177,6 +5189,7 @@ <translation id="5517412723934627386"><ph name="NETWORK_TYPE" /> - <ph name="NETWORK_DISPLAY_NAME" /></translation> <translation id="5518949581554491184">រៀបចំដោយប្រើទូរសព្ទ Android</translation> <translation id="5519195206574732858">LTE</translation> +<translation id="5519900055135507385">រក្សាគណនីនេះឱ្យកាន់តែមានសុវត្ថិភាពដោយប្រើពាក្យសម្ងាត់ខ្លាំង។ ពាក្យសម្ងាត់នេះនឹងត្រូវបានរក្សាទុកទៅក្នុង<ph name="GOOGLE_PASSWORD_MANAGER" />សម្រាប់ <ph name="EMAIL" />។</translation> <translation id="5521078259930077036">តើនេះជាទំព័រដើមដែលអ្នកចង់បានឬ?</translation> <translation id="5522156646677899028">កម្មវិធីបន្ថែមផ្ទុកភាពងាយរងគ្រោះផ្នែកសុវត្ថិភាពធ្ងន់ធ្ងរ។</translation> <translation id="5522403133543437426">ម៉ាស៊ីនស្វែងរកដែលប្រើនៅក្នុងរបារអាសយដ្ឋាន។</translation> @@ -5796,6 +5809,7 @@ <translation id="6070311415473175157">ជ្រើសរើសផ្ទៃលើរូបភាព ដើម្បីស្វែងរក</translation> <translation id="6071181508177083058">អះអាងពាក្យសម្ងាត់</translation> <translation id="6071576563962215370">ប្រព័ន្ធមិនអាចបង្កើតការចាក់សោលក្ខណៈសម្រាប់រយៈពេលដំឡើងឧបករណ៍បានទេ។</translation> +<translation id="6071938745001252305">សន្សំសំចៃអង្គចងចាំបាន <ph name="MEMORY_VALUE" /></translation> <translation id="6072442788591997866">មិនអនុញ្ញាតឱ្យប្រើ <ph name="APP_NAME" /> នៅលើឧបករណ៍នេះទេ។ សូមទាក់ទងអ្នកគ្រប់គ្រងរបស់អ្នក។ លេខកូដបញ្ហា៖ <ph name="ERROR_CODE" />។</translation> <translation id="6073451960410192870">បញ្ឈប់ការថត</translation> <translation id="6073903501322152803">បន្ថែមលក្ខណៈពិសេសលទ្ធភាពចូលប្រើ</translation> @@ -5843,6 +5857,7 @@ <translation id="6104068876731806426">គណនី Google</translation> <translation id="6104311680260824317">មិនអាចភ្ជាប់ឧបករណ៍ទៅដែនបានទេ។ ម៉ាសីុនមេមិនអាចប្រើប្រភេទអ៊ីនគ្រីប Kerberos ដែលបានបញ្ជាក់ទេ។ សូមពិនិត្យមើល "ជម្រើសច្រើនទៀត" សម្រាប់ការកំណត់ការអ៊ីនគ្រីប។</translation> <translation id="6104796831253957966">ជួរម៉ាស៊ីនបោះពុម្ពពេញហើយ</translation> +<translation id="6104929924898022309">ប្រើប៊ូតុងស្វែងរក ដើម្បីប្ដូរសកម្មភាពគ្រាប់ចុច Function</translation> <translation id="6106167152849320869">ប្រសិនបើអ្នកក៏បានជ្រើសរើសផ្ញើទិន្នន័យប្រើប្រាស់ និងទិន្នន័យវិភាគនៅក្នុងជំហានមុនដែរ ទិន្នន័យនេះនឹងត្រូវបានប្រមូលសម្រាប់កម្មវិធីដែលបានដំឡើង។</translation> <translation id="6111972606040028426">បើក Google ជំនួយការ</translation> <translation id="6112294629795967147">ប៉ះដើម្បីប្ដូរទំហំ</translation> @@ -5984,6 +5999,7 @@ <translation id="6234108445915742946">លក្ខខណ្ឌប្រើប្រាស់របស់ Chrome នឹងផ្លាស់ប្ដូរនៅថ្ងៃទី 31 ខែមីនា</translation> <translation id="6234474535228214774">រង់ចាំការដំឡើង</translation> <translation id="6235208551686043831">កាមេរ៉ារបស់ឧបករណ៍បានបើក។ សូមដាក់កូដ QR នៃ eSIM របស់អ្នកនៅចំពីមុខកាមេរ៉ា។</translation> +<translation id="6237297174664969437">អ្នកអាចជ្រើសរើសទិន្នន័យរុករកដែលត្រូវធ្វើសមកាលកម្មនៅក្នុងការកំណត់ Chrome បានជានិច្ច។ នៅក្នុង<ph name="LINK_BEGIN" />ការកំណត់ឧបករណ៍<ph name="LINK_END" /> អ្នកអាចគ្រប់គ្រងសមកាលកម្មសម្រាប់កម្មវិធីវេបដែលបានដំឡើងពីកម្មវិធីរុករកតាមអ៊ីនធឺណិត Chrome។ Google អាចកំណត់ម៉ាស៊ីនស្វែងរក និងសេវាកម្មផ្សេងទៀតឱ្យមានលក្ខណៈផ្ទាល់ខ្លួន ផ្អែកតាមប្រវត្តិរបស់អ្នក។</translation> <translation id="6237474966939441970">កម្មវិធីកត់ត្រាដោយប្រើប៊ិក</translation> <translation id="623755660902014047">មុខងារអាន</translation> <translation id="6238767809035845642">អត្ថបទដែលចែករំលែកពីឧបករណ៍ផ្សេងទៀត</translation> @@ -6317,6 +6333,7 @@ <translation id="6537613839935722475">ឈ្មោះអាចប្រើអក្សរ លេខ និងសហសញ្ញា (-)</translation> <translation id="6538098297809675636">មានបញ្ហាក្នុងការចាប់យកកូដ</translation> <translation id="653920215766444089">កំពុងស្វែងរកឧបករណ៍ចង្អុល</translation> +<translation id="6539674013849300372">កាន់តែមានសុវត្ថិភាពលើអ៊ីនធឺណិតដោយប្រើពាក្យសម្ងាត់ខ្លាំង។ ពាក្យសម្ងាត់នេះនឹងត្រូវបានរក្សាទុកទៅក្នុង<ph name="GOOGLE_PASSWORD_MANAGER" />សម្រាប់ <ph name="EMAIL" />។</translation> <translation id="653983593749614101">កំពុងបន្ត...</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />ចំណាំ៖<ph name="END_BOLD" /> បើកដំណើរការ ប្រសិនបើអ្នកដឹងថាអ្នកកំពុងធ្វើអ្វី ឬប្រសិនបើអ្នកត្រូវបានសួរឲ្យធ្វើដូច្នេះប៉ុណ្ណោះ ដោយសារការប្រមូលទិន្នន័យអាចធ្វើឲ្យប្រតិបត្តិការយឺត។</translation> <translation id="6541638731489116978">គេហទំព័រនេះត្រូវបានទប់ស្កាត់មិនឱ្យចូលប្រើឧបករណ៍ចាប់ចលនារបស់អ្នក។</translation> @@ -6511,6 +6528,7 @@ <translation id="671226373742585927">ចុចប៊ូតុង "X" ដើម្បីបិទផ្ទាំងចំហៀង</translation> <translation id="6712943853047024245">អ្នកបានរក្សាទុកពាក្យសម្ងាត់ជាមួយឈ្មោះអ្នកប្រើប្រាស់នេះសម្រាប់ <ph name="WEBSITE" /> រួចហើយ</translation> <translation id="6713233729292711163">បញ្ចូលកម្រងព័ត៌មានការងារ</translation> +<translation id="6713441551032149301">ចុចគ្រាប់ចុចកម្មវិធីចាប់ផ្ដើមឱ្យជាប់ ដើម្បីប្ដូររវាងគ្រាប់ចុច Function និងគ្រាប់ចុចជួរខាងលើរបស់ប្រព័ន្ធ</translation> <translation id="6713668088933662563">កុំផ្ដល់ជូនការបកប្រែភាសាទាំងនេះ</translation> <translation id="6715803357256707211">មានបញ្ហាកើតឡើង អំឡុងពេលដំឡើងកម្មវិធី Linux របស់អ្នក។ សូមចុចលើការជូនដំណឹងសម្រាប់ព័ត៌មានលម្អិត។</translation> <translation id="671619610707606484">សកម្មភាពនេះនឹងសម្អាតទិន្នន័យទំហំ <ph name="TOTAL_USAGE" /> ដែលបានរក្សាទុកដោយគេហទំព័រ</translation> @@ -6632,6 +6650,7 @@ <translation id="6811034713472274749">ទំព័រអាចមើលបានហើយ</translation> <translation id="6811151703183939603">ខ្លាំង</translation> <translation id="6811332638216701903">ឈ្មោះម៉ាស៊ីន DHCP</translation> +<translation id="6811792477922751991">ប្រើគ្រាប់ចុចកម្មវិធីចាប់ផ្ដើម ដើម្បីប្ដូរសកម្មភាពគ្រាប់ចុច Function</translation> <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> មិនអាចដំណើរការជាគោលទេ។</translation> <translation id="6812841287760418429">រក្សាការប្តូរ</translation> <translation id="6813907279658683733">អេក្រង់ទាំងមូល</translation> @@ -7826,6 +7845,7 @@ <translation id="7851720427268294554">កម្មវិធីញែក IPP</translation> <translation id="78526636422538552">ការបញ្ចូលគណនី Google បន្ថែមត្រូវបានបិទ</translation> <translation id="7853747251428735">ឧបករណ៍ច្រើនទៀត</translation> +<translation id="7853999103056713222">ប្រើពាក្យសម្ងាត់ដែលកាន់តែមានសុវត្ថិភាព</translation> <translation id="7855678561139483478">ផ្លាស់ទីផ្ទាំងទៅវិនដូថ្មី</translation> <translation id="7857004848504343806">កុំព្យូទ័ររបស់អ្នកមានម៉ូឌុលសុវត្ថិភាព ដែលត្រូវបានប្រើដើម្បីប្រតិបត្តិការមុខងារសុវត្ថិភាពសំខាន់ៗជាច្រើននៅក្នុង ChromeOS Flex។ សូមចូលទៅកាន់មជ្ឈមណ្ឌលជំនួយ Chromebook ដើម្បីស្វែងយល់បន្ថែម៖ https://support.google.com/chromebook/?p=sm</translation> <translation id="7857093393627376423">ការណែនាំអំពីពាក្យឬឃ្លា</translation> @@ -8380,6 +8400,7 @@ <translation id="8325413836429495820">មិនអនុញ្ញាតឱ្យមើលឃ្លីបបតរបស់អ្នកទេ</translation> <translation id="8326478304147373412">PKCS #7, ខ្សែវិញ្ញាបនប័ត្រ</translation> <translation id="8327386430364625757">ពុម្ពអក្សរគណិតវិទ្យា</translation> +<translation id="8327538105740918488">អ្នកអាចប្ដូរពាក្យសម្ងាត់នេះនៅពេលក្រោយបានជានិច្ច។ ពាក្យសម្ងាត់នេះនឹងត្រូវបានរក្សាទុកទៅក្នុង<ph name="GOOGLE_PASSWORD_MANAGER" />សម្រាប់ <ph name="EMAIL" />។</translation> <translation id="8327676037044516220">ការកំណត់ខ្លឹមសារ និងការអនុញ្ញាត</translation> <translation id="8330617762701840933">បញ្ជីគេហទំព័រដែលបញ្ជូនបន្តទៅកម្មវិធីរុករកតាមអ៊ីនធឺណិតផ្សេងទៀត។</translation> <translation id="8330689128072902965">ទំនាក់ទំនងនៅជិតអាចចែករំលែកជាមួយអ្នកបាន។ ចុចដើម្បីផ្លាស់ប្ដូរ។</translation> @@ -8525,6 +8546,7 @@ <translation id="8449836157089738489">បើកទាំងអស់នៅក្នុងក្រុមផ្ទាំងថ្មី</translation> <translation id="8451512073679317615">ជំនួយការ</translation> <translation id="845702320058262034">មិនអាចភ្ជាប់បានទេ។ សូមប្រាកដថាបានបើកប៊្លូធូសទូរសព្ទរបស់អ្នក។</translation> +<translation id="8457251154056341970">អ្នកនឹងមើលមិនឃើញ <ph name="MODULE_NAME" /> នៅលើទំព័រនេះទៀតទេ</translation> <translation id="8457451314607652708">នាំចូលចំណាំ</translation> <translation id="8458341576712814616">ផ្លូវកាត់</translation> <translation id="8458627787104127436">បើកទាំងអស់ (<ph name="URL_COUNT" />) នៅក្នុងវិនដូថ្មី</translation> @@ -8597,6 +8619,7 @@ <translation id="8514955299594277296">កុំអនុញ្ញាតឱ្យគេហទំព័ររក្សាទុកទិន្នន័យនៅលើឧបករណ៍របស់អ្នក (មិនណែនាំទេ)</translation> <translation id="8517759303731677493">កែ…</translation> <translation id="8519895319663397036">មិនអាចនាំចូលពាក្យសម្ងាត់បានទេ។ ទំហំឯកសារគួរតែតូចជាង 150 KB។</translation> +<translation id="851991974800416566">ប្រើពាក្យសម្ងាត់ខ្លាំងបានយ៉ាងរហ័ស</translation> <translation id="8523493869875972733">រក្សាការផ្លាស់ប្តូរ</translation> <translation id="8523849605371521713">បានបន្ថែមដោយគោលការណ៍</translation> <translation id="8524783101666974011">រក្សាទុកបណ្ណនៅក្នុងគណនី Google របស់អ្នក</translation> @@ -8755,6 +8778,7 @@ <translation id="8665110742939124773">អ្នកបានបញ្ចូលលេខកូដចូលប្រើប្រាស់មិនត្រឹមត្រូវ។ សូមព្យាយាមម្ដងទៀត។</translation> <translation id="8665180165765946056">ការបម្រុងទុកបានបញ្ចប់</translation> <translation id="866611985033792019">ជឿទុកចិត្តវិញ្ញាបនបត្រនេះដើម្បីកំណត់អត្តសញ្ញាណអ្នកប្រើអាសយដ្ឋានអ៊ីមែល</translation> +<translation id="8666268818656583275">ឥឡូវនេះ គ្រាប់ចុច F នឹងមានសកម្មភាពដូចគ្រាប់ចុចជួរខាងលើរបស់ប្រព័ន្ធដែរ</translation> <translation id="8666321716757704924">បានផ្ដល់ការអនុញ្ញាតម្ដងទៀតសម្រាប់ <ph name="WEBSITE" /></translation> <translation id="8666759526542103597">អំពីការកំណត់ការផ្សាយពាណិជ្ជកម្មឱ្យស្របតាមបុគ្គលដោយផ្អែកលើកម្មវិធីរុករកតាមអ៊ីនធឺណិត</translation> <translation id="8667261224612332309">អ្នកមានពាក្យសម្ងាត់ដែលអាចកែលម្អបាន</translation> @@ -9437,6 +9461,7 @@ <translation id="950307215746360464">ការណែនាំអំពីការរៀបចំ</translation> <translation id="951991426597076286">បដិសេធ</translation> <translation id="952471655966876828">ឧបករណ៍នឹងភ្ជាប់ដោយស្វ័យប្រវត្តិ នៅពេលបើក ឬកំពុងត្រូវបានប្រើប្រាស់</translation> +<translation id="952880932803612259">អនុញ្ញាតឱ្យកម្មវិធី គេហទំព័រ និងសេវាកម្មប្រព័ន្ធប្រើទីតាំងរបស់អ្នក។ ទីតាំងអាចប្រើប្រាស់ប្រភពផ្សេងៗ ដូចជា Wi‑Fi, បណ្ដាញទូរសព្ទចល័ត និងសេនស័រ ដើម្បីជួយប៉ាន់ស្មានទីតាំងរបស់ឧបករណ៍អ្នក។</translation> <translation id="953434574221655299">អនុញ្ញាតឱ្យដឹងថា នៅពេលណាដែលអ្នកកំពុងប្រើឧបករណ៍របស់អ្នកយ៉ាងសកម្ម</translation> <translation id="956500788634395331">អ្នកទទួលបានការការពារពីកម្មវិធីបន្ថែមដែលអាចបង្កគ្រោះថ្នាក់</translation> <translation id="957179356621191750">6 ចំណុច</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb index a631e2f..066f302 100644 --- a/chrome/app/resources/generated_resources_ky.xtb +++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">Өтмөк кайрадан жигердүү</translation> <translation id="1003088604756913841">Шилтемени жаңы <ph name="APP" /> терезесинде ачуу</translation> <translation id="100323615638474026">USB түзмөгү (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Google Коопсуз серептөө</translation> <translation id="1004218526896219317">Сайтка кирүү мүмкүнчүлүгү</translation> <translation id="1005274289863221750">Микрофон менен камераңызды колдонуңуз</translation> <translation id="1005333234656240382">ADB аркылуу мүчүлүштүктөрдү аныктоо иштетилсинби?</translation> @@ -913,6 +914,7 @@ <translation id="1769104665586091481">Шилтеме жаңы &терезеде ачылсын</translation> <translation id="1770407692401984718">Сүрөттү бул жерге сүйрөңүз же</translation> <translation id="177053719077591686">Android колдонмолорунун камдык көчүрмөсүн Google Drive'га сактаңыз.</translation> +<translation id="1771075623623424448">Серепчинин түзмөк таржымалын издеп жатасызбы? <ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" /> барагына өтүңүз.</translation> <translation id="177336675152937177">Хост колдонмосунун дайындары</translation> <translation id="1776712937009046120">Колдонуучу кошуу</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> @@ -1699,6 +1701,15 @@ <translation id="2422125132043002186">Linux'ту калыбына келтирүү жокко чыгарылды</translation> <translation id="2423578206845792524">Сү&рөттү төмөнкүдөй сактоо…</translation> <translation id="2424424966051154874">{0,plural, =1{Конок}other{Конок (#)}}</translation> +<translation id="242684489663276773">Бул аракет: + <ph name="LINE_BREAKS" /> + • Chrome'дун айрым параметрлерин жана Chrome ыкчам баскычтарын баштапкы абалга келтирет + <ph name="LINE_BREAK" /> + • Кеңейтүүлөрдү өчүрөт + <ph name="LINE_BREAK" /> + • Cookie файлдарын жана сайттагы убактылуу маалыматтарды өчүрөт + <ph name="LINE_BREAKS" /> + Кыстармаларга, таржымалга жана сакталган сырсөздөргө таасирин тийгизбейт.</translation> <translation id="2428510569851653187">Өтмөк жабылып калганда эмне кылып жаттыңыз эле?</translation> <translation id="2428939361789119025">Wi-Fi'ды өчүрүү</translation> <translation id="2428978615149723410">Бул себеттерди</translation> @@ -4474,6 +4485,7 @@ <translation id="4876895919560854374">Экранды кулпулоо жана кулпусун ачуу</translation> <translation id="4877276003880815204">Элементтерди иликтөө</translation> <translation id="4877652723592270843">ChromeOS Flex системасына кыстарылган экрандагы нерсени окуп берүүчү ChromeVox куралын иштетесизби? Иштетсеңиз, үн баскычтарын беш секунд коё бербей басып туруңуз.</translation> +<translation id="4878261017150799673">Cайтты жигердүү бойдон сактоо</translation> <translation id="4878634973244289103">Пикир жөнөтүлбөй жатат. Бир аздан кийин кайталап көрүңүз.</translation> <translation id="4878653975845355462">Жеке фондорду администраторуңуз өчүрүп койгон</translation> <translation id="4878718769565915065">Бул коопсуздук ачкычына манжа изи кошулган жок</translation> @@ -5261,6 +5273,9 @@ <translation id="5602765853043467355">Бул түзмөктөгү кыстармаларды, таржымалды, сырсөздөрдү жана башкаларды тазалоо</translation> <translation id="5605758115928394442">Сиз экениңизди ырастоо үчүн телефонуңузга билдирме жөнөтүлдү.</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{Бул кеңейтүү бөгөттөлгөн}other{Бул кеңейтүүлөр бөгөттөлгөн}}</translation> +<translation id="560743070587960985">Бул файл вирус же кесепеттүү программа болушу мүмкүн. + +Анын коопсуз экенин текшерүү үчүн Google'га жөнөтсөңүз болот. Текшерүү адатта бир нече секундга созулат.</translation> <translation id="560834977503641186">Wi-Fi Sync тууралуу кеңири маалымат</translation> <translation id="5608580678041221894">Кесиле турган аймакты тууралоо же жылдыруу үчүн төмөнкү баскычтарды басыңыз</translation> <translation id="5609231933459083978">Колдонмо жараксыз окшойт.</translation> @@ -5998,6 +6013,7 @@ <translation id="6254892857036829079">Кынтыксыз</translation> <translation id="6257602895346497974">Шайкештирүүнү күйгүзүү...</translation> <translation id="62586649943626337">Өтмөктөрдү өтмөктөр тобунун жардамы менен иреттеңиз</translation> +<translation id="6260092874648348841">Cайтты жигердүү бойдон сактоо</translation> <translation id="6262371516389954471">Камдык көчүрмөлөрүңүз Google'га жүктөлүп берилип, Google аккаунтуңуздун сырсөзү менен шифрленет.</translation> <translation id="6263082573641595914">Microsoft CA версиясы</translation> <translation id="6263284346895336537">Коркунучтуу эмес</translation> @@ -7535,6 +7551,7 @@ <translation id="7634280112532283638">Спам жана шылуундукту азайтуу</translation> <translation id="7634337648687970851">Жергиликтүү маалыматты калыбына келтирүү учурда колдоого алынбайт.</translation> <translation id="7634566076839829401">Бир жерден ката кетти. Кайталап көрүңүз.</translation> +<translation id="763472884969134151">Талдоо <ph name="LINK" /> тарабынан аткарылды</translation> <translation id="7635048370253485243">Администраторуңуз кадап койду</translation> <translation id="7635711411613274199">Сайттарды карап жатканыңызда жарнамалар ушул параметрге, <ph name="BEGIN_LINK1" />жарнамалардын темаларына<ph name="LINK_END1" />, <ph name="BEGIN_LINK2" />cookie жөндөөлөрүнө<ph name="LINK_END2" /> жана сиз карап жаткан сайттын параметрлерине жараша жекелештирилип көрсөтүлөт</translation> <translation id="7636919061354591437">Ушул түзмөккө орнотуу</translation> @@ -8213,6 +8230,7 @@ <translation id="8195737548602430447">Коштомо жазууларды автоматтык түрдө көздөлгөн тилге которуу.</translation> <translation id="8197673340773315084">Жумуш же Жеке сыяктуу белги же аталыш кошуңуз</translation> <translation id="8198456017687137612">Өтмөктү тышкы экранга чыгаруу</translation> +<translation id="8198457270656084773">Тутумдун түзмөк таржымалын издеп жатасызбы? <ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" /> барагына өтүңүз.</translation> <translation id="8198511718495409170">Жаңырган параметрлерди ушул сайттагы "<ph name="EXTENSION_NAME" />" кеңейтүүсүнө колдонуу үчүн бул баракты кайрадан жүктөңүз</translation> <translation id="8199300056570174101">Тармактын (кызматтын) жана түзмөктүн касиеттери</translation> <translation id="8200772114523450471">Улантуу</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index b4284de0..1b790ce5 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -527,6 +527,7 @@ <translation id="146000042969587795">Šis rāmis tika bloķēts, jo tas satur dažus nedrošus elementus.</translation> <translation id="1461041542809785877">Veiktspēja</translation> <translation id="1461177659295855031">Pārvietot uz mapi Grāmatzīmju josla</translation> +<translation id="1461288887896722288">Jūs tikko pierakstījāties pārvaldītā kontā. Izveidojot jaunu pārvaldīto profilu, varēsiet piekļūt noteiktiem ar minēto kontu saistītiem resursiem.</translation> <translation id="146219525117638703">ONC statuss</translation> <translation id="146220085323579959">Internets atvienots. Pārbaudiet interneta savienojumu un mēģiniet vēlreiz.</translation> <translation id="1462850958694534228">Pārskatiet ikonas izmaiņas</translation> @@ -1879,6 +1880,7 @@ <translation id="2575407791320728464">URL nav derīgs. Pārbaudiet, vai tas ir pareizi formatēts.</translation> <translation id="2575441894380764255">Nedrīkst rādīt traucējošas vai maldinošas reklāmas</translation> <translation id="2575713839157415345">{YEARS,plural, =1{Šī ierīce uz gadu tiks saglabāta, un nākamreiz varēsiet izveidot savienojumu bez koda. Šo iestatījumu pārvalda administrators.}zero{Šī ierīce tiks saglabāta uz {YEARS} gadiem, un nākamreiz varēsiet izveidot savienojumu bez koda. Šo iestatījumu pārvalda administrators.}one{Šī ierīce tiks saglabāta uz {YEARS} gadu, un nākamreiz varēsiet izveidot savienojumu bez koda. Šo iestatījumu pārvalda administrators.}other{Šī ierīce tiks saglabāta uz {YEARS} gadiem, un nākamreiz varēsiet izveidot savienojumu bez koda. Šo iestatījumu pārvalda administrators.}}</translation> +<translation id="2577446426265992344">bez universālā lodziņa</translation> <translation id="257779572837908839">Iestatīt kā sistēmu “Chromebox sapulcēm”</translation> <translation id="2579309488038515659">Tīklāja iespējošana</translation> <translation id="2579596474754516455">Skenējiet PDF attēlus, lai nepieciešamības gadījumā pārveidotu tekstu ekrāna lasītājam.</translation> @@ -6576,6 +6578,7 @@ <translation id="6787097042755590313">Cita cilne</translation> <translation id="6787839852456839824">Īsinājumtaustiņi</translation> <translation id="6788210894632713004">Atpakotais paplašinājums</translation> +<translation id="678939393857169499">Tiek iespējots jaunais darbvirsmas noformējums.</translation> <translation id="6789592661892473991">Horizontāls dalījums</translation> <translation id="6789834167207639931">Lai pabeigtu atkopšanu, nākamajā ekrānā vēlreiz ievadiet sava Google konta paroli.</translation> <translation id="6790428901817661496">Atskaņot</translation> @@ -7373,6 +7376,7 @@ <translation id="7481312909269577407">Pārsūtīt</translation> <translation id="7481358317100446445">Gatavs</translation> <translation id="748138892655239008">Sertifikāta pamatierobežojumi</translation> +<translation id="7483145199632798061">Chrome Refresh 2023</translation> <translation id="7484645889979462775">Nekad šai vietnei</translation> <translation id="7487141338393529395">Uzlabotās pareizrakstības pārbaudes ieslēgšana</translation> <translation id="7487969577036436319">Nav instalēts neviens komponents.</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb index 831f663..e7fa0ee 100644 --- a/chrome/app/resources/generated_resources_mk.xtb +++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">Картичката е активна повторно</translation> <translation id="1003088604756913841">Отвори го линкот во нов прозорец на <ph name="APP" /></translation> <translation id="100323615638474026">USB-уред (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Безбедно прелистување со Google</translation> <translation id="1004218526896219317">Пристап до сајтови</translation> <translation id="1005274289863221750">Користете ги микрофонот и фотоапаратот</translation> <translation id="1005333234656240382">Да се овозможи отстранување грешки на ADB?</translation> @@ -528,6 +529,7 @@ <translation id="146000042969587795">Рамката е блокирана затоа што содржи небезбедна содржина.</translation> <translation id="1461041542809785877">Изведба</translation> <translation id="1461177659295855031">Преместете во папката „Лента со обележувачи“</translation> +<translation id="1461288887896722288">Тукушто се најавивте на управувана сметка, па создавањето нов управуван профил ќе ви овозможи да пристапувате до некои ресурси поврзани со сметката.</translation> <translation id="146219525117638703">Состојба ONC</translation> <translation id="146220085323579959">Интернетот е исклучен. Проверете ја вашата интернет-врска и обидете се повторно.</translation> <translation id="1462850958694534228">Прегледајте го ажурирањето на иконата</translation> @@ -913,6 +915,7 @@ <translation id="1769104665586091481">Отвори ја врската во нов &прозорец</translation> <translation id="1770407692401984718">Повлечете слика овде или</translation> <translation id="177053719077591686">Направете бекап од апликациите на Android во Google Drive.</translation> +<translation id="1771075623623424448">Дали ја барате страницата за евиденција на уреди на прелистувачот? Одете на <ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="177336675152937177">Вдомени податоци на апликација</translation> <translation id="1776712937009046120">Додај корисник</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> @@ -1699,6 +1702,15 @@ <translation id="2422125132043002186">Враќањето на Linux е откажано</translation> <translation id="2423578206845792524">Сни&ми слика како…</translation> <translation id="2424424966051154874">{0,plural, =1{Гостин}one{Гости (#)}other{Гости (#)}}</translation> +<translation id="242684489663276773">Ова дејство: + <ph name="LINE_BREAKS" /> + • ќе ресетира некои од поставките и кратенките за Chrome + <ph name="LINE_BREAK" /> + • ќе ги оневозможи екстензиите + <ph name="LINE_BREAK" /> + • ќе ги избрише колачињата и другите привремени податоци од сајтовите + <ph name="LINE_BREAKS" /> + Обележувачите, историјата и зачуваните лозинки нема да бидат засегнати.</translation> <translation id="2428510569851653187">Опишете што правевте кога падна картичката</translation> <translation id="2428939361789119025">Исклучи Wi-Fi</translation> <translation id="2428978615149723410">овие картички</translation> @@ -1882,6 +1894,7 @@ <translation id="2575407791320728464">Неважечка URL-адреса. Проверете дали е форматирана правилно.</translation> <translation id="2575441894380764255">Не им е дозволено да прикажуваат нападни, ниту лажни реклами</translation> <translation id="2575713839157415345">{YEARS,plural, =1{Уредов ќе се зачува 1 година и следниот пат ќе може да се поврзете без код. Ова е поставено од вашиот администратор.}one{Уредов ќе се зачува {YEARS} година и следниот пат ќе може да се поврзете без код. Ова е поставено од вашиот администратор.}other{Уредов ќе се зачува {YEARS} години и следниот пат ќе може да се поврзете без код. Ова е поставено од вашиот администратор.}}</translation> +<translation id="2577446426265992344">без лента за адреси</translation> <translation id="257779572837908839">Поставете како „Chromebox за состаноци“</translation> <translation id="2579309488038515659">Овозможете ја точката на пристап</translation> <translation id="2579596474754516455">Скенирајте PDF-слики за да конвертирате текст за читачот на екран кога е потребно</translation> @@ -4473,6 +4486,7 @@ <translation id="4876895919560854374">Заклучи го и отклучи го екранот</translation> <translation id="4877276003880815204">Провери ги елементите</translation> <translation id="4877652723592270843">Дали сакате да го активирате ChromeVox, вградениот читач на екранот за ChromeOS Flex? Ако сакате, притиснете ги и задржете ги двете копчиња за јачина на звук пет секунди.</translation> +<translation id="4878261017150799673">Одржувај го сајтот активен</translation> <translation id="4878634973244289103">Не може да се испратат повратните информации. Обидете се повторно подоцна.</translation> <translation id="4878653975845355462">Администраторот ги исклучил приспособените заднини</translation> <translation id="4878718769565915065">Не успеа додавањето отпечаток на овој безбедносен клуч</translation> @@ -5260,6 +5274,9 @@ <translation id="5602765853043467355">Исчисти обележувачи, историја, лозинки и друго од уредов</translation> <translation id="5605758115928394442">Испратено ви е известување на телефонот за потврда на вашиот идентитет.</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{Екстензијава е блокирана}one{Екстензииве се блокирани}other{Екстензииве се блокирани}}</translation> +<translation id="560743070587960985">Датотекава можеби е вирус или злонамерен софтвер. + +Може да ја испратите во Google за да се провери дали е небезбедна. Скенирањата обично траат неколку секунди.</translation> <translation id="560834977503641186">Синхронизирање на Wi-Fi, дознајте повеќе</translation> <translation id="5608580678041221894">Допрете ги следниве копчиња за да го приспособите или преместите подрачјето за сечење</translation> <translation id="5609231933459083978">Апликацијата изгледа дека е неважечка.</translation> @@ -5997,6 +6014,7 @@ <translation id="6254892857036829079">Совршено</translation> <translation id="6257602895346497974">Вклучете синхронизација…</translation> <translation id="62586649943626337">Организирајте ги картичките со групи картички</translation> +<translation id="6260092874648348841">Одржувај го сајтот активен</translation> <translation id="6262371516389954471">Вашиот бекап се прикачува во Google и се шифрира со лозинката за вашата сметка на Google.</translation> <translation id="6263082573641595914">Microsoft CA верзија</translation> <translation id="6263284346895336537">Не е критично</translation> @@ -6576,6 +6594,7 @@ <translation id="6787097042755590313">Друга картичка</translation> <translation id="6787839852456839824">Кратенки на тастатура</translation> <translation id="6788210894632713004">Неотпакувана екстензија</translation> +<translation id="678939393857169499">Го овозможува новиот дизајн на работната површина.</translation> <translation id="6789592661892473991">Подели хоризонтално</translation> <translation id="6789834167207639931">Внесете ја лозинката за сметката на Google повторно на следниот екран за да го завршите враќањето</translation> <translation id="6790428901817661496">Репродуцирај</translation> @@ -7373,6 +7392,7 @@ <translation id="7481312909269577407">Напред</translation> <translation id="7481358317100446445">Подготвен</translation> <translation id="748138892655239008">Основни ограничувања на сертификат</translation> +<translation id="7483145199632798061">Chrome Refresh 2023</translation> <translation id="7484645889979462775">Никогаш за оваа локација</translation> <translation id="7487141338393529395">Вклучете подобрена проверка на правопис</translation> <translation id="7487969577036436319">Не се инсталирани компоненти</translation> @@ -7534,6 +7554,7 @@ <translation id="7634280112532283638">Намалување на спамот и измамите</translation> <translation id="7634337648687970851">Во моментов, враќање локални податоци не е поддржано.</translation> <translation id="7634566076839829401">Нешто не е во ред. Обидете се повторно.</translation> +<translation id="763472884969134151">Анализата се врши со <ph name="LINK" /></translation> <translation id="7635048370253485243">Закачено од администраторот</translation> <translation id="7635711411613274199">Дали дадена реклама ќе биде персонализирана додека прелистувате зависи од поставката <ph name="BEGIN_LINK1" />Теми за реклами<ph name="LINK_END1" />, вашите <ph name="BEGIN_LINK2" />поставки за колачиња<ph name="LINK_END2" /> и од тоа дали сајтот што го посетувате ги персонализира рекламите</translation> <translation id="7636919061354591437">Инсталирај на уредов</translation> @@ -8212,6 +8233,7 @@ <translation id="8195737548602430447">Автоматско преведување титлови на целен јазик.</translation> <translation id="8197673340773315084">Додајте име или етикета, на пр., „Работен“ или „Личен“</translation> <translation id="8198456017687137612">Картичка за емитување</translation> +<translation id="8198457270656084773">Дали ја барате страницата за евиденција на уреди на системот? Одете на <ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="8198511718495409170">За да ги примените ажурираните поставки за „<ph name="EXTENSION_NAME" />“ на сајтов, вчитајте ја страницава повторно</translation> <translation id="8199300056570174101">Својства на уредот и мрежата (услугата)</translation> <translation id="8200772114523450471">Продолжи</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index dcd4032b..85b3f8e 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">ടാബ് വീണ്ടും സജീവമായി</translation> <translation id="1003088604756913841">പുതിയ <ph name="APP" /> വിന്ഡോയില് ലിങ്ക് തുറക്കുക</translation> <translation id="100323615638474026">USB ഉപകരണം (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Google സുരക്ഷിത ബ്രൗസിംഗ്</translation> <translation id="1004218526896219317">സൈറ്റ് ആക്സസ്</translation> <translation id="1005274289863221750">നിങ്ങളുടെ മൈക്രോഫോണും ക്യാമറയും ഉപയോഗിക്കുക</translation> <translation id="1005333234656240382">ADB ഡീബഗ് ചെയ്യൽ പ്രവർത്തനക്ഷമമാക്കണോ?</translation> @@ -526,6 +527,7 @@ <translation id="146000042969587795">ഈ ഫ്രെയിം തടഞ്ഞു കാരണം ഇതില് ചില സുരക്ഷിതമല്ലാത്ത ഉള്ളടക്കം അടങ്ങിയിരിക്കുന്നു.</translation> <translation id="1461041542809785877">പ്രകടനം</translation> <translation id="1461177659295855031">ബുക്ക്മാർക്ക് ബാർ ഫോൾഡറിലേക്ക് നീക്കുക</translation> +<translation id="1461288887896722288">മാനേജ് ചെയ്യപ്പെടുന്ന അക്കൗണ്ടിലേക്ക് നിങ്ങൾ ഇപ്പോൾ സൈൻ ഇൻ ചെയ്തിരിക്കുന്നു, മാനേജ് ചെയ്യപ്പെടുന്ന പുതിയൊരു പ്രൊഫൈൽ സൃഷ്ടിക്കുന്നത് ആ അക്കൗണ്ടുമായി ലിങ്ക് ചെയ്തിരിക്കുന്ന ചില ഉറവിടങ്ങൾ ആക്സസ് ചെയ്യാൻ നിങ്ങളെ അനുവദിക്കും.</translation> <translation id="146219525117638703">ONC സ്റ്റേറ്റ്</translation> <translation id="146220085323579959">ഇന്റർനെറ്റ് വിച്ഛേദിച്ചു. നിങ്ങളുടെ ഇന്റർനെറ്റ് കണക്ഷൻ പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="1462850958694534228">ഐക്കൺ അപ്ഡേറ്റ് ചെയ്തത് അവലോകനം ചെയ്യുക</translation> @@ -900,6 +902,7 @@ <translation id="1769104665586091481">പുതിയ &വിൻഡോയിൽ ലിങ്ക് തുറക്കുക</translation> <translation id="1770407692401984718">ഒരു ചിത്രം ഇവിടേക്ക് വലിച്ചിടുക അല്ലെങ്കിൽ</translation> <translation id="177053719077591686">Android ആപ്പുകൾ Google Drive-ലേക്ക് ബാക്കപ്പെടുക്കുക.</translation> +<translation id="1771075623623424448">ബ്രൗസറിന്റെ ഉപകരണ ലോഗ് പേജ് തിരയുകയാണോ? <ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" /> സന്ദർശിക്കുക.</translation> <translation id="177336675152937177">ഹോസ്റ്റ് ചെയ്ത ആപ്പ് ഡാറ്റ</translation> <translation id="1776712937009046120">ഉപയോക്താവിനെ ചേര്ക്കുക</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> @@ -1682,6 +1685,15 @@ <translation id="2422125132043002186">Linux പുനഃസ്ഥാപിക്കൽ റദ്ദാക്കി</translation> <translation id="2423578206845792524">ചിത്രം ഇതായി സം&രക്ഷിക്കുക...</translation> <translation id="2424424966051154874">{0,plural, =1{അതിഥി}other{അതിഥി (#)}}</translation> +<translation id="242684489663276773">ഈ പ്രവർത്തനം ഇനിപ്പറയുന്നത് ചെയ്യും: + <ph name="LINE_BREAKS" /> + • ചില Chrome ക്രമീകരണങ്ങളും Chrome കുറുക്കുവഴികളും റീസെറ്റ് ചെയ്യും + <ph name="LINE_BREAK" /> + • വിപുലീകരണങ്ങൾ പ്രവർത്തനരഹിതമാക്കും + <ph name="LINE_BREAK" /> + • കുക്കികളും മറ്റ് താൽക്കാലിക സൈറ്റ് ഡാറ്റയും ഇല്ലാതാക്കും + <ph name="LINE_BREAKS" /> + ബുക്ക്മാർക്കുകൾ, ചരിത്രം, സംരക്ഷിച്ച പാസ്വേഡുകൾ എന്നിവയെ ബാധിക്കില്ല.</translation> <translation id="2428510569851653187">ടാബ് ക്രാഷാകുമ്പോൾ നിങ്ങൾ എന്താണ് ചെയ്തിരുന്നതെന്ന് വിവരിക്കുക</translation> <translation id="2428939361789119025">വൈഫൈ ഓഫാക്കുക</translation> <translation id="2428978615149723410">ഈ കാർട്ടുകൾ</translation> @@ -1865,6 +1877,7 @@ <translation id="2575407791320728464">URL അസാധുവാണ്. ഇത് ശരിയായി ഫോർമാറ്റ് ചെയ്തിട്ടുണ്ടെന്ന് ഉറപ്പാക്കുക.</translation> <translation id="2575441894380764255">അനാവശ്യമോ തെറ്റിദ്ധരിപ്പിക്കുന്നതോ ആയ പരസ്യങ്ങൾ അനുവദനീയമല്ല</translation> <translation id="2575713839157415345">{YEARS,plural, =1{ഈ ഉപകരണം 1 വർഷം വരെ സംരക്ഷിക്കും, അടുത്ത തവണ നിങ്ങൾക്ക് ഒരു കോഡ് ഇല്ലാതെ തന്നെ കണക്റ്റ് ചെയ്യാം. ഇത് നിങ്ങളുടെ അഡ്മിൻ സജ്ജീകരിച്ചതാണ്.}other{ഈ ഉപകരണം {YEARS} വർഷം വരെ സംരക്ഷിക്കും, അടുത്ത തവണ നിങ്ങൾക്ക് ഒരു കോഡ് ഇല്ലാതെ തന്നെ കണക്റ്റ് ചെയ്യാം. ഇത് നിങ്ങളുടെ അഡ്മിൻ സജ്ജീകരിച്ചതാണ്.}}</translation> +<translation id="2577446426265992344">ഒമ്നിബോക്സ് ഇല്ലാതെ</translation> <translation id="257779572837908839">മീറ്റിംഗിനുള്ള Chromebox സജ്ജമാക്കുക</translation> <translation id="2579309488038515659">ഹോട്ട്സ്പോട്ട് പ്രവർത്തനക്ഷമമാക്കുക</translation> <translation id="2579596474754516455">ആവശ്യമുള്ളപ്പോൾ, സ്ക്രീൻ റീഡറിനായി ടെക്സ്റ്റ് പരിവർത്തനം ചെയ്യാൻ PDF ചിത്രങ്ങൾ സ്കാൻ ചെയ്യുക</translation> @@ -4454,6 +4467,7 @@ <translation id="4876895919560854374">സ്ക്രീൻ ലോക്ക് ചെയ്യുക, അൺലോക്ക് ചെയ്യുക</translation> <translation id="4877276003880815204">ഘടകങ്ങൾ പരിശോധിക്കുക</translation> <translation id="4877652723592270843">ChromeOS Flex-നുള്ള ബിൽറ്റ് ഇൻ സ്ക്രീൻ റീഡർ ആയ ChromeVox സജീവമാക്കണോ? അങ്ങനെയെങ്കിൽ, രണ്ട് വോളിയം കീകളും അഞ്ച് സെക്കൻഡ് നേരത്തേക്ക് അമർത്തിപ്പിടിക്കുക.</translation> +<translation id="4878261017150799673">സൈറ്റ് സജീവമായി നിലനിർത്തുക</translation> <translation id="4878634973244289103">ഫീഡ്ബാക്ക് അയയ്ക്കാനായില്ല. പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="4878653975845355462">ഇഷ്ടാനുസൃത പശ്ചാത്തലങ്ങൾ നിങ്ങളുടെ അഡ്മിൻ ഓഫാക്കിയിരിക്കുന്നു</translation> <translation id="4878718769565915065">ഈ സുരക്ഷാ കീയിലേക്ക് ഒരു ഫിംഗർപ്രിന്റ് ചേർക്കാനായില്ല</translation> @@ -5241,6 +5255,9 @@ <translation id="5602765853043467355">ഈ ഉപകരണത്തിൽ നിന്ന് ബുക്ക്മാർക്കുകൾ, ചരിത്രം, പാസ്വേഡുകൾ എന്നിവയും മറ്റും മായ്ക്കുക</translation> <translation id="5605758115928394442">ഇത് നിങ്ങൾ തന്നെയാണെന്ന് സ്ഥിരീകരിക്കാൻ ഫോണിലേക്ക് ഒരു അറിയിപ്പ് അയച്ചിട്ടുണ്ട്.</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{ഈ വിപുലീകരണം ബ്ലോക്ക് ചെയ്തു}other{ഈ വിപുലീകരണങ്ങൾ ബ്ലോക്ക് ചെയ്തു}}</translation> +<translation id="560743070587960985">ഈ ഫയൽ ഒരു വൈറസോ മാൽവെയറോ ആകാം. + +സുരക്ഷിതമല്ലെങ്കിൽ, പരിശോധിക്കാൻ നിങ്ങൾക്ക് അത് Google-ലേക്ക് അയയ്ക്കാം. സ്കാൻ ചെയ്യാൻ സാധരണഗതിയിൽ കുറച്ച് സമയമെടുത്തേക്കാം.</translation> <translation id="560834977503641186">വൈഫൈ സമന്വയം, കൂടുതലറിയുക</translation> <translation id="5608580678041221894">വലുപ്പം മാറ്റുന്നയിടം ക്രമീകരിക്കാനും നീക്കാനും ചുവടെയുള്ള കീകൾ ടാപ്പുചെയ്യുക</translation> <translation id="5609231933459083978">ആപ്പ് അസാധുവായി തോന്നുന്നു.</translation> @@ -5980,6 +5997,7 @@ <translation id="6254892857036829079">മികച്ചത്</translation> <translation id="6257602895346497974">സമന്വയിപ്പിക്കൽ ഓണാക്കുക...</translation> <translation id="62586649943626337">ടാബ് ഗ്രൂപ്പുകൾ ഉപയോഗിച്ച് നിങ്ങളുടെ ടാബുകൾ ഓർഗനൈസ് ചെയ്യുക</translation> +<translation id="6260092874648348841">സൈറ്റ് സജീവമായി നിലനിർത്തുക</translation> <translation id="6262371516389954471">നിങ്ങളുടെ ബാക്കപ്പുകൾ Google-ലേക്ക് അപ്ലോഡ് ചെയ്ത് Google അക്കൗണ്ട് പാസ്വേഡ് ഉപയോഗിച്ച് എൻക്രിപ്റ്റ് ചെയ്യും.</translation> <translation id="6263082573641595914">Microsoft CA പതിപ്പ്</translation> <translation id="6263284346895336537">ഗുരുതരമല്ല</translation> @@ -6557,6 +6575,7 @@ <translation id="6787097042755590313">മറ്റ് ടാബ്</translation> <translation id="6787839852456839824">കീബോർഡ് കുറുക്കുവഴികൾ</translation> <translation id="6788210894632713004">പായ്ക്ക് ചെയ്യാത്ത വിപുലീകരണം</translation> +<translation id="678939393857169499">പുതിയ ഡെസ്ക്ടോപ്പ് ഡിസൈൻ പ്രവർത്തനക്ഷമമാക്കുന്നു.</translation> <translation id="6789592661892473991">തിരശ്ചീനമായി വിഭജിക്കുക</translation> <translation id="6789834167207639931">വീണ്ടെടുക്കൽ പൂർത്തിയാക്കാൻ അടുത്ത സ്ക്രീനിൽ നിങ്ങളുടെ Google അക്കൗണ്ട് പാസ്വേഡ് വീണ്ടും നൽകുക</translation> <translation id="6790428901817661496">പ്ലേചെയ്യുക</translation> @@ -7353,6 +7372,7 @@ <translation id="7481312909269577407">മുന്നോട്ട്</translation> <translation id="7481358317100446445">തയ്യാര്</translation> <translation id="748138892655239008">സര്ട്ടിഫിക്കറ്റ് ബേസിക് നിയന്ത്രണങ്ങള്</translation> +<translation id="7483145199632798061">Chrome റീഫ്രഷ് 2023</translation> <translation id="7484645889979462775">ഈ സൈറ്റിന് ഒരിക്കലും ആവശ്യമില്ല</translation> <translation id="7487141338393529395">മെച്ചപ്പെട്ട സ്പെൽ ചെക്ക് ഓണാക്കുക</translation> <translation id="7487969577036436319">ഘടകങ്ങളൊന്നും ഇൻസ്റ്റാളുചെയ്തിട്ടില്ല</translation> @@ -7514,6 +7534,7 @@ <translation id="7634280112532283638">സ്പാമും വഞ്ചനയും കുറയ്ക്കൽ</translation> <translation id="7634337648687970851">ലോക്കൽ ഡാറ്റ വീണ്ടെടുക്കലിന് നിലവിൽ പിന്തുണയില്ല.</translation> <translation id="7634566076839829401">എന്തോ കുഴപ്പം സംഭവിച്ചു, വീണ്ടും ശ്രമിക്കുക.</translation> +<translation id="763472884969134151">വിശകലനം, <ph name="LINK" /> പൂർത്തിയാക്കി</translation> <translation id="7635048370253485243">നിങ്ങളുടെ അഡ്മിൻ പിൻ ചെയ്തത്</translation> <translation id="7635711411613274199">നിങ്ങൾ ബ്രൗസ് ചെയ്യുന്നതിനനുസരിച്ച് നിങ്ങൾ കാണുന്ന പരസ്യം വ്യക്തിപരമാക്കിയതാണോ എന്നത് ഈ ക്രമീകരണം, <ph name="BEGIN_LINK1" />പരസ്യത്തിന്റെ വിഷയങ്ങൾ<ph name="LINK_END1" />, നിങ്ങളുടെ <ph name="BEGIN_LINK2" />കുക്കി ക്രമീകരണം<ph name="LINK_END2" />, നിങ്ങൾ കാണുന്ന സൈറ്റ് പരസ്യങ്ങൾ വ്യക്തിപരമാക്കുന്നുണ്ടോ എന്നിവയെ ആശ്രയിച്ചിരിക്കും</translation> <translation id="7636919061354591437">ഈ ഉപകരണത്തിൽ ഇൻസ്റ്റാൾ ചെയ്യുക</translation> @@ -8193,6 +8214,7 @@ <translation id="8195737548602430447">ടാർഗറ്റ് ഭാഷയിലേക്ക് അടിക്കുറിപ്പുകൾ സ്വയമേവ വിവർത്തനം ചെയ്യുക.</translation> <translation id="8197673340773315084">പേരോ ഔദ്യോഗികം, വ്യക്തിപരം എന്നിവ പോലുള്ള ലേബലോ ചേർക്കുക</translation> <translation id="8198456017687137612">ടാബ് കാസ്റ്റ് ചെയ്യുന്നു</translation> +<translation id="8198457270656084773">സിസ്റ്റത്തിന്റെ ഉപകരണ ലോഗ് പേജ് തിരയുകയാണോ? <ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" /> സന്ദർശിക്കുക.</translation> <translation id="8198511718495409170">ഈ സൈറ്റിലേക്ക് "<ph name="EXTENSION_NAME" />" എന്നതിനുള്ള അപ്ഡേറ്റ് ചെയ്ത ക്രമീകരണം ബാധകമാക്കാൻ, ഈ പേജ് റീലോഡ് ചെയ്യുക</translation> <translation id="8199300056570174101">നെറ്റ്വർക്കും (സേവനം) ഉപകരണ പ്രോപ്പർട്ടികളും</translation> <translation id="8200772114523450471">പുനരാരംഭിക്കുക</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb index dff2d505..ade62c00 100644 --- a/chrome/app/resources/generated_resources_mn.xtb +++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">Таб дахин идэвхэжсэн</translation> <translation id="1003088604756913841">Холбоосыг шинэ <ph name="APP" /> цонхонд нээх</translation> <translation id="100323615638474026">USB төхөөрөмж (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Google-н аюулгүй хөтөч</translation> <translation id="1004218526896219317">Сайтын хандалт</translation> <translation id="1005274289863221750">Микрофон болон камераа ашиглана уу</translation> <translation id="1005333234656240382">ADB алдаа засахыг идэвхжүүлэх үү?</translation> @@ -527,6 +528,7 @@ <translation id="146000042969587795">Аюултай агуулгыг агуулж байгаа учраас энэ хүрээ хаагдсан байна.</translation> <translation id="1461041542809785877">Хүчин чадал</translation> <translation id="1461177659295855031">Хавчуургын хэсэг хавтас руу зөөх</translation> +<translation id="1461288887896722288">Та дөнгөж сая тохиргоо хийгдсэн бүртгэлээр нэвтэрсэн. Шинэ тохиргоо хийгдсэн профайл үүсгэх нь танд тухайн бүртгэлтэй холбосон зарим нөөцөд хандахыг зөвшөөрнө.</translation> <translation id="146219525117638703">ONC Төлөв</translation> <translation id="146220085323579959">Интернэт салсан байна. Интернетийн холболтоо шалгаад дахин хандана уу.</translation> <translation id="1462850958694534228">Дүрс тэмдгийн шинэчлэлтийг шалгах</translation> @@ -908,6 +910,7 @@ <translation id="1769104665586091481">Холбоосыг шинэ цонхонд нээх</translation> <translation id="1770407692401984718">Зургийг ийшээ чирэх эсвэл</translation> <translation id="177053719077591686">Android аппуудыг Google Драйв руу хуулбарлана уу.</translation> +<translation id="1771075623623424448">Хөтчийн төхөөрөмжийн логийн хуудсыг хайж байна уу? <ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" />-д зочилно уу.</translation> <translation id="177336675152937177">Аппликейшний өгөгдлийг зохион байгуулсан</translation> <translation id="1776712937009046120">Хэрэглэгч нэмэх</translation> <translation id="1776883657531386793"><ph name="OID" /> : <ph name="INFO" /></translation> @@ -1694,6 +1697,15 @@ <translation id="2422125132043002186">Linux-г сэргээхийг цуцалсан</translation> <translation id="2423578206845792524">Зургийг ... хэлбэрээр хадгал</translation> <translation id="2424424966051154874">{0,plural, =1{Зочин}other{Зочин (#)}}</translation> +<translation id="242684489663276773">Энэ үйлдэл нь: + <ph name="LINE_BREAKS" /> + • Chrome-н зарим тохиргоо болон Chrome-н товчлолуудыг шинэчилнэ + <ph name="LINE_BREAK" /> + • Өргөтгөлүүдийг идэвхгүй болгоно + <ph name="LINE_BREAK" /> + • Күүкинүүд болон сайтын бусад түр зуурын өгөгдлийг устгана + <ph name="LINE_BREAKS" /> + Хавчуурга, түүх болон хадгалсан нууц үгнүүдэд нөлөөлөхгүй.</translation> <translation id="2428510569851653187">Табыг гэмтсэн үед хийж байсан зүйлээ тайлбарлана уу</translation> <translation id="2428939361789119025">Wi-Fi-г унтраах</translation> <translation id="2428978615149723410">эдгээр сагс</translation> @@ -1877,6 +1889,7 @@ <translation id="2575407791320728464">Энэ URL буруу байна. Энэ нь зөв форматтай эсэхийг шалгана уу.</translation> <translation id="2575441894380764255">Төвөгтэй эсвэл хуурамч зар харуулахыг зөвшөөрөөгүй</translation> <translation id="2575713839157415345">{YEARS,plural, =1{Энэ төхөөрөмжийг 1 жилийн турш хадгалах бөгөөд та дараагийн удаа кодгүйгээр холбогдох боломжтой. Үүнийг танай администратор тохируулсан.}other{Энэ төхөөрөмжийг {YEARS} жилийн турш хадгалах бөгөөд та дараагийн удаа кодгүйгээр холбогдох боломжтой. Үүнийг танай администратор тохируулсан.}}</translation> +<translation id="2577446426265992344">Omnibox-гүй</translation> <translation id="257779572837908839">Уулзалтад зориулсан Chromebox-р тохируулах</translation> <translation id="2579309488038515659">Сүлжээний цэгийг идэвхжүүлэх</translation> <translation id="2579596474754516455">Шаардлагатай үед дэлгэц уншигчид зориулж PDF зургийг текст болгон хөрвүүлэхийн тулд скан хийгээрэй</translation> @@ -4467,6 +4480,7 @@ <translation id="4876895919560854374">Дэлгэцийг түгжих, түгжээг гаргах</translation> <translation id="4877276003880815204">Элементүүдийг шалгах</translation> <translation id="4877652723592270843">Та ChromeOS Flex-н бүрэлдэхүүн дэлгэц уншигч болох ChromeVox-г идэвхжүүлэхийг хүсэж байна уу? Хэрэв тийм бол хоёр дууны түвшний товчийг хоёуланг нь таван секундийн турш удаан дарна уу.</translation> +<translation id="4878261017150799673">Сайтыг идэвхтэй байлгах</translation> <translation id="4878634973244289103">Санал хүсэлтийг илгээх боломжгүй байна. Дараа дахин оролдоно уу.</translation> <translation id="4878653975845355462">Таны администратор захиалгат арын дэвсгэрийг унтраасан байна</translation> <translation id="4878718769565915065">Энэ аюулгүй байдлын түлхүүрт хурууны хээ нэмэх амжилтгүй боллоо</translation> @@ -5254,6 +5268,9 @@ <translation id="5602765853043467355">Энэ төхөөрөмжөөс хавчуурга, түүх, нууц үг болон бусад зүйлийг устгах</translation> <translation id="5605758115928394442">Таныг мөн эсэхийг баталгаажуулах зорилгоор таны утсанд мэдэгдэл илгээсэн болно.</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{Энэ өргөтгөлийг блоклосон байна}other{Эдгээр өргөтгөлийг блоклосон байна}}</translation> +<translation id="560743070587960985">Энэ файл вирус эсвэл хортой программ байж магадгүй. + +Та үүнийг аюултай эсэхийг шалгуулахаар Google рүү илгээх боломжтой. Скан хийхэд ихэвчлэн хэдэн секунд зарцуулдаг.</translation> <translation id="560834977503641186">Wi-Fi синк, Нэмэлт мэдээлэл авах</translation> <translation id="5608580678041221894">Тайрсан хэсгийг тохируулах эсвэл зөөхийн тулд дараах түлхүүрийг товшино уу</translation> <translation id="5609231933459083978">Энэхүү апп нь хүчин төгөлдөр бус апп байж болзошгүй байна.</translation> @@ -5991,6 +6008,7 @@ <translation id="6254892857036829079">Төгс</translation> <translation id="6257602895346497974">Синкийг асаах...</translation> <translation id="62586649943626337">Табын бүлгүүдээр табуудаа цэгцэлнэ үү</translation> +<translation id="6260092874648348841">Сайтыг идэвхтэй байлгах</translation> <translation id="6262371516389954471">Таны нөөцлөлтийг Google-д байршуулдаг бөгөөд таны Google Бүртгэлийн нууц үгийг ашиглан шифрлэдэг.</translation> <translation id="6263082573641595914">Microsoft-ийн CA хувилбар</translation> <translation id="6263284346895336537">Чухал биш</translation> @@ -6568,6 +6586,7 @@ <translation id="6787097042755590313">Бусад таб</translation> <translation id="6787839852456839824">Компьютерийн гарын богино холбоос</translation> <translation id="6788210894632713004">Багцлаагүй өргөтгөл</translation> +<translation id="678939393857169499">Дэлгэцийн шинэ дизайныг идэвхжүүлнэ.</translation> <translation id="6789592661892473991">Хэвтээ чиглэлд хуваах</translation> <translation id="6789834167207639931">Сэргээж дуусгахын тулд дараагийн дэлгэцэд Google Бүртгэлийн нууц үгээ дахин оруулна уу</translation> <translation id="6790428901817661496">Тоглуулах</translation> @@ -7365,6 +7384,7 @@ <translation id="7481312909269577407">Forward</translation> <translation id="7481358317100446445">Бэлэн</translation> <translation id="748138892655239008">Сертификатын үндсэн хязгаар</translation> +<translation id="7483145199632798061">Chrome Refresh 2023</translation> <translation id="7484645889979462775">Энэ сайтанд хэзээ ч битгий хадгал</translation> <translation id="7487141338393529395">Зөв бичгийн алдаа шалгах сайжруулсан онцлогийг асаах</translation> <translation id="7487969577036436319">Ямар ч бүрэлдэхүүн хэсэг суугдаагүй байна.</translation> @@ -7526,6 +7546,7 @@ <translation id="7634280112532283638">Спам болон залиланг бууруулах</translation> <translation id="7634337648687970851">Дотоод өгөгдлийг сэргээхийг одоогоор дэмждэггүй.</translation> <translation id="7634566076839829401">Алдаа гарлаа. Дахин ачаална уу.</translation> +<translation id="763472884969134151">Задлан шинжлэлийг <ph name="LINK" />-с хийдэг</translation> <translation id="7635048370253485243">Таны администратор бэхэлсэн</translation> <translation id="7635711411613274199">Таныг үзэх явцад таны харж буй зарыг хувийн болгосон эсэх нь энэ тохиргоо, <ph name="BEGIN_LINK1" />Зарын сэдэв<ph name="LINK_END1" />, таны <ph name="BEGIN_LINK2" />күүкиний тохиргоо<ph name="LINK_END2" /> болон таны үзэж буй сайт зарыг хувийн болгосон эсэхээс хамаарна</translation> <translation id="7636919061354591437">Энэ төхөөрөмж дээр суулгах</translation> @@ -8202,6 +8223,7 @@ <translation id="8195737548602430447">Тайлбарыг зорилтот хэл рүү автоматаар орчуулаарай.</translation> <translation id="8197673340773315084">Ажил эсвэл Хувийн зэрэг нэр эсвэл шошго нэмнэ үү</translation> <translation id="8198456017687137612">Табыг дамжуулж байна</translation> +<translation id="8198457270656084773">Системийн төхөөрөмжийн логийн хуудсыг хайж байна уу? <ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" />-д зочилно уу.</translation> <translation id="8198511718495409170">"<ph name="EXTENSION_NAME" />"-н шинэчилсэн тохиргоогоо энэ сайтад хэрэгжүүлэхийн тулд энэ хуудсыг дахин ачаална уу</translation> <translation id="8199300056570174101">Сүлжээ (Үйлчилгээ) болон Төхөөрөмжийн тодруулга</translation> <translation id="8200772114523450471">Сэргээх</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb index 899409d..3b2b2e0a 100644 --- a/chrome/app/resources/generated_resources_my.xtb +++ b/chrome/app/resources/generated_resources_my.xtb
@@ -527,6 +527,7 @@ <translation id="146000042969587795">ဒီဘောင်သည် စိတ်မချရသည့် အစိတ်အပိုင်း အချို့ ပါဝင်နေခဲ့ဥ ပိတ်ဆို့ခံခဲ့ရသည်။</translation> <translation id="1461041542809785877">ဆောင်ရွက်မှု</translation> <translation id="1461177659295855031">‘လိပ်စာဘား’ ဖိုင်တွဲသို့ ရွှေ့ရန်</translation> +<translation id="1461288887896722288">စီမံခန့်ခွဲထားသည့်အကောင့်သို့ သင်လက်မှတ်ထိုးဝင်လိုက်သည်။ စီမံခန့်ခွဲထားသော ပရိုဖိုင်သစ် ဖွင့်ခြင်းသည် ထိုအကောင့်နှင့် လင့်ခ်ချိတ်ထားသော ရင်းမြစ်အချို့ကို သုံးခွင့်ရရှိမည်။</translation> <translation id="146219525117638703">ONC State</translation> <translation id="146220085323579959">အင်တာနက် ချိတ်ဆက်မှု ဖြတ်တောက်လိုက်သည်။ သင့်အင်တာနက် ချိတ်ဆက်မှုကို စစ်ဆေးကာ ထပ်မံ ကြိုးစားပါ။</translation> <translation id="1462850958694534228">သင်္ကေတအပ်ဒိတ် ပြန်စိစစ်ရန်</translation> @@ -1890,6 +1891,7 @@ <translation id="2575407791320728464">URL မမှန်ကန်ပါ။ ၎င်းကိုမှန်ကန်စွာ ဖော်မက်လုပ်ထားကြောင်း သေချာပါစေ။</translation> <translation id="2575441894380764255">စိတ်အနှောင့်အယှက်ဖြစ်စေသော (သို့) အထင်အမြင်မှားစေသော ကြော်ငြာများပြရန် ခွင့်ပြုမထားပါ</translation> <translation id="2575713839157415345">{YEARS,plural, =1{ဤစက်ကို ၁ နှစ် သိမ်းပေးမည်ဖြစ်ပြီး နောက်တစ်ကြိမ်တွင် ကုဒ်မပါဘဲ ချိတ်ဆက်နိုင်သည်။ ၎င်းကို သင်၏စီမံခန့်ခွဲသူက သတ်မှတ်ထားသည်။}other{ဤစက်ကို {YEARS} နှစ် သိမ်းပေးမည်ဖြစ်ပြီး နောက်တစ်ကြိမ်တွင် ကုဒ်မပါဘဲ ချိတ်ဆက်နိုင်သည်။ ၎င်းကို သင်၏စီမံခန့်ခွဲသူက သတ်မှတ်ထားသည်။}}</translation> +<translation id="2577446426265992344">Omnibox မပါ</translation> <translation id="257779572837908839">အစည်းအဝေးများအတွက် Chromebox အဖြစ် စနစ်ထည့်သွင်းရန်</translation> <translation id="2579309488038515659">ဟော့စပေါ့ ဖွင့်ရန်</translation> <translation id="2579596474754516455">ဖန်သားပြင်ဖတ် အက်ပ်အတွက် လိုအပ်သောအခါတွင် စာသားအဖြစ်ပြောင်းလဲရန် PDF ပုံများကို စကင်ဖတ်ပါ</translation> @@ -6584,6 +6586,7 @@ <translation id="6787097042755590313">အခြားတဘ်</translation> <translation id="6787839852456839824">ကီးဘုတ် ဖြတ်လမ်းများ</translation> <translation id="6788210894632713004">နောက်ဆက်တွဲကို အထုပ်ဖြေထားသည်</translation> +<translation id="678939393857169499">ဒက်စ်တော့ဒီဇိုင်းသစ် သုံးခွင့်ပေးသည်။</translation> <translation id="6789592661892473991">အလျားလိုက် ခွဲရန်</translation> <translation id="6789834167207639931">ပြန်လည်ရယူမှု အပြီးသတ်ရန် လာမည့်စခရင်တွင် သင့် Google Account စကားဝှက်ကို ထပ်မံထည့်ပါ</translation> <translation id="6790428901817661496">ဖွင့်ရန်</translation> @@ -7381,6 +7384,7 @@ <translation id="7481312909269577407">ရှေ့သို့</translation> <translation id="7481358317100446445">အသင့်ဖြစ်ပြီ</translation> <translation id="748138892655239008">လက်မှတ် အခြေခံ ကန့်သတ်မှုများ</translation> +<translation id="7483145199632798061">၂၀၂၃ Chrome အသစ်</translation> <translation id="7484645889979462775">ဒီဆိုက် အတွက် လုံးဝမလုပ်ရန်</translation> <translation id="7487141338393529395">အဆင့်မြင့် စာလုံးပေါင်းစစ်ဆေးခြင်းကို ဖွင့်ပါ</translation> <translation id="7487969577036436319">တပ်ဆင်ထားသည့် အစိတ်အပိုင်းများ မရှိ</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb index ba022e5..e1f5584 100644 --- a/chrome/app/resources/generated_resources_ne.xtb +++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">यो ट्याब फेरि सक्रिय भएको छ</translation> <translation id="1003088604756913841">लिंकलाई नयाँ <ph name="APP" /> विन्डोमा खोल्नुहोस्</translation> <translation id="100323615638474026">USB डिभाइस (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Google सुरक्षित ब्राउजिङ</translation> <translation id="1004218526896219317">पहुँच राख्न सक्ने साइटहरू</translation> <translation id="1005274289863221750">आफ्नो माइक्रोफोन र क्यामेरा प्रयोग गर्नुहोस्</translation> <translation id="1005333234656240382">ADB डिबग प्रक्रिया सक्षम पार्ने हो?</translation> @@ -899,6 +900,7 @@ <translation id="1769104665586091481">लिङ्कलाई नयाँ &विन्डोमा खोल्नुहोस्</translation> <translation id="1770407692401984718">कुनै फोटो ड्रयाग गरेर यहाँ ड्रप गर्नुहोस् वा</translation> <translation id="177053719077591686">Android एपहरू Google Drive मा ब्याकअप गर्नुहोस्।</translation> +<translation id="1771075623623424448">ब्राउजरसम्बन्धी जानकारी भएको डिभाइसको लग पेज खोज्दै हुनुहुन्छ? <ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" /> मा जानुहोस्।</translation> <translation id="177336675152937177">होस्ट गरिएको एप लगत</translation> <translation id="1776712937009046120">प्रयोगकर्ता थप्नुहोस्</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> @@ -1681,6 +1683,15 @@ <translation id="2422125132043002186">Linux को पुनर्स्थापना रद्द गरियो</translation> <translation id="2423578206845792524">छविलाई यस रूपमा ब&चत गर्नुहोस्...</translation> <translation id="2424424966051154874">{0,plural, =1{अतिथि}other{अतिथि (#)}}</translation> +<translation id="242684489663276773">तपाईंले यसो गर्नुभयो भने: + <ph name="LINE_BREAKS" /> + • Chrome का केही सेटिङ तथा Chrome सर्टकटहरू रिसेट हुने छन् + <ph name="LINE_BREAK" /> + • एक्स्टेन्सनहरू अफ हुने छन् + <ph name="LINE_BREAK" /> + • कुकी तथा साइटका अन्य अस्थायी डेटा मेटिने छन् + <ph name="LINE_BREAKS" /> + बुकमार्क, हिस्ट्री तथा सेभ गरिएका पासवर्डहरू प्रभावित हुने छैनन्।</translation> <translation id="2428510569851653187">ट्याब क्र्यास भएको बेला तपाईं के गर्दै हुनुहुन्थ्यो भनी वर्णन दिनुहोस्</translation> <translation id="2428939361789119025">WiFi निष्क्रिय पार्नुहोस्</translation> <translation id="2428978615149723410">यी कार्टहरू</translation> @@ -4455,6 +4466,7 @@ <translation id="4876895919560854374">स्क्रिनलाई लक र अनलक गर्नुहोस्</translation> <translation id="4877276003880815204">तत्त्वहरूको निरीक्षण गर्नुहोस्</translation> <translation id="4877652723592270843">तपाईं ChromeOS Flex मा पहिले नै इन्स्टल गरिएको ChromeVox नामक स्क्रिन रिडर एक्टिभेट गर्न चाहनुहुन्छ? एक्टिभेट गर्न चाहनुहुन्छ भने पाँच सेकेन्डसम्म दुवै भोल्युम की थिचिराख्नुहोस्।</translation> +<translation id="4878261017150799673">साइट सक्रिय राखिराख्नुहोस्</translation> <translation id="4878634973244289103">प्रतिक्रिया पठाउन सकिएन। कृपया पछि फेरि प्रयास गर्नुहोस्।</translation> <translation id="4878653975845355462">इच्छ्याइएका पृष्ठभूमिहरू तपाईंका प्रशासकद्वारा निष्क्रिय पारिएका छन्</translation> <translation id="4878718769565915065">यो सुरक्षा साँचोमा फिंगरप्रिन्ट थप्न सकिएन</translation> @@ -5242,6 +5254,9 @@ <translation id="5602765853043467355">यो यन्त्रबाट पुस्तक चिन्ह, इतिहास, पासवर्ड र थप कुराहरू खाली गर्नुहोस्</translation> <translation id="5605758115928394442">यो व्यक्ति तपाईं नै हो भन्ने सुनिश्चित गर्न तपाईंको फोनमा एउटा सूचना पठाइयो।</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{यो एक्स्टेन्सन ब्लक गरिएको छ}other{यी एक्स्टेन्सन ब्लक गरिएका छन्}}</translation> +<translation id="560743070587960985">यो फाइल भाइरस वा मालवेयर हुन सक्छ। + +तपाईं उक्त फाइल सुरक्षित छ कि छैन भन्ने कुरा जाँच्न यसलाई Google कहाँ पठाउन सक्नुहुन्छ। स्क्यान गर्ने कार्य सामान्यतया केही बेरमै पूरा हुन्छ।</translation> <translation id="560834977503641186">Wi-Fi सिंकका बारेमा थप जान्नुहोस्</translation> <translation id="5608580678041221894">क्रप गर्ने क्षेत्रलाई समायोजन गर्न वा सार्न निम्न कुञ्जीहरूमा ट्याप गर्नुहोस्</translation> <translation id="5609231933459083978">एप अवैध जस्तो देखिन्छ।</translation> @@ -5978,6 +5993,7 @@ <translation id="6254892857036829079">उत्कृष्ट</translation> <translation id="6257602895346497974">सिंक गर्ने सुविधा अन गर्नुहोस्...</translation> <translation id="62586649943626337">ट्याब समूहहरू बनाएर ती समूहमा आफ्ना ट्याबहरू मिलाएर राख्नुहोस्</translation> +<translation id="6260092874648348841">साइट सक्रिय राखिराख्नुहोस्</translation> <translation id="6262371516389954471">तपाईंका ब्याकअपहरू Google मा अपलोड गरी तपाईंको Google खाताको पासवर्ड प्रयोग गरेर इन्क्रिप्ट गरिन्छन्।</translation> <translation id="6263082573641595914">Microsoft CA संस्करण</translation> <translation id="6263284346895336537">संवेदनशील छैन</translation> @@ -7515,6 +7531,7 @@ <translation id="7634280112532283638">स्प्याम तथा ठगी न्यूनीकरण गर्ने सुविधा</translation> <translation id="7634337648687970851">लोकल डेटा रिकभर गर्ने सुविधा हाल उपलब्ध छैन।</translation> <translation id="7634566076839829401">केहि गलत भयो। फेरि प्रयास गर्नुहोस्।</translation> +<translation id="763472884969134151"><ph name="LINK" /> ले विश्लेषण गरेको</translation> <translation id="7635048370253485243">तपाईंका एड्मिनले पिन गर्नुभएको</translation> <translation id="7635711411613274199">तपाईंले ब्राउज गर्दै गर्दा तपाईंलाई देखाइने कुनै विज्ञापन पर्सनलाइज गरिन्छ कि गरिँदैन भन्ने कुरा यो सेटिङ, <ph name="BEGIN_LINK1" />विज्ञापनका शीर्षक<ph name="LINK_END1" />, तपाईंले तय गर्नुभएको <ph name="BEGIN_LINK2" />कुकीसम्बन्धी सेटिङ<ph name="LINK_END2" /> र तपाईंले हेरिरहनुभएको साइटले विज्ञापन पर्सनलाइज गर्छ कि गर्दैन भन्ने कुरामा भर पर्छ</translation> <translation id="7636919061354591437">यो डिभाइसमा स्थापना गर्नुहोस्</translation> @@ -8193,6 +8210,7 @@ <translation id="8195737548602430447">क्याप्सनहरू स्वतः लक्षित भाषामा अनुवाद गरियोस्।</translation> <translation id="8197673340773315084">"कार्य" वा "व्यक्तिगत" जस्तो कुनै नाम वा लेबल हाल्नुहोस्</translation> <translation id="8198456017687137612">ट्याब कास्ट गरिँदै छ</translation> +<translation id="8198457270656084773">सिस्टमसम्बन्धी जानकारी भएको डिभाइसको लग पेज खोज्दै हुनुहुन्छ? <ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" /> मा जानुहोस्।</translation> <translation id="8198511718495409170">यो साइटमा "<ph name="EXTENSION_NAME" />" सम्बन्धी परिवर्तित सेटिङ लागू गर्न यो पेज रिलोड गर्नुहोस्</translation> <translation id="8199300056570174101">नेटवर्क (सेवा) र डिभाइसका गुणहरू</translation> <translation id="8200772114523450471">रिजुमी</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index 2361d5bb..d0cd11f 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">Tabblad weer actief</translation> <translation id="1003088604756913841">Link openen in een nieuw <ph name="APP" />-venster</translation> <translation id="100323615638474026">USB-apparaat (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Google Safe Browsing</translation> <translation id="1004218526896219317">Toegang tot site</translation> <translation id="1005274289863221750">Je microfoon en camera gebruiken</translation> <translation id="1005333234656240382">ADB-foutopsporing aanzetten?</translation> @@ -902,6 +903,7 @@ <translation id="1769104665586091481">Link openen in nieu&w venster</translation> <translation id="1770407692401984718">Sleep hier een afbeelding naartoe of</translation> <translation id="177053719077591686">Maak een back-up van Android-apps in Google Drive.</translation> +<translation id="1771075623623424448">Zoek je de pagina met apparaatlogboeken van de browser? Ga naar <ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="177336675152937177">Gehoste app-gegevens</translation> <translation id="1776712937009046120">Gebruiker toevoegen</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> @@ -1684,6 +1686,15 @@ <translation id="2422125132043002186">Linux herstellen geannuleerd</translation> <translation id="2423578206845792524">Af&beelding opslaan als...</translation> <translation id="2424424966051154874">{0,plural, =1{Gast}other{Gast (#)}}</translation> +<translation id="242684489663276773">Door deze actie gebeurt het volgende: +<ph name="LINE_BREAKS" /> +• Sommige Chrome-instellingen en -sneltoetsen worden gereset +<ph name="LINE_BREAK" /> +• Extensies worden uitgezet +<ph name="LINE_BREAK" /> +• Cookies en andere tijdelijke sitegegevens worden verwijderd +<ph name="LINE_BREAKS" /> +Dit heeft geen gevolgen voor bookmarks, geschiedenis en opgeslagen wachtwoorden.</translation> <translation id="2428510569851653187">Beschrijf wat je aan het doen was toen het tabblad crashte</translation> <translation id="2428939361789119025">Wifi uitzetten</translation> <translation id="2428978615149723410">deze kaarten</translation> @@ -4456,6 +4467,7 @@ <translation id="4876895919560854374">Het scherm vergrendelen en ontgrendelen</translation> <translation id="4877276003880815204">Elementen inspecteren</translation> <translation id="4877652723592270843">Wil je ChromeVox, de ingebouwde schermlezer voor Chrome OS Flex, activeren? Houd dan beide volumeknoppen 5 seconden ingedrukt.</translation> +<translation id="4878261017150799673">Site actief houden</translation> <translation id="4878634973244289103">Kan geen feedback sturen. Probeer het later opnieuw.</translation> <translation id="4878653975845355462">Aangepaste achtergronden zijn uitgezet door je beheerder</translation> <translation id="4878718769565915065">Kan vingerafdruk niet toevoegen aan deze beveiligingssleutel</translation> @@ -5243,6 +5255,9 @@ <translation id="5602765853043467355">Bookmarks, geschiedenis, wachtwoorden en meer wissen van dit apparaat</translation> <translation id="5605758115928394442">Er is een melding naar je telefoon verstuurd om te bevestigen dat jij het bent.</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{Deze extensie is geblokkeerd}other{Deze extensies zijn geblokkeerd}}</translation> +<translation id="560743070587960985">Dit bestand is misschien een virus of malware. + +Je kunt het bestand naar Google sturen om te laten checken of het onveilig is. Scans duren meestal een paar seconden.</translation> <translation id="560834977503641186">Wifi-synchronisatie, meer informatie</translation> <translation id="5608580678041221894">Tik op de volgende toetsen om het bijsnijdgebied aan te passen of te verplaatsen</translation> <translation id="5609231933459083978">De app blijkt ongeldig te zijn.</translation> @@ -5976,6 +5991,7 @@ <translation id="6254892857036829079">Perfect</translation> <translation id="6257602895346497974">Synchronisatie aanzetten...</translation> <translation id="62586649943626337">Je tabbladen ordenen met tabbladgroepen</translation> +<translation id="6260092874648348841">Site actief houden</translation> <translation id="6262371516389954471">Je back-ups worden geüpload naar Google en versleuteld met het wachtwoord van je Google-account.</translation> <translation id="6263082573641595914">CA-versie van Microsoft</translation> <translation id="6263284346895336537">Niet kritiek</translation> @@ -7511,6 +7527,7 @@ <translation id="7634280112532283638">Spam- en fraudebeperking</translation> <translation id="7634337648687970851">Herstel van lokale gegevens wordt op dit moment niet ondersteund.</translation> <translation id="7634566076839829401">Er is iets misgegaan. Probeer het opnieuw.</translation> +<translation id="763472884969134151">Analyse uitgevoerd door <ph name="LINK" /></translation> <translation id="7635048370253485243">Vastgezet door je beheerder</translation> <translation id="7635711411613274199">Of een advertentie wordt gepersonaliseerd terwijl je browst, is afhankelijk van deze instelling, <ph name="BEGIN_LINK1" />advertentieonderwerpen<ph name="LINK_END1" />, je <ph name="BEGIN_LINK2" />cookie-instellingen<ph name="LINK_END2" /> en of de site die je bekijkt advertenties personaliseert</translation> <translation id="7636919061354591437">Installeren op dit apparaat</translation> @@ -8188,6 +8205,7 @@ <translation id="8195737548602430447">Ondertiteling automatisch vertalen naar een doeltaal.</translation> <translation id="8197673340773315084">Voeg een naam of label toe, zoals Werk of Persoonlijk</translation> <translation id="8198456017687137612">Tabblad casten</translation> +<translation id="8198457270656084773">Zoek je de pagina met apparaatlogboeken van het systeem? Ga naar <ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="8198511718495409170">Laad deze pagina opnieuw om je geüpdatete instellingen voor <ph name="EXTENSION_NAME" /> toe te passen op deze site</translation> <translation id="8199300056570174101">Eigenschappen van netwerk (service) en apparaat</translation> <translation id="8200772114523450471">Doorgaan</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index 4218b71..96db8c6c6 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -204,6 +204,7 @@ <translation id="1166212789817575481">Lukk fanene til høyre</translation> <translation id="1166583374608765787">Gjennomgå navneoppdatering</translation> <translation id="1166596238782048887"><ph name="TAB_TITLE" /> tilhører skrivebordet <ph name="DESK_TITLE" /></translation> +<translation id="1167262726334064738">Prøv et nytt passord</translation> <translation id="1168020859489941584">Åpner om <ph name="TIME_REMAINING" />...</translation> <translation id="116896278675803795">Bytt språk automatisk ut ifra det markerte innholdet</translation> <translation id="1169266963600477608">Spillkontroller</translation> @@ -913,6 +914,7 @@ <translation id="177336675152937177">Appdata på vertstjener</translation> <translation id="1776712937009046120">Legg til bruker</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="177814385589420211">Hold inne søketasten for å bytte mellom funksjonstaster og tastene på øverste rad på systemet</translation> <translation id="1778457539567749232">Merk som ulest</translation> <translation id="1778991607452011493">Send feilsøkingslogger (anbefales)</translation> <translation id="1779441632304440041">Svake passord er enkle å gjette. Sørg for at du lager sterke passord.</translation> @@ -1354,6 +1356,7 @@ <translation id="2142582065325732898">Slå på <ph name="LINK1_BEGIN" />Chrome-synkronisering<ph name="LINK1_END" /> for å se nylige Chrome-faner. <ph name="LINK2_BEGIN" />Finn ut mer<ph name="LINK2_END" /></translation> <translation id="2143765403545170146">Vis alltid verktøyraden i fullskjerm</translation> <translation id="2143778271340628265">Manuell konfigurasjon av proxy-tjener</translation> +<translation id="2143808295261240440">Bruk anbefalt passord</translation> <translation id="2143915448548023856">Skjerminnstillinger</translation> <translation id="2144536955299248197">Visningsprogram for sertifikat: <ph name="CERTIFICATE_NAME" /></translation> <translation id="2144557304298909478">Android-apputvikling i Linux</translation> @@ -2343,6 +2346,7 @@ <translation id="2963151496262057773">Følgende programtillegg svarer ikke: <ph name="PLUGIN_NAME" />Vil du stoppe det?</translation> <translation id="2964193600955408481">Deaktiver Wifi</translation> <translation id="2964245677645334031">Tilgang for nærdeling</translation> +<translation id="2966705348606485669">Flere alternativer for bokmerkemappen <ph name="FOLDER_TITLE" /></translation> <translation id="2966937470348689686">Administrer Android-innstillinger</translation> <translation id="2967926928600500959">Nettadresser som gir treff på disse reglene, blir tvunget til å åpnes i en spesifikk nettleser.</translation> <translation id="2972581237482394796">Gjø&r om</translation> @@ -2632,6 +2636,7 @@ <translation id="3244294424315804309">Fortsett med å kutte lyden</translation> <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> – nettverksfeil</translation> <translation id="3248902735035392926">Sikkerhet er viktig. Bruk et øyeblikk på å <ph name="BEGIN_LINK" />sjekke utvidelsene dine nå<ph name="END_LINK" /></translation> +<translation id="3249323165366527554">Registrer deg og logg på raskere når passordet ditt automatisk blir lagret i <ph name="GOOGLE_PASSWORD_MANAGER" /> for <ph name="EMAIL" />.</translation> <translation id="3251714896659475029">La <ph name="SUPERVISED_USER_NAME" /> bruke Google-assistenten ved å si «Hey Google»</translation> <translation id="3251759466064201842"><Ikke del av sertifikat></translation> <translation id="325238099842880997">Angi digitale grunnregler for å hjelpe barn å leke, utforske og gjøre skolearbeid hjemme</translation> @@ -4124,6 +4129,7 @@ <translation id="4556194354084985730">Du kan enkelt logge på nettsteder og apper med de lagrede passordene dine. Når dette er slått av, blir du spurt før pålogging.</translation> <translation id="4558426062282641716">Tillatelse om autostart er forespurt</translation> <translation id="4559617833001311418">Dette nettstedet bruker bevegelses- eller lyssensorene dine.</translation> +<translation id="4560728518401799797">Flere alternativer for bokmerket i <ph name="FOLDER_TITLE" /></translation> <translation id="4561893854334016293">Ingen nylig endrede tillatelser</translation> <translation id="4562155214028662640">Legg til fingeravtrykk</translation> <translation id="4563210852471260509">Det opprinnelige inndataspråket er kinesisk</translation> @@ -4407,6 +4413,7 @@ <translation id="4819323978093861656">{0,plural, =0{Lukkes nå.}=1{Lukkes om 1 sekund.}other{Lukkes om # sekunder.}}</translation> <translation id="4819607494758673676">Google Assistent-varsler</translation> <translation id="4820236583224459650">Angi som aktiv sak</translation> +<translation id="4820795723433418303">Bruk funksjonstastene som tastene på øverste rad</translation> <translation id="4821935166599369261">&Profilering aktivert</translation> <translation id="4823484602432206655">lese og endre bruker- og enhetsinnstillinger</translation> <translation id="4824037980212326045">Linux-sikkerhetskopiering og -gjenoppretting</translation> @@ -4538,6 +4545,7 @@ <translation id="4925320384394644410">Portene dine vises her</translation> <translation id="49265687513387605">Kunne ikke caste skjermen. Sjekk om du har bekreftet forespørselen om å begynne å dele skjermen din.</translation> <translation id="4927753642311223124">Her er det ikke noe nytt. Men intet nytt er jo godt nytt!</translation> +<translation id="4928629450964837566">Bruk et sikrere passord</translation> <translation id="4929386379796360314">Destinasjoner for utskrift</translation> <translation id="4930447554870711875">Utviklere</translation> <translation id="4930714375720679147">Slå på</translation> @@ -4620,6 +4628,7 @@ <translation id="5010886807652684893">Visuell visning</translation> <translation id="5015344424288992913">Konverterer proxy ...</translation> <translation id="5016491575926936899">Du kan sende tekstmeldinger fra datamaskinen, dele internettilkoblingen, svare på samtalevarsler og låse opp <ph name="DEVICE_TYPE" /> med telefonen.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation> +<translation id="5016983299133677671">Prøv et nytt passord</translation> <translation id="5017643436812738274">Du kan navigere på sider med en tekstmarkør. Trykk på Ctrl + Søk + 7 for å slå av dette.</translation> <translation id="5018207570537526145">Åpne nettstedet for utvidelsen</translation> <translation id="5018526990965779848">Send bruks- og diagnostikkdata. Hjelp til med å gjøre Android-opplevelsen din bedre ved å sende diagnostikk-, enhets- og appbruksdata til Google automatisk. Dette bidrar til å gjøre systemet og appene bedre og mer stabile. Noen aggregerte data hjelper også Google-apper og -partnere, for eksempel Android-utviklere. Hvis du har slått på innstillingen for annen nett- og appaktivitet, kan disse dataene bli lagret i Google-kontoen din.</translation> @@ -4688,6 +4697,7 @@ <translation id="5078638979202084724">Legg inn alle faner som bokmerke</translation> <translation id="5078796286268621944">Feil personlig kode</translation> <translation id="5079010647467150187">Legg til innebygd VPN…</translation> +<translation id="5079699784114005398">Når dette slås på, blir appene dine tilgjengelige på alle ChromeOS-enheter når du logger på med Google-kontoen din. Nettprogrammer som er installert via Chrome-nettleseren, blir synkronisert selv hvis nettlesersynkronisering er slått av.</translation> <translation id="508059534790499809">Oppdater en Kerberos-sak</translation> <translation id="5081960376148623587">Velg om du vil at sider skal forhåndslastes</translation> <translation id="5084328598860513926">Identitetshåndteringen ble avbrutt. Prøv på nytt, eller kontakt eieren eller administratoren av enheten. Feilkode: <ph name="ERROR_CODE" />.</translation> @@ -4763,6 +4773,7 @@ <translation id="5145464978649806571">Hvis du beveger deg bort fra enheten, låses skjermen automatisk. Når du er foran enheten, holder skjermen seg ulåst lenger. Hvis låseskjermen er avslått, går enheten over i hvilemodus i stedet for å bli låst.</translation> <translation id="514575469079499857">Bruk IP-adressen din til å fastslå posisjonen (standard)</translation> <translation id="5146896637028965135">Systemstemme</translation> +<translation id="5147992672778369947">Bruk anbefalt passord</translation> <translation id="5148277445782867161">Googles posisjonstjeneste bruker kilder som wifi, mobilnettverk og sensorer til å estimere posisjonen til enheten din.</translation> <translation id="5150254825601720210">Navn på Netscape SSL-tjenersertifikat</translation> <translation id="5151354047782775295">Frigjør lagringsplass eller velg data som kan slettes automatisk</translation> @@ -5048,6 +5059,7 @@ <translation id="5414566801737831689">lese ikonene på nettstedene du besøker</translation> <translation id="5414836363063783498">Bekrefter …</translation> <translation id="5417312524372586921">Nettlesertemaer</translation> +<translation id="5417353542809767994">Ta i bruk et sterkt passord raskt</translation> <translation id="541737483547792035">Forstørr skjermen</translation> <translation id="5419405654816502573">Voice Match</translation> <translation id="5420274697768050645">Krev passord for å låse opp enheten, for ekstra sikkerhet</translation> @@ -5168,6 +5180,7 @@ <translation id="5517412723934627386"><ph name="NETWORK_TYPE" /> – <ph name="NETWORK_DISPLAY_NAME" /></translation> <translation id="5518949581554491184">Konfigurer med en Android-telefon</translation> <translation id="5519195206574732858">LTE</translation> +<translation id="5519900055135507385">Gjør kontoen sikrere med et sterkt passord. Det blir lagret i <ph name="GOOGLE_PASSWORD_MANAGER" /> for <ph name="EMAIL" />.</translation> <translation id="5521078259930077036">Er dette startsiden du forventet?</translation> <translation id="5522156646677899028">Denne utvidelsen inneholder et alvorlig sikkerhetsproblem.</translation> <translation id="5522403133543437426">Søkemotoren som brukes i adressefeltet.</translation> @@ -5786,6 +5799,7 @@ <translation id="6070311415473175157">Velg bildeområde for å søke</translation> <translation id="6071181508177083058">bekreft passordet</translation> <translation id="6071576563962215370">Systemet kunne ikke opprette enhetens attributtlås under installasjonen.</translation> +<translation id="6071938745001252305"><ph name="MEMORY_VALUE" /> minne er spart</translation> <translation id="6072442788591997866"><ph name="APP_NAME" /> er ikke tillatt på denne enheten. Kontakt administratoren din. Feilkode: <ph name="ERROR_CODE" />.</translation> <translation id="6073451960410192870">Stopp opptaket</translation> <translation id="6073903501322152803">Legg til tilgjengelighetsfunksjoner</translation> @@ -5833,6 +5847,7 @@ <translation id="6104068876731806426">Google-kontoer</translation> <translation id="6104311680260824317">Kan ikke knytte enheten til domenet. Tjeneren støtter ikke de angitte Kerberos-krypteringstypene. Du finner innstillinger for kryptering under «Flere alternativer».</translation> <translation id="6104796831253957966">Utskriftskøen er full</translation> +<translation id="6104929924898022309">Bruk søketasten for å endre funksjonstastenes virkemåte</translation> <translation id="6106167152849320869">Hvis du også valgte å sende diagnostikk- og bruksdata på det forrige trinnet, blir disse dataene samlet inn for installerte apper.</translation> <translation id="6111972606040028426">Slå på Google-assistenten</translation> <translation id="6112294629795967147">Trykk for å endre størrelsen</translation> @@ -5974,6 +5989,7 @@ <translation id="6234108445915742946">Vilkårene for bruk av Chrome endres 31. mars</translation> <translation id="6234474535228214774">Venter på installering</translation> <translation id="6235208551686043831">Enhetskameraet er slått på. Plassér QR-koden for eSIM-kortet foran kameraet.</translation> +<translation id="6237297174664969437">Du kan når som helst velge hvilke nettlesingsdata som skal synkroniseres, i Chrome-innstillingene. I <ph name="LINK_BEGIN" />enhetsinnstillingene<ph name="LINK_END" /> kan du styre synkroniseringen for nettprogrammer som er installert via Chrome-nettleseren. Google kan gi Søk og andre tjenester personlig preg basert på loggen din.</translation> <translation id="6237474966939441970">App for notatskriving med pekepenn</translation> <translation id="623755660902014047">Lesemodus</translation> <translation id="6238767809035845642">Tekst er delt fra en annen enhet</translation> @@ -6307,6 +6323,7 @@ <translation id="6537613839935722475">Navnet kan inneholde bokstaver, tall og bindestreker (-)</translation> <translation id="6538098297809675636">Kunne ikke gjenkjenne koden</translation> <translation id="653920215766444089">Søker etter pekeenhet</translation> +<translation id="6539674013849300372">Hold deg tryggere på nettet med et sterkt passord. Det blir lagret i <ph name="GOOGLE_PASSWORD_MANAGER" /> for <ph name="EMAIL" />.</translation> <translation id="653983593749614101">Gjenopptar …</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Merk:<ph name="END_BOLD" /> Ettersom innsamling av data kan redusere ytelsen bør du bare aktivere dette hvis du vet hva du gjør eller har blitt bedt om å gjøre dette.</translation> <translation id="6541638731489116978">Dette nettstedet er blokkert fra å få tilgang til bevegelsessensorene dine.</translation> @@ -6501,6 +6518,7 @@ <translation id="671226373742585927">Klikk på «X»-knappen for å lukke sidepanelet.</translation> <translation id="6712943853047024245">Du har allerede lagret et passord med dette brukernavnet for <ph name="WEBSITE" /></translation> <translation id="6713233729292711163">Legg til en jobbprofil</translation> +<translation id="6713441551032149301">Hold inne Appoversikt-tasten for å bytte mellom funksjonstaster og tastene på øverste rad på systemet</translation> <translation id="6713668088933662563">Tilby aldri å oversette disse språkene</translation> <translation id="6715803357256707211">Det oppsto en feil under installasjon av Linux-programmet. Klikk på varselet for mer informasjon.</translation> <translation id="671619610707606484">Dette sletter <ph name="TOTAL_USAGE" /> data som er lagret av nettsteder</translation> @@ -6622,6 +6640,7 @@ <translation id="6811034713472274749">Siden er klar til å vises</translation> <translation id="6811151703183939603">Fast</translation> <translation id="6811332638216701903">DHCP-vertsnavn</translation> +<translation id="6811792477922751991">Bruk Appoversikt-tasten for å endre funksjonstastenes virkemåte</translation> <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> kan ikke kjøres som rot.</translation> <translation id="6812841287760418429">Behold endringene</translation> <translation id="6813907279658683733">Hele skjermen</translation> @@ -7816,6 +7835,7 @@ <translation id="7851720427268294554">IPP-parser</translation> <translation id="78526636422538552">Det er ikke mulig å legge til flere Google-kontoer</translation> <translation id="7853747251428735">Flere verktø&y</translation> +<translation id="7853999103056713222">Bruk et sikrere passord</translation> <translation id="7855678561139483478">Flytt fanen til et nytt vindu</translation> <translation id="7857004848504343806">Datamaskinen din inneholder en sikker modul, som brukes til å implementere mange viktige sikkerhetsfunksjoner i ChromeOS Flex. Gå til Chromebook-brukerstøtten for å finne ut mer: https://support.google.com/chromebook/?p=sm</translation> <translation id="7857093393627376423">Tekstforslag</translation> @@ -8371,6 +8391,7 @@ <translation id="8325413836429495820">Nettsteder som ikke har lov til å se utklippstavlen din</translation> <translation id="8326478304147373412">PKCS #7, sertifikat-kjede</translation> <translation id="8327386430364625757">Matematisk skrifttype</translation> +<translation id="8327538105740918488">Du kan alltid endre dette passordet senere. Det blir lagret i <ph name="GOOGLE_PASSWORD_MANAGER" /> for <ph name="EMAIL" />.</translation> <translation id="8327676037044516220">Tillatelser og innholdsinnstillinger</translation> <translation id="8330617762701840933">Listen over nettsteder som omdirigeres til den alternative nettleseren.</translation> <translation id="8330689128072902965">Kontakter i nærheten kan dele med deg. Klikk for å endre.</translation> @@ -8516,6 +8537,7 @@ <translation id="8449836157089738489">Åpne alle i en ny fanegruppe</translation> <translation id="8451512073679317615">assistent</translation> <translation id="845702320058262034">Kan ikke koble til. Kontroller at telefonens Bluetooth er på.</translation> +<translation id="8457251154056341970">Du kommer ikke til å se <ph name="MODULE_NAME" /> på denne siden igjen</translation> <translation id="8457451314607652708">Importér bokmerker</translation> <translation id="8458341576712814616">Snarvei</translation> <translation id="8458627787104127436">Åpne alle (<ph name="URL_COUNT" />) i et nytt vindu</translation> @@ -8588,6 +8610,7 @@ <translation id="8514955299594277296">Ikke la nettsteder lagre data på enheten din (anbefales ikke)</translation> <translation id="8517759303731677493">Endre …</translation> <translation id="8519895319663397036">Kan ikke importere passordene. Filstørrelsen må være under 150 kB.</translation> +<translation id="851991974800416566">Ta i bruk et sterkt passord raskt</translation> <translation id="8523493869875972733">Behold endringene</translation> <translation id="8523849605371521713">Lagt til som følge av retningslinjer</translation> <translation id="8524783101666974011">Lagre kort i Google-kontoen din</translation> @@ -8745,6 +8768,7 @@ <translation id="8665110742939124773">Du har oppgitt feil tilgangskode. Prøv på nytt.</translation> <translation id="8665180165765946056">Sikkerhetskopieringen er fullført</translation> <translation id="866611985033792019">Stol på dette sertifikatet for identifisering av e-postbrukere.</translation> +<translation id="8666268818656583275">F-tastene har nå samme virkemåte som tastene på øverste rad på systemet</translation> <translation id="8666321716757704924"><ph name="WEBSITE" /> har fått tillatelsene tilbake</translation> <translation id="8666759526542103597">Om nettleserbasert personlig tilpasning av annonser</translation> <translation id="8667261224612332309">Du har passord som kan forbedres</translation> @@ -9427,6 +9451,7 @@ <translation id="950307215746360464">Konfigureringsveiledning</translation> <translation id="951991426597076286">Avvis</translation> <translation id="952471655966876828">Enheten kobles til automatisk når den slås på og er i bruk</translation> +<translation id="952880932803612259">La apper, nettsteder og systemtjenester bruke posisjonen din. Posisjonstjenestene kan bruke kilder som wifi, mobilnettverk og sensorer for å anslå enhetens posisjon.</translation> <translation id="953434574221655299">Får vite når du bruker enheten aktivt</translation> <translation id="956500788634395331">Du er beskyttet mot potensielt skadelige utvidelser</translation> <translation id="957179356621191750">6-punkts</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb index 4a062ed2..f75e83f 100644 --- a/chrome/app/resources/generated_resources_or.xtb +++ b/chrome/app/resources/generated_resources_or.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">ଟାବ ପୁଣି ସକ୍ରିୟ ହୋଇଛି</translation> <translation id="1003088604756913841">ନୂତନ <ph name="APP" /> ୱିଣ୍ଡୋରେ ଲିଙ୍କ୍ ଖୋଲନ୍ତୁ</translation> <translation id="100323615638474026">USB ଡିଭାଇସ୍ (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Google ସୁରକ୍ଷିତ ବ୍ରାଉଜିଂ</translation> <translation id="1004218526896219317">ସାଇଟ୍ ଆକ୍ସେସ୍</translation> <translation id="1005274289863221750">ଆପଣଙ୍କର ମାଇକ୍ରୋଫୋନ୍ ଓ କ୍ୟାମେରା ବ୍ୟବହାର କରନ୍ତୁ</translation> <translation id="1005333234656240382">ADB ଡିବଗିଂ ସକ୍ଷମ କରିବେ?</translation> @@ -900,6 +901,7 @@ <translation id="1769104665586091481">ନୂତନ &ୱିଣ୍ଡୋରେ ଲିଙ୍କ୍ଗୁଡ଼ିକ ଖୋଲନ୍ତୁ</translation> <translation id="1770407692401984718">ଏଠାକୁ ଏକ ଇମେଜ ଡ୍ରାଗ କରନ୍ତୁ କିମ୍ବା</translation> <translation id="177053719077591686">Google Driveରେ Android ଆପଗୁଡ଼ିକର ବ୍ୟାକ ଅପ ନିଅନ୍ତୁ।</translation> +<translation id="1771075623623424448">ବ୍ରାଉଜର ଡିଭାଇସ-ଲଗ ପୃଷ୍ଠାକୁ ଖୋଜୁଛନ୍ତି? <ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" />କୁ ଭିଜିଟ କରନ୍ତୁ।</translation> <translation id="177336675152937177">ହୋଷ୍ଟ କରାଯାଇଥିବା ଆପ୍ ଡାଟା</translation> <translation id="1776712937009046120">ୟୁଜରଙ୍କୁ ଯୋଗ କରନ୍ତୁ</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> @@ -1681,6 +1683,15 @@ <translation id="2422125132043002186">Linuxର ରିଷ୍ଟୋର୍ ବାତିଲ୍ ହୋଇଯାଇଛି</translation> <translation id="2423578206845792524">&ପ୍ରତିଛବି ଏହି ଭାବେ ସଞ୍ଚୟ କରନ୍ତୁ...</translation> <translation id="2424424966051154874">{0,plural, =1{ଅତିଥି}other{ଅତିଥି (#)}}</translation> +<translation id="242684489663276773">ଏହି କାର୍ଯ୍ୟ: + <ph name="LINE_BREAKS" /> + • କିଛି Chrome ସେଟିଂସ ଓ Chrome ସର୍ଟକଟକୁ ରିସେଟ କରିବ + <ph name="LINE_BREAK" /> + • ଏକ୍ସଟେନସନଗୁଡ଼ିକୁ ଅକ୍ଷମ କରିବ + <ph name="LINE_BREAK" /> + • କୁକୀ ଓ ଅନ୍ୟ ଅସ୍ଥାୟୀ ସାଇଟ ଡାଟାକୁ ଡିଲିଟ କରିବ + <ph name="LINE_BREAKS" /> + ବୁକମାର୍କ, ଇତିହାସ ଓ ସେଭ କରାଯାଇଥିବା ପାସୱାର୍ଡଗୁଡ଼ିକ ପ୍ରଭାବିତ ହେବ ନାହିଁ।</translation> <translation id="2428510569851653187">ଟାବ୍ କ୍ରାସ୍ ହେବା ସମୟରେ ଆପଣ କ'ଣ କରୁଥିଲେ ବର୍ଣ୍ଣନା କରନ୍ତୁ</translation> <translation id="2428939361789119025">ୱାଇ-ଫାଇ ବନ୍ଦ କରନ୍ତୁ</translation> <translation id="2428978615149723410">ଏହି କାର୍ଟଗୁଡ଼ିକ</translation> @@ -4454,6 +4465,7 @@ <translation id="4876895919560854374">ସ୍କ୍ରିନ୍କୁ ଲକ୍ ଏବଂ ଅନ୍ଲକ୍ କରନ୍ତୁ</translation> <translation id="4877276003880815204">ଉପାଦାନଗୁଡ଼ିକ ଯାଞ୍ଚ କରନ୍ତୁ</translation> <translation id="4877652723592270843">ଆପଣ ChromeOS Flex ପାଇଁ ବିଲ୍ଟ-ଇନ ସ୍କ୍ରିନ ରିଡର, ChromeVoxକୁ ସକ୍ରିୟ କରିବାକୁ ଚାହୁଁଛନ୍ତି? ଯଦି ଏପରି ହୋଇଥାଏ, ତେବେ ପାଞ୍ଚ ସେକେଣ୍ଡ ପାଇଁ ଉଭୟ ଭଲ୍ୟୁମ କୀ’କୁ ଦବାଇ ଧରନ୍ତୁ।</translation> +<translation id="4878261017150799673">ସାଇଟକୁ ସକ୍ରିୟ ରଖନ୍ତୁ</translation> <translation id="4878634973244289103">ମତାମତ ପଠାଇବାକୁ ଅକ୍ଷମ। ଦୟାକରି ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation> <translation id="4878653975845355462">ଆପଣଙ୍କର ଆଡ୍ମିନିଷ୍ଟ୍ରେଟର୍ଙ୍କ ଦ୍ୱାରା କଷ୍ଟମ୍ ପୃଷ୍ଠପଟଗୁଡ଼ିକ ବନ୍ଦ କରାଯାଇଛି</translation> <translation id="4878718769565915065">ଏହି ସୁରକ୍ଷା କୀରେ ଏକ ଟିପଚିହ୍ନ ଯୋଗ କରିବା ବିଫଳ ହୋଇଛି</translation> @@ -5241,6 +5253,9 @@ <translation id="5602765853043467355">ଏହି ଡିଭାଇସ୍ରୁ ବୁକ୍ମାର୍କ, ଇତିବୃତ୍ତି, ପାସ୍ୱର୍ଡ ଏବଂ ଆହୁରି ଅନେକ କିଛି ଖାଲି କରନ୍ତୁ</translation> <translation id="5605758115928394442">ଏହା ଆପଣ ବୋଲି ସୁନିଶ୍ଚିତ କରିବା ପାଇଁ ଆପଣଙ୍କ ଫୋନ୍କୁ ଗୋଟିଏ ବିଜ୍ଞପ୍ତି ପଠାଯାଇଥିଲା।</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{ଏହି ଏକ୍ସଟେନସନକୁ ବ୍ଲକ୍ କରାଯାଇଛି}other{ଏହି ଏକ୍ସଟେନସନଗୁଡ଼ିକୁ ବ୍ଲକ୍ କରାଯାଇଛି}}</translation> +<translation id="560743070587960985">ଏହି ଫାଇଲ ଏକ ଭାଇରସ କିମ୍ବା ମାଲୱେର ହୋଇଥାଇପାରେ। + +ଏହା ସୁରକ୍ଷିତ ନା ନୁହେଁ ତାହା ଯାଞ୍ଚ କରିବାକୁ ଆପଣ ଏହାକୁ Googleକୁ ପଠାଇପାରିବେ। ସ୍କାନ ପାଇଁ ସାଧାରଣତଃ କିଛି ସମୟ ଲାଗିପାରେ।</translation> <translation id="560834977503641186">ୱାଇ-ଫାଇ ସିଙ୍କ୍, ଅଧିକ ଜାଣନ୍ତୁ</translation> <translation id="5608580678041221894">କ୍ରପିଂ ଏରିଆକୁ ଆଡ୍ଜଷ୍ଟ କରିବା ପାଇଁ କିମ୍ୱା ଘୁଞ୍ଚାଇବା ପାଇଁ ନିମ୍ନରେ ଥିବା କୀଗୁଡ଼ିକୁ ଟାପ୍ କରନ୍ତୁ</translation> <translation id="5609231933459083978">ଆପ୍ଲିକେସନ୍ ଅବୈଧ ଥିବା ଜଣାପଡୁଛି।</translation> @@ -5975,6 +5990,7 @@ <translation id="6254892857036829079">ଉତ୍କୃଷ୍ଟ</translation> <translation id="6257602895346497974">ସିଙ୍କ୍କୁ ଚାଲୁ କରନ୍ତୁ...</translation> <translation id="62586649943626337">ଟାବ ଗ୍ରୁପ ସହ ଆପଣଙ୍କ ଟାବଗୁଡ଼ିକୁ ବ୍ୟବସ୍ଥିତ କରନ୍ତୁ</translation> +<translation id="6260092874648348841">ସାଇଟକୁ ସକ୍ରିୟ ରଖନ୍ତୁ</translation> <translation id="6262371516389954471">ଆପଣଙ୍କ ବ୍ୟାକଅପଗୁଡ଼ିକୁ Googleରେ ଅପଲୋଡ୍ କରାଯାଇଛି ଏବଂ ଆପଣଙ୍କ Google ଆକାଉଣ୍ଟ ପାସୱାର୍ଡକୁ ବ୍ୟବହାର କରି ଏନକ୍ରିପ୍ଟ କରାଯାଇଛି।</translation> <translation id="6263082573641595914">Microsoft CA ସଂସ୍କରଣ</translation> <translation id="6263284346895336537">ଜଟିଳ ନୁହେଁ</translation> @@ -7512,6 +7528,7 @@ <translation id="7634280112532283638">ସ୍ପାମ ଓ ଠକାମୀରେ ହ୍ରାସ</translation> <translation id="7634337648687970851">ସ୍ଥାନୀୟ ଡାଟା ରିକଭରି ବର୍ତ୍ତମାନ ସମର୍ଥିତ ନୁହେଁ।</translation> <translation id="7634566076839829401">କିଛି ତ୍ରୁଟି ହୋଇଗଲା। ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation> +<translation id="763472884969134151"><ph name="LINK" /> ଦ୍ୱାରା ବିଶ୍ଳେଷଣ କରାଯାଇଛି</translation> <translation id="7635048370253485243">ଆପଣଙ୍କ ଆଡମିନିଷ୍ଟ୍ରେଟର୍ ପିନ୍ କରିଛନ୍ତି</translation> <translation id="7635711411613274199">ଆପଣ ବ୍ରାଉଜ କରିବା ସମୟରେ, ଆପଣ ଦେଖୁଥିବା ଏକ ବିଜ୍ଞାପନକୁ ପର୍ସନାଲାଇଜ କରାଯାଇଛି ନା ନାହିଁ ତାହା ଏହି ସେଟିଂ, <ph name="BEGIN_LINK1" />ବିଜ୍ଞାପନ ବିଷୟ<ph name="LINK_END1" />, ଆପଣଙ୍କ <ph name="BEGIN_LINK2" />କୁକୀ ସେଟିଂସ<ph name="LINK_END2" /> ଏବଂ ଆପଣ ଦେଖୁଥିବା ସାଇଟ ବିଜ୍ଞାପନକୁ ପର୍ସନାଲାଇଜ କରେ ନା ନାହିଁ, ତାହା ଉପରେ ନିର୍ଭର କରେ</translation> <translation id="7636919061354591437">ଏହି ଡିଭାଇସ୍ରେ ଇନ୍ଷ୍ଟଲ୍ କରନ୍ତୁ</translation> @@ -8189,6 +8206,7 @@ <translation id="8195737548602430447">କୌଣସି ଟାର୍ଗେଟ ଭାଷାରେ କେପସନଗୁଡ଼ିକୁ ସ୍ୱତଃ ଅନୁବାଦ କରନ୍ତୁ।</translation> <translation id="8197673340773315084">ୱାର୍କ କିମ୍ବା ବ୍ୟକ୍ତିଗତ ପରି ଏକ ନାମ କିମ୍ବା ଲେବଲ ଯୋଗ କରନ୍ତୁ</translation> <translation id="8198456017687137612">କାଷ୍ଟିଂ ଟାବ୍</translation> +<translation id="8198457270656084773">ସିଷ୍ଟମ ଡିଭାଇସ-ଲଗ ପୃଷ୍ଠାକୁ ଖୋଜୁଛନ୍ତି? <ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" />କୁ ଭିଜିଟ କରନ୍ତୁ।</translation> <translation id="8198511718495409170">ଏହି ସାଇଟରେ "<ph name="EXTENSION_NAME" />" ନିମନ୍ତେ ଆପଣଙ୍କ ଅପଡେଟ କରାଯାଇଥିବା ସେଟିଂସ ଲାଗୁ କରିବା ପାଇଁ ଏହି ପୃଷ୍ଠାକୁ ପୁଣି ଲୋଡ କରନ୍ତୁ</translation> <translation id="8199300056570174101">ନେଟ୍ୱାର୍କ (ସେବା) ଏବଂ ଡିଭାଇସ୍ର ଗୁଣଧର୍ମ</translation> <translation id="8200772114523450471">ସାରାଶଂ</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb index c8d0d89..e8399f6 100644 --- a/chrome/app/resources/generated_resources_pa.xtb +++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">ਟੈਬ ਦੁਬਾਰਾ ਕਿਰਿਆਸ਼ੀਲ ਹੈ</translation> <translation id="1003088604756913841">ਨਵੀਂ <ph name="APP" /> ਵਿੰਡੋ ਵਿੱਚ ਲਿੰਕ ਖੋਲ੍ਹੋ</translation> <translation id="100323615638474026">USB ਡੀਵਾਈਸ (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Google ਸੁਰੱਖਿਅਤ ਬ੍ਰਾਊਜ਼ਿੰਗ</translation> <translation id="1004218526896219317">ਸਾਈਟ ਤੱਕ ਪਹੁੰਚ</translation> <translation id="1005274289863221750">ਆਪਣਾ ਮਾਈਕ੍ਰੋਫੋਨ ਅਤੇ ਕੈਮਰਾ ਵਰਤੋ</translation> <translation id="1005333234656240382">ਕੀ ADB ਡੀਬੱਗਿੰਗ ਨੂੰ ਚਾਲੂ ਕਰਨਾ ਹੈ?</translation> @@ -528,6 +529,7 @@ <translation id="146000042969587795">ਇਹ ਫ੍ਰੇਮ ਬਲਾਕ ਕੀਤਾ ਗਿਆ ਕਿਉਂਕਿ ਇਸ ਵਿੱਚ ਕੁਝ ਅਸੁਰੱਖਿਅਤ ਸਮੱਗਰੀ ਹੈ।</translation> <translation id="1461041542809785877">ਪ੍ਰਦਰਸ਼ਨ</translation> <translation id="1461177659295855031">ਬੁੱਕਮਾਰਕ ਬਾਰ ਫੋਲਡਰ 'ਤੇ ਜਾਓ</translation> +<translation id="1461288887896722288">ਤੁਸੀਂ ਹੁਣੇ ਪ੍ਰਬੰਧਿਤ ਖਾਤੇ ਵਿੱਚ ਸਾਈਨ ਇਨ ਕੀਤਾ ਹੈ, ਨਵਾਂ ਪ੍ਰਬੰਧਿਤ ਪ੍ਰੋਫਾਈਲ ਬਣਾਉਣ ਨਾਲ ਤੁਸੀਂ ਉਨ੍ਹਾਂ ਕੁਝ ਸਰੋਤਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕੋਗੇ ਜੋ ਉਸ ਖਾਤੇ ਨਾਲ ਲਿੰਕ ਹਨ।</translation> <translation id="146219525117638703">ONC ਸਥਿਤੀ</translation> <translation id="146220085323579959">ਇੰਟਰਨੈੱਟ ਡਿਸਕਨੈਕਟ ਹੋਇਆ। ਕਿਰਪਾ ਕਰਕੇ ਆਪਣੇ ਇੰਟਰਨੈੱਟ ਕਨੈਕਸ਼ਨ ਦੀ ਜਾਂਚ ਕਰੋ ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> <translation id="1462850958694534228">ਪ੍ਰਤੀਕ ਸੰਬੰਧੀ ਅੱਪਡੇਟ ਦੀ ਸਮੀਖਿਆ ਕਰੋ</translation> @@ -913,6 +915,7 @@ <translation id="1769104665586091481">ਨਵੀਂ &Window ਵਿੱਚ ਲਿੰਕ ਖੋਲ੍ਹੋ</translation> <translation id="1770407692401984718">ਚਿੱਤਰ ਨੂੰ ਇੱਥੇ ਘਸੀਟੋ ਜਾਂ</translation> <translation id="177053719077591686">Google Drive 'ਤੇ Android ਐਪਾਂ ਦਾ ਬੈਕਅੱਪ ਲਓ।</translation> +<translation id="1771075623623424448">ਕੀ ਬ੍ਰਾਊਜ਼ਰ ਡੀਵਾਈਸ-ਲੌਗ ਪੰਨਾ ਲੱਭ ਰਹੇ ਹੋ? <ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" /> 'ਤੇ ਜਾਓ।</translation> <translation id="177336675152937177">ਹੋਸਟ ਕੀਤਾ ਐਪ ਡਾਟਾ</translation> <translation id="1776712937009046120">ਵਰਤੋਂਕਾਰ ਸ਼ਾਮਲ ਕਰੋ</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> @@ -1699,6 +1702,15 @@ <translation id="2422125132043002186">Linux ਮੁੜ-ਬਹਾਲੀ ਰੱਦ ਕੀਤੀ ਗਈ</translation> <translation id="2423578206845792524">ਦੇ ਤੌਰ 'ਤੇ ਚਿੱਤਰ ਰੱ&ਖਿਅਤ ਕਰੋ...</translation> <translation id="2424424966051154874">{0,plural, =1{ਮਹਿਮਾਨ}one{ਮਹਿਮਾਨ (#)}other{ਮਹਿਮਾਨ (#)}}</translation> +<translation id="242684489663276773">ਇਹ ਕਾਰਵਾਈ: + <ph name="LINE_BREAKS" /> + • ਕੁਝ Chrome ਸੈਟਿੰਗਾਂ ਅਤੇ Chrome ਸ਼ਾਰਟਕੱਟਾਂ ਨੂੰ ਰੀਸੈੱਟ ਕਰੇਗੀ + <ph name="LINE_BREAK" /> + • ਐਕਸਟੈਂਸ਼ਨਾਂ ਨੂੰ ਬੰਦ ਕਰੇਗੀ + <ph name="LINE_BREAK" /> + • ਕੁਕੀਜ਼ ਅਤੇ ਅਸਥਾਈ ਸਾਈਟ ਡਾਟੇ ਨੂੰ ਮਿਟਾਵੇਗੀ + <ph name="LINE_BREAKS" /> + ਬੁੱਕਮਾਰਕ, ਇਤਿਹਾਸ ਅਤੇ ਰੱਖਿਅਤ ਕੀਤੇ ਪਾਸਵਰਡ ਪ੍ਰਭਾਵਿਤ ਨਹੀਂ ਹੋਣਗੇ।</translation> <translation id="2428510569851653187">ਟੈਬ ਕ੍ਰੈਸ਼ ਹੋਣ ਸਮੇਂ ਤੁਹਾਡੇ ਦੁਆਰਾ ਕੀਤੇ ਜਾ ਰਹੇ ਕੰਮਾਂ ਦਾ ਵਰਣਨ ਕਰੋ</translation> <translation id="2428939361789119025">ਵਾਈ-ਫਾਈ ਬੰਦ ਕਰੋ</translation> <translation id="2428978615149723410">ਇਹ ਕਾਰਟ</translation> @@ -1882,6 +1894,7 @@ <translation id="2575407791320728464">ਅਵੈਧ URL. ਪੱਕਾ ਕਰੋ ਕਿ ਇਸਨੂੰ ਸਹੀ ਢੰਗ ਨਾਲ ਫਾਰਮੈਟ ਕੀਤਾ ਗਿਆ ਹੈ।</translation> <translation id="2575441894380764255">ਦਖਲਅੰਦਾਜ਼ੀ ਜਾਂ ਗੁਮਰਾਹ ਕਰਨ ਵਾਲੇ ਵਿਗਿਆਪਨ ਦਿਖਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ</translation> <translation id="2575713839157415345">{YEARS,plural, =1{ਇਸ ਡੀਵਾਈਸ ਨੂੰ 1 ਸਾਲ ਲਈ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾਵੇਗਾ ਅਤੇ ਅਗਲੀ ਵਾਰ ਤੁਸੀਂ ਬਿਨਾਂ ਕੋਡ ਦੇ ਕਨੈਕਟ ਹੋ ਸਕਦੇ ਹੋ। ਇਸਨੂੰ ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਸੈੱਟ ਕੀਤਾ ਗਿਆ ਹੈ।}one{ਇਸ ਡੀਵਾਈਸ ਨੂੰ {YEARS} ਸਾਲ ਲਈ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾਵੇਗਾ ਅਤੇ ਅਗਲੀ ਵਾਰ ਤੁਸੀਂ ਬਿਨਾਂ ਕੋਡ ਦੇ ਕਨੈਕਟ ਹੋ ਸਕਦੇ ਹੋ। ਇਸਨੂੰ ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਸੈੱਟ ਕੀਤਾ ਗਿਆ ਹੈ।}other{ਇਸ ਡੀਵਾਈਸ ਨੂੰ {YEARS} ਸਾਲਾਂ ਲਈ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾਵੇਗਾ ਅਤੇ ਅਗਲੀ ਵਾਰ ਤੁਸੀਂ ਬਿਨਾਂ ਕੋਡ ਦੇ ਕਨੈਕਟ ਹੋ ਸਕਦੇ ਹੋ। ਇਸਨੂੰ ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਸੈੱਟ ਕੀਤਾ ਗਿਆ ਹੈ।}}</translation> +<translation id="2577446426265992344">ਓਮਨੀਬਾਕਸ ਤੋਂ ਬਿਨਾਂ</translation> <translation id="257779572837908839">ਮੀਟਿੰਗਾਂ ਲਈ Chromebox ਵਜੋਂ ਸਥਾਪਤ ਕਰੋ</translation> <translation id="2579309488038515659">ਹੌਟਸਪੌਟ ਚਾਲੂ ਹੈ</translation> <translation id="2579596474754516455">ਲੋੜ ਪੈਣ 'ਤੇ ਸਕ੍ਰੀਨ ਰੀਡਰ ਲਈ ਚਿੱਤਰਾਂ ਨੂੰ ਲਿਖਤ ਵਿੱਚ ਬਦਲਣ ਵਾਸਤੇ PDF ਚਿੱਤਰਾਂ ਨੂੰ ਸਕੈਨ ਕਰੋ</translation> @@ -4472,6 +4485,7 @@ <translation id="4876895919560854374">ਸਕ੍ਰੀਨ ਨੂੰ ਲਾਕ ਅਤੇ ਅਣਲਾਕ ਕਰੋ</translation> <translation id="4877276003880815204">ਅੰਸ਼ਾਂ ਦੀ ਜਾਂਚ ਕਰੋ</translation> <translation id="4877652723592270843">ਕੀ ਤੁਸੀਂ ChromeOS Flex ਦੇ ਬਿਲਟ-ਇਨ ਸਕ੍ਰੀਨ ਰੀਡਰ ChromeVox ਨੂੰ ਕਿਰਿਆਸ਼ੀਲ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ? ਜੇ ਹਾਂ, ਤਾਂ ਪੰਜ ਸਕਿੰਟਾਂ ਲਈ ਦੋਵੇਂ ਅਵਾਜ਼ੀ ਕੁੰਜੀਆਂ ਨੂੰ ਦਬਾਈ ਰੱਖੋ।</translation> +<translation id="4878261017150799673">ਸਾਈਟ ਨੂੰ ਕਿਰਿਆਸ਼ੀਲ ਰੱਖੋ</translation> <translation id="4878634973244289103">ਵਿਚਾਰ ਭੇਜਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ। ਕਿਰਪਾ ਕਰਕੇ ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> <translation id="4878653975845355462">ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਨੇ ਵਿਉਂਤਬੱਧ ਬੈਕਗ੍ਰਾਊਂਡਾਂ ਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਹੈ</translation> <translation id="4878718769565915065">ਫਿੰਗਰਪ੍ਰਿੰਟ ਨੂੰ ਇਸ ਸੁਰੱਖਿਆ ਕੁੰਜੀ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ</translation> @@ -5259,6 +5273,9 @@ <translation id="5602765853043467355">ਇਸ ਡੀਵਾਈਸ ਵਿੱਚੋਂ ਬੁੱਕਮਾਰਕ, ਇਤਿਹਾਸ, ਪਾਸਵਰਡ ਅਤੇ ਹੋਰ ਚੀਜ਼ਾਂ ਨੂੰ ਕਲੀਅਰ ਕਰੋ</translation> <translation id="5605758115928394442">ਤੁਹਾਡੀ ਪਛਾਣ ਦੀ ਪੁਸ਼ਟੀ ਕਰਨ ਲਈ ਇੱਕ ਸੂਚਨਾ ਤੁਹਾਡੇ ਫ਼ੋਨ 'ਤੇ ਭੇਜੀ ਗਈ।</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{ਇਸ ਐਕਸਟੈਂਸ਼ਨ ਨੂੰ ਬਲਾਕ ਕੀਤਾ ਗਿਆ ਹੈ}one{ਇਸ ਐਕਸਟੈਂਸ਼ਨ ਨੂੰ ਬਲਾਕ ਕੀਤਾ ਗਿਆ ਹੈ}other{ਇਨ੍ਹਾਂ ਐਕਸਟੈਂਸ਼ਨਾਂ ਨੂੰ ਬਲਾਕ ਕੀਤਾ ਗਿਆ ਹੈ}}</translation> +<translation id="560743070587960985">ਇਹ ਫ਼ਾਈਲ ਵਾਇਰਸ ਜਾਂ ਮਾਲਵੇਅਰ ਹੋ ਸਕਦੀ ਹੈ। + +ਇਸਦੇ ਸੁਰੱਖਿਅਤ ਹੋਣ ਜਾਂ ਨਾ ਹੋਣ ਸੰਬੰਧੀ ਜਾਂਚ ਕਰਨ ਲਈ ਤੁਸੀਂ ਇਸਨੂੰ Google ਨੂੰ ਭੇਜ ਸਕਦੇ ਹੋ। ਸਕੈਨ ਵਿੱਚ ਆਮ ਤੌਰ 'ਤੇ ਕੁਝ ਸਕਿੰਟਾਂ ਦਾ ਸਮਾਂ ਲੱਗਦਾ ਹੈ।</translation> <translation id="560834977503641186">ਵਾਈ-ਫਾਈ ਸਿੰਕ, ਹੋਰ ਜਾਣੋ</translation> <translation id="5608580678041221894">ਕਾਂਟ-ਛਾਂਟ ਕਰਨ ਸਬੰਧੀ ਖੇਤਰ ਨੂੰ ਵਿਵਸਥਿਤ ਕਰਨ ਜਾਂ ਖਿਸਕਾਉਣ ਲਈ ਅੱਗੇ ਦਿੱਤੀਆਂ ਕੁੰਜੀਆਂ 'ਤੇ ਟੈਪ ਕਰੋ</translation> <translation id="5609231933459083978">ਐਪਲੀਕੇਸ਼ਨ ਅਵੈਧ ਜਾਪਦੀ ਹੈ।</translation> @@ -5996,6 +6013,7 @@ <translation id="6254892857036829079">ਬਿਲਕੁਲ ਸਹੀ ਚੱਲਣਾ</translation> <translation id="6257602895346497974">ਸਿੰਕ ਚਾਲੂ ਕਰੋ...</translation> <translation id="62586649943626337">ਟੈਬ ਗਰੁੱਪਾਂ ਨਾਲ ਆਪਣੀਆਂ ਟੈਬਾਂ ਨੂੰ ਵਿਵਸਥਿਤ ਕਰੋ</translation> +<translation id="6260092874648348841">ਸਾਈਟ ਨੂੰ ਕਿਰਿਆਸ਼ੀਲ ਰੱਖੋ</translation> <translation id="6262371516389954471">ਤੁਹਾਡੇ ਬੈਕਅੱਪ Google 'ਤੇ ਅੱਪਲੋਡ ਕੀਤੇ ਜਾਂਦੇ ਹਨ ਅਤੇ ਤੁਹਾਡੇ Google ਖਾਤੇ ਦੇ ਪਾਸਵਰਡ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਇਨਕ੍ਰਿਪਟ ਕੀਤੇ ਜਾਂਦੇ ਹਨ।</translation> <translation id="6263082573641595914">Microsoft CA ਵਰਜਨ</translation> <translation id="6263284346895336537">ਆਲੋਚਨਾਤਮਿਕ ਨਹੀਂ</translation> @@ -6576,6 +6594,7 @@ <translation id="6787097042755590313">ਹੋਰ ਟੈਬ</translation> <translation id="6787839852456839824">ਕੀ-ਬੋਰਡ ਸ਼ਾਰਟਕੱਟ</translation> <translation id="6788210894632713004">ਅਣਪੈਕ ਕੀਤੀ ਐਕਸਟੈਂਸ਼ਨ</translation> +<translation id="678939393857169499">ਨਵਾਂ ਡੈਸਕਟਾਪ ਡਿਜ਼ਾਈਨ ਨੂੰ ਚਾਲੂ ਕਰਦਾ ਹੈ।</translation> <translation id="6789592661892473991">ਲੇਟਵੇਂ ਤੌਰ 'ਤੇ ਵੰਡੋ</translation> <translation id="6789834167207639931">ਰਿਕਵਰੀ ਪ੍ਰਕਿਰਿਆ ਨੂੰ ਪੂਰਾ ਕਰਨ ਲਈ, ਅਗਲੀ ਸਕ੍ਰੀਨ 'ਤੇ ਆਪਣਾ Google ਖਾਤਾ ਪਾਸਵਰਡ ਦੁਬਾਰਾ ਦਾਖਲ ਕਰੋ</translation> <translation id="6790428901817661496">ਪਲੇ ਕਰੋ</translation> @@ -7373,6 +7392,7 @@ <translation id="7481312909269577407">ਅੱਗੇ ਭੇਜੋ</translation> <translation id="7481358317100446445">ਤਿਆਰ ਹੈ</translation> <translation id="748138892655239008">ਪ੍ਰਮਾਣ-ਪੱਤਰ ਮੂਲ ਪਾਬੰਦੀਆਂ</translation> +<translation id="7483145199632798061">Chrome Refresh 2023</translation> <translation id="7484645889979462775">ਇਸ ਸਾਈਟ ਲਈ ਕਦੇ ਵੀ ਨਹੀਂ</translation> <translation id="7487141338393529395">ਵਿਸਤ੍ਰਿਤ ਸ਼ਬਦ-ਜੋੜ ਜਾਂਚ ਚਾਲੂ ਕਰੋ</translation> <translation id="7487969577036436319">ਕੋਈ ਕੰਪੋਨੈਂਟ ਇੰਸਟੌਲ ਨਹੀਂ ਕੀਤੇ ਗਏ ਹਨ</translation> @@ -7534,6 +7554,7 @@ <translation id="7634280112532283638">ਸਪੈਮ ਅਤੇ ਧੋਖਾਧੜੀ ਨੂੰ ਘਟਾਉਣਾ</translation> <translation id="7634337648687970851">ਸਥਾਨਕ ਡਾਟਾ ਰਿਕਵਰੀ ਇਸ ਵੇਲੇ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ।</translation> <translation id="7634566076839829401">ਕੁਝ ਗ਼ਲਤ ਹੋਇਆ ਸੀ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> +<translation id="763472884969134151"><ph name="LINK" /> ਮੁਤਾਬਕ ਵਿਸ਼ਲੇਸ਼ਣ ਕੀਤਾ ਗਿਆ</translation> <translation id="7635048370253485243">ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਪਿੰਨ ਕੀਤੀ ਗਈ</translation> <translation id="7635711411613274199">ਜਦੋਂ ਤੁਸੀਂ ਬ੍ਰਾਊਜ਼ ਕਰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਨੂੰ ਦਿਸਣ ਵਾਲੇ ਵਿਗਿਆਪਨ ਨੂੰ ਵਿਅਕਤੀਗਤ ਬਣਾਇਆ ਗਿਆ ਹੈ ਜਾਂ ਨਹੀਂ, ਇਸ ਸੈਟਿੰਗ, <ph name="BEGIN_LINK1" />ਵਿਗਿਆਪਨ ਵਿਸ਼ਿਆਂ<ph name="LINK_END1" />, ਤੁਹਾਡੀਆਂ <ph name="BEGIN_LINK2" />ਕੁਕੀ ਸੈਟਿੰਗਾਂ<ph name="LINK_END2" /> ਅਤੇ ਤੁਹਾਡੇ ਵੱਲੋਂ ਦੇਖੀ ਜਾਣ ਵਾਲੀ ਸਾਈਟ ਵਿਗਿਆਪਨਾਂ ਨੂੰ ਵਿਅਕਤੀਗਤ ਬਣਾਉਂਦੀ ਹੈ ਜਾਂ ਨਹੀਂ, ਇਸ 'ਤੇ ਨਿਰਭਰ ਕਰਦਾ ਹੈ</translation> <translation id="7636919061354591437">ਇਸ ਡੀਵਾਈਸ 'ਤੇ ਸਥਾਪਤ ਕਰੋ</translation> @@ -8211,6 +8232,7 @@ <translation id="8195737548602430447">ਅਨੁਵਾਦ ਦੀ ਭਾਸ਼ਾ ਵਿੱਚ ਸੁਰਖੀਆਂ ਦਾ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਅਨੁਵਾਦ ਕਰੋ।</translation> <translation id="8197673340773315084">ਨਾਮ ਜਾਂ ਲੇਬਲ ਸ਼ਾਮਲ ਕਰੋ, ਜਿਵੇਂ ਕਿ ਕੰਮ ਜਾਂ ਨਿੱਜੀ</translation> <translation id="8198456017687137612">ਟੈਬ ਕਾਸਟ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ</translation> +<translation id="8198457270656084773">ਕੀ ਸਿਸਟਮ ਡੀਵਾਈਸ-ਲੌਗ ਪੰਨਾ ਲੱਭ ਰਹੇ ਹੋ? <ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" /> 'ਤੇ ਜਾਓ।</translation> <translation id="8198511718495409170">ਇਸ ਸਾਈਟ 'ਤੇ "<ph name="EXTENSION_NAME" />" ਲਈ ਆਪਣੀਆਂ ਅੱਪਡੇਟ ਕੀਤੀਆਂ ਸੈਟਿੰਗਾਂ ਲਾਗੂ ਕਰਨ ਵਾਸਤੇ, ਇਸ ਪੰਨੇ ਨੂੰ ਰੀਲੋਡ ਕਰੋ</translation> <translation id="8199300056570174101">ਨੈੱਟਵਰਕ (ਸੇਵਾ) ਅਤੇ ਡੀਵਾਈਸ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ</translation> <translation id="8200772114523450471">ਦੁਬਾਰਾ ਸ਼ੁਰੂ ਕਰੋ</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index a31a751..0d8a6b4 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -8450,7 +8450,7 @@ <translation id="8413956290606243087">Czy chcesz włączyć ChromeVoksa, czyli wbudowany czytnik ekranu w Chrome OS?</translation> <translation id="8414249071344507766">Wspomnienia zostały ukryte na 2 dni</translation> <translation id="8414396119627470038">Zaloguj się w <ph name="SITE_ETLD_PLUS_ONE" /> za pomocą <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /></translation> -<translation id="8414685983518053656">Uwagi</translation> +<translation id="8414685983518053656">Notatki</translation> <translation id="8416730306157376817"><ph name="BATTERY_PERCENTAGE" />% (obudowa)</translation> <translation id="8417548266957501132">Hasło rodzica</translation> <translation id="8418445294933751433">&Pokaż jako kartę</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index 63c4d15..0f7be59 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -5334,7 +5334,7 @@ <translation id="565515993087783098">Ao esquecer essa rede, você também vai remover a assinatura do Passpoint e as redes associadas a ela.</translation> <translation id="5655296450510165335">Registro do dispositivo</translation> <translation id="5656845498778518563">Enviar feedback para o Google</translation> -<translation id="5657156137487675418">Mostrar todos os cookies</translation> +<translation id="5657156137487675418">Permitir todos os cookies</translation> <translation id="5657667036353380798">A extensão externa requer que a versão <ph name="MINIMUM_CHROME_VERSION" /> do Google Chrome, ou mais recente, esteja instalada.</translation> <translation id="5659593005791499971">E-mail</translation> <translation id="5662513737565158057">Mude o funcionamento dos apps Linux.</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index 83a54c41..033095ba 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -202,6 +202,7 @@ <translation id="1166212789817575481">Închide filele de la dreapta</translation> <translation id="1166583374608765787">Examinează actualizarea numelui</translation> <translation id="1166596238782048887"><ph name="TAB_TITLE" /> aparține desktopului <ph name="DESK_TITLE" /></translation> +<translation id="1167262726334064738">Încearcă o nouă parolă</translation> <translation id="1168020859489941584">Se deschide în <ph name="TIME_REMAINING" />...</translation> <translation id="116896278675803795">Setează schimbarea automată a limbii, astfel încât să corespundă conținutului selectat</translation> <translation id="1169266963600477608">Comenzile jocului</translation> @@ -908,6 +909,7 @@ <translation id="177336675152937177">Datele aplicațiilor găzduite</translation> <translation id="1776712937009046120">Adaugă un utilizator</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="177814385589420211">Ține apăsată tasta de căutare pentru a comuta între tastele de funcții și tastele de pe rândul de sus</translation> <translation id="1778457539567749232">Marchează ca necitit</translation> <translation id="1778991607452011493">Trimite jurnale de remediere a erorilor (recomandat)</translation> <translation id="1779441632304440041">Parolele slabe sunt ușor de ghicit. Creează parole puternice.</translation> @@ -1349,6 +1351,7 @@ <translation id="2142582065325732898">Activează <ph name="LINK1_BEGIN" />Sincronizarea Chrome<ph name="LINK1_END" /> pentru a vedea filele Chrome recente. <ph name="LINK2_BEGIN" />Află mai multe<ph name="LINK2_END" /></translation> <translation id="2143765403545170146">Afișează întotdeauna bara de instrumente în modul Ecran complet</translation> <translation id="2143778271340628265">Configurare proxy manuală</translation> +<translation id="2143808295261240440">Folosește parola recomandată</translation> <translation id="2143915448548023856">Setări de afișare</translation> <translation id="2144536955299248197">Vizualizator de certificate: <ph name="CERTIFICATE_NAME" /></translation> <translation id="2144557304298909478">Dezvoltarea aplicațiilor pentru Android în Linux</translation> @@ -2334,6 +2337,7 @@ <translation id="2963151496262057773">Următorul plugin este inactiv: <ph name="PLUGIN_NAME" />. Dorești să îl oprești?</translation> <translation id="2964193600955408481">Dezactivați Wi-Fi</translation> <translation id="2964245677645334031">vizibilitatea pentru Trimiterea în apropiere</translation> +<translation id="2966705348606485669">Mai multe opțiuni pentru dosarul de marcaje <ph name="FOLDER_TITLE" /></translation> <translation id="2966937470348689686">Gestionează preferințele Android</translation> <translation id="2967926928600500959">Adresele URL care corespund acestor reguli vor fi forțate să se deschisă într-un anumit browser.</translation> <translation id="2972581237482394796">&Repetă</translation> @@ -2623,6 +2627,7 @@ <translation id="3244294424315804309">Continuă să dezactivezi sunetul</translation> <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> – eroare de rețea</translation> <translation id="3248902735035392926">Siguranța contează. <ph name="BEGIN_LINK" />Verifică-ți extensiile acum<ph name="END_LINK" /></translation> +<translation id="3249323165366527554">Înscrie-te și conectează-te mai rapid când parola ta se salvează automat în <ph name="GOOGLE_PASSWORD_MANAGER" /> pentru <ph name="EMAIL" />.</translation> <translation id="3251714896659475029">Permite accesul lui <ph name="SUPERVISED_USER_NAME" /> la Asistentul Google cu „Ok Google”</translation> <translation id="3251759466064201842"><Nu face parte dintr-un certificat></translation> <translation id="325238099842880997">Stabilește reguli digitale de bază pentru a-i ajuta pe copii să se joace, să exploreze și să-și facă temele acasă</translation> @@ -4117,6 +4122,7 @@ <translation id="4556194354084985730">Conectează-te cu ușurință la site-uri și aplicații cu parolele salvate. Dacă opțiunea este dezactivată, ți se va solicita confirmarea înainte să te conectezi.</translation> <translation id="4558426062282641716">S-a solicitat permisiunea de lansare automată</translation> <translation id="4559617833001311418">Acest site îți accesează senzorii de mișcare sau de lumină.</translation> +<translation id="4560728518401799797">Mai multe opțiuni pentru marcajul <ph name="FOLDER_TITLE" /></translation> <translation id="4561893854334016293">Nu există permisiuni modificate recent</translation> <translation id="4562155214028662640">Adaugă o amprentă</translation> <translation id="4563210852471260509">Limba inițială de introducere este chineza</translation> @@ -4400,6 +4406,7 @@ <translation id="4819323978093861656">{0,plural, =0{Se închide.}=1{Se închide în o secundă}few{Se închide în # secunde}other{Se închide în # de secunde}}</translation> <translation id="4819607494758673676">Notificări privind Asistentul Google</translation> <translation id="4820236583224459650">Setează ca tichet activ</translation> +<translation id="4820795723433418303">Folosește tastele de funcții drept taste de pe rândul de sus</translation> <translation id="4821935166599369261">&Analizare activată</translation> <translation id="4823484602432206655">Citește și modifică setările pentru dispozitiv și pentru utilizator</translation> <translation id="4824037980212326045">Backupul și restabilirea în Linux</translation> @@ -4531,6 +4538,7 @@ <translation id="4925320384394644410">Porturile vor apărea aici</translation> <translation id="49265687513387605">Ecranul nu poate fi proiectat. Verifică dacă ai confirmat solicitarea de a începe permiterea accesului la ecran.</translation> <translation id="4927753642311223124">Nimic de văzut aici, treceți mai departe.</translation> +<translation id="4928629450964837566">Folosește o parolă mai sigură</translation> <translation id="4929386379796360314">Destinații de printare</translation> <translation id="4930447554870711875">Dezvoltatori</translation> <translation id="4930714375720679147">Activează</translation> @@ -4613,6 +4621,7 @@ <translation id="5010886807652684893">Afișare vizuală</translation> <translation id="5015344424288992913">Se rezolvă proxy-ul...</translation> <translation id="5016491575926936899">Poți să trimiți mesaje text de pe computer, să permiți accesul la conexiunea de internet, să răspunzi la notificări privind conversațiile și să deblochezi <ph name="DEVICE_TYPE" /> cu telefonul.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation> +<translation id="5016983299133677671">Încearcă o nouă parolă</translation> <translation id="5017643436812738274">Poți să navighezi în pagini folosind cursorul pentru text. Apasă Ctrl + tasta de căutare + 7 pentru a-l dezactiva.</translation> <translation id="5018207570537526145">Deschide site-ul extensiei</translation> <translation id="5018526990965779848">Trimite date de utilizare și diagnosticare. Contribuie la îmbunătățirea experienței Android trimițând automat la Google date privind diagnosticarea și utilizarea dispozitivelor și a aplicațiilor. Aceasta va ajuta la stabilitatea sistemului, a aplicației și altele. Unele date cumulate vor ajuta aplicațiile și partenerii Google, cum ar fi dezvoltatorii Android. Dacă setarea Activitatea suplimentară de pe web și din aplicații este activată, aceste date pot fi salvate în Contul tău Google.</translation> @@ -4681,6 +4690,7 @@ <translation id="5078638979202084724">Marchează toate filele</translation> <translation id="5078796286268621944">Cod PIN incorect</translation> <translation id="5079010647467150187">Adaugă un VPN încorporat…</translation> +<translation id="5079699784114005398">După activare, aplicațiile tale vor fi disponibile pe toate dispozitivele ChromeOS după ce te conectezi folosind Contul Google. Aplicațiile web instalate din browserul Chrome se vor sincroniza chiar dacă sincronizarea browserului este dezactivată.</translation> <translation id="508059534790499809">Actualizează un tichet Kerberos</translation> <translation id="5081960376148623587">Alege dacă preîncarci pagini</translation> <translation id="5084328598860513926">Fluxul de provizionare a fost întrerupt. Încearcă din nou sau contactează proprietarul dispozitivului ori administratorul. Cod de eroare: <ph name="ERROR_CODE" />.</translation> @@ -4756,6 +4766,7 @@ <translation id="5145464978649806571">Dacă te îndepărtezi de dispozitiv, ecranul se va bloca automat. Când ești în fața dispozitivului, acesta va rămâne activat mai mult. Dacă ecranul de blocare este dezactivat, dispozitivul va intra în starea de inactivitate în loc să se blocheze.</translation> <translation id="514575469079499857">Folosește adresa IP pentru a detecta locația (prestabilit)</translation> <translation id="5146896637028965135">Vocea sistemului</translation> +<translation id="5147992672778369947">Folosește parola recomandată</translation> <translation id="5148277445782867161">Serviciul de localizare Google folosește surse precum rețelele Wi-Fi, rețelele mobile și senzorii pentru a estima locația dispozitivului.</translation> <translation id="5150254825601720210">Nume de server SSL pentru certificat Netscape</translation> <translation id="5151354047782775295">Eliberează spațiu pe hard disk sau este posibil ca anumite date să fie șterse automat</translation> @@ -5042,6 +5053,7 @@ <translation id="5414566801737831689">Citește pictogramele site-urilor pe care le accesezi</translation> <translation id="5414836363063783498">Se verifică...</translation> <translation id="5417312524372586921">Teme pentru browser</translation> +<translation id="5417353542809767994">Folosește rapid o parolă puternică</translation> <translation id="541737483547792035">Mărește ecranul</translation> <translation id="5419405654816502573">Voice Match</translation> <translation id="5420274697768050645">Solicită parola ca să deblochezi dispozitivul pentru mai multă securitate</translation> @@ -5162,6 +5174,7 @@ <translation id="5517412723934627386"><ph name="NETWORK_TYPE" /> – <ph name="NETWORK_DISPLAY_NAME" /></translation> <translation id="5518949581554491184">Configurează cu un telefon Android</translation> <translation id="5519195206574732858">LTE</translation> +<translation id="5519900055135507385">Protejează-ți mai bine contul cu o parolă puternică. Ea se va salva în <ph name="GOOGLE_PASSWORD_MANAGER" /> pentru <ph name="EMAIL" />.</translation> <translation id="5521078259930077036">Aceasta este pagina de pornire la care vă așteptați?</translation> <translation id="5522156646677899028">Această extensie conține o vulnerabilitate gravă a securității.</translation> <translation id="5522403133543437426">Motorul de căutare folosit în bara de adrese.</translation> @@ -5780,6 +5793,7 @@ <translation id="6070311415473175157">Selectează zona imaginii pentru căutare</translation> <translation id="6071181508177083058">confirmă parola</translation> <translation id="6071576563962215370">Sistemul nu a blocat atributele necesare în momentul instalării dispozitivului.</translation> +<translation id="6071938745001252305">Ai economisit <ph name="MEMORY_VALUE" /> de memorie</translation> <translation id="6072442788591997866"><ph name="APP_NAME" /> nu este permis pe acest dispozitiv. Contactează administratorul. Cod de eroare: <ph name="ERROR_CODE" />.</translation> <translation id="6073451960410192870">Oprește înregistrarea</translation> <translation id="6073903501322152803">Adaugă funcții de accesibilitate</translation> @@ -5827,6 +5841,7 @@ <translation id="6104068876731806426">Conturi Google</translation> <translation id="6104311680260824317">Dispozitivul nu a putut fi asociat domeniului. Serverul nu acceptă tipurile de criptare Kerberos specificate. Accesează „Mai multe opțiuni” pentru setările de criptare.</translation> <translation id="6104796831253957966">Coada imprimantei este plină</translation> +<translation id="6104929924898022309">Folosește tasta de căutare pentru a schimba comportamentul tastelor de funcții</translation> <translation id="6106167152849320869">Dacă la pasul anterior ai ales și să trimiți date de diagnosticare și de utilizare, aceste date vor fi colectate pentru aplicațiile instalate.</translation> <translation id="6111972606040028426">Activează Asistentul Google</translation> <translation id="6112294629795967147">Atinge pentru a redimensiona</translation> @@ -5968,6 +5983,7 @@ <translation id="6234108445915742946">Termenii și condițiile Chrome se modifică la 31 martie</translation> <translation id="6234474535228214774">Instalare în așteptare</translation> <translation id="6235208551686043831">Camera foto a dispozitivului a fost activată. Poziționează codul QR eSIM în fața camerei.</translation> +<translation id="6237297174664969437">Poți să alegi oricând ce date de browser să sincronizezi în setările Chrome. În <ph name="LINK_BEGIN" />setările dispozitivului<ph name="LINK_END" />, poți controla sincronizarea aplicațiilor web instalate din browserul Chrome. Google poate personaliza Căutarea și alte servicii pe baza istoricului.</translation> <translation id="6237474966939441970">Aplicație de creare a notelor cu creionul</translation> <translation id="623755660902014047">Modul de lectură</translation> <translation id="6238767809035845642">Text trimis de pe alt dispozitiv</translation> @@ -6301,6 +6317,7 @@ <translation id="6537613839935722475">Numele poate conține litere, cifre și cratime (-)</translation> <translation id="6538098297809675636">Eroare la detectarea codului</translation> <translation id="653920215766444089">Se caută dispozitivul de indicat</translation> +<translation id="6539674013849300372">Protejează-te mai bine online cu o parolă puternică. Ea se va salva în <ph name="GOOGLE_PASSWORD_MANAGER" /> pentru <ph name="EMAIL" />.</translation> <translation id="653983593749614101">Se reia...</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Notă:<ph name="END_BOLD" /> activați culegerea datelor numai dacă înțelegeți consecințele acțiunii sau dacă vi s-a solicitat să o activați, deoarece aceasta ar putea reduce performanța.</translation> <translation id="6541638731489116978">Site-ul nu are permisiunea de a accesa senzorii de mișcare.</translation> @@ -6497,6 +6514,7 @@ <translation id="671226373742585927">Dă clic pe butonul X pentru a închide panoul lateral</translation> <translation id="6712943853047024245">Ai salvat deja o parolă folosind acest nume de utilizator pentru <ph name="WEBSITE" /></translation> <translation id="6713233729292711163">Adaugă un profil de serviciu</translation> +<translation id="6713441551032149301">Ține apăsată tasta lansator pentru a comuta între tastele de funcții și tastele de sistem de pe rândul de sus</translation> <translation id="6713668088933662563">Nu oferi niciodată traducerea acestor limbi</translation> <translation id="6715803357256707211">A apărut o eroare în timpul instalării aplicației Linux. Dă clic pe notificare pentru detalii.</translation> <translation id="671619610707606484">Astfel, se vor șterge <ph name="TOTAL_USAGE" /> din datele stocate de site-uri</translation> @@ -6618,6 +6636,7 @@ <translation id="6811034713472274749">Pagina este gata de vizualizare</translation> <translation id="6811151703183939603">Fermă</translation> <translation id="6811332638216701903">Nume de gazdă DHCP</translation> +<translation id="6811792477922751991">Folosește tasta lansator ca să schimbi comportamentul tastelor de funcții</translation> <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> nu poate fi rulat în modul root.</translation> <translation id="6812841287760418429">Păstrați modificările</translation> <translation id="6813907279658683733">Tot ecranul</translation> @@ -7812,6 +7831,7 @@ <translation id="7851720427268294554">Parser IPP</translation> <translation id="78526636422538552">Adăugarea mai multor Conturi Google este dezactivată</translation> <translation id="7853747251428735">Mai multe instru&mente</translation> +<translation id="7853999103056713222">Folosește o parolă mai sigură</translation> <translation id="7855678561139483478">Mută fila în fereastră nouă</translation> <translation id="7857004848504343806">Computerul conține un modul securizat, care este folosit pentru a implementa numeroase funcții esențiale de securitate în sistemul de operare Chrome Flex. Accesează Centrul de ajutor Chromebook pentru a afla mai multe: https://support.google.com/chromebook/?p=sm</translation> <translation id="7857093393627376423">Sugestii de text</translation> @@ -8367,6 +8387,7 @@ <translation id="8325413836429495820">Nu au permisiunea de a vedea clipboardul</translation> <translation id="8326478304147373412">PKCS #7, lanț de certificate</translation> <translation id="8327386430364625757">Font matematic</translation> +<translation id="8327538105740918488">Poți modifica oricând această parolă ulterior. Ea se va salva în <ph name="GOOGLE_PASSWORD_MANAGER" /> pentru <ph name="EMAIL" />.</translation> <translation id="8327676037044516220">Permisiuni și setări privind conținutul</translation> <translation id="8330617762701840933">Lista de site-uri care redirecționează la browserul secundar.</translation> <translation id="8330689128072902965">Persoanele de contact din apropiere îți pot trimite fișiere. Dă clic pentru a schimba.</translation> @@ -8512,6 +8533,7 @@ <translation id="8449836157089738489">Deschideți-le pe toate într-un nou grup de file</translation> <translation id="8451512073679317615">asistent</translation> <translation id="845702320058262034">Nu se poate conecta. Asigură-te că funcția Bluetooth a telefonului este pornită.</translation> +<translation id="8457251154056341970">Nu vei mai vedea <ph name="MODULE_NAME" /> în această pagină</translation> <translation id="8457451314607652708">Importă marcajele</translation> <translation id="8458341576712814616">Comanda rapidă</translation> <translation id="8458627787104127436">Deschide-le pe toate (<ph name="URL_COUNT" />) într-o fereastră nouă</translation> @@ -8584,6 +8606,7 @@ <translation id="8514955299594277296">Nu permite site-urilor să salveze date pe dispozitiv (nu se recomandă)</translation> <translation id="8517759303731677493">Editează…</translation> <translation id="8519895319663397036">Nu se pot importa parolele. Dimensiunea fișierelor trebuie să fie de maximum 150 KB.</translation> +<translation id="851991974800416566">Folosește rapid o parolă puternică</translation> <translation id="8523493869875972733">Păstrează modificările</translation> <translation id="8523849605371521713">Adăugată de politică</translation> <translation id="8524783101666974011">Salvează carduri în Contul tău Google</translation> @@ -8741,6 +8764,7 @@ <translation id="8665110742939124773">Ai introdus un cod de acces incorect. Încearcă din nou.</translation> <translation id="8665180165765946056">Backupul a fost finalizat</translation> <translation id="866611985033792019">Ai încredere în acest certificat pentru a identifica utilizatorii de e-mail</translation> +<translation id="8666268818656583275">Tastele F se vor comporta acum ca tastele de sistem de pe rândul de sus.</translation> <translation id="8666321716757704924">Permisiunile sunt acordate din nou pentru <ph name="WEBSITE" /></translation> <translation id="8666759526542103597">Despre Personalizarea anunțurilor bazată pe browser</translation> <translation id="8667261224612332309">Ai parole care se pot îmbunătăți</translation> @@ -9424,6 +9448,7 @@ <translation id="950307215746360464">Ghid de configurare</translation> <translation id="951991426597076286">Refuză</translation> <translation id="952471655966876828">Dispozitivul se va conecta automat când este deschis și este folosit</translation> +<translation id="952880932803612259">Permite aplicațiilor, site-urilor și serviciilor de sistem să folosească locația. Locația poate folosi surse precum Wi-Fi, rețele mobile și senzori pentru a ajuta la estimarea locației dispozitivului.</translation> <translation id="953434574221655299">Au permisiunea de a afla când folosești activ dispozitivul</translation> <translation id="956500788634395331">Beneficiezi de protecție împotriva extensiilor potențial dăunătoare</translation> <translation id="957179356621191750">6 puncte</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index d16e107..c7433d3 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">Вкладка вновь активна</translation> <translation id="1003088604756913841">Открыть ссылку в новом окне приложения "<ph name="APP" />"</translation> <translation id="100323615638474026">USB-устройство (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Google Безопасный просмотр</translation> <translation id="1004218526896219317">Доступ к сайтам</translation> <translation id="1005274289863221750">Использование микрофона и камеры</translation> <translation id="1005333234656240382">Включить отладку с ADB?</translation> @@ -527,6 +528,7 @@ <translation id="146000042969587795">Этот фрейм заблокирован, поскольку он содержит небезопасные элементы.</translation> <translation id="1461041542809785877">Производительность</translation> <translation id="1461177659295855031">Переместить в папку "Панель закладок"</translation> +<translation id="1461288887896722288">Вы только что вошли в управляемый аккаунт. Чтобы получить доступ к некоторым связанным с ним ресурсам, создайте новый управляемый профиль.</translation> <translation id="146219525117638703">Статус ONC</translation> <translation id="146220085323579959">Проверьте подключение к Интернету и повторите попытку.</translation> <translation id="1462850958694534228">Проверьте новый значок</translation> @@ -903,6 +905,7 @@ <translation id="1769104665586091481">Открыть ссылку в новом окне</translation> <translation id="1770407692401984718">Перетащите изображение сюда или</translation> <translation id="177053719077591686">Резервное копирование приложений для Android на Google Диск</translation> +<translation id="1771075623623424448">Ищете журнал устройств браузера? Перейдите на страницу <ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="177336675152937177">Данные размещаемых приложений</translation> <translation id="1776712937009046120">Добавить пользователя</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> @@ -1685,6 +1688,15 @@ <translation id="2422125132043002186">Восстановление контейнера Linux отменено.</translation> <translation id="2423578206845792524">Со&хранить картинку как...</translation> <translation id="2424424966051154874">{0,plural, =1{Гость}one{Гость (#)}few{Гость (#)}many{Гость (#)}other{Гость (#)}}</translation> +<translation id="242684489663276773">Произойдут следующие изменения: + <ph name="LINE_BREAKS" /> + • сброс некоторых настроек и сочетаний клавиш в Chrome; + <ph name="LINE_BREAK" /> + • отключение расширений; + <ph name="LINE_BREAK" /> + • удаление файлов cookie и других временных данных сайтов. + <ph name="LINE_BREAKS" /> + Вам по-прежнему будут доступны закладки, история и сохраненные пароли.</translation> <translation id="2428510569851653187">Опишите, что вы делали, когда произошел сбой</translation> <translation id="2428939361789119025">Отключить Wi-Fi</translation> <translation id="2428978615149723410">эти корзины</translation> @@ -1868,6 +1880,7 @@ <translation id="2575407791320728464">Недопустимый URL. Убедитесь, что у него правильный формат.</translation> <translation id="2575441894380764255">Запретить сайтам показывать навязчивую или вводящую в заблуждение рекламу</translation> <translation id="2575713839157415345">{YEARS,plural, =1{Устройство будет сохранено на 1 год. При следующем подключении код не потребуется. Этот параметр задается администратором.}one{Устройство будет сохранено на {YEARS} год. При следующем подключении код не потребуется. Этот параметр задается администратором.}few{Устройство будет сохранено на {YEARS} года. При следующем подключении код не потребуется. Этот параметр задается администратором.}many{Устройство будет сохранено на {YEARS} лет. При следующем подключении код не потребуется. Этот параметр задается администратором.}other{Устройство будет сохранено на {YEARS} года. При следующем подключении код не потребуется. Этот параметр задается администратором.}}</translation> +<translation id="2577446426265992344">без изменений в дизайне омнибокса</translation> <translation id="257779572837908839">Использовать в качестве Chromebox для видеоконференций</translation> <translation id="2579309488038515659">Включить точку доступа</translation> <translation id="2579596474754516455">При необходимости сканировать PDF-изображения и конвертировать их в текст для программы чтения с экрана</translation> @@ -4458,6 +4471,7 @@ <translation id="4876895919560854374">Блокировка и разблокировка экрана</translation> <translation id="4877276003880815204">Проверить элементы</translation> <translation id="4877652723592270843">Включить встроенную в Chrome OS Flex программу чтения с экрана ChromeVox? Если да, нажмите и удерживайте обе кнопки регулировки громкости в течение пяти секунд.</translation> +<translation id="4878261017150799673">Сохранять сайт активным</translation> <translation id="4878634973244289103">Не удается отправить отзыв. Повторите попытку позже.</translation> <translation id="4878653975845355462">Администратор запретил изменять фоновое изображение.</translation> <translation id="4878718769565915065">Не удалось добавить отпечаток пальца для этого электронного ключа.</translation> @@ -5245,6 +5259,9 @@ <translation id="5602765853043467355">Удалить с устройства закладки, пароли, данные о работе в браузере и т. д.</translation> <translation id="5605758115928394442">На ваш телефон отправлено уведомление для подтверждения личности.</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{Это расширение заблокировано}one{Эти расширения заблокированы}few{Эти расширения заблокированы}many{Эти расширения заблокированы}other{Эти расширения заблокированы}}</translation> +<translation id="560743070587960985">Этот файл может оказаться вирусом или вредоносным ПО. + +Вы можете отправить его в Google, чтобы проверить, безопасен ли он. Обычно сканирование занимает несколько секунд.</translation> <translation id="560834977503641186">Узнать больше о функции "Синхронизация Wi-Fi"</translation> <translation id="5608580678041221894">Чтобы двигать рамку кадрирования, нажимайте на следующие кнопки</translation> <translation id="5609231933459083978">Неизвестное название приложения</translation> @@ -5982,6 +5999,7 @@ <translation id="6254892857036829079">Отличное</translation> <translation id="6257602895346497974">Включить синхронизацию</translation> <translation id="62586649943626337">Объединяйте вкладки в группы</translation> +<translation id="6260092874648348841">Сохранять сайт активным</translation> <translation id="6262371516389954471">Резервные копии загружаются в Google и шифруются с помощью пароля вашего аккаунта Google.</translation> <translation id="6263082573641595914">Версия ЦС Microsoft</translation> <translation id="6263284346895336537">Не критично</translation> @@ -6565,6 +6583,7 @@ <translation id="6787097042755590313">Другая вкладка</translation> <translation id="6787839852456839824">Быстрые клавиши</translation> <translation id="6788210894632713004">Распакованное расширение</translation> +<translation id="678939393857169499">Новый интерфейс для Chrome на ПК.</translation> <translation id="6789592661892473991">Разделить по горизонтали</translation> <translation id="6789834167207639931">Введите пароль своего аккаунта Google ещё раз на следующем экране, чтобы завершить восстановление</translation> <translation id="6790428901817661496">Воспроизвести</translation> @@ -7361,6 +7380,7 @@ <translation id="7481312909269577407">Вперед</translation> <translation id="7481358317100446445">Готово</translation> <translation id="748138892655239008">Базовые ограничения сертификата</translation> +<translation id="7483145199632798061">Дизайн Chrome – 2023</translation> <translation id="7484645889979462775">Никогда для этого сайта</translation> <translation id="7487141338393529395">Включите расширенную проверку правописания</translation> <translation id="7487969577036436319">Компоненты не установлены</translation> @@ -7522,6 +7542,7 @@ <translation id="7634280112532283638">Противодействие спаму и мошенничеству</translation> <translation id="7634337648687970851">Восстановление локальных данных сейчас не поддерживается.</translation> <translation id="7634566076839829401">Произошла ошибка. Повторите попытку.</translation> +<translation id="763472884969134151">Анализ выполнен сервисом <ph name="LINK" /></translation> <translation id="7635048370253485243">Закреплено администратором</translation> <translation id="7635711411613274199">Персонализация рекламы зависит от этого параметра, <ph name="BEGIN_LINK1" />тем<ph name="LINK_END1" />, <ph name="BEGIN_LINK2" />настроек файлов cookie<ph name="LINK_END2" />, а также от параметров сайта, который вы просматриваете.</translation> <translation id="7636919061354591437">Установить на этом устройстве</translation> @@ -8201,6 +8222,7 @@ <translation id="8195737548602430447">Автоматический перевод субтитров на целевой язык.</translation> <translation id="8197673340773315084">Укажите название, например "Рабочий"</translation> <translation id="8198456017687137612">Трансляция вкладки</translation> +<translation id="8198457270656084773">Ищете журнал устройств системы? Перейдите на страницу <ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="8198511718495409170">Чтобы применить измененные настройки к расширению "<ph name="EXTENSION_NAME" />" на сайте, обновите страницу</translation> <translation id="8199300056570174101">Настройки сети и устройства</translation> <translation id="8200772114523450471">Возобновить</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb index d98a4ab2..cc8b8fb4 100644 --- a/chrome/app/resources/generated_resources_si.xtb +++ b/chrome/app/resources/generated_resources_si.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">පටිත්ත නැවත සක්රියයි</translation> <translation id="1003088604756913841">සබැඳිය නව <ph name="APP" /> කවුළුවක විවෘත කරන්න</translation> <translation id="100323615638474026">USB උපාංගය (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Google ආරක්ෂිත බ්රවුස් කිරීම</translation> <translation id="1004218526896219317">වෙබ් අඩවි ප්රවේශය</translation> <translation id="1005274289863221750">ඔබේ මයික්රෆෝනය සහ කැමරාව භාවිතා කරන්න</translation> <translation id="1005333234656240382">ADB නිදොස් කිරීම සබල කරන්නද?</translation> @@ -527,6 +528,7 @@ <translation id="146000042969587795">මෙම රාමුවෙහි සමහර අනාරක්ෂිත එය අවහිර කරන ලදි.</translation> <translation id="1461041542809785877">ක්රියාකාරීත්වය</translation> <translation id="1461177659295855031">පිටුසන තීරුව ෆෝල්ඩරය වෙත යන්න</translation> +<translation id="1461288887896722288">ඔබ දැන් කළමනාකරණය කළ ගිණුමකට පුරනය වී ඇත, නව කළමනාකරණය කළ පැතිකඩක් තැනීමට ඔබට එම ගිණුමට සම්බන්ධ කර ඇති සමහර සම්පත් වෙත ප්රවේශ වීමට ඉඩ දෙයි.</translation> <translation id="146219525117638703">ONC තත්ත්වය</translation> <translation id="146220085323579959">අන්තර්ජාලය විසන්ධි විය. කරුණාකර ඔබගේ අන්තර්ජාල සබැඳුම පරික්ෂා කර නැවත උත්සාහ කරන්න.</translation> <translation id="1462850958694534228">නිරූපක යාවත්කාලීන කිරීම සමාලෝචනය කරන්න</translation> @@ -901,6 +903,7 @@ <translation id="1769104665586091481">සබැඳිය නව කවුළුවක &විවෘත කරන්න</translation> <translation id="1770407692401984718">මෙහි රූපයක් අඳින්න හෝ</translation> <translation id="177053719077591686">Android යෙදුම් Google Drive වෙත උපස්ථ කරන්න.</translation> +<translation id="1771075623623424448">බ්රව්සර උපාංග-ලොග් පිටුව සොයන්නේ ද? <ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" /> කරා පිවිසෙන්න.</translation> <translation id="177336675152937177">අනුග්රහය සහිත යෙදුම් දත්ත</translation> <translation id="1776712937009046120">පරිශීලකයකු එක් කරන්න</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> @@ -1687,6 +1690,15 @@ <translation id="2422125132043002186">ලිනක්ස් ප්රතිසාධනය අවලංගු කළා</translation> <translation id="2423578206845792524">රූපය මෙසෙල සුරකින්න...</translation> <translation id="2424424966051154874">{0,plural, =1{ආගන්තුක}one{ආගන්තුක (#)}other{ආගන්තුක (#)}}</translation> +<translation id="242684489663276773">මෙම ක්රියාව පහත දේ සිදු කරනු ඇත: + <ph name="LINE_BREAKS" /> + • සමහර Chrome සැකසීම් Chrome කෙටිමං යළි සැකසීම් + <ph name="LINE_BREAK" /> + • දිගු අබල කිරීම + <ph name="LINE_BREAK" /> + • කුකී සහ වෙනත් තාවකාලික අඩවි දත්ත මැකීම + <ph name="LINE_BREAKS" /> + පිටුසන්, ඉතිහාසය, සහ සුරැකි මුරපද බලපෑමට ලක් නොවනු ඇත.</translation> <translation id="2428510569851653187">පටිත්ත බිඳ වැටුණු විට ඔබ කළ දේ විස්තර කරන්න</translation> <translation id="2428939361789119025">WiFi අක්රිය කරන්න</translation> <translation id="2428978615149723410">මෙම කරත්ත</translation> @@ -1870,6 +1882,7 @@ <translation id="2575407791320728464">වලංගු නොවන URL. එය නිවැරදිව ෆෝමැට් කර ඇති බවට සහතික කර ගන්න.</translation> <translation id="2575441894380764255">ආක්රමණශීලී හෝ නොමඟ යවන වෙළඳ දැන්වීම් පෙන්වීමට ඉඩ නොදේ</translation> <translation id="2575713839157415345">{YEARS,plural, =1{මෙම උපාංගය වසර 1ක් සඳහා සුරකිනු ඇති අතර ඔබට ඊළඟ වතාවේ කේතයක් නොමැතිව සම්බන්ධ විය හැකිය. මෙය ඔබගේ පරිපාලක විසින් සකසා ඇත.}one{මෙම උපාංගය වසර {YEARS}ක් සඳහා සුරකිනු ඇති අතර ඔබට ඊළඟ වතාවේ කේතයක් නොමැතිව සම්බන්ධ විය හැකිය. මෙය ඔබගේ පරිපාලක විසින් සකසා ඇත.}other{මෙම උපාංගය වසර {YEARS}ක් සඳහා සුරකිනු ඇති අතර ඔබට ඊළඟ වතාවේ කේතයක් නොමැතිව සම්බන්ධ විය හැකිය. මෙය ඔබගේ පරිපාලක විසින් සකසා ඇත.}}</translation> +<translation id="2577446426265992344">Omnibox නොමැතිව</translation> <translation id="257779572837908839">රැස්වීම් සඳහා Chromebox ලෙස පිහිටුවන්න</translation> <translation id="2579309488038515659">හොට්ස්පොට් සබල කරන්න</translation> <translation id="2579596474754516455">අවශ්ය විට තිර කියවනය සඳහා පෙළ හැරවීමට PDF රූප ස්කෑන් කරන්න</translation> @@ -4461,6 +4474,7 @@ <translation id="4876895919560854374">තිරය අගුළු දමන්න අගුළු හරින්න</translation> <translation id="4877276003880815204">මූලද්රව්ය පරීක්ෂා කරන්න</translation> <translation id="4877652723592270843">ඔබට ChromeOS Flex සඳහා වන ආවේණික තිර කියවනය, ChromeVox සක්රිය කිරීමට අවශ්යද? එසේ නම්, හඬ පරිමා යතුරු දෙකම තත්පර පහක් ඔබා අල්ලාගෙන සිටින්න.</translation> +<translation id="4878261017150799673">අඩවිය ක්රියාකාරීව තබා ගන්න</translation> <translation id="4878634973244289103">ප්රතිපෝෂණය යැවීමට නොහැකිය. පසුව නැවත උත්සාහ කරන්න.</translation> <translation id="4878653975845355462">අභිරුචි පසුබිම ඔබේ පරිපාලකයා විසින් අක්රිය කරනු ලැබ ඇත</translation> <translation id="4878718769565915065">මෙම ආරක්ෂක යතුරට ඇඟිලි සලකුණක් එක් කිරීම අසමත් විය</translation> @@ -5248,6 +5262,9 @@ <translation id="5602765853043467355">මෙම උපාංගයෙන් පිටුසන්, ඉතිහාසය, මුරපද, සහ තවත් දේ හිස් කරන්න</translation> <translation id="5605758115928394442">ඒ ඔබ බව තහවුරු කිරීමට ඔබේ දුරකථනයට දැනුම්දීමක් යවන ලදි.</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{මෙම දිගුව අවහිර කර ඇත}one{මෙම දිගු අවහිර කර ඇත}other{මෙම දිගු අවහිර කර ඇත}}</translation> +<translation id="560743070587960985">මෙම ගොනුව වෛරසයක් හෝ අනිෂ්ට මෘදුකාංගයක් විය හැක. + +එය අනාරක්ෂිත දැයි පරීක්ෂා කිරීමට ඔබට එය Google වෙත යැවිය හැක. ස්කෑන් කිරීමට සාමාන්යයෙන් තත්පර කිහිපයක් ගත වේ.</translation> <translation id="560834977503641186">Wi-Fi සමමුහුර්තකරණය, තව දැන ගන්න</translation> <translation id="5608580678041221894">කප්පාදු ප්රදේශය සීරුමාරු කිරීමට හෝ ගෙන යාමට පහත යතුරු තට්ටු කරන්න</translation> <translation id="5609231933459083978">මෙම යෙදුම වලංගු නොවන ලෙසක් පෙනේ.</translation> @@ -5986,6 +6003,7 @@ <translation id="6254892857036829079">පරිපූර්ණයි</translation> <translation id="6257602895346497974">සමමුහුව ක්රියාත්මක කරන්න...</translation> <translation id="62586649943626337">ටැබ සමූහ සමඟ ඔබගේ ටැබ සංවිධානය කරන්න</translation> +<translation id="6260092874648348841">අඩවිය ක්රියාකාරීව තබා ගන්න</translation> <translation id="6262371516389954471">ඔබේ උපස්ථ Google වෙත උඩුගත කෙරෙන අතර ඔබේ Google ගිණුමේ මුරපදය භාවිත කර සංකේතන කෙරේ.</translation> <translation id="6263082573641595914">Microsoft CA සංස්කරණය</translation> <translation id="6263284346895336537">බරපතල නැත</translation> @@ -6563,6 +6581,7 @@ <translation id="6787097042755590313">වෙනත් ටැබය</translation> <translation id="6787839852456839824">යතුරු පුවරු කෙටිමං</translation> <translation id="6788210894632713004">ඇසුරුම් හරින ලද දිගුව</translation> +<translation id="678939393857169499">නව ඩෙස්ක්ටොප් නිර්මාණය සබල කරයි.</translation> <translation id="6789592661892473991">තිරස්ව වෙන් කරන්න</translation> <translation id="6789834167207639931">ප්රතිසාධනය අවසන් කිරීමට මීළඟ තිරයෙහි ඔබේ Google ගිණුමේ මුරපදය නැවත ඇතුළු කරන්න</translation> <translation id="6790428901817661496">වාදනය කරන්න</translation> @@ -7360,6 +7379,7 @@ <translation id="7481312909269577407">ඉදිරියට යන්න</translation> <translation id="7481358317100446445">සූදානම්</translation> <translation id="748138892655239008">සහතික මූලික බාධක</translation> +<translation id="7483145199632798061">Chrome නැවුම් කිරීම 2023</translation> <translation id="7484645889979462775">කවදාවත් මෙම අඩවිය සඳහා නොවේ</translation> <translation id="7487141338393529395">උසස් අක්ෂර පරීක්ෂාව සක්රීය කරන්න</translation> <translation id="7487969577036436319">කිසිදු අංගයක් ස්ථාපිත කර නැත</translation> @@ -7521,6 +7541,7 @@ <translation id="7634280112532283638">අයාචිත සහ වංචා අඩු කිරීම</translation> <translation id="7634337648687970851">ස්ථානික දත්ත ප්රතිසාධනය දැනට සහාය නොදැක්වේ.</translation> <translation id="7634566076839829401">යම් දෝශයක් ඇතිවිය. කරුණාකර නැවත උත්සහ කරන්න</translation> +<translation id="763472884969134151"><ph name="LINK" /> විසින් විශ්ලේෂණය නිම කරන ලදි</translation> <translation id="7635048370253485243">ඔබගේ පරිපාලක විසින් අමුණන ලදි</translation> <translation id="7635711411613274199">ඔබ බ්රවුස් කරන විට, ඔබ දකින දැන්වීමක් පෞද්ගලීකරණය කර තිබේ ද යන්න මෙම සැකසීම, <ph name="BEGIN_LINK1" />දැන්වීම් මාතෘකා<ph name="LINK_END1" />, ඔබේ <ph name="BEGIN_LINK2" />කුකී සැකසීම්<ph name="LINK_END2" />, සහ ඔබ බලන අඩවිය දැන්වීම් පෞද්ගලීකරණය කරන්නේ දැයි මත රඳා පවතී</translation> <translation id="7636919061354591437">මෙම උපාංගයේ ස්ථාපන කරන්න</translation> @@ -8198,6 +8219,7 @@ <translation id="8195737548602430447">ඉලක්ක භාෂාවකට සිරස්තල ස්වයංක්රීයව පරිවර්තනය කරන්න.</translation> <translation id="8197673340773315084">වැඩ හෝ පුද්ගලික වැනි, නමක් හෝ ලේබලයක් එක් කරන්න</translation> <translation id="8198456017687137612">විකාශ ටැබය</translation> +<translation id="8198457270656084773">පද්ධති උපාංග-ලොග් පිටුව සොයන්නේ ද? <ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" /> කරා පිවිසෙන්න.</translation> <translation id="8198511718495409170">මෙම අඩවියට "<ph name="EXTENSION_NAME" />" සඳහා ඔබේ යාවත්කාලීන සැකසීම් යෙදීමට, මෙම පිටුව නැවත පූරණය කරන්න</translation> <translation id="8199300056570174101">ජාල (සේවාව) සහ උපාංග ගුණාංග</translation> <translation id="8200772114523450471">කරගෙන යන්න</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index 5498807..ceafa46b 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -202,6 +202,7 @@ <translation id="1166212789817575481">Zatvoriť karty vpravo</translation> <translation id="1166583374608765787">Kontrola aktualizácie názvu</translation> <translation id="1166596238782048887"><ph name="TAB_TITLE" /> patrí na plochu <ph name="DESK_TITLE" /></translation> +<translation id="1167262726334064738">Vyskúšajte nové heslo</translation> <translation id="1168020859489941584">Čas do otvorenia: <ph name="TIME_REMAINING" /></translation> <translation id="116896278675803795">Automaticky meniť jazyk tak, aby sa zhodoval s vybraným obsahom</translation> <translation id="1169266963600477608">Ovládanie hry</translation> @@ -909,6 +910,7 @@ <translation id="177336675152937177">Dáta hostených aplikácií</translation> <translation id="1776712937009046120">Pridať používateľa</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="177814385589420211">Pridržaním klávesa vyhľadávania môžete prepínať medzi funkčnými klávesmi a systémovými klávesmi horného radu</translation> <translation id="1778457539567749232">Označiť ako neprečítané</translation> <translation id="1778991607452011493">Posielať denníky ladenia (odporúča sa)</translation> <translation id="1779441632304440041">Slabé heslá sa dajú ľahko uhádnuť. Vždy sa snažte vytvárať silné heslá.</translation> @@ -1350,6 +1352,7 @@ <translation id="2142582065325732898">Ak chcete zobraziť nedávne karty Chromu, zapnite <ph name="LINK1_BEGIN" />synchronizáciu Chromu<ph name="LINK1_END" />. <ph name="LINK2_BEGIN" />Ďalšie informácie<ph name="LINK2_END" /></translation> <translation id="2143765403545170146">Vždy zobrazovať panel s nástrojmi na celú obrazovku</translation> <translation id="2143778271340628265">Ručná konfigurácia servera proxy</translation> +<translation id="2143808295261240440">Používajte odporúčané heslo</translation> <translation id="2143915448548023856">Nastavenia obrazovky</translation> <translation id="2144536955299248197">Zobrazovač certifikátov: <ph name="CERTIFICATE_NAME" /></translation> <translation id="2144557304298909478">Vývoj aplikácií pre Android v systéme Linux</translation> @@ -2335,6 +2338,7 @@ <translation id="2963151496262057773">Nasledujúci doplnok prestal reagovať: <ph name="PLUGIN_NAME" />. Chcete ho zastaviť?</translation> <translation id="2964193600955408481">Zakázať sieť Wi‑Fi</translation> <translation id="2964245677645334031">Viditeľnosť pri Zdieľaní nablízku</translation> +<translation id="2966705348606485669">Ďalšie možnosti pre priečinok so záložkami <ph name="FOLDER_TITLE" /></translation> <translation id="2966937470348689686">Spravovať predvoľby Androidu</translation> <translation id="2967926928600500959">Webové adresy zodpovedajúce týmto pravidlám sa budú vynútene otvárať v konkrétnom prehliadači.</translation> <translation id="2972581237482394796">&Dopredu</translation> @@ -2624,6 +2628,7 @@ <translation id="3244294424315804309">Ponechať zvuk vypnutý</translation> <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> – Chyba siete</translation> <translation id="3248902735035392926">Na bezpečnosti záleží. Strávte chvíľu <ph name="BEGIN_LINK" />kontrolou rozšírení<ph name="END_LINK" />.</translation> +<translation id="3249323165366527554">Zaregistrujte sa a po automatickom uložení hesla do služby <ph name="GOOGLE_PASSWORD_MANAGER" /> pre účet <ph name="EMAIL" /> sa budete môcť prihlasovať rýchlejšie.</translation> <translation id="3251714896659475029">Umožnite dieťaťu <ph name="SUPERVISED_USER_NAME" /> aktivovať Asistenta Google príkazom „Hey Google“</translation> <translation id="3251759466064201842"><Nie je súčasťou certifikátu></translation> <translation id="325238099842880997">Nastavte základné digitálne pravidlá, ktoré pomôžu deťom doma hrať, skúmať a robiť domáce úlohy</translation> @@ -4118,6 +4123,7 @@ <translation id="4556194354084985730">Uloženými heslami sa môžete jednoducho prihlasovať na weboch a v aplikáciách. Keď je táto možnosť vypnutá, pred prihlásením sa zobrazí výzva.</translation> <translation id="4558426062282641716">Požaduje sa povolenie na automatické spustenie</translation> <translation id="4559617833001311418">Tento web má prístup k senzorom pohybu alebo svetla.</translation> +<translation id="4560728518401799797">Ďalšie možnosti pre záložku <ph name="FOLDER_TITLE" /></translation> <translation id="4561893854334016293">Žiadne nedávno zmenené povolenia</translation> <translation id="4562155214028662640">Pridať odtlačok</translation> <translation id="4563210852471260509">Úvodný jazyk vstupu: čínština</translation> @@ -4401,6 +4407,7 @@ <translation id="4819323978093861656">{0,plural, =0{Zatvárajú sa.}=1{Zavrú sa o 1 sekundu}few{Zavrú sa o # sekundy}many{Zavrú sa o # sekundy}other{Zavrú sa o # sekúnd}}</translation> <translation id="4819607494758673676">Upozornenia Asistenta Google</translation> <translation id="4820236583224459650">Nastaviť ako aktívny tiket</translation> +<translation id="4820795723433418303">Používať funkčné klávesy ako klávesy horného radu</translation> <translation id="4821935166599369261">&Profilovanie povolené</translation> <translation id="4823484602432206655">Čítať a meniť nastavenia používateľa a zariadenia</translation> <translation id="4824037980212326045">Zálohovanie a obnova v systéme Linux</translation> @@ -4532,6 +4539,7 @@ <translation id="4925320384394644410">Tu sa zobrazia vaše porty</translation> <translation id="49265687513387605">Obrazovka sa nedá prenášať. Skontrolujte, či ste potvrdili výzvu na spustenie jej zdieľania.</translation> <translation id="4927753642311223124">Tu sa nič nenachádza, pokračujte ďalej.</translation> +<translation id="4928629450964837566">Používajte bezpečnejšie heslo</translation> <translation id="4929386379796360314">Tlač destinácií</translation> <translation id="4930447554870711875">Vývojári</translation> <translation id="4930714375720679147">Zapnúť</translation> @@ -4614,6 +4622,7 @@ <translation id="5010886807652684893">Vizuálne zobrazenie</translation> <translation id="5015344424288992913">Určenie proxy...</translation> <translation id="5016491575926936899">Môžete odosielať textové správy z počítača, zdieľať internetové pripojenie, odpovedať na upozornenia na konverzácie a odomykať telefónom zariadenie <ph name="DEVICE_TYPE" />.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> +<translation id="5016983299133677671">Vyskúšajte nové heslo</translation> <translation id="5017643436812738274">Stránkami môžete prechádzať pomocou textového kurzora. Túto funkciu vypnete stlačením skratky Ctrl + Hľadať + 7.</translation> <translation id="5018207570537526145">Otvoriť web rozšírenia</translation> <translation id="5018526990965779848">Odosielanie údajov o využití a diagnostiky. Pomôžte zlepšiť prostredie Androidu automatickým odosielaním diagnostík a údajov o používaní zariadenia a aplikácií do Googlu. Pomôžu zvýšiť stabilitu systému a aplikácií a poskytovať ďalšie zlepšenia. Niektoré súhrnné údaje tiež pomôžu aplikáciám Google a partnerom, ako napríklad vývojárom pre Android. Ak aktivujete ďalšiu aktivitu na internete a v aplikáciách, tieto údaje sa uložia vo vašom účte Google.</translation> @@ -4682,6 +4691,7 @@ <translation id="5078638979202084724">Uložiť všetky karty ako záložky</translation> <translation id="5078796286268621944">Nesprávny kód PIN</translation> <translation id="5079010647467150187">Pridať vstavanú sieť VPN…</translation> +<translation id="5079699784114005398">Po zapnutí budú vaše aplikácie k dispozícii vo všetkých zariadeniach ChromeOS, keď sa prihlásite účtom Google. Webové aplikácie nainštalované v prehliadači Chrome sa budú synchronizovať aj vtedy, keď bude synchronizácia prehliadača vypnutá.</translation> <translation id="508059534790499809">Obnovenie tiketu Kerberos</translation> <translation id="5081960376148623587">Vyberte, či chcete prednačítavať stránky</translation> <translation id="5084328598860513926">Nastavovanie bolo prerušené. Skúste to znova alebo kontaktujte vlastníka či správcu zariadenia. Kód chyby: <ph name="ERROR_CODE" />.</translation> @@ -4757,6 +4767,7 @@ <translation id="5145464978649806571">Ak odídete od zariadenia, obrazovka sa automaticky uzamkne. Keď ste pred zariadením, obrazovka zostane odomknutá dlhšie. Ak je uzamknutá obrazovka deaktivovaná, zariadenie sa nezamkne, ale prejde do režimu spánku.</translation> <translation id="514575469079499857">Na zistenie polohy používať adresu IP (predvolené)</translation> <translation id="5146896637028965135">Hlas systému</translation> +<translation id="5147992672778369947">Používajte odporúčané heslo</translation> <translation id="5148277445782867161">Služby určovania polohy Google odhadujú polohu vášho zariadenia pomocou zdrojov, ako sú Wi-Fi a mobilné siete.</translation> <translation id="5150254825601720210">Netscape – názov servera SSL certifikátu</translation> <translation id="5151354047782775295">Uvoľnite miesto na disku, inak môže dôjsť k automatickému odstráneniu vybraných údajov</translation> @@ -5043,6 +5054,7 @@ <translation id="5414566801737831689">Čítať ikony webov, ktoré navštevujete</translation> <translation id="5414836363063783498">Overuje sa...</translation> <translation id="5417312524372586921">Motívy prehliadača</translation> +<translation id="5417353542809767994">Rýchlo používajte silné heslo</translation> <translation id="541737483547792035">Zväčšiť obrazovku</translation> <translation id="5419405654816502573">Voice Match</translation> <translation id="5420274697768050645">V záujme vyššej bezpečnosti vyžadovať na odomknutie zariadenia heslo</translation> @@ -5163,6 +5175,7 @@ <translation id="5517412723934627386"><ph name="NETWORK_TYPE" /> – <ph name="NETWORK_DISPLAY_NAME" /></translation> <translation id="5518949581554491184">Nastaviť pomocou telefónu s Androidom</translation> <translation id="5519195206574732858">LTE</translation> +<translation id="5519900055135507385">Zvýšte zabezpečenie tohto účtu silným heslom. Bude uložené v službe <ph name="GOOGLE_PASSWORD_MANAGER" /> pre účet <ph name="EMAIL" />.</translation> <translation id="5521078259930077036">Je toto domovská stránka, ktorú ste čakali?</translation> <translation id="5522156646677899028">Toto rozšírenie obsahuje vážnu chybu zabezpečenia.</translation> <translation id="5522403133543437426">Vyhľadávač používaný v paneli s adresou.</translation> @@ -5781,6 +5794,7 @@ <translation id="6070311415473175157">Vyberte časť obrázka na vyhľadávanie</translation> <translation id="6071181508177083058">potvrdenie hesla</translation> <translation id="6071576563962215370">Systému sa nepodarilo nastaviť v zariadení zámku atribútov z inštalácie.</translation> +<translation id="6071938745001252305">Uvoľnilo sa <ph name="MEMORY_VALUE" /> pamäte</translation> <translation id="6072442788591997866">Aplikácia <ph name="APP_NAME" /> nie je v tomto zariadení povolená. Kontaktujte správcu. Kód chyby: <ph name="ERROR_CODE" />.</translation> <translation id="6073451960410192870">Zastaviť zaznamenávanie</translation> <translation id="6073903501322152803">Pridať funkcie dostupnosti</translation> @@ -5828,6 +5842,7 @@ <translation id="6104068876731806426">Účty Google</translation> <translation id="6104311680260824317">Zariadenie sa nepodarilo pripojiť k doméne. Server nepodporuje stanovené typy šifrovania Kerberos. Skontrolujte nastavenia šifrovania v časti Ďalšie možnosti.</translation> <translation id="6104796831253957966">Zoznam tlačových úloh je plný</translation> +<translation id="6104929924898022309">Klávesom vyhľadávania meniť správanie funkčných klávesov</translation> <translation id="6106167152849320869">Ak ste sa v predchádzajúcom kroku rozhodli odosielať aj diagnostické údaje a údaje o využití, tieto údaje sa budú zhromažďovať pre nainštalované aplikácie.</translation> <translation id="6111972606040028426">Aktivovať Asistenta Google</translation> <translation id="6112294629795967147">Klepnutím zmeníte veľkosť</translation> @@ -5969,6 +5984,7 @@ <translation id="6234108445915742946">Zmluvné podmienky prehliadača Chrome sa 31. marca zmenia</translation> <translation id="6234474535228214774">Inštalácia čaká na spracovanie</translation> <translation id="6235208551686043831">Fotoaparát zariadenia je zapnutý. Umiestnite QR kód eSIM karty pred jeho objektív.</translation> +<translation id="6237297174664969437">V nastaveniach Chromu môžete kedykoľvek vybrať, ktoré dáta prehliadania sa majú synchronizovať. V <ph name="LINK_BEGIN" />nastaveniach zariadenia<ph name="LINK_END" /> môžete ovládať synchronizáciu webových aplikácií nainštalovaných v prehliadači Chrome. Google môže prispôsobovať Vyhľadávanie a ďalšie služby na základe vašej histórie.</translation> <translation id="6237474966939441970">Aplikácia na písanie poznámok dotykovým perom</translation> <translation id="623755660902014047">Režim čítania</translation> <translation id="6238767809035845642">Text zdieľaný z iného zariadenia</translation> @@ -6302,6 +6318,7 @@ <translation id="6537613839935722475">Názov môže obsahovať písmená, čísla a spojovníky (-)</translation> <translation id="6538098297809675636">Pri rozpoznávaní kódu sa vyskytla chyba</translation> <translation id="653920215766444089">Vyhľadáva sa polohovacie zariadenie</translation> +<translation id="6539674013849300372">Zvýšte svoju bezpečnosť na internete pomocou silného hesla. Bude uložené v službe <ph name="GOOGLE_PASSWORD_MANAGER" /> pre účet <ph name="EMAIL" />.</translation> <translation id="653983593749614101">Obnovuje sa…</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Poznámka:<ph name="END_BOLD" /> Túto možnosť povoľte iba v prípade, ak viete, čo robíte, alebo ak vás o to niekto požiadal, pretože zhromažďovanie údajov môže znížiť výkonnosť.</translation> <translation id="6541638731489116978">Tomuto webu bol zablokovaný prístup k senzorom pohybu.</translation> @@ -6500,6 +6517,7 @@ <translation id="671226373742585927">Kliknutím na tlačidlo X zavriete bočný panel</translation> <translation id="6712943853047024245">Už ste si uložili heslo pomocou tohto používateľského mena pre web alebo aplikáciu <ph name="WEBSITE" /></translation> <translation id="6713233729292711163">Pridať pracovný profil</translation> +<translation id="6713441551032149301">Pridržaním klávesa Spúšťač môžete prepínať medzi funkčnými klávesmi a systémovými klávesmi horného radu</translation> <translation id="6713668088933662563">Nikdy neponúkať preklad týchto jazykov</translation> <translation id="6715803357256707211">Počas inštalácie aplikácie pre Linux sa vyskytla chyba. Podrobnosti zistíte po kliknutí na upozornenie.</translation> <translation id="671619610707606484">Týmto vymažete <ph name="TOTAL_USAGE" /> dát uložených webmi</translation> @@ -6621,6 +6639,7 @@ <translation id="6811034713472274749">Stránka je pripravená na prezeranie</translation> <translation id="6811151703183939603">Pevná</translation> <translation id="6811332638216701903">Názov hostiteľa DHCP</translation> +<translation id="6811792477922751991">Klávesom Spúšťač meniť správanie funkčných klávesov</translation> <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> sa nepodarilo spustiť v mene používateľa root.</translation> <translation id="6812841287760418429">Zachovať zmeny</translation> <translation id="6813907279658683733">Celá obrazovka</translation> @@ -7814,6 +7833,7 @@ <translation id="7851720427268294554">Analyzátor IPP</translation> <translation id="78526636422538552">Pridávanie ďalších účtov Google je zakázané</translation> <translation id="7853747251428735">Ďalšie nástro&je</translation> +<translation id="7853999103056713222">Používajte bezpečnejšie heslo</translation> <translation id="7855678561139483478">Presun karty do nového okna</translation> <translation id="7857004848504343806">Váš počítač obsahuje bezpečnostný modul, pomocou ktorého sa v systéme Chrome OS Flex implementujú mnohé dôležité bezpečnostné funkcie. Viac sa dozviete v centre pomoci pre Chromebooky na https://support.google.com/chromebook/?p=sm.</translation> <translation id="7857093393627376423">Textové návrhy</translation> @@ -8369,6 +8389,7 @@ <translation id="8325413836429495820">Nemôže zobrazovať vašu schránku</translation> <translation id="8326478304147373412">Štandard PKCS #7, certifikačná reťaz</translation> <translation id="8327386430364625757">Písmo pre matematiku</translation> +<translation id="8327538105740918488">Toto heslo môžete neskôr kedykoľvek zmeniť. Bude uložené v službe <ph name="GOOGLE_PASSWORD_MANAGER" /> pre účet <ph name="EMAIL" />.</translation> <translation id="8327676037044516220">Povolenia a nastavenia obsahu</translation> <translation id="8330617762701840933">Zoznam webov presmerovávajúcich do alternatívneho prehliadača.</translation> <translation id="8330689128072902965">Kontakty v okolí s vami môžu zdieľať obsah. Zmeniť to môžete kliknutím.</translation> @@ -8514,6 +8535,7 @@ <translation id="8449836157089738489">Otvoriť všetko v novej skupine kariet</translation> <translation id="8451512073679317615">asistent</translation> <translation id="845702320058262034">Nedá sa pripojiť. Skontrolujte, či je v telefóne zapnuté rozhranie Bluetooth.</translation> +<translation id="8457251154056341970"><ph name="MODULE_NAME" /> na tejto stránke už neuvidíte</translation> <translation id="8457451314607652708">Import záložiek</translation> <translation id="8458341576712814616">Skratka</translation> <translation id="8458627787104127436">Otvoriť všetky (<ph name="URL_COUNT" />) v novom okne</translation> @@ -8586,6 +8608,7 @@ <translation id="8514955299594277296">Nepovoliť webom ukladať dáta v zariadení (neodporúča sa)</translation> <translation id="8517759303731677493">Upraviť…</translation> <translation id="8519895319663397036">Heslá sa nedajú importovať. Súbor musí byť menší než 150 kB.</translation> +<translation id="851991974800416566">Rýchlo používajte silné heslo</translation> <translation id="8523493869875972733">Zachovať zmeny</translation> <translation id="8523849605371521713">Pridané pravidlom</translation> <translation id="8524783101666974011">Uloženie kariet do účtu Google</translation> @@ -8743,6 +8766,7 @@ <translation id="8665110742939124773">Zadali te nesprávny prístupový kód. Skúste to znova.</translation> <translation id="8665180165765946056">Zálohovanie bolo dokončené</translation> <translation id="866611985033792019">Dôverovať tomuto certifikátu na identifikáciu e-mailových používateľov</translation> +<translation id="8666268818656583275">Klávesy F budú odteraz fungovať ako systémové klávesy horného radu</translation> <translation id="8666321716757704924">Povolenia pre <ph name="WEBSITE" /> boli znova udelené</translation> <translation id="8666759526542103597">Prispôsobenie reklám založené na prehliadači</translation> <translation id="8667261224612332309">Máte heslá, ktoré sa dajú zlepšiť</translation> @@ -9427,6 +9451,7 @@ <translation id="950307215746360464">Sprievodca nastavením</translation> <translation id="951991426597076286">Odmietnuť</translation> <translation id="952471655966876828">Zariadenie sa automaticky pripojí, keď ho zapnete alebo použijete</translation> +<translation id="952880932803612259">Povoľte aplikáciám, webom a systémovým službám používať vašu polohu. Nastavenie Poloha pomáha odhadnúť polohu vášho zariadenia pomocou zdrojov, ako sú Wi-Fi, mobilné siete a senzory.</translation> <translation id="953434574221655299">Weby, ktoré majú povolené zisťovať, kedy aktívne používate zariadenie</translation> <translation id="956500788634395331">Je aktivovaná ochrana pred potenciálne škodlivými rozšíreniami</translation> <translation id="957179356621191750">Šesťbodové</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index ace55fc..1d2ecd6 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">Zavihek je spet aktiven</translation> <translation id="1003088604756913841">Odpiranje povezave v novem oknu aplikacije <ph name="APP" /></translation> <translation id="100323615638474026">Naprava USB (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Google Varno brskanje</translation> <translation id="1004218526896219317">Dostop do spletnih mest</translation> <translation id="1005274289863221750">Uporabite mikrofon in kamero</translation> <translation id="1005333234656240382">Želite omogočiti odpravljanje napak z mostom za odpravljanje težav s sistemom Android (ADB)?</translation> @@ -530,6 +531,7 @@ <translation id="146000042969587795">Ta okvir je bil blokiran, ker vsebuje vsebino, ki ni varna.</translation> <translation id="1461041542809785877">Učinkovitost delovanja</translation> <translation id="1461177659295855031">Premakni v mapo vrstice z zaznamki</translation> +<translation id="1461288887896722288">Pravkar ste se prijavili v upravljani račun. Če ustvarite nov upravljan profil, boste lahko dostopali do nekaterih virov, povezanih s tem računom.</translation> <translation id="146219525117638703">Stanje ONC</translation> <translation id="146220085323579959">Prekinjena povezava z internetom. Preverite internetno povezavo in poskusite znova.</translation> <translation id="1462850958694534228">Pregled posodobitve ikone</translation> @@ -915,6 +917,7 @@ <translation id="1769104665586091481">Odpri povezavo v novem &oknu</translation> <translation id="1770407692401984718">Povlecite sliko sem ali</translation> <translation id="177053719077591686">Varnostno kopirajte aplikacije za Android v Google Drive.</translation> +<translation id="1771075623623424448">Ali iščete stran dnevnika naprave brskalnika? Obiščite <ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="177336675152937177">Podatki gostujočih aplikacij</translation> <translation id="1776712937009046120">Dodaj uporabnika</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> @@ -1701,6 +1704,15 @@ <translation id="2422125132043002186">Obnovitev vsebnika za Linux je bila preklicana</translation> <translation id="2423578206845792524">Sh&rani sliko kot ...</translation> <translation id="2424424966051154874">{0,plural, =1{Gost}one{Gost (#)}two{Gost (#)}few{Gost (#)}other{Gost (#)}}</translation> +<translation id="242684489663276773">S tem dejanjem se bo zgodilo to: + <ph name="LINE_BREAKS" /> + • Ponastavljene bodo nekatere nastavitve v Chromu in bližnjice za Chrome. + <ph name="LINE_BREAK" /> + • Onemogočene bodo razširitve. + <ph name="LINE_BREAK" /> + • Izbrisani bodo piškotki in drugi začasni podatki spletnih mest. + <ph name="LINE_BREAKS" /> + To ne bo vplivalo na zaznamke, zgodovino in shranjena gesla.</translation> <translation id="2428510569851653187">Opišite, kaj ste počeli, ko se je zavihek zrušil</translation> <translation id="2428939361789119025">Izklop Wi-Fi-ja</translation> <translation id="2428978615149723410">ti vozički</translation> @@ -1884,6 +1896,7 @@ <translation id="2575407791320728464">Neveljaven URL. Pravilno mora biti oblikovan.</translation> <translation id="2575441894380764255">Ni dovoljeno prikazovanje vsiljivih ali zavajajočih oglasov</translation> <translation id="2575713839157415345">{YEARS,plural, =1{Ta naprava bo shranjena za 1 leto in naslednjič se lahko z njo povežete brez kode. To nastavi vaš skrbnik.}one{Ta naprava bo shranjena za {YEARS} leto in naslednjič se lahko z njo povežete brez kode. To nastavi vaš skrbnik.}two{Ta naprava bo shranjena za {YEARS} leti in naslednjič se lahko z njo povežete brez kode. To nastavi vaš skrbnik.}few{Ta naprava bo shranjena za {YEARS} leta in naslednjič se lahko z njo povežete brez kode. To nastavi vaš skrbnik.}other{Ta naprava bo shranjena za {YEARS} let in naslednjič se lahko z njo povežete brez kode. To nastavi vaš skrbnik.}}</translation> +<translation id="2577446426265992344">brez naslovne vrstice</translation> <translation id="257779572837908839">Nastavitev kot Chromebox za videokonference</translation> <translation id="2579309488038515659">Omogočanje dostopne točke</translation> <translation id="2579596474754516455">Optično preberite slike PDF, da po potrebi pretvorite besedilo za bralnik zaslona.</translation> @@ -4475,6 +4488,7 @@ <translation id="4876895919560854374">Zaklepanje in odklepanje zaslona</translation> <translation id="4877276003880815204">Pregled elementov</translation> <translation id="4877652723592270843">Ali želite aktivirati ChromeVox, vgrajeni bralnik zaslona za ChromeOS Flex? Če ga želite, za pet sekund pridržite gumba za glasnost.</translation> +<translation id="4878261017150799673">Spletno mesto naj bo aktivno</translation> <translation id="4878634973244289103">Povratnih informacij ni mogoče poslati. Poskusite znova pozneje.</translation> <translation id="4878653975845355462">Skrbnik je izklopil ozadja po meri</translation> <translation id="4878718769565915065">Dodajanje prstnega odtisa temu varnostnemu ključu ni uspelo.</translation> @@ -5263,6 +5277,9 @@ <translation id="5602765853043467355">Počistite zaznamke, zgodovino, gesla in drugo v tej napravi</translation> <translation id="5605758115928394442">V vaš telefon smo poslali obvestilo, da potrdite, da ste to res vi.</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{Ta razširitev je blokirana}one{Te razširitve so blokirane}two{Te razširitve so blokirane}few{Te razširitve so blokirane}other{Te razširitve so blokirane}}</translation> +<translation id="560743070587960985">Ta datoteka je morda virus ali zlonamerna programska oprema. + +Lahko jo pošljete Googlu, da preveri, ali je varna. Pregled običajno traja nekaj sekund.</translation> <translation id="560834977503641186">Sinhronizacija poverilnic za Wi-Fi, več o tem</translation> <translation id="5608580678041221894">Dotaknite se teh tipk, če želite prilagoditi ali premakniti območje za obrezovanje</translation> <translation id="5609231933459083978">Videti je, da je aplikacija neveljavna.</translation> @@ -6001,6 +6018,7 @@ <translation id="6254892857036829079">Odlično</translation> <translation id="6257602895346497974">Vklopi sinhronizacijo …</translation> <translation id="62586649943626337">Organizirajte zavihke s skupinami zavihkov</translation> +<translation id="6260092874648348841">Spletno mesto naj bo aktivno</translation> <translation id="6262371516389954471">Varnostne kopije so naložene v Google in šifrirane z geslom za račun Google.</translation> <translation id="6263082573641595914">Microsoftova različica overitelja potrdil</translation> <translation id="6263284346895336537">Ni kritično</translation> @@ -6584,6 +6602,7 @@ <translation id="6787097042755590313">Drug zavihek</translation> <translation id="6787839852456839824">Bližnjične tipke</translation> <translation id="6788210894632713004">Odpakirana razširitev</translation> +<translation id="678939393857169499">Omogoči novo obliko za namizne računalnike.</translation> <translation id="6789592661892473991">Razdeli vodoravno</translation> <translation id="6789834167207639931">Na naslednjem zaslonu znova vnesite geslo za račun Google, da končate obnovitev.</translation> <translation id="6790428901817661496">Predvajanje</translation> @@ -7381,6 +7400,7 @@ <translation id="7481312909269577407">Naprej</translation> <translation id="7481358317100446445">Pripravljeno</translation> <translation id="748138892655239008">Osnovne omejitve potrdila</translation> +<translation id="7483145199632798061">Chrome Refresh 2023</translation> <translation id="7484645889979462775">Nikoli za to spletno mesto</translation> <translation id="7487141338393529395">Vklop izboljšanega preverjanja črkovanja</translation> <translation id="7487969577036436319">Ni nameščenih komponent</translation> @@ -7542,6 +7562,7 @@ <translation id="7634280112532283638">Zmanjšanje vsiljene vsebine in prevar</translation> <translation id="7634337648687970851">Obnovitev lokalnih podatkov trenutno ni podprta.</translation> <translation id="7634566076839829401">Prišlo je do napake. Poskusite znova.</translation> +<translation id="763472884969134151">Avtor analize: <ph name="LINK" /></translation> <translation id="7635048370253485243">Pripel skrbnik</translation> <translation id="7635711411613274199">Ali je med brskanjem oglas, ki je prikazan, osebno prilagojen, je odvisno od te nastavitve, nastavitve <ph name="BEGIN_LINK1" />tem oglasov<ph name="LINK_END1" />, <ph name="BEGIN_LINK2" />nastavitev piškotkov<ph name="LINK_END2" /> in od tega, ali spletno mesto, ki si ga ogledujete, osebno prilagaja oglase.</translation> <translation id="7636919061354591437">Namesti v to napravo</translation> @@ -8221,6 +8242,7 @@ <translation id="8195737548602430447">Samodejno prevajanje podnapisov v ciljni jezik.</translation> <translation id="8197673340773315084">Dodajte ime ali oznako, denimo Delo ali Osebno.</translation> <translation id="8198456017687137612">Predvajanje vsebine zavihka</translation> +<translation id="8198457270656084773">Ali iščete stran dnevnika naprave sistema? Obiščite <ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="8198511718495409170">Če želite uporabiti posodobljene nastavitve za razširitev »<ph name="EXTENSION_NAME" />« na tem spletnem mestu, znova naložite to stran</translation> <translation id="8199300056570174101">Nastavitve omrežja (storitve) in naprav</translation> <translation id="8200772114523450471">Nadaljuj</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb index bffd01ce..cd66528 100644 --- a/chrome/app/resources/generated_resources_sq.xtb +++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">Skeda është përsëri aktive</translation> <translation id="1003088604756913841">Hape lidhjen në një dritare të re të <ph name="APP" /></translation> <translation id="100323615638474026">Pajisja USB (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Shfletimi i sigurt i Google</translation> <translation id="1004218526896219317">Qasja në sajt</translation> <translation id="1005274289863221750">Përdor mikrofonin dhe kamerën</translation> <translation id="1005333234656240382">Të aktivizohet korrigjimi i ADB-së?</translation> @@ -524,6 +525,7 @@ <translation id="146000042969587795">Kjo kornizë u bllokua, sepse përmban përmbajtje të pasigurt.</translation> <translation id="1461041542809785877">Cilësia e funksionimit</translation> <translation id="1461177659295855031">Zhvendose te dosja e "Shiritit të faqeshënuesve"</translation> +<translation id="1461288887896722288">Sapo u identifikove në një llogari të menaxhuar. Krijimi i një profili të ri të menaxhuar do të të lejojë të kesh qasje te disa burime të lidhura me atë llogari.</translation> <translation id="146219525117638703">Gjendja ONC</translation> <translation id="146220085323579959">Interneti u shkëput. Kontrollo lidhjen e internetit dhe provo sërish.</translation> <translation id="1462850958694534228">Shqyrto përditësimin e ikonës</translation> @@ -898,6 +900,7 @@ <translation id="1769104665586091481">Hape lidhjen në dritare &të re</translation> <translation id="1770407692401984718">Zvarrit një imazh këtu ose</translation> <translation id="177053719077591686">Rezervo aplikacionet për Android në "Diskun e Google".</translation> +<translation id="1771075623623424448">Po kërkon për faqen e evidencës së pajisjes për shfletuesin? Vizito <ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="177336675152937177">Të dhënat e strehuara të aplikacionit</translation> <translation id="1776712937009046120">Shto përdorues</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> @@ -1681,6 +1684,15 @@ <translation id="2422125132043002186">U anulua restaurimi i Linux</translation> <translation id="2423578206845792524">Ru&aje imazhin si...</translation> <translation id="2424424966051154874">{0,plural, =1{I ftuar}other{I ftuar (#)}}</translation> +<translation id="242684489663276773">Ky veprim: + <ph name="LINE_BREAKS" /> + • Do të rivendosë disa cilësime të Chrome dhe shkurtoret e Chrome + <ph name="LINE_BREAK" /> + • Do të çaktivizojë shtesat + <ph name="LINE_BREAK" /> + • Do të fshijë kukit dhe të dhënat e tjera të përkohshme të sajtit + <ph name="LINE_BREAKS" /> + Faqeshënuesit, historiku dhe fjalëkalimet e ruajtura nuk do të preken.</translation> <translation id="2428510569851653187">Përshkruaj çfarë po bëje kur skeda pësoi një ndërprerje aksidentale</translation> <translation id="2428939361789119025">Çaktivizo Wi-Fi</translation> <translation id="2428978615149723410">këto karroca</translation> @@ -1864,6 +1876,7 @@ <translation id="2575407791320728464">URL e pavlefshme. Sigurohu që të jetë e formatuar në mënyrën e duhur.</translation> <translation id="2575441894380764255">Nuk lejohen të shfaqin reklama ndërhyrëse ose mashtruese</translation> <translation id="2575713839157415345">{YEARS,plural, =1{Kjo pajisje do të ruhet për 1 vit dhe mund të lidhesh pa kod herën tjetër. Kjo është caktuar nga administratori yt.}other{Kjo pajisje do të ruhet për {YEARS} vite dhe mund të lidhesh pa kod herën tjetër. Kjo është caktuar nga administratori yt.}}</translation> +<translation id="2577446426265992344">pa omnibox</translation> <translation id="257779572837908839">Konfiguroje si "Chromebox për takime"</translation> <translation id="2579309488038515659">Aktivizo zonën e qasjes për internet</translation> <translation id="2579596474754516455">Skano imazhet në PDF për ta konvertuar tekstin për lexuesit e ekranit kur është e nevojshme</translation> @@ -4454,6 +4467,7 @@ <translation id="4876895919560854374">Kyç dhe shkyç ekranin</translation> <translation id="4877276003880815204">Inspekto elementet</translation> <translation id="4877652723592270843">Dëshiron të aktivizosh ChromeVox, lexuesin e integruar të ekranit për Chrome OS Flex? Nëse po, shtyp dhe mbaj shtypur të dy tastet e volumit për pesë sekonda.</translation> +<translation id="4878261017150799673">Mbaje sajtin aktiv</translation> <translation id="4878634973244289103">Nuk mund të dërgohen përshtypje. Provo sërish më vonë</translation> <translation id="4878653975845355462">Sfondet e personalizuara janë çaktivizuar nga administratori yt</translation> <translation id="4878718769565915065">Shtimi i një gjurme gishti te ky çelës sigurie dështoi</translation> @@ -5241,6 +5255,9 @@ <translation id="5602765853043467355">Pastro faqeshënuesit, historikun, fjalëkalimet dhe më shumë nga kjo pajisje</translation> <translation id="5605758115928394442">Një njoftim është dërguar te telefoni yt për të konfirmuar që je ti.</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{Kjo shtesë është bllokuar}other{Këto shtesa janë bllokuar}}</translation> +<translation id="560743070587960985">Ky skedar mund të jetë një virus ose softuer keqdashës. + +Mund ta dërgosh atë te Google për të kontrolluar nëse nuk është i sigurt. Skanimet zakonisht zgjasin disa sekonda.</translation> <translation id="560834977503641186">"Sinkronizimi i Wi-Fi", Mëso më shumë</translation> <translation id="5608580678041221894">Trokit te tastet e mëposhtme për të rregulluar ose zhvendosur zonën e prerjes</translation> <translation id="5609231933459083978">Aplikacioni duket se është i pavlefshëm.</translation> @@ -5978,6 +5995,7 @@ <translation id="6254892857036829079">E përkryer</translation> <translation id="6257602895346497974">Aktivizo sinkronizimin...</translation> <translation id="62586649943626337">Organizo skedat e tua me grupet e skedave</translation> +<translation id="6260092874648348841">Mbaje sajtin aktiv</translation> <translation id="6262371516389954471">Rezervimet e tua ngarkohen te Google dhe enkriptohen duke përdorur fjalëkalimin e "Llogarisë sate të Google".</translation> <translation id="6263082573641595914">Versioni i autoritetit të certifikimit të Microsoft</translation> <translation id="6263284346895336537">Jo vendimtare</translation> @@ -6555,6 +6573,7 @@ <translation id="6787097042755590313">Skedë tjetër</translation> <translation id="6787839852456839824">Shkurtoret e tastierës</translation> <translation id="6788210894632713004">Shtesë e shpaketuar</translation> +<translation id="678939393857169499">Aktivizon dizajnin e ri të desktopit.</translation> <translation id="6789592661892473991">Horizontal i ndarë</translation> <translation id="6789834167207639931">Fut përsëri fjalëkalimin e "Llogarisë sate të Google" në ekranin tjetër për të përfunduar rikuperimin</translation> <translation id="6790428901817661496">Luaj</translation> @@ -7352,6 +7371,7 @@ <translation id="7481312909269577407">Përpara</translation> <translation id="7481358317100446445">Gati</translation> <translation id="748138892655239008">Kufizimet bazë të certifikatës</translation> +<translation id="7483145199632798061">Rifreskimi i Chrome për vitin 2023</translation> <translation id="7484645889979462775">Asnjëherë për këtë faqe</translation> <translation id="7487141338393529395">Aktivizo kontrolluesin drejtshkrimor të përmirësuar</translation> <translation id="7487969577036436319">Nuk është instaluar asnjë komponent</translation> @@ -7513,6 +7533,7 @@ <translation id="7634280112532283638">Reduktimi i mesazheve të bezdisshme dhe mashtrimit</translation> <translation id="7634337648687970851">Rikuperimi i të dhënave lokale nuk mbështetet aktualisht.</translation> <translation id="7634566076839829401">Ndodhi një gabim. Provo përsëri.</translation> +<translation id="763472884969134151">Analiza e kryer nga <ph name="LINK" /></translation> <translation id="7635048370253485243">Gozhduar nga administratori yt</translation> <translation id="7635711411613274199">Kur shfleton, nëse një reklamë që shikon është e personalizuar, kjo varet nga ky cilësim, nga <ph name="BEGIN_LINK1" />Temat e reklamave<ph name="LINK_END1" />, <ph name="BEGIN_LINK2" />cilësimet e tua të kukive<ph name="LINK_END2" /> dhe nëse sajti që po shikon ti i personalizon reklamat</translation> <translation id="7636919061354591437">Instaloje në këtë pajisje</translation> @@ -8190,6 +8211,7 @@ <translation id="8195737548602430447">Përkthe automatikisht titrat në gjuhën e synuar.</translation> <translation id="8197673340773315084">Shto një emër ose një etiketë, si p.sh. "Puna" ose "Personale"</translation> <translation id="8198456017687137612">Skeda e transmetimit</translation> +<translation id="8198457270656084773">Po kërkon për faqen e evidencës së pajisjes për sistemin? Vizito <ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="8198511718495409170">Për të zbatuar cilësimet e përditësuara për "<ph name="EXTENSION_NAME" />" në këtë sajt, ringarkoje këtë faqe</translation> <translation id="8199300056570174101">Vetitë e rrjetit (shërbimit) dhe pajisjes</translation> <translation id="8200772114523450471">Vazhdo</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index 255690e7..5a5a7c5f 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">Kichupo kinatumika tena</translation> <translation id="1003088604756913841">Fungua Kiungo katika Dirisha jipya la <ph name="APP" /></translation> <translation id="100323615638474026">Kifaa cha USB (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Kipengele cha Kuvinjari Salama na Google</translation> <translation id="1004218526896219317">Ufikiaji wa tovuti</translation> <translation id="1005274289863221750">Tumia kipazasauti na kamera yako</translation> <translation id="1005333234656240382">Ungependa kuwasha utatuzi wa ADB?</translation> @@ -527,6 +528,7 @@ <translation id="146000042969587795">Fremu hii imezuiwa kwa sababu ina maudhui mengine yasiyo salama.</translation> <translation id="1461041542809785877">Utandaji</translation> <translation id="1461177659295855031">Hamishia kwenye folda ya Sehemu ya Alamisho</translation> +<translation id="1461288887896722288">Umeingia katika akaunti inayosimamiwa sasa hivi, ukiunda wasifu mpya unaosimamiwa, utaweza kufikia baadhi ya nyenzo zilizounganishwa na akaunti hiyo.</translation> <translation id="146219525117638703">Hali ya ONC</translation> <translation id="146220085323579959">Mtandao umekatizwa. Tafadhali kagua muunganisho wako wa mtandao na ujaribu tena.</translation> <translation id="1462850958694534228">Kagua mabadiliko ya aikoni</translation> @@ -909,6 +911,7 @@ <translation id="1769104665586091481">Fungua Kiungo katika &Dirisha Jipya</translation> <translation id="1770407692401984718">Buruta picha uilete hapa au</translation> <translation id="177053719077591686">Hifadhi nakala za programu za Android kwenye Hifadhi ya Google.</translation> +<translation id="1771075623623424448">Je, unatafuta ukurasa wa kumbukumbu ya kivinjari cha kifaa? Tembelea<ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" /></translation> <translation id="177336675152937177">Data ya programu iliyopangishwa</translation> <translation id="1776712937009046120">Ongeza mtumiaji</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> @@ -1695,6 +1698,15 @@ <translation id="2422125132043002186">Imeghairi upakiaji Linux</translation> <translation id="2423578206845792524">Hifadhi picha kama...</translation> <translation id="2424424966051154874">{0,plural, =1{Mgeni}other{Mgeni (#)}}</translation> +<translation id="242684489663276773">Kitendo hiki: + <ph name="LINE_BREAKS" /> + • Kitaweka upya baadhi ya mipangilio ya Chrome na njia za mkato za Chrome + <ph name="LINE_BREAK" /> + • Kitazima viendelezi + <ph name="LINE_BREAK" /> + • Kitafuta vidakuzi na data nyingine ya tovuti ya muda + <ph name="LINE_BREAKS" /> + Alamisho, historia na manenosiri uliyoyahifadhi hayataathiriwa.</translation> <translation id="2428510569851653187">Eleza shughuli ulizokuwa ukifanya kichupo kilipoacha kufanya kazi</translation> <translation id="2428939361789119025">Zima Wi-Fi</translation> <translation id="2428978615149723410">vikapu hivi</translation> @@ -1878,6 +1890,7 @@ <translation id="2575407791320728464">URL si sahihi. Hakikisha imeundwa kwa usahihi.</translation> <translation id="2575441894380764255">Zisizoruhusiwa kuonyesha matangazo yanayopotosha au yanayokatiza matumizi</translation> <translation id="2575713839157415345">{YEARS,plural, =1{Kifaa hiki kitahifadhiwa kwa mwaka 1 na unaweza kuunganisha bila msimbo wakati mwingine. Mipangilio hii imewekwa na msimamizi wako.}other{Kifaa hiki kitahifadhiwa kwa miaka {YEARS} na unaweza kuunganisha bila msimbo wakati mwingine. Mipangilio hii imewekwa na msimamizi wako.}}</translation> +<translation id="2577446426265992344">bila Sanduku kuu</translation> <translation id="257779572837908839">Weka mipangilio kuwa Chromebox ya mikutano</translation> <translation id="2579309488038515659">Mtandao pepe umewashwa</translation> <translation id="2579596474754516455">Changanua picha za PDF ili ubadilishe maandishi ya kisoma skrini inapohitajika</translation> @@ -4467,6 +4480,7 @@ <translation id="4876895919560854374">Funga na ufungue skrini</translation> <translation id="4877276003880815204">Kagua Vipengee</translation> <translation id="4877652723592270843">Je, ungependa kuwasha ChromeVox, kisoma skrini kilichojumuishwa ndani ya kifaa kwa ajili ya ChromeOS Flex? Ikiwa ndivyo, bonyeza na ushikilie vitufe vyote viwili vya sauti kwa sekunde tano.</translation> +<translation id="4878261017150799673">Ifanye tovuti iendelee kutumika</translation> <translation id="4878634973244289103">Imeshindwa kutuma maoni. Tafadhali jaribu tena baadaye.</translation> <translation id="4878653975845355462">Kipengele cha mandhari-nyuma maalum kimezimwa na msimamizi wako</translation> <translation id="4878718769565915065">Imeshindwa kuweka alama ya kidole kwenye ufunguo huu wa usalama</translation> @@ -5254,6 +5268,9 @@ <translation id="5602765853043467355">Futa alamisho, historia, manenosiri na mengineyo kwenye kifaa hiki</translation> <translation id="5605758115928394442">Arifa imetumwa kwenye simu yako ili kuthibitisha ni wewe.</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{Kiendelezi hiki kimezuiwa}other{Viendelezi hivi vimezuiwa}}</translation> +<translation id="560743070587960985">Faili hii inaweza kuwa ni kirusi au programu hasidi. + +Unaweza kuituma kwa Google ili kuikagua kama si salama. Kwa kawaida, uchanganuzi huchukua sekunde kadhaa.</translation> <translation id="560834977503641186">Usawazishaji Wi-Fi, Pata Maelezo Zaidi</translation> <translation id="5608580678041221894">Gusa vitufe vinavyofuata ili urekebishe au usogeze eneo la kupunguzia</translation> <translation id="5609231933459083978">Programu inaonekana kuwa batili.</translation> @@ -5569,7 +5586,7 @@ <translation id="5889282057229379085">Upeo wa idadi ya mamlaka ya kati ya cheti: <ph name="NUM_INTERMEDIATE_CA" /></translation> <translation id="5889629805140803638">Simba data iliyosawazishwa kwa njia fiche ukitumia <ph name="BEGIN_LINK" />kauli yako ya siri ya usawazishaji<ph name="END_LINK" />. Njia za kulipa na anwani kutoka Google Pay hazitasimbwa kwa njia fiche. Historia ya kuvinjari kutoka Chrome haitasawazishwa.</translation> <translation id="5891688036610113830">Mitandao ya Wi-Fi inayopendelewa</translation> -<translation id="5895138241574237353">Zzima na uwashe</translation> +<translation id="5895138241574237353">Zima na uwashe</translation> <translation id="5895335062901455404">Mapendeleo na shughuli ulizohifadhi zitakuwa tayari kwenye kifaa chochote kinachotumia ChromeOS Flex ukiingia kwa kutumia Akaunti yako ya Google. Unaweza kuchagua unachotaka kusawazisha katika Mipangilio.</translation> <translation id="589541317545606110">Tafuta Ukurasa ukitumia <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="5895758411979561724"><ph name="APP_ORIGIN" /> inarekodi skrini yako</translation> @@ -5991,6 +6008,7 @@ <translation id="6254892857036829079">Shwari</translation> <translation id="6257602895346497974">Washa kipengele cha kusawazisha...</translation> <translation id="62586649943626337">Panga vichupo vyako kwa kutumia kikundi cha vichupo</translation> +<translation id="6260092874648348841">Ifanye tovuti iendelee kutumika</translation> <translation id="6262371516389954471">Nakala unazohifadhi hupakiwa kwenye Google na kusimbwa kwa njia fiche kwa kutumia nenosiri la Akaunti yako ya Google.</translation> <translation id="6263082573641595914">Toleo la Mamlaka ya Cheti la Microsoft</translation> <translation id="6263284346895336537">Sio Muhimu</translation> @@ -6568,6 +6586,7 @@ <translation id="6787097042755590313">Kichupo Kingine</translation> <translation id="6787839852456839824">Mikato ya kibodi</translation> <translation id="6788210894632713004">Kiendelezi kilichofunguliwa</translation> +<translation id="678939393857169499">Huwasha muundo mpya wa eneo kazi.</translation> <translation id="6789592661892473991">Gawanya Kimlalo</translation> <translation id="6789834167207639931">Weka tena nenosiri lako la Akaunti ya Google katika skrini inayofuata ili umalizie kurejesha</translation> <translation id="6790428901817661496">Cheza</translation> @@ -7365,6 +7384,7 @@ <translation id="7481312909269577407">Mbele</translation> <translation id="7481358317100446445">Iko tayari</translation> <translation id="748138892655239008">Vizuizi Msingi vya Cheti</translation> +<translation id="7483145199632798061">Sasisho la Chrome, 2023</translation> <translation id="7484645889979462775">Kamwe lisihifadhiwe kwa tovuti hii</translation> <translation id="7487141338393529395">Washa Kikagua Maendelezo Kilichoboreshwa</translation> <translation id="7487969577036436319">Hakuna vipengele vilivyosakinishwa</translation> @@ -7526,6 +7546,7 @@ <translation id="7634280112532283638">Upunguzaji wa taka na ulaghai</translation> <translation id="7634337648687970851">Urejeshaji wa data ya kwenye kifaa hautumiki kwa sasa.</translation> <translation id="7634566076839829401">Hitilafu fulani imetokea. Tafadhali jaribu tena.</translation> +<translation id="763472884969134151">Uchambuzi umefanywa na <ph name="LINK" /></translation> <translation id="7635048370253485243">Imebandikwa na Msimamizi wako</translation> <translation id="7635711411613274199">Unapovinjari, iwapo tangazo unaloona limewekewa mapendeleo hutegemea mipangilio hii, <ph name="BEGIN_LINK1" />mada za Matangazo<ph name="LINK_END1" />, <ph name="BEGIN_LINK2" />mipangilio yako ya vidakuzi<ph name="LINK_END2" /> na ikiwa tovuti unayoangalia huwekea matangazo mapendeleo</translation> <translation id="7636919061354591437">Sakinisha kwenye Kifaa hiki</translation> @@ -8206,6 +8227,7 @@ <translation id="8195737548602430447">Tafsiri manukuu kiotomatiki kwa lugha lengwa</translation> <translation id="8197673340773315084">Weka jina au lebo, kama vile wasifu wa Kazi au Binafsi</translation> <translation id="8198456017687137612">Inatuma maudhui ya kichupo</translation> +<translation id="8198457270656084773">Je, unatafuta ukurasa wa kumbukumbu ya mfumo wa kifaa? Tembelea<ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" /></translation> <translation id="8198511718495409170">Ili utumie mipangilio iliyosasishwa kwa ajili ya "<ph name="EXTENSION_NAME" />" kwenye tovuti hii, pakia upya ukurasa huu</translation> <translation id="8199300056570174101">Sifa za Kifaa na Mtandao (Huduma)</translation> <translation id="8200772114523450471">Endelea</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index b950d19..52821e7 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">பக்கம் மீண்டும் இயக்கப்பட்டது</translation> <translation id="1003088604756913841">புதிய <ph name="APP" /> சாளரத்தில் இணைப்பைத் திற</translation> <translation id="100323615638474026">USB சாதனம் (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Google பாதுகாப்பு உலாவல்</translation> <translation id="1004218526896219317">தள அணுகல்</translation> <translation id="1005274289863221750">உங்கள் மைக்ரோஃபோன் மற்றும் கேமராவைப் பயன்படுத்தலாம்</translation> <translation id="1005333234656240382">ADB பிழைதிருத்தத்தை இயக்கவா?</translation> @@ -525,6 +526,7 @@ <translation id="146000042969587795">இந்த சட்டகம் சில பாதுகாப்பாற்ற உள்ளடக்கத்தைக் கொண்டுள்ளதால் தடுக்கப்பட்டது.</translation> <translation id="1461041542809785877">செயல்பாடு</translation> <translation id="1461177659295855031">புக்மார்க் பட்டி ஃபோல்டருக்கு நகர்த்து</translation> +<translation id="1461288887896722288">நிர்வகிக்கப்படும் கணக்கில் உள்நுழைந்துள்ளீர்கள். நிர்வகிக்கப்படும் சுயவிவரம் ஒன்றைப் புதிதாக உருவாக்குவதன் மூலம் அந்தக் கணக்குடன் தொடர்புடைய சில தகவல்களை அணுக முடியும்.</translation> <translation id="146219525117638703">ONC நிலை</translation> <translation id="146220085323579959">இணையம் துண்டிக்கப்பட்டது. இணைய இணைப்பைச் சரிபார்த்து, மீண்டும் முயலவும்.</translation> <translation id="1462850958694534228">ஐகான் மாற்றப்பட்டுள்ளது</translation> @@ -910,6 +912,7 @@ <translation id="1769104665586091481">இணைப்பை புதிய &சாளரத்தில் திற</translation> <translation id="1770407692401984718">படத்தை இங்கே இழுத்து விடவும் அல்லது</translation> <translation id="177053719077591686">Android ஆப்ஸை Google Driveவுக்குக் காப்புப் பிரதி எடுத்தல்.</translation> +<translation id="1771075623623424448">உலாவியின் சாதனப் பதிவுப் பக்கத்தைத் தேடுகிறீர்களா? <ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" /> என்ற இணைப்பிற்குச் செல்லவும்.</translation> <translation id="177336675152937177">ஹோஸ்ட் செய்யப்பட்ட ஆப்ஸின் தரவு</translation> <translation id="1776712937009046120">பயனரைச் சேர்</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> @@ -1693,6 +1696,15 @@ <translation id="2422125132043002186">Linuxஸை மீட்டமைப்பது ரத்துசெய்யப்பட்டது</translation> <translation id="2423578206845792524">படத்தை இவ்வாறு சே&மி...</translation> <translation id="2424424966051154874">{0,plural, =1{விருந்தினர்}other{விருந்தினர் (#)}}</translation> +<translation id="242684489663276773">இதனால்: + <ph name="LINE_BREAKS" /> + • சில Chrome அமைப்புகளும் Chrome ஷார்ட்கட்களும் மீட்டமைக்கப்படும் + <ph name="LINE_BREAK" /> + • நீட்டிப்புகள் முடக்கப்படும் + <ph name="LINE_BREAK" /> + • குக்கீகளும் பிற தற்காலிகத் தளத் தரவும் நீக்கப்படும் + <ph name="LINE_BREAKS" /> + புக்மார்க்குகள், பதிவுகள், சேமிக்கப்பட்ட கடவுச்சொற்கள் ஆகியவை பாதிக்கப்படாது.</translation> <translation id="2428510569851653187">தாவல் சிதைந்த போது, நீங்கள் என்ன செய்து கொண்டிருந்தீர்கள் என்பதை விளக்கவும்</translation> <translation id="2428939361789119025">வைஃபையை முடக்கு</translation> <translation id="2428978615149723410">இந்தக் கார்ட்டுகள்</translation> @@ -1876,6 +1888,7 @@ <translation id="2575407791320728464">தவறான URL. சரியாக வடிவமைக்கப்பட்டுள்ளதை உறுதிப்படுத்திக் கொள்ளவும்.</translation> <translation id="2575441894380764255">குறுக்கிடும்/தவறாக வழிநடத்தும் விளம்பரங்களைக் காட்ட அனுமதி இல்லாத தளங்கள்</translation> <translation id="2575713839157415345">{YEARS,plural, =1{இந்தச் சாதனம் 1 ஆண்டிற்குச் சேமிக்கப்படும் என்பதால் அடுத்த முறை நீங்கள் குறியீடு இல்லாமல் இணைக்க முடியும். இது உங்கள் நிர்வாகியால் அமைக்கப்பட்டது.}other{இந்தச் சாதனம் {YEARS} ஆண்டுகளுக்குச் சேமிக்கப்படும் என்பதால் அடுத்த முறை நீங்கள் குறியீடு இல்லாமல் இணைக்க முடியும். இது உங்கள் நிர்வாகியால் அமைக்கப்பட்டது.}}</translation> +<translation id="2577446426265992344">ஆம்னிபாக்ஸ் இல்லாமல்</translation> <translation id="257779572837908839">மீட்டிங்குகளுக்கான Chromebox சாதனமாக அமை</translation> <translation id="2579309488038515659">ஹாட்ஸ்பாட்டை இயக்கும்</translation> <translation id="2579596474754516455">தேவைப்படும்போது PDF படங்களை ஸ்கேன் செய்து ஸ்கிரீன் ரீடருக்கு வார்த்தைகளாக மாற்றும்</translation> @@ -4447,6 +4460,7 @@ <translation id="4876895919560854374">திரையை லாக் மற்றும் அன்லாக் செய்தல்</translation> <translation id="4877276003880815204">கூறுகளை ஆய்வு செய்</translation> <translation id="4877652723592270843">ChromeOS Flexஸின் உள்ளமைந்த ஸ்கிரீன் ரீடரான ChromeVoxஸை இயக்க விரும்புகிறீர்களா? ஆம் என்றால் இரண்டு ஒலியளவு பட்டன்களையும் ஐந்து வினாடிகளுக்கு அழுத்திப் பிடித்திருக்கவும்.</translation> +<translation id="4878261017150799673">தளத்தைச் செயல்பாட்டில் வைத்திரு</translation> <translation id="4878634973244289103">கருத்தை அனுப்ப முடியவில்லை. பிறகு முயலவும்.</translation> <translation id="4878653975845355462">பிரத்தியேகமான பின்புலங்கள் உங்கள் நிர்வாகியால் முடக்கப்பட்டுள்ளன</translation> <translation id="4878718769565915065">இந்தப் பாதுகாப்பு விசையில் கைரேகையைச் சேர்க்க முடியவில்லை</translation> @@ -5231,6 +5245,9 @@ <translation id="5602765853043467355">இந்தச் சாதனத்திலிருந்து புக்மார்க்குகள், வரலாறு, கடவுச்சொற்கள் மற்றும் பலவற்றை அழிக்கவும்</translation> <translation id="5605758115928394442">அது நீங்கள்தான் என்பதை உறுதிப்படுத்த உங்கள் ஃபோனுக்கு ஓர் அறிவிப்பு அனுப்பப்பட்டுள்ளது.</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{இந்த நீட்டிப்பு தடுக்கப்பட்டுள்ளது}other{இந்த நீட்டிப்புகள் தடுக்கப்பட்டுள்ளன}}</translation> +<translation id="560743070587960985">இந்த ஃபைல் வைரஸ் அல்லது மால்வேராக இருக்கலாம். + +இது பாதுகாப்பற்றதா எனச் சரிபார்க்க இதை நீங்கள் Googleளுக்கு அனுப்பலாம். ஸ்கேன் செய்ய வழக்கமாகச் சில வினாடிகள் ஆகும்.</translation> <translation id="560834977503641186">வைஃபை ஒத்திசைவு, மேலும் அறிக</translation> <translation id="5608580678041221894">செதுக்கும் பகுதியைச் சரிசெய்ய அல்லது நகர்த்த, பின்வரும் விசைகளைத் தட்டவும்</translation> <translation id="5609231933459083978">ஆப்ஸ் தவறானது என்பதுபோல் தெரிகிறது.</translation> @@ -5967,6 +5984,7 @@ <translation id="6254892857036829079">அருமை</translation> <translation id="6257602895346497974">ஒத்திசைவை இயக்கு...</translation> <translation id="62586649943626337">பக்கக் குழுக்கள் மூலம் உலாவிப் பக்கங்களை ஒழுங்கமைத்திடுங்கள்</translation> +<translation id="6260092874648348841">தளத்தைச் செயல்பாட்டில் வைத்திரு</translation> <translation id="6262371516389954471">உங்களின் காப்புப்பிரதிகள் Googleளுக்குப் பதிவேற்றப்பட்டு Google கணக்கின் கடவுச்சொல்லைப் பயன்படுத்தி என்க்ரிப்ஷன் செய்யப்படுகின்றன.</translation> <translation id="6263082573641595914">Microsoft CA பதிப்பு</translation> <translation id="6263284346895336537">சிக்கலானதல்ல</translation> @@ -6543,6 +6561,7 @@ <translation id="6787097042755590313">பிற தாவல்</translation> <translation id="6787839852456839824">கீபோர்டு ஷார்ட்கட்கள்</translation> <translation id="6788210894632713004">தொகுக்கப்படாத நீட்டிப்பு</translation> +<translation id="678939393857169499">புதிய டெஸ்க்டாப் டிசைனை இயக்குகிறது.</translation> <translation id="6789592661892473991">கிடைமட்டமாகப் பிரி</translation> <translation id="6789834167207639931">மீட்புச் செயல்முறையை நிறைவுசெய்ய, அடுத்து வரும் திரையில் Google கணக்கின் கடவுச்சொல்லை மீண்டும் ஒருமுறை டைப் செய்யவும்</translation> <translation id="6790428901817661496">இயக்கு</translation> @@ -7332,6 +7351,7 @@ <translation id="7481312909269577407">அடுத்த பக்கம்</translation> <translation id="7481358317100446445">தயார்</translation> <translation id="748138892655239008">சான்றிதழ் அடிப்படை கட்டுப்பாடுகள்</translation> +<translation id="7483145199632798061">Chrome Refresh 2023</translation> <translation id="7484645889979462775">இந்த தளத்திற்கு எப்போதும் இல்லை</translation> <translation id="7487141338393529395">'மேம்பட்ட எழுத்துப் பிழை சரிபார்க்கும்' அம்சத்தை இயக்கு</translation> <translation id="7487969577036436319">கூறுகள் எதுவும் நிறுவப்படவில்லை</translation> @@ -7493,6 +7513,7 @@ <translation id="7634280112532283638">ஸ்பேம் & மோசடியைக் குறைத்தல்</translation> <translation id="7634337648687970851">தற்சமயம் அகத் தரவு மீட்டெடுப்பு ஆதரிக்கப்படவில்லை.</translation> <translation id="7634566076839829401">ஏதோ தவறாகிவிட்டது. மீண்டும் முயற்சிக்கவும்.</translation> +<translation id="763472884969134151">பகுப்பாய்வு செய்தது: <ph name="LINK" /></translation> <translation id="7635048370253485243">உங்கள் நிர்வாகி பின் (pin) செய்துள்ளார்</translation> <translation id="7635711411613274199">நீங்கள் உலாவும்போது காட்டப்படும் விளம்பரம் பிரத்தியேகமானதா என்பது இந்த அமைப்பு, <ph name="BEGIN_LINK1" />விளம்பரத் தலைப்புகள்<ph name="LINK_END1" />, உங்கள் <ph name="BEGIN_LINK2" />குக்கீ அமைப்புகள்<ph name="LINK_END2" /> ஆகியவற்றையும் நீங்கள் பார்க்கும் தளம் விளம்பரங்களைப் பிரத்தியேகப்படுத்துகிறதா என்பதையும் பொறுத்து இருக்கும்</translation> <translation id="7636919061354591437">இந்தச் சாதனத்தில் நிறுவு</translation> @@ -8169,6 +8190,7 @@ <translation id="8195737548602430447">தானாகவே வசனங்களை இலக்கு மொழியில் மொழிபெயர்க்கும்.</translation> <translation id="8197673340773315084">பெயரையோ 'பணி' அல்லது 'தனிப்பட்டது' போன்ற லேபிளையோ சேர்த்திடுக</translation> <translation id="8198456017687137612">தாவலை அலைபரப்புகிறது</translation> +<translation id="8198457270656084773">சிஸ்டத்தின் சாதனப் பதிவுப் பக்கத்தைத் தேடுகிறீர்களா? <ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" /> என்ற இணைப்பிற்குச் செல்லவும்.</translation> <translation id="8198511718495409170">"<ph name="EXTENSION_NAME" />"க்கான புதுப்பிக்கப்பட்ட அமைப்புகளை இந்தத் தளத்தில் பயன்படுத்த, இந்தப் பக்கத்தை ரெஃப்ரெஷ் செய்யுங்கள்</translation> <translation id="8199300056570174101">நெட்வொர்க் (சேவை) மற்றும் சாதனப் பண்புகள்</translation> <translation id="8200772114523450471">மீண்டும் தொடங்கு</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index d19cc436..5aa784cb 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -528,6 +528,7 @@ <translation id="146000042969587795">ఈ ఫ్రేమ్లో అసురక్షిత కంటెంట్ ఉండటం వల్ల, అది బ్లాక్ చేయబడింది.</translation> <translation id="1461041542809785877">పనితీరు</translation> <translation id="1461177659295855031">బుక్మార్క్ బార్ ఫోల్డర్కు తరలించండి</translation> +<translation id="1461288887896722288">మీరు మేనేజ్ చేయబడే ఖాతాకు ఇప్పుడే సైన్ ఇన్ చేశారు, మేనేజ్ చేయబడే కొత్త ప్రొఫైల్ను క్రియేట్ చేయడం ద్వారా, ఆ ఖాతాకు లింక్ అయి ఉన్న కొన్ని రిసోర్స్లను మీరు యాక్సెస్ చేయగలరు.</translation> <translation id="146219525117638703">ONC స్థితి</translation> <translation id="146220085323579959">ఇంటర్నెట్ డిస్కనెక్ట్ చేయబడింది. దయచేసి మీ ఇంటర్నెట్ కనెక్షన్ని చెక్ చేసి, మళ్లీ ట్రై చేయండి.</translation> <translation id="1462850958694534228">చిహ్నానికి సంబంధించిన అప్డేట్ను రివ్యూ చేయండి</translation> @@ -1890,6 +1891,7 @@ <translation id="2575407791320728464">చెల్లని URL. ఇది సరిగ్గా ఫార్మాట్ చేయబడిందని నిర్ధారించుకోండి.</translation> <translation id="2575441894380764255">అనుచితమైన లేదా తప్పుదారి పట్టించే యాడ్లను చూపించడానికి అనుమతి లేదు.</translation> <translation id="2575713839157415345">{YEARS,plural, =1{ఈ పరికరం 1 సంవత్సరం పాటు సేవ్ చేయబడుతుంది, మీరు తర్వాతి సారి కోడ్ అవసరం లేకుండానే కనెక్ట్ చేయవచ్చు. దీనిని మీ అడ్మినిస్ట్రేటర్ సెట్ చేస్తారు.}other{ఈ పరికరం {YEARS} సంవత్సరాల పాటు సేవ్ చేయబడుతుంది, మీరు తర్వాతి సారి కోడ్ అవసరం లేకుండానే కనెక్ట్ చేయవచ్చు. దీనిని మీ అడ్మినిస్ట్రేటర్ సెట్ చేస్తారు.}}</translation> +<translation id="2577446426265992344">ఓమ్నిబాక్స్ డిజైన్లో మార్పులు లేవు</translation> <translation id="257779572837908839">మీటింగ్ల కోసం Chromebox లాగా సెటప్ చేయండి</translation> <translation id="2579309488038515659">హాట్స్పాట్ ఎనేబుల్ చేసే టోగుల్</translation> <translation id="2579596474754516455">అవసరమైనప్పుడు, స్క్రీన్ రీడర్ కోసం టెక్స్ట్ను మార్చడానికి PDF ఇమేజ్లను స్కాన్ చేయండి</translation> @@ -6587,6 +6589,7 @@ <translation id="6787097042755590313">ఇతర ట్యాబ్</translation> <translation id="6787839852456839824">కీబోర్డ్ షార్ట్కట్లు</translation> <translation id="6788210894632713004">ప్యాక్ చేయని ఎక్స్టెన్షన్</translation> +<translation id="678939393857169499">కొత్త డెస్క్టాప్ డిజైన్ను ఎనేబుల్ చేస్తోంది.</translation> <translation id="6789592661892473991">అడ్డంగా విభజించు</translation> <translation id="6789834167207639931">తర్వాతి స్క్రీన్లో మీ Google ఖాతా పాస్వర్డ్ను మళ్లీ ఎంటర్ చేసి, రికవరీని పూర్తి చేయండి</translation> <translation id="6790428901817661496">ప్లే చేయి</translation> @@ -7384,6 +7387,7 @@ <translation id="7481312909269577407">ఫార్వర్డ్</translation> <translation id="7481358317100446445">సిద్ధం</translation> <translation id="748138892655239008">సర్టిఫికెట్ ఆధార పరిమితులు</translation> +<translation id="7483145199632798061">Chrome రిఫ్రెష్ 2023</translation> <translation id="7484645889979462775">ఈ సైట్కోసం ఎప్పటికీ వద్దు</translation> <translation id="7487141338393529395">మెరుగైన స్పెల్ చెక్ను ఆన్ చేయండి</translation> <translation id="7487969577036436319">భాగాలు ఇన్స్టాల్ చేయబడలేదు</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index 022dc41..900d5eb 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -202,6 +202,7 @@ <translation id="1166212789817575481">ปิดแท็บทางด้านขวา</translation> <translation id="1166583374608765787">ตรวจสอบการอัปเดตชื่อ</translation> <translation id="1166596238782048887"><ph name="TAB_TITLE" /> อยู่ในเดสก์ <ph name="DESK_TITLE" /></translation> +<translation id="1167262726334064738">ลองใช้รหัสผ่านใหม่</translation> <translation id="1168020859489941584">กำลังจะเปิดภายใน <ph name="TIME_REMAINING" />...</translation> <translation id="116896278675803795">เปลี่ยนภาษาโดยอัตโนมัติให้ตรงกับเนื้อหาที่เลือก</translation> <translation id="1169266963600477608">การควบคุมเกม</translation> @@ -907,6 +908,7 @@ <translation id="177336675152937177">ข้อมูลแอปที่โฮสต์</translation> <translation id="1776712937009046120">เพิ่มผู้ใช้</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="177814385589420211">กดแป้นค้นหาค้างไว้เพื่อสลับระหว่างแป้นฟังก์ชันกับแป้นแถวบนสุดของระบบ</translation> <translation id="1778457539567749232">ทำเครื่องหมายว่ายังไม่อ่าน</translation> <translation id="1778991607452011493">ส่งบันทึกการแก้ไขข้อบกพร่อง (แนะนำ)</translation> <translation id="1779441632304440041">รหัสผ่านที่ไม่รัดกุมนั้นคาดเดาได้ง่าย ตรวจสอบว่าคุณกำลังตั้งรหัสผ่านที่รัดกุม</translation> @@ -1348,6 +1350,7 @@ <translation id="2142582065325732898">เปิด<ph name="LINK1_BEGIN" />การซิงค์ของ Chrome<ph name="LINK1_END" /> เพื่อดูแท็บ Chrome ล่าสุด <ph name="LINK2_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK2_END" /></translation> <translation id="2143765403545170146">แสดงแถบเครื่องมือทุกครั้งในโหมดเต็มหน้าจอ</translation> <translation id="2143778271340628265">กำหนดค่าพร็อกซีด้วยตนเอง</translation> +<translation id="2143808295261240440">ใช้รหัสผ่านที่แนะนำ</translation> <translation id="2143915448548023856">การตั้งค่าการแสดงผล</translation> <translation id="2144536955299248197">ผู้ดูใบรับรอง: <ph name="CERTIFICATE_NAME" /></translation> <translation id="2144557304298909478">การพัฒนาแอป Android ใน Linux</translation> @@ -2333,6 +2336,7 @@ <translation id="2963151496262057773">ปลั๊กอินต่อไปนี้ไม่ตอบสนอง: <ph name="PLUGIN_NAME" />คุณต้องการหยุดปลั๊กอินดังกล่าวไหม</translation> <translation id="2964193600955408481">ปิดใช้งาน WiFi</translation> <translation id="2964245677645334031">ระดับการเข้าถึงของการแชร์ใกล้เคียง</translation> +<translation id="2966705348606485669">ตัวเลือกเพิ่มเติมสำหรับโฟลเดอร์บุ๊กมาร์ก <ph name="FOLDER_TITLE" /></translation> <translation id="2966937470348689686">จัดการค่ากำหนด Android</translation> <translation id="2967926928600500959">ระบบจะบังคับเปิด URL ที่ตรงกับกฎเหล่านี้ในเบราว์เซอร์ที่เจาะจง</translation> <translation id="2972581237482394796">&ทำซ้ำ</translation> @@ -2622,6 +2626,7 @@ <translation id="3244294424315804309">ดำเนินการปิดเสียงไว้ต่อไป</translation> <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> - ข้อผิดพลาดของเครือข่าย</translation> <translation id="3248902735035392926">ความปลอดภัยเป็นสิ่งสำคัญ โปรดใช้เวลาสักครู่เพื่อ<ph name="BEGIN_LINK" />ตรวจสอบส่วนขยายตอนนี้เลย<ph name="END_LINK" /></translation> +<translation id="3249323165366527554">ลงชื่อสมัครใช้และลงชื่อเข้าใช้ได้เร็วขึ้นเมื่อระบบบันทึกรหัสผ่านลงใน<ph name="GOOGLE_PASSWORD_MANAGER" /> สำหรับ <ph name="EMAIL" /> โดยอัตโนมัติ</translation> <translation id="3251714896659475029">ให้ <ph name="SUPERVISED_USER_NAME" /> เข้าถึง Google Assistant เมื่อพูดว่า "Ok Google"</translation> <translation id="3251759466064201842"><ไม่ใช่ส่วนหนึ่งของใบรับรอง></translation> <translation id="325238099842880997">กำหนดกฎการใช้งานดิจิทัลพื้นฐานเพื่อช่วยบุตรหลานในการเล่น สำรวจ และทำการบ้านที่บ้าน</translation> @@ -4116,6 +4121,7 @@ <translation id="4556194354084985730">ลงชื่อเข้าใช้เว็บไซต์และแอปได้อย่างง่ายดายด้วยรหัสผ่านที่บันทึกไว้ หากปิดการตั้งค่านี้ ระบบจะขอให้คุณยืนยันก่อนลงชื่อเข้าใช้</translation> <translation id="4558426062282641716">ขอสิทธิ์การเปิดอัตโนมัติแล้ว</translation> <translation id="4559617833001311418">เว็บไซต์นี้เข้าถึงเซ็นเซอร์ตรวจจับการเคลื่อนไหวหรือแสงอยู่</translation> +<translation id="4560728518401799797">ตัวเลือกเพิ่มเติมสำหรับบุ๊กมาร์ก <ph name="FOLDER_TITLE" /></translation> <translation id="4561893854334016293">ไม่มีการเปลี่ยนแปลงสิทธิ์เมื่อเร็วๆ นี้</translation> <translation id="4562155214028662640">เพิ่มลายนิ้วมือ</translation> <translation id="4563210852471260509">ภาษาป้อนข้อมูลเบื้องต้นคือจีน</translation> @@ -4399,6 +4405,7 @@ <translation id="4819323978093861656">{0,plural, =0{กำลังจะปิดตอนนี้}=1{กำลังจะปิดในอีก 1 วินาที}other{กำลังจะปิดในอีก # วินาที}}</translation> <translation id="4819607494758673676">การแจ้งเตือนของ Google Assistant</translation> <translation id="4820236583224459650">กำหนดเป็นตั๋วที่ใช้งานอยู่</translation> +<translation id="4820795723433418303">ใช้แป้นฟังก์ชันเป็นแป้นแถวบนสุด</translation> <translation id="4821935166599369261">&เปิดใช้งานการทำแฟ้มประวัติ</translation> <translation id="4823484602432206655">อ่านและเปลี่ยนการตั้งค่าผู้ใช้และอุปกรณ์</translation> <translation id="4824037980212326045">การสำรองและกู้คืนข้อมูลใน Linux</translation> @@ -4530,6 +4537,7 @@ <translation id="4925320384394644410">พอร์ตจะแสดงที่นี่</translation> <translation id="49265687513387605">แคสต์หน้าจอไม่ได้ โปรดตรวจสอบว่าได้ยืนยันในข้อความเตือนแล้วเพื่อเริ่มแชร์หน้าจอ</translation> <translation id="4927753642311223124">ที่นี่ไม่มีอะไรต้องดู ไปต่อได้</translation> +<translation id="4928629450964837566">ใช้รหัสผ่านที่ปลอดภัยยิ่งขึ้น</translation> <translation id="4929386379796360314">ปลายทางของการพิมพ์</translation> <translation id="4930447554870711875">นักพัฒนาซอฟต์แวร์</translation> <translation id="4930714375720679147">เปิด</translation> @@ -4612,6 +4620,7 @@ <translation id="5010886807652684893">ดูภาพ</translation> <translation id="5015344424288992913">กำลังแปลงพร็อกซี...</translation> <translation id="5016491575926936899">คุณสามารถส่งข้อความจากคอมพิวเตอร์ แชร์การเชื่อมต่ออินเทอร์เน็ต ตอบกลับการแจ้งเตือนการสนทนา และปลดล็อก <ph name="DEVICE_TYPE" /> ด้วยโทรศัพท์<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation> +<translation id="5016983299133677671">ลองใช้รหัสผ่านใหม่</translation> <translation id="5017643436812738274">คุณไปยังส่วนต่างๆ ของหน้าได้ด้วยเคอร์เซอร์ข้อความ กด Ctrl+Search+7 เพื่อปิด</translation> <translation id="5018207570537526145">เปิดเว็บไซต์ส่วนขยาย</translation> <translation id="5018526990965779848">ส่งข้อมูลการใช้งานและการวินิจฉัย ช่วยปรับปรุงประสบการณ์การใช้งาน Android ของคุณให้ดีขึ้นด้วยการส่งข้อมูลการวินิจฉัย อุปกรณ์ และการใช้งานแอปไปยัง Google โดยอัตโนมัติ ซึ่งจะช่วยให้แอปและระบบมีความเสถียร พร้อมทั้งปรับปรุงด้านอื่นๆ ข้อมูลที่รวบรวมมาบางส่วนจะมีประโยชน์ต่อแอปและพาร์ทเนอร์ของ Google ด้วย เช่น นักพัฒนาแอป Android หากเปิดการตั้งค่ากิจกรรมเพิ่มเติมบนเว็บและแอปไว้ ระบบอาจบันทึกข้อมูลนี้ไว้ในบัญชี Google ของคุณ</translation> @@ -4680,6 +4689,7 @@ <translation id="5078638979202084724">บุ๊กมาร์กแท็บทั้งหมด</translation> <translation id="5078796286268621944">PIN ไม่ถูกต้อง</translation> <translation id="5079010647467150187">เพิ่ม VPN ในตัว…</translation> +<translation id="5079699784114005398">เมื่อเปิดการตั้งค่า แอปจะพร้อมใช้งานในอุปกรณ์ ChromeOS ทุกเครื่องหลังจากที่คุณลงชื่อเข้าใช้ด้วยบัญชี Google เว็บแอปที่ติดตั้งจากเบราว์เซอร์ Chrome จะได้รับการซิงค์แม้จะปิดการซิงค์ของเบราว์เซอร์ไว้ก็ตาม</translation> <translation id="508059534790499809">รีเฟรชตั๋ว Kerberos</translation> <translation id="5081960376148623587">เลือกว่าจะโหลดหน้าเว็บล่วงหน้าหรือไม่</translation> <translation id="5084328598860513926">ขั้นตอนการตั้งค่าถูกขัดจังหวะ โปรดลองอีกครั้งหรือติดต่อเจ้าของอุปกรณ์หรือผู้ดูแลระบบ รหัสข้อผิดพลาด: <ph name="ERROR_CODE" /></translation> @@ -4755,6 +4765,7 @@ <translation id="5145464978649806571">หากคุณไม่ได้อยู่ด้านหน้าอุปกรณ์ หน้าจอจะล็อกโดยอัตโนมัติ หน้าจอจะเปิดค้างไว้นานขึ้นเมื่อคุณอยู่ด้านหน้าอุปกรณ์ หากปิดใช้หน้าจอล็อก อุปกรณ์จะเข้าสู่โหมดสลีปแทนการล็อก</translation> <translation id="514575469079499857">ใช้ที่อยู่ IP ของคุณเพื่อระบุตำแหน่ง (ค่าเริ่มต้น)</translation> <translation id="5146896637028965135">เสียงของระบบ</translation> +<translation id="5147992672778369947">ใช้รหัสผ่านที่แนะนำ</translation> <translation id="5148277445782867161">บริการตำแหน่งของ Google จะใช้แหล่งที่มาอย่าง Wi-Fi เครือข่ายมือถือ และเซ็นเซอร์ในการประมาณตำแหน่งของอุปกรณ์</translation> <translation id="5150254825601720210">ใบรับรองชื่อเซิร์ฟเวอร์ SSL ของ Netscape</translation> <translation id="5151354047782775295">เพิ่มพื้นที่ว่างของดิสก์หรือเลือกข้อมูลที่อาจลบออกเองโดยอัตโนมัติ</translation> @@ -5041,6 +5052,7 @@ <translation id="5414566801737831689">อ่านไอคอนของเว็บไซต์ที่คุณเข้าชม</translation> <translation id="5414836363063783498">กำลังยืนยัน…</translation> <translation id="5417312524372586921">ธีมของเบราว์เซอร์</translation> +<translation id="5417353542809767994">ใช้รหัสผ่านที่รัดกุมได้อย่างรวดเร็ว</translation> <translation id="541737483547792035">ขยายหน้าจอ</translation> <translation id="5419405654816502573">Voice Match</translation> <translation id="5420274697768050645">ต้องใช้รหัสผ่านปลดล็อกอุปกรณ์เพื่อเพิ่มความปลอดภัย</translation> @@ -5161,6 +5173,7 @@ <translation id="5517412723934627386"><ph name="NETWORK_TYPE" /> - <ph name="NETWORK_DISPLAY_NAME" /></translation> <translation id="5518949581554491184">ตั้งค่าด้วยโทรศัพท์ Android</translation> <translation id="5519195206574732858">LTE</translation> +<translation id="5519900055135507385">รักษาบัญชีนี้ให้ปลอดภัยยิ่งขึ้นด้วยรหัสผ่านที่รัดกุม โดยระบบจะบันทึกรหัสผ่านดังกล่าวไว้ใน<ph name="GOOGLE_PASSWORD_MANAGER" /> สำหรับ <ph name="EMAIL" /></translation> <translation id="5521078259930077036">นี่คือ "หน้าแรก" ที่คุณต้องการใช่ไหม</translation> <translation id="5522156646677899028">ส่วนขยายนี้มีช่องโหว่ด้านความปลอดภัยอย่างร้ายแรง</translation> <translation id="5522403133543437426">เครื่องมือค้นหาที่ใช้ในแถบที่อยู่</translation> @@ -5776,6 +5789,7 @@ <translation id="6070311415473175157">เลือกบริเวณที่ต้องการค้นหาในรูปภาพ</translation> <translation id="6071181508177083058">ยืนยันรหัสผ่าน</translation> <translation id="6071576563962215370">ระบบสร้างการล็อกแอตทริบิวต์เวลาการติดตั้งของอุปกรณ์ไม่สำเร็จ</translation> +<translation id="6071938745001252305">ประหยัดหน่วยความจําแล้ว <ph name="MEMORY_VALUE" /></translation> <translation id="6072442788591997866">อุปกรณ์นี้ไม่อนุญาตให้ใช้ <ph name="APP_NAME" /> โปรดติดต่อผู้ดูแลระบบ รหัสข้อผิดพลาด: <ph name="ERROR_CODE" /></translation> <translation id="6073451960410192870">หยุดบันทึก</translation> <translation id="6073903501322152803">เพิ่มฟีเจอร์การสามารถเข้าถึงได้ง่าย</translation> @@ -5823,6 +5837,7 @@ <translation id="6104068876731806426">บัญชี Google</translation> <translation id="6104311680260824317">นำอุปกรณ์เข้าร่วมโดเมนไม่ได้ เซิร์ฟเวอร์ไม่รองรับประเภทการเข้ารหัส Kerberos ที่ระบุ ดูการตั้งค่าการเข้ารหัสได้จาก "ตัวเลือกเพิ่มเติม"</translation> <translation id="6104796831253957966">คิวเครื่องพิมพ์เต็ม</translation> +<translation id="6104929924898022309">ใช้แป้นค้นหาเพื่อเปลี่ยนลักษณะการทำงานของแป้นฟังก์ชัน</translation> <translation id="6106167152849320869">หากคุณเลือกที่จะส่งข้อมูลการวินิจฉัยและการใช้งานด้วยในขั้นตอนก่อนหน้า ระบบจะเก็บรวบรวมข้อมูลดังกล่าวสำหรับแอปที่ติดตั้ง</translation> <translation id="6111972606040028426">เปิดใช้ Google Assistant</translation> <translation id="6112294629795967147">แตะเพื่อปรับขนาด</translation> @@ -5964,6 +5979,7 @@ <translation id="6234108445915742946">ข้อกำหนดในการให้บริการของ Chrome จะมีการเปลี่ยนแปลงในวันที่ 31 มีนาคม</translation> <translation id="6234474535228214774">กำลังรอการติดตั้ง</translation> <translation id="6235208551686043831">เปิดกล้องของอุปกรณ์แล้ว โปรดวางคิวอาร์โค้ด eSIM ตรงหน้ากล้อง</translation> +<translation id="6237297174664969437">คุณเลือกข้อมูลเบราว์เซอร์ที่จะซิงค์ได้เสมอในการตั้งค่า Chrome ใน<ph name="LINK_BEGIN" />การตั้งค่าอุปกรณ์<ph name="LINK_END" /> คุณสามารถควบคุมการซิงค์สำหรับเว็บแอปที่ติดตั้งจากเบราว์เซอร์ Chrome Google อาจปรับเปลี่ยน Search และบริการอื่นๆ ให้เหมาะกับคุณโดยอิงจากประวัติการเข้าชม</translation> <translation id="6237474966939441970">แอปการจดบันทึกด้วยสไตลัส</translation> <translation id="623755660902014047">โหมดการอ่าน</translation> <translation id="6238767809035845642">ข้อความแชร์มาจากอุปกรณ์อื่น</translation> @@ -6297,6 +6313,7 @@ <translation id="6537613839935722475">ชื่อมีตัวอักษร ตัวเลข และขีดกลาง (-) ได้</translation> <translation id="6538098297809675636">เกิดข้อผิดพลาดขณะตรวจหารหัส</translation> <translation id="653920215766444089">กำลังค้นหาอุปกรณ์ชี้ตำแหน่ง</translation> +<translation id="6539674013849300372">ออนไลน์อย่างปลอดภัยยิ่งขึ้นด้วยรหัสผ่านที่รัดกุม โดยระบบจะบันทึกรหัสผ่านดังกล่าวไว้ใน<ph name="GOOGLE_PASSWORD_MANAGER" /> สำหรับ <ph name="EMAIL" /></translation> <translation id="653983593749614101">ดาวน์โหลดต่อ...</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />หมายเหตุ:<ph name="END_BOLD" /> เปิดใช้งานเฉพาะเมื่อคุณทราบว่าคุณกำลังทำอะไรอยู่ หรือเมื่อคุณถูกร้องขอให้ทำเช่นนั้นเท่านั้น เนื่องจากคอลเล็กชันข้อมูลอาจลดประสิทธิภาพในการปฏิบัติงาน</translation> <translation id="6541638731489116978">เว็บไซต์นี้ถูกบล็อกไม่ให้เข้าถึงเซ็นเซอร์ตรวจจับการเคลื่อนไหว</translation> @@ -6491,6 +6508,7 @@ <translation id="671226373742585927">คลิกปุ่ม "X" เพื่อปิดแผงด้านข้าง</translation> <translation id="6712943853047024245">คุณได้บันทึกรหัสผ่านไว้กับชื่อผู้ใช้นี้แล้วสำหรับ <ph name="WEBSITE" /></translation> <translation id="6713233729292711163">เพิ่มโปรไฟล์งาน</translation> +<translation id="6713441551032149301">กดแป้น Launcher ค้างไว้เพื่อสลับระหว่างแป้นฟังก์ชันกับแป้นแถวบนสุดของระบบ</translation> <translation id="6713668088933662563">ไม่ต้องเสนอการแปลภาษาเหล่านี้</translation> <translation id="6715803357256707211">เกิดข้อผิดพลาดระหว่างการติดตั้งแอปพลิเคชัน Linux คลิกที่การแจ้งเตือนเพื่อดูรายละเอียด</translation> <translation id="671619610707606484">การดำเนินการนี้จะล้างข้อมูลที่เว็บไซต์ต่างๆ จัดเก็บไว้รวมทั้งสิ้น <ph name="TOTAL_USAGE" /></translation> @@ -6612,6 +6630,7 @@ <translation id="6811034713472274749">พร้อมดูหน้าเว็บแล้ว</translation> <translation id="6811151703183939603">หนัก</translation> <translation id="6811332638216701903">ชื่อโฮสต์ DHCP</translation> +<translation id="6811792477922751991">ใช้แป้น Launcher เพื่อเปลี่ยนลักษณะการทำงานของแป้นฟังก์ชัน</translation> <translation id="6812349420832218321">ไม่สามารถเรียกใช้ <ph name="PRODUCT_NAME" /> ในฐานะผู้ใช้ระดับราก</translation> <translation id="6812841287760418429">เก็บการเปลี่ยนแปลงไว้</translation> <translation id="6813907279658683733">ทั้งหน้าจอ</translation> @@ -7805,6 +7824,7 @@ <translation id="7851720427268294554">โปรแกรมแยกวิเคราะห์ IPP</translation> <translation id="78526636422538552">ปิดใช้การเพิ่มบัญชี Google อื่นอยู่</translation> <translation id="7853747251428735">เครื่องมือเ&พิ่มเติม</translation> +<translation id="7853999103056713222">ใช้รหัสผ่านที่ปลอดภัยยิ่งขึ้น</translation> <translation id="7855678561139483478">ย้ายแท็บไปที่หน้าต่างใหม่</translation> <translation id="7857004848504343806">คอมพิวเตอร์ของคุณมีโมดูลความปลอดภัย ซึ่งใช้เพื่อนำฟีเจอร์การรักษาความปลอดภัยที่สำคัญจำนวนมากมาใช้ใน Chrome OS Flex ดูข้อมูลเพิ่มเติมได้จากศูนย์ช่วยเหลือของ Chromebook ที่ https://support.google.com/chromebook/?p=sm</translation> <translation id="7857093393627376423">คำแนะนำข้อความ</translation> @@ -8360,6 +8380,7 @@ <translation id="8325413836429495820">ไม่ได้รับอนุญาตให้ดูคลิปบอร์ด</translation> <translation id="8326478304147373412">PKCS #7, กลุ่มใบรับรอง (Certificate Chain)</translation> <translation id="8327386430364625757">แบบอักษรทางคณิตศาสตร์</translation> +<translation id="8327538105740918488">คุณเปลี่ยนรหัสผ่านนี้ในภายหลังได้เสมอ โดยระบบจะบันทึกรหัสผ่านดังกล่าวไว้ใน<ph name="GOOGLE_PASSWORD_MANAGER" /> สำหรับ <ph name="EMAIL" /></translation> <translation id="8327676037044516220">การตั้งค่าสิทธิ์และเนื้อหา</translation> <translation id="8330617762701840933">รายการเว็บไซต์ที่เปลี่ยนเส้นทางไปยังเบราว์เซอร์สำรองได้</translation> <translation id="8330689128072902965">ผู้ติดต่อใกล้เคียงจะแชร์กับคุณได้ คลิกเพื่อเปลี่ยน</translation> @@ -8505,6 +8526,7 @@ <translation id="8449836157089738489">เปิดทั้งหมดในกลุ่มแท็บใหม่</translation> <translation id="8451512073679317615">Assistant</translation> <translation id="845702320058262034">เชื่อมต่อไม่ได้ ตรวจสอบว่าบลูทูธโทรศัพท์เปิดอยู่</translation> +<translation id="8457251154056341970">คุณจะไม่เห็น <ph name="MODULE_NAME" /> ในหน้านี้อีก</translation> <translation id="8457451314607652708">นำเข้าบุ๊กมาร์ก</translation> <translation id="8458341576712814616">ทางลัด</translation> <translation id="8458627787104127436">เปิดทั้งหมด (<ph name="URL_COUNT" />) ในหน้าต่างใหม่</translation> @@ -8577,6 +8599,7 @@ <translation id="8514955299594277296">ไม่อนุญาตให้เว็บไซต์บันทึกข้อมูลลงในอุปกรณ์ (ไม่แนะนำ)</translation> <translation id="8517759303731677493">แก้ไข…</translation> <translation id="8519895319663397036">นำเข้ารหัสผ่านไม่ได้ ไฟล์ต้องมีขนาดเล็กกว่า 150 KB</translation> +<translation id="851991974800416566">ใช้รหัสผ่านที่รัดกุมได้อย่างรวดเร็ว</translation> <translation id="8523493869875972733">เก็บการเปลี่ยนแปลงไว้</translation> <translation id="8523849605371521713">เพิ่มตามนโยบาย</translation> <translation id="8524783101666974011">บันทึกบัตรลงในบัญชี Google ของคุณ</translation> @@ -8734,6 +8757,7 @@ <translation id="8665110742939124773">คุณป้อนรหัสการเข้าถึงไม่ถูกต้อง โปรดลองอีกครั้ง</translation> <translation id="8665180165765946056">สำรองข้อมูลเสร็จสมบูรณ์</translation> <translation id="866611985033792019">เชื่อถือใบรับรองนี้ในการระบุตัวตนของผู้ใช้อีเมล</translation> +<translation id="8666268818656583275">ขณะนี้แป้น F จะทำงานเป็นแป้นแถวบนสุดของระบบ</translation> <translation id="8666321716757704924">อนุญาตสิทธิ์อีกครั้งแล้วสำหรับ <ph name="WEBSITE" /></translation> <translation id="8666759526542103597">เกี่ยวกับการปรับโฆษณาตามโปรไฟล์ของผู้ใช้ด้วยข้อมูลจากเบราว์เซอร์</translation> <translation id="8667261224612332309">ควรปรับปรุงรหัสผ่าน</translation> @@ -9416,6 +9440,7 @@ <translation id="950307215746360464">คำแนะนำในการตั้งค่า</translation> <translation id="951991426597076286">ปฏิเสธ</translation> <translation id="952471655966876828">อุปกรณ์จะเชื่อมต่อโดยอัตโนมัติเมื่อเปิดและใช้งานอุปกรณ์</translation> +<translation id="952880932803612259">อนุญาตให้แอปพลิเคชัน เว็บไซต์ และบริการของระบบใช้ตำแหน่งของคุณ ตำแหน่งอาจใช้ข้อมูลจากแหล่งที่มาต่างๆ อย่างเช่น Wi-Fi, เครือข่ายมือถือ และเซ็นเซอร์ เพื่อช่วยระบุตำแหน่งคร่าวๆ ของอุปกรณ์</translation> <translation id="953434574221655299">อนุญาตให้ทราบเวลาที่คุณใช้งานอุปกรณ์อยู่</translation> <translation id="956500788634395331">คุณได้รับการปกป้องจากส่วนขยายที่อาจเป็นอันตราย</translation> <translation id="957179356621191750">6 จุด</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index 8b320173..8bb74e2 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">Sekme yeniden etkin</translation> <translation id="1003088604756913841">Bağlantıyı yeni <ph name="APP" /> Penceresinde aç</translation> <translation id="100323615638474026">USB cihaz (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Google Güvenli Tarama</translation> <translation id="1004218526896219317">Site erişimi</translation> <translation id="1005274289863221750">Mikrofonunuzu ve kameranızı kullanma</translation> <translation id="1005333234656240382">ADB hata ayıklama işlevi etkinleştirilsin mi?</translation> @@ -524,6 +525,7 @@ <translation id="146000042969587795">Bu çerçeve, güvenli olmayan içerik barındırdığı için engellendi.</translation> <translation id="1461041542809785877">Performans</translation> <translation id="1461177659295855031">Yer işaretleri çubuğu klasörüne taşı</translation> +<translation id="1461288887896722288">Biraz önce yönetilen bir hesapta oturum açtınız. Yeni bir yönetilen profil oluşturmak söz konusu hesaba bağlı bazı kaynaklara erişmenize olanak tanır.</translation> <translation id="146219525117638703">ONC Durumu</translation> <translation id="146220085323579959">İnternet bağlantısı kesildi. Lütfen İnternet bağlantınızı kontrol edin ve tekrar deneyin.</translation> <translation id="1462850958694534228">Simge güncellemesini inceleyin</translation> @@ -901,6 +903,7 @@ <translation id="1769104665586091481">Bağlantıyı Yeni &Pencerede Aç</translation> <translation id="1770407692401984718">Buraya bir resim sürükleyin veya</translation> <translation id="177053719077591686">Android uygulamalarını Google Drive'da yedekleyin.</translation> +<translation id="1771075623623424448">Tarayıcı cihaz günlüğü sayfasını mı arıyorsunuz? <ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" /> adresini ziyaret edin.</translation> <translation id="177336675152937177">Barındırılan uygulama verileri</translation> <translation id="1776712937009046120">Kullanıcı ekle</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> @@ -1681,6 +1684,15 @@ <translation id="2422125132043002186">Linux geri yükleme işlemi iptal edildi</translation> <translation id="2423578206845792524">Res&mi farklı kaydet...</translation> <translation id="2424424966051154874">{0,plural, =1{Misafir}other{Misafir (#)}}</translation> +<translation id="242684489663276773">Bu işlem: + <ph name="LINE_BREAKS" /> + • Chrome ayarlarını ve Chrome kısayollarını sıfırlar + <ph name="LINE_BREAK" /> + • Uzantıları devre dışı bırakır + <ph name="LINE_BREAK" /> + • Çerezleri ve diğer geçici site verilerini siler + <ph name="LINE_BREAKS" /> + Yer işaretlerini, geçmişi ve kayıtlı şifreleri etkilemez.</translation> <translation id="2428510569851653187">Sekme kilitlendiği sırada ne yaptığınızı açıklayın</translation> <translation id="2428939361789119025">Kablosuz bağlantıyı kapat</translation> <translation id="2428978615149723410">bu alışveriş sepetleri</translation> @@ -1864,6 +1876,7 @@ <translation id="2575407791320728464">Geçersiz URL. Doğru biçimlendirildiğinden emin olun.</translation> <translation id="2575441894380764255">Araya giren veya yanıltıcı reklamlar göstermesine izin verilmeyen siteler</translation> <translation id="2575713839157415345">{YEARS,plural, =1{Bu cihaz 1 yıl boyunca kaydedilecek olup bir dahaki sefere kod kullanmadan bağlanabilirsiniz. Bu ayar, yöneticiniz tarafından yapılmıştır.}other{Bu cihaz {YEARS} yıl boyunca kaydedilecek olup bir dahaki sefere kod kullanmadan bağlanabilirsiniz. Bu ayar, yöneticiniz tarafından yapılmıştır.}}</translation> +<translation id="2577446426265992344">Çok amaçlı adres çubuğunda değişiklik yoktur</translation> <translation id="257779572837908839">Chromebox video konferansı olarak kurun</translation> <translation id="2579309488038515659">Hotspot'u etkinleştir</translation> <translation id="2579596474754516455">Gerektiğinde PDF resimleri tarayarak metinleri ekran okuyucu için dönüştürün</translation> @@ -2534,7 +2547,7 @@ <translation id="3160928651883997588">VPN Tercihleri</translation> <translation id="3161522574479303604">Tüm diller</translation> <translation id="3162853326462195145">Okul hesabı</translation> -<translation id="3162899666601560689">Siteler size daha iyi bir göz atma deneyimi sunmak, örneğin, oturumunuzu açık tutmak veya alışveriş sepetinizdeki ürünleri hatırlamak için çerez kullanabilir</translation> +<translation id="3162899666601560689">Siteler size daha iyi bir göz atma deneyimi sunmak, örneğin, oturumunuzu açık tutmak veya alışveriş sepetinizdeki ürünleri hatırlamak için çerez kullanabilir.</translation> <translation id="3163201441334626963"><ph name="VENDOR_ID" /> adlı satıcı firma tarafından sağlanan <ph name="PRODUCT_ID" /> ürün kimliğine sahip bilinmeyen ürün</translation> <translation id="3163511056918491211">Verilerinizi istediğiniz zaman kolayca geri yükleyebilir veya cihazlar arasında geçiş yapabilirsiniz. Yedek verileriniz Google'a yüklenir ve Google Hesabınızın şifresi kullanılarak şifrelenir.</translation> <translation id="3164329792803560526">Bu sekme <ph name="APP_NAME" /> ile paylaşılıyor</translation> @@ -3508,7 +3521,7 @@ <translation id="402184264550408568">(TCP)</translation> <translation id="4021909830315618592">Yapı ayrıntılarını kopyala</translation> <translation id="4021941025609472374">Soldaki sekmeleri kapat</translation> -<translation id="402211067068791756">Bu işlem, siteler tarafından görüntülenen <ph name="TOTAL_USAGE" /> veriyi temizleyecek</translation> +<translation id="402211067068791756">Bu işlem, görüntülenen siteler tarafından depolanan <ph name="TOTAL_USAGE" /> veriyi temizleyecek</translation> <translation id="4022426551683927403">Sözlüğe &Ekle</translation> <translation id="4025039777635956441">Seçili Sitenin Sesini Kapat</translation> <translation id="402707738228916911"><ph name="AUTHORIZE_INSTRUCTION_NAME" /> talimatı alındı</translation> @@ -4454,6 +4467,7 @@ <translation id="4876895919560854374">Ekranı kilitleme ve kilidini açma</translation> <translation id="4877276003880815204">Öğeleri İncele</translation> <translation id="4877652723592270843">ChromeOS Flex'in yerleşik ekran okuyucusu olan ChromeVox'u etkinleştirmek istiyor musunuz? Cevabınız evet ise ses seviyesi tuşlarının ikisini birden beş saniyeliğine basılı tutun.</translation> +<translation id="4878261017150799673">Siteyi etkin halde tut</translation> <translation id="4878634973244289103">Geri bildirim gönderilemedi. Lütfen daha sonra tekrar deneyin.</translation> <translation id="4878653975845355462">Özel arka planlar yöneticiniz tarafından kapatıldı</translation> <translation id="4878718769565915065">Bu güvenlik anahtarına parmak izi ekleme işlemi başarısız oldu</translation> @@ -5241,6 +5255,9 @@ <translation id="5602765853043467355">Yer işaretleri, geçmiş, şifreler ve diğer bilgileri bu cihazdan temizle</translation> <translation id="5605758115928394442">Telefonunuza kimliğinizi doğrulamak için bir bildirim gönderildi.</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{Bu uzantı engellendi}other{Bu uzantılar engellendi}}</translation> +<translation id="560743070587960985">Bu dosya virüs veya kötü amaçlı yazılım olabilir. + +Güvenli olup olmadığını kontrol etmek için Google'a gönderebilirsiniz. Taramalar genellikle birkaç saniye sürer.</translation> <translation id="560834977503641186">Wi-Fi Senkronizasyonu, Daha Fazla Bilgi</translation> <translation id="5608580678041221894">Kırpma alanını ayarlamak veya taşımak için aşağıdaki tuşlara dokunun</translation> <translation id="5609231933459083978">Uygulamanın geçersiz olduğu görülüyor.</translation> @@ -5910,7 +5927,7 @@ <translation id="6202304368170870640">Cihazınızda oturum açmak veya cihazınızın kilidini açmak için PIN'inizi kullanabilirsiniz.</translation> <translation id="6203247599828309566">Bu sitedeki bir şifreyle ilgili not kaydettiniz. Notu görüntülemek için anahtar simgesini tıklayın.</translation> <translation id="6205314730813004066">Reklam gizliliği</translation> -<translation id="6206199626856438589">Açık sekmeler de dahil olmak üzere görüntülenen sitelerde oturumunuz kapatılır</translation> +<translation id="6206199626856438589">Açık sekmeler de dahil olmak üzere görüntülenen sitelerde oturumunuz kapatılacak</translation> <translation id="6206311232642889873">Resmi Kop&yala</translation> <translation id="6206521455877863927">google.com ve mail.google.com gibi aynı alandaki siteler dahildir. Görüntülediğiniz siteler cihazınıza veri kaydedebilir.</translation> <translation id="6207200176136643843">Varsayılan yakınlaştırma seviyesine sıfırla</translation> @@ -5979,6 +5996,7 @@ <translation id="6254892857036829079">Mükemmel</translation> <translation id="6257602895346497974">Senkronizasyonu aç...</translation> <translation id="62586649943626337">Sekme gruplarıyla sekmelerinizi düzenleyin</translation> +<translation id="6260092874648348841">Siteyi Etkin Halde Tut</translation> <translation id="6262371516389954471">Yedek verileriniz Google'a yüklenir ve Google Hesabınızın şifresi kullanılarak şifrelenir.</translation> <translation id="6263082573641595914">Microsoft CA Sürümü</translation> <translation id="6263284346895336537">Çok önemli değil</translation> @@ -6556,6 +6574,7 @@ <translation id="6787097042755590313">Diğer Sekmesi</translation> <translation id="6787839852456839824">Klavye kısayolları</translation> <translation id="6788210894632713004">Paketlenmemiş uzantı</translation> +<translation id="678939393857169499">Yeni masaüstü tasarımını etkinleştirir.</translation> <translation id="6789592661892473991">Yatay Böl</translation> <translation id="6789834167207639931">Kurtarma işlemini tamamlamak için sonraki ekranda Google Hesabınızın şifresini tekrar girin</translation> <translation id="6790428901817661496">Oynat</translation> @@ -7352,6 +7371,7 @@ <translation id="7481312909269577407">İleri</translation> <translation id="7481358317100446445">Hazır</translation> <translation id="748138892655239008">Sertifika Temel Kısıtlamaları</translation> +<translation id="7483145199632798061">Chrome Yenileme 2023</translation> <translation id="7484645889979462775">Bu site için hiçbir zaman</translation> <translation id="7487141338393529395">Gelişmiş Yazım Denetimini Etkinleştirin</translation> <translation id="7487969577036436319">Yüklü hiç bileşen yok</translation> @@ -7513,6 +7533,7 @@ <translation id="7634280112532283638">Spam ve sahtekarlığı azaltma</translation> <translation id="7634337648687970851">Yerel verileri kurtarma işlemi şu anda desteklenmiyor.</translation> <translation id="7634566076839829401">Bir şeyler ters gitti. Lütfen tekrar deneyin.</translation> +<translation id="763472884969134151">Analiz <ph name="LINK" /> tarafından yapıldı</translation> <translation id="7635048370253485243">Yöneticiniz tarafından sabitlendi</translation> <translation id="7635711411613274199">İnternette gezinirken gördüğünüz bir reklamın kişiselleştirilmiş olup olmaması bu ayara, <ph name="BEGIN_LINK1" />reklam konularına<ph name="LINK_END1" />, <ph name="BEGIN_LINK2" />çerez ayarlarınıza<ph name="LINK_END2" /> ve görüntülediğiniz sitenin reklamları kişiselleştirip kişiselleştirmediğine bağlıdır</translation> <translation id="7636919061354591437">Bu cihaza yükle</translation> @@ -8192,6 +8213,7 @@ <translation id="8195737548602430447">Altyazıları otomatik olarak hedef dile çevirin.</translation> <translation id="8197673340773315084">Bir ad veya İş ya da Kişisel gibi bir etiket ekleyin</translation> <translation id="8198456017687137612">Sekme yayınlanıyor</translation> +<translation id="8198457270656084773">Sistem cihaz günlüğü sayfasını mı arıyorsunuz? <ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" /> adresini ziyaret edin.</translation> <translation id="8198511718495409170">"<ph name="EXTENSION_NAME" />" ile ilgili güncellenen ayarlarınızı bu siteye uygulamak için sayfayı yeniden yükleyin</translation> <translation id="8199300056570174101">Ağ (Hizmet) ve Cihaz özellikleri</translation> <translation id="8200772114523450471">Sürdür</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 69e4c3c..29aad2e 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">Вкладка знову активна</translation> <translation id="1003088604756913841">Відкрити посилання в новому вікні додатка <ph name="APP" /></translation> <translation id="100323615638474026">Пристрій USB (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Безпечний перегляд Google</translation> <translation id="1004218526896219317">Доступ до сайту</translation> <translation id="1005274289863221750">Використовувати ваш мікрофон і камеру</translation> <translation id="1005333234656240382">Увімкнути налагодження ADB?</translation> @@ -530,6 +531,7 @@ <translation id="146000042969587795">Цей фрейм було заблоковано, тому що він містить незахищений вмест.</translation> <translation id="1461041542809785877">Ефективність</translation> <translation id="1461177659295855031">Перемістити в папку "Панель закладок"</translation> +<translation id="1461288887896722288">Ви щойно ввійшли в керований обліковий запис. Щоб отримати доступ до деяких ресурсів, зв’язаних із цим обліковим записом, створіть новий керований профіль.</translation> <translation id="146219525117638703">Стан ONC</translation> <translation id="146220085323579959">З’єднання з Інтернетом розірвано. Перевірте з’єднання з Інтернетом і повторіть спробу.</translation> <translation id="1462850958694534228">Перевірте змінений значок</translation> @@ -915,6 +917,7 @@ <translation id="1769104665586091481">Відкрити посилання в новому &вікні</translation> <translation id="1770407692401984718">Перетягніть зображення сюди або</translation> <translation id="177053719077591686">Створюйте резервні копії додатків для Android на Google Диску</translation> +<translation id="1771075623623424448">Шукаєте сторінку журналу пристрою з інформацією про веб-переглядач? Перейдіть на сторінку <ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="177336675152937177">Дані розміщених додатків</translation> <translation id="1776712937009046120">Додати користувача</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> @@ -1701,6 +1704,15 @@ <translation id="2422125132043002186">Відновлення Linux скасовано</translation> <translation id="2423578206845792524">Збер&егти зображення як...</translation> <translation id="2424424966051154874">{0,plural, =1{Гість}one{Гість (#)}few{Гість (#)}many{Гість (#)}other{Гість (#)}}</translation> +<translation id="242684489663276773">Якщо виконати цю дію: + <ph name="LINE_BREAKS" /> + • деякі налаштування і ярлики Chrome буде скинуто; + <ph name="LINE_BREAK" /> + • розширення буде вимкнено; + <ph name="LINE_BREAK" /> + • файли cookie й інші тимчасові дані сайтів буде видалено. + <ph name="LINE_BREAKS" /> + Це не вплине на закладки, історію і збережені паролі.</translation> <translation id="2428510569851653187">Опишіть, що ви робили, коли вкладка аварійно завершила роботу</translation> <translation id="2428939361789119025">Вимкнути Wi-Fi</translation> <translation id="2428978615149723410">ці картки</translation> @@ -1884,6 +1896,7 @@ <translation id="2575407791320728464">Недійсна URL-адреса. Переконайтеся, що її формат правильний.</translation> <translation id="2575441894380764255">Заборонено показувати нав'язливі чи оманливі оголошення</translation> <translation id="2575713839157415345">{YEARS,plural, =1{Цей пристрій буде збережено на 1 рік. Наступного разу ви зможете підключитися без коду. Цей параметр налаштовує ваш адміністратор.}one{Цей пристрій буде збережено на {YEARS} рік. Наступного разу ви зможете підключитися без коду. Цей параметр налаштовує ваш адміністратор.}few{Цей пристрій буде збережено на {YEARS} роки. Наступного разу ви зможете підключитися без коду. Цей параметр налаштовує ваш адміністратор.}many{Цей пристрій буде збережено на {YEARS} років. Наступного разу ви зможете підключитися без коду. Цей параметр налаштовує ваш адміністратор.}other{Цей пристрій буде збережено на {YEARS} року. Наступного разу ви зможете підключитися без коду. Цей параметр налаштовує ваш адміністратор.}}</translation> +<translation id="2577446426265992344">без універсального вікна пошуку</translation> <translation id="257779572837908839">Налаштувати як Chromebox для відеоконференцій</translation> <translation id="2579309488038515659">Увімкнути точку доступу</translation> <translation id="2579596474754516455">Скануйте зображення у форматі PDF, щоб за потреби конвертувати текст для програми зчитування з екрана</translation> @@ -4475,6 +4488,7 @@ <translation id="4876895919560854374">Блокувати чи розблоковувати екран</translation> <translation id="4877276003880815204">Перевірити елементи</translation> <translation id="4877652723592270843">Активувати ChromeVox, вбудовану програму зчитування з екрана для ОС Chrome Flex? Щоб зробити це, утримуйте обидві клавіші гучності впродовж п’яти секунд.</translation> +<translation id="4878261017150799673">Залишити сайт активним</translation> <translation id="4878634973244289103">Не вдається надіслати відгук. Повторіть спробу пізніше.</translation> <translation id="4878653975845355462">Адміністратор вимкнув можливість встановлення власних фонів</translation> <translation id="4878718769565915065">Не вдалося додати відбиток пальця для цього ключа безпеки</translation> @@ -5262,6 +5276,9 @@ <translation id="5602765853043467355">Видалити закладки, історію, паролі тощо з цього пристрою</translation> <translation id="5605758115928394442">Ми надіслали сповіщення на ваш телефон, щоб підтвердити вашу особу.</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{Це розширення заблоковано}one{Ці розширення заблоковано}few{Ці розширення заблоковано}many{Ці розширення заблоковано}other{Ці розширення заблоковано}}</translation> +<translation id="560743070587960985">Цей файл може містити вірус або зловмисне програмне забезпечення. + +Ви можете надіслати його в Google на перевірку. Сканування зазвичай триває кілька секунд.</translation> <translation id="560834977503641186">Докладніше про синхронізацію Wi-Fi</translation> <translation id="5608580678041221894">Торкніться наведених нижче клавіш, щоб змінити чи перемістити область обрізування</translation> <translation id="5609231933459083978">Схоже, додаток недійсний.</translation> @@ -5996,6 +6013,7 @@ <translation id="6254892857036829079">Чудова</translation> <translation id="6257602895346497974">Увімкнути синхронізацію…</translation> <translation id="62586649943626337">Упорядковуйте вкладки в групах</translation> +<translation id="6260092874648348841">Залишити сайт активним</translation> <translation id="6262371516389954471">Ваші резервні копії завантажуються в Google і шифруються за допомогою пароля облікового запису Google.</translation> <translation id="6263082573641595914">Версія ЦС Microsoft</translation> <translation id="6263284346895336537">Не вирішальні</translation> @@ -6579,6 +6597,7 @@ <translation id="6787097042755590313">Іншу вкладку</translation> <translation id="6787839852456839824">Комбінації клавіш</translation> <translation id="6788210894632713004">розширення</translation> +<translation id="678939393857169499">Вмикає новий дизайн робочого столу.</translation> <translation id="6789592661892473991">Розділити горизонтально</translation> <translation id="6789834167207639931">Щоб завершити відновлення, на наступному екрані знову введіть пароль облікового запису Google</translation> <translation id="6790428901817661496">Відтворити</translation> @@ -7375,6 +7394,7 @@ <translation id="7481312909269577407">Переслати</translation> <translation id="7481358317100446445">Готова</translation> <translation id="748138892655239008">Базові обмеження сертифіката</translation> +<translation id="7483145199632798061">Оновлення Chrome у 2023 році</translation> <translation id="7484645889979462775">Ніколи для цього сайта</translation> <translation id="7487141338393529395">Увімкнути покращену перевірку орфографії</translation> <translation id="7487969577036436319">Немає встановлених компонентів</translation> @@ -7536,6 +7556,7 @@ <translation id="7634280112532283638">Боротьба зі спамом і шахрайством</translation> <translation id="7634337648687970851">Відновлення локальних даних наразі не підтримується.</translation> <translation id="7634566076839829401">Сталася помилка. Повторіть спробу.</translation> +<translation id="763472884969134151">Проаналізовано сервісом <ph name="LINK" /></translation> <translation id="7635048370253485243">Закріплено адміністратором</translation> <translation id="7635711411613274199">Персоналізація реклами залежить від цього параметра, <ph name="BEGIN_LINK1" />тем оголошень<ph name="LINK_END1" /> і <ph name="BEGIN_LINK2" />налаштувань файлів cookie<ph name="LINK_END2" />, а також від налаштувань персоналізації, визначених сайтом, який ви переглядаєте</translation> <translation id="7636919061354591437">Установити на цьому пристрої</translation> @@ -8215,6 +8236,7 @@ <translation id="8195737548602430447">Автоматично перекладати субтитри цільовою мовою.</translation> <translation id="8197673340773315084">Додайте назву або мітку, як-от "Робочий" або "Особистий"</translation> <translation id="8198456017687137612">Трансляція вкладки</translation> +<translation id="8198457270656084773">Шукаєте сторінку журналу пристрою з інформацією про систему? Перейдіть на сторінку <ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="8198511718495409170">Щоб застосувати оновлені налаштування для розширення "<ph name="EXTENSION_NAME" />" на цьому сайті, оновіть сторінку</translation> <translation id="8199300056570174101">Параметри мережі (служби) і пристрою</translation> <translation id="8200772114523450471">Відновити</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index af8a287..3cb71df 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">Varaq yana faol</translation> <translation id="1003088604756913841">Havolani yangi <ph name="APP" /> oynasida ochish</translation> <translation id="100323615638474026">USB qurilma (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Google Saytlarni xavfsiz kezish</translation> <translation id="1004218526896219317">Ruxsat etilgan saytlar</translation> <translation id="1005274289863221750">Mikrofon va kameradan foydalanish</translation> <translation id="1005333234656240382">ADB tuzatish vositasi yoqilsinmi?</translation> @@ -525,6 +526,7 @@ <translation id="146000042969587795">Bu freym unda havfsiz bo‘lmagan elementlar borligi sababli bloklandi.</translation> <translation id="1461041542809785877">Samara</translation> <translation id="1461177659295855031">Bukmarklar paneli jildiga olish</translation> +<translation id="1461288887896722288">Siz hozirgina boshqariladigan hisobga kirdingiz. Ayrimi tegishli manbalarga kirish uchun yangi boshqariladigan profil yarating.</translation> <translation id="146219525117638703">ONC ahvoli</translation> <translation id="146220085323579959">Tarmoqqa ulanib bo‘lmadi. Internetga ulanish sozlamalarini tekshiring va qaytadan urinib ko‘ring.</translation> <translation id="1462850958694534228">Belgi oʻzgarishi tekshiruvi</translation> @@ -899,6 +901,7 @@ <translation id="1769104665586091481">&Havolani yangi oynada ochish</translation> <translation id="1770407692401984718">Rasmni bu yerga sudrang yoki</translation> <translation id="177053719077591686">Android ilovalarini Google Drive xizmatiga zaxiralash</translation> +<translation id="1771075623623424448">Brauzer qurilmalar jurnali sahifasini qidiryapsizmi? <ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" /> sahifasini oching.</translation> <translation id="177336675152937177">Joylashtiriladigan ilovalarning ma’lumotlari</translation> <translation id="1776712937009046120">Foydalanuvchi kiritish</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> @@ -1685,6 +1688,15 @@ <translation id="2422125132043002186">Linux tasvirini tiklash bekor qilindi</translation> <translation id="2423578206845792524">&Rasmni saqlab olish</translation> <translation id="2424424966051154874">{0,plural, =1{Mehmon}other{Mehmon (#)}}</translation> +<translation id="242684489663276773">Bunda: + <ph name="LINE_BREAKS" /> + • Ayrim Chrome sozlamalari va Chrome yorliqlari tiklanadi + <ph name="LINE_BREAK" /> + • Kengaytmalar faolsizlantiriladi + <ph name="LINE_BREAK" /> + • Cookie fayllar va boshqa vaqtincha sayt maʼlumotlari tozalanadi + <ph name="LINE_BREAKS" /> + Bukmarklar, tarix va saqlangan parollar joyida qoladi.</translation> <translation id="2428510569851653187">Varaqda nosozlik ro‘y bergan vaqtda nima qilayotganligingizni tasvirlab bering.</translation> <translation id="2428939361789119025">Wi-Fi aloqasini uzish</translation> <translation id="2428978615149723410">bu savatchalar</translation> @@ -1868,6 +1880,7 @@ <translation id="2575407791320728464">URL manzil yaroqsiz. Bexato formatlanganini tekshiring.</translation> <translation id="2575441894380764255">Yoqimsiz yoki befoyda reklamalar chiqishi taqiqlangan</translation> <translation id="2575713839157415345">{YEARS,plural, =1{Bu qurilma 1 yil davomida saqlanadi va unga keyingi safar kodsiz ulanish mumkin. Bu administrator tomonidan sozlangan.}other{Bu qurilma {YEARS} yil davomida saqlanadi va unga keyingi safar kodsiz ulanish mumkin. Bu administrator tomonidan sozlangan.}}</translation> +<translation id="2577446426265992344">omnibox dizayniga oʻzgartirish kiritmasdan</translation> <translation id="257779572837908839">Video muloqotlar uchun Chromebox sifatida foydalanish</translation> <translation id="2579309488038515659">Hotspotni yoqish</translation> <translation id="2579596474754516455">Kerak boʻlganda PDF rasmlarni skanerlang va ularni skrin rider uchun matnga aylantiring</translation> @@ -4459,6 +4472,7 @@ <translation id="4876895919560854374">Ekranni qulflash va qulfdan chiqarish</translation> <translation id="4877276003880815204">Elementlarni tekshirish</translation> <translation id="4877652723592270843">ChromeOS Flex tizimidagi ichiga oʻrnatilgan skrin rider – ChromeVox faollashtirilsinmi? Uni yoqish uchun ikkala tovush tugmasini birga besh soniya bosib turing</translation> +<translation id="4878261017150799673">Saytni faol saqlang</translation> <translation id="4878634973244289103">Fikr-mulohaza yuborilmadi. Keyinroq qaytadan urining.</translation> <translation id="4878653975845355462">Fon rasmlarini oʻzgartirishni administrator taqiqlagan</translation> <translation id="4878718769565915065">Bu elektron kalitga barmoq izi kiritilmadi</translation> @@ -5246,6 +5260,9 @@ <translation id="5602765853043467355">Qurilmadagi xatcho‘plar, tarix, parollar va boshqa ma’lumotlarni tozalash</translation> <translation id="5605758115928394442">Telefoningizga bildirishnoma yuborildi. Shaxsingizni tasdiqlang.</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{Bu kengaytma bloklandi}other{Bu kengaytmalar bloklandi}}</translation> +<translation id="560743070587960985">Bu fayl virus yoki zararli dastur boʻlishi mumkin. + +Uning xavfsizligini aniqlash uchun Googlega yuboring. Tekshiruv uchun odatda bir necha soniya ketadi.</translation> <translation id="560834977503641186">Wi-Fi Sync, Batafsil</translation> <translation id="5608580678041221894">Qirqilayotgan maydonni surish yoki moslash uchun quyidagi tugmalar ustiga bosing</translation> <translation id="5609231933459083978">Ilova nomi noto‘g‘ri kiritilganga o‘xshaydi.</translation> @@ -5983,6 +6000,7 @@ <translation id="6254892857036829079">Aʼlo darajada</translation> <translation id="6257602895346497974">Sinxronizatsiyani yoqish...</translation> <translation id="62586649943626337">Varaqlaringizni varaqlar guruhiga jamlang</translation> +<translation id="6260092874648348841">Saytni faol saqlang</translation> <translation id="6262371516389954471">Zaxiralar Google serverlariga yuklanadi va farzandingizning Google hisobingiz paroli bilan shifrlanadi.</translation> <translation id="6263082573641595914">Microsoft CA versiyasi</translation> <translation id="6263284346895336537">Muhim emas</translation> @@ -6560,6 +6578,7 @@ <translation id="6787097042755590313">Boshqa varaq</translation> <translation id="6787839852456839824">Klaviatura yorliqlari</translation> <translation id="6788210894632713004">To‘plamdan chiqarilgan kengaytma</translation> +<translation id="678939393857169499">Chrome brauzerining kompyuter versiyasi uchun yangi interfeys.</translation> <translation id="6789592661892473991">Gorizontal ajratish</translation> <translation id="6789834167207639931">Tiklashni yakunlash uchun keyingi ekranda Google hisobi parolini qayta kiriting</translation> <translation id="6790428901817661496">Ijro etish</translation> @@ -7357,6 +7376,7 @@ <translation id="7481312909269577407">Oldinga</translation> <translation id="7481358317100446445">Tayyor</translation> <translation id="748138892655239008">Sertifikatga asosiy cheklovlar</translation> +<translation id="7483145199632798061">Chrome dizayni 2023</translation> <translation id="7484645889979462775">Bu saytda hech qachon</translation> <translation id="7487141338393529395">Kengaytirilgan imlo tekshiruvini yoqish</translation> <translation id="7487969577036436319">Hech qanday tarkibiy qism o‘rnatilmagan</translation> @@ -7518,6 +7538,7 @@ <translation id="7634280112532283638">Spam va firibgarlikka qarshi kurash</translation> <translation id="7634337648687970851">Hozircha qurilmadagi maʼlumotlarni tiklash imkonsiz.</translation> <translation id="7634566076839829401">Xatolik yuz berdi. Qaytadan urinib ko‘ring.</translation> +<translation id="763472884969134151">Tashxis <ph name="LINK" /> tomonidan amalga oshirilgan</translation> <translation id="7635048370253485243">Administratoringiz qadagan</translation> <translation id="7635711411613274199">Internetni kezish davomida chiqadigan reklama shu sozlama, <ph name="BEGIN_LINK1" />Reklamadagi mavzular<ph name="LINK_END1" />, <ph name="BEGIN_LINK2" />cookie sozlamalari<ph name="LINK_END2" /> hamda ochilgan saytda reklamani moslashtirish mumkinligi asosida moslashtiriladi</translation> <translation id="7636919061354591437">Shu qurilmaga oʻrnatish</translation> @@ -8195,6 +8216,7 @@ <translation id="8195737548602430447">Taglavhalar tarjima tiliga avtomatik tarjima qilinsin.</translation> <translation id="8197673340773315084">Ish va shaxsiy kabi nom yoki yorliq qoʻshing</translation> <translation id="8198456017687137612">Translatsiya varagʻi</translation> +<translation id="8198457270656084773">Tizim qurilmalar jurnali sahifasini qidiryapsizmi? <ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" /> sahifasini oching.</translation> <translation id="8198511718495409170"><ph name="EXTENSION_NAME" /> uchun yangilangan sozlamalar bu saytda ishlashi uchun sahifani yangilang</translation> <translation id="8199300056570174101">Tarmoq (xizmat) va qurilma parametrlari</translation> <translation id="8200772114523450471">Davom ettirish</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index 8daf964..78561f8 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">Thẻ hoạt động trở lại</translation> <translation id="1003088604756913841">Mở đường liên kết trong cửa sổ mới của <ph name="APP" /></translation> <translation id="100323615638474026">Thiết bị USB (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Duyệt web An toàn của Google</translation> <translation id="1004218526896219317">Quyền truy cập vào trang web</translation> <translation id="1005274289863221750">Sử dụng micrô và máy ảnh của bạn</translation> <translation id="1005333234656240382">Bật tùy chọn gỡ lỗi ADB?</translation> @@ -527,6 +528,7 @@ <translation id="146000042969587795">Khung này đã bị chặn bởi vì có chứa một số nội dung không an toàn.</translation> <translation id="1461041542809785877">Hiệu suất</translation> <translation id="1461177659295855031">Chuyển đến thư mục Thanh dấu trang</translation> +<translation id="1461288887896722288">Bạn vừa đăng nhập vào một tài khoản được quản lý. Nếu tạo hồ sơ được quản lý mới, bạn sẽ có thể truy cập vào một số tài nguyên liên kết với tài khoản đó.</translation> <translation id="146219525117638703">Trạng thái ONC</translation> <translation id="146220085323579959">Internet đã bị ngắt kết nối. Hãy kiểm tra kết nối Internet của bạn và thử lại.</translation> <translation id="1462850958694534228">Xem lại bản cập nhật biểu tượng</translation> @@ -912,6 +914,7 @@ <translation id="1769104665586091481">Mở Liên kết bằng Cửa sổ &Mới</translation> <translation id="1770407692401984718">Kéo hình ảnh vào đây hoặc</translation> <translation id="177053719077591686">Sao lưu các ứng dụng Android vào Google Drive.</translation> +<translation id="1771075623623424448">Bạn muốn tìm trang nhật ký thiết bị của trình duyệt? Truy cập<ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="177336675152937177">Dữ liệu ứng dụng lưu trữ trên máy chủ</translation> <translation id="1776712937009046120">Thêm người dùng</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> @@ -1698,6 +1701,15 @@ <translation id="2422125132043002186">Đã hủy quá trình khôi phục Linux</translation> <translation id="2423578206845792524">Lưu &hình ảnh thành...</translation> <translation id="2424424966051154874">{0,plural, =1{Khách}other{Khách (#)}}</translation> +<translation id="242684489663276773">Hành động này sẽ: + <ph name="LINE_BREAKS" /> + • Đặt lại một số chế độ cài đặt Chrome và lối tắt Chrome + <ph name="LINE_BREAK" /> + • Tắt tiện ích + <ph name="LINE_BREAK" /> + • Xoá cookie và dữ liệu trang web tạm thời khác + <ph name="LINE_BREAKS" /> + Dấu trang, nhật ký và mật khẩu đã lưu sẽ không bị ảnh hưởng.</translation> <translation id="2428510569851653187">Mô tả những việc bạn đang làm khi thẻ gặp lỗi</translation> <translation id="2428939361789119025">Tắt Wi-Fi</translation> <translation id="2428978615149723410">những giỏ hàng này</translation> @@ -1881,6 +1893,7 @@ <translation id="2575407791320728464">URL không hợp lệ. Hãy đảm bảo URL có định dạng phù hợp.</translation> <translation id="2575441894380764255">Không được phép hiển thị quảng cáo xâm nhập hoặc quảng cáo gây hiểu nhầm</translation> <translation id="2575713839157415345">{YEARS,plural, =1{Thiết bị này sẽ được lưu trong 1 năm và trong thời gian đó, bạn có thể kết nối mà không cần dùng mã. Chế độ này do quản trị viên của bạn thiết lập.}other{Thiết bị này sẽ được lưu trong {YEARS} năm và trong thời gian đó, bạn có thể kết nối mà không cần dùng mã. Chế độ này do quản trị viên của bạn thiết lập.}}</translation> +<translation id="2577446426265992344">không có Thanh địa chỉ</translation> <translation id="257779572837908839">Thiết lập làm Chromebox cho hội họp</translation> <translation id="2579309488038515659">Bật điểm phát sóng</translation> <translation id="2579596474754516455">Quét hình ảnh PDF để chuyển đổi văn bản cho trình đọc màn hình khi cần</translation> @@ -4472,6 +4485,7 @@ <translation id="4876895919560854374">Khóa và mở khóa màn hình</translation> <translation id="4877276003880815204">Kiểm tra phần tử</translation> <translation id="4877652723592270843">Bạn có muốn kích hoạt ChromeVox (trình đọc màn hình tích hợp cho ChromeOS Flex) không? Nếu có, hãy nhấn và giữ cả hai phím âm lượng trong 5 giây.</translation> +<translation id="4878261017150799673">Duy trì hoạt động của trang web</translation> <translation id="4878634973244289103">Không thể gửi ý kiến phản hồi. Vui lòng thử lại sau.</translation> <translation id="4878653975845355462">Quản trị viên đã tắt các nền tùy chỉnh</translation> <translation id="4878718769565915065">Không thêm được vân tay vào khóa bảo mật này</translation> @@ -5259,6 +5273,9 @@ <translation id="5602765853043467355">Xóa dấu trang, lịch sử, mật khẩu và nhiều nội dung khác từ thiết bị này</translation> <translation id="5605758115928394442">Chúng tôi đã gửi một thông báo đến điện thoại của bạn để xác nhận đó là bạn.</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{Tiện ích này đã bị chặn}other{Các tiện ích này đã bị chặn}}</translation> +<translation id="560743070587960985">Tệp này có thể là vi-rút hoặc phần mềm độc hại. + +Bạn có thể gửi tệp này cho Google để kiểm tra xem tệp có an toàn hay không. Quá trình quét thường mất vài giây.</translation> <translation id="560834977503641186">Đồng bộ hóa Wi-Fi, Tìm hiểu thêm</translation> <translation id="5608580678041221894">Nhấn các phím sau để điều chỉnh hoặc di chuyển vùng cắt</translation> <translation id="5609231933459083978">Ứng dụng này có vẻ không hợp lệ.</translation> @@ -5996,6 +6013,7 @@ <translation id="6254892857036829079">Hoàn hảo</translation> <translation id="6257602895346497974">Bật tính năng đồng bộ hóa...</translation> <translation id="62586649943626337">Sắp xếp thẻ thành các nhóm</translation> +<translation id="6260092874648348841">Duy trì hoạt động của trang web</translation> <translation id="6262371516389954471">Các bản sao lưu được tải lên Google và mã hóa bằng mật khẩu Tài khoản Google của bạn.</translation> <translation id="6263082573641595914">Phiên bản CA của Microsoft</translation> <translation id="6263284346895336537">Không Quan trọng</translation> @@ -6573,6 +6591,7 @@ <translation id="6787097042755590313">Thẻ khác</translation> <translation id="6787839852456839824">Phím tắt</translation> <translation id="6788210894632713004">Tiện ích đã giải nén</translation> +<translation id="678939393857169499">Mang đến thiết kế mới cho màn hình.</translation> <translation id="6789592661892473991">Chia ngang</translation> <translation id="6789834167207639931">Nhập lại mật khẩu Tài khoản Google của bạn trên màn hình tiếp theo để hoàn tất quá trình khôi phục</translation> <translation id="6790428901817661496">Phát</translation> @@ -7370,6 +7389,7 @@ <translation id="7481312909269577407">Chuyển tiếp</translation> <translation id="7481358317100446445">Sẵn sàng</translation> <translation id="748138892655239008">Giới hạn Cơ bản của Chứng chỉ</translation> +<translation id="7483145199632798061">Chrome Refresh 2023</translation> <translation id="7484645889979462775">Không bao giờ đối với trang web này</translation> <translation id="7487141338393529395">Bật tính năng kiểm tra lỗi chính tả nâng cao</translation> <translation id="7487969577036436319">Không có thành phần nào được cài đặt</translation> @@ -7531,6 +7551,7 @@ <translation id="7634280112532283638">Giảm nội dung rác và lừa đảo</translation> <translation id="7634337648687970851">Chúng tôi hiện chưa hỗ trợ tính năng khôi phục dữ liệu cục bộ.</translation> <translation id="7634566076839829401">Đã xảy ra sự cố. Vui lòng thử lại.</translation> +<translation id="763472884969134151">Quy trình phân tích do <ph name="LINK" /> thực hiện</translation> <translation id="7635048370253485243">Do Quản trị viên ghim</translation> <translation id="7635711411613274199">Khi bạn duyệt web, thì chế độ cài đặt này, <ph name="BEGIN_LINK1" />Chủ đề quảng cáo<ph name="LINK_END1" />, <ph name="BEGIN_LINK2" />chế độ cài đặt cookie<ph name="LINK_END2" /> và khả năng cá nhân hoá quảng cáo của trang web bạn đang xem sẽ quyết định liệu quảng cáo bạn thấy có được cá nhân hoá không</translation> <translation id="7636919061354591437">Cài đặt trên thiết bị này</translation> @@ -8210,6 +8231,7 @@ <translation id="8195737548602430447">Tự động dịch phụ đề sang ngôn ngữ đích.</translation> <translation id="8197673340773315084">Thêm tên hoặc nhãn như "Công việc" hoặc "Cá nhân"</translation> <translation id="8198456017687137612">Đang truyền thẻ</translation> +<translation id="8198457270656084773">Bạn muốn tìm trang nhật ký thiết bị của hệ thống? Truy cập<ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="8198511718495409170">Để áp dụng chế độ cài đặt đã cập nhật cho "<ph name="EXTENSION_NAME" />" vào trang web này, hãy tải lại trang</translation> <translation id="8199300056570174101">Thuộc tính của thiết bị và mạng (dịch vụ)</translation> <translation id="8200772114523450471">Tiếp tục</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index 2a1ff561..f0fb743 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">标签页重新变为活动状态</translation> <translation id="1003088604756913841">在<ph name="APP" />的新窗口中打开链接</translation> <translation id="100323615638474026">USB 设备 (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Google 安全浏览</translation> <translation id="1004218526896219317">有权访问的网站</translation> <translation id="1005274289863221750">使用您的麦克风和摄像头</translation> <translation id="1005333234656240382">启用 ADB 调试?</translation> @@ -897,6 +898,7 @@ <translation id="1769104665586091481">在新窗口中打开链接(&W)</translation> <translation id="1770407692401984718">将图片拖到此处,或者</translation> <translation id="177053719077591686">将 Android 应用备份到 Google 云端硬盘。</translation> +<translation id="1771075623623424448">想查看浏览器设备日志页面?请访问 <ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" />。</translation> <translation id="177336675152937177">托管应用数据</translation> <translation id="1776712937009046120">添加用户</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> @@ -1677,6 +1679,15 @@ <translation id="2422125132043002186">已取消 Linux 恢复</translation> <translation id="2423578206845792524">图片另存为(&V)...</translation> <translation id="2424424966051154874">{0,plural, =1{访客}other{访客 (#)}}</translation> +<translation id="242684489663276773">此操作将会: + <ph name="LINE_BREAKS" /> + • 重置 Chrome 中的某些设置和快捷键 + <ph name="LINE_BREAK" /> + • 停用扩展程序 + <ph name="LINE_BREAK" /> + • 删除 Cookie 和其他临时网站数据 + <ph name="LINE_BREAKS" /> + 书签、历史记录和已存密码不受影响。</translation> <translation id="2428510569851653187">请说明此标签页崩溃时您在做什么</translation> <translation id="2428939361789119025">关闭 Wi-Fi</translation> <translation id="2428978615149723410">这些购物车</translation> @@ -4447,6 +4458,7 @@ <translation id="4876895919560854374">将屏幕锁定和解锁</translation> <translation id="4877276003880815204">检查元素</translation> <translation id="4877652723592270843">您想为 ChromeOS Flex 启用 ChromeVox(内置屏幕阅读器)吗?如要启用,请同时按住两个音量键 5 秒钟。</translation> +<translation id="4878261017150799673">让网站保持活跃状态</translation> <translation id="4878634973244289103">无法发送反馈。请稍后重试。</translation> <translation id="4878653975845355462">您的管理员已关闭自定义背景</translation> <translation id="4878718769565915065">未能向此安全密钥添加指纹</translation> @@ -5234,6 +5246,9 @@ <translation id="5602765853043467355">清除此设备上的书签、历史记录、密码等信息</translation> <translation id="5605758115928394442">系统向您的手机发送了一条通知,以确认您的身份。</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{这个扩展程序已被屏蔽}other{这些扩展程序已被屏蔽}}</translation> +<translation id="560743070587960985">此文件可能是病毒或恶意软件。 + +您可将它发送给 Google 以检查它是否安全。扫描通常需要几秒钟的时间。</translation> <translation id="560834977503641186">Wi-Fi 同步,了解详情</translation> <translation id="5608580678041221894">按以下键可调整或移动剪裁区域</translation> <translation id="5609231933459083978">该应用似乎无效。</translation> @@ -5968,6 +5983,7 @@ <translation id="6254892857036829079">完美</translation> <translation id="6257602895346497974">开启同步功能…</translation> <translation id="62586649943626337">使用标签页分组整理标签页</translation> +<translation id="6260092874648348841">让网站保持活跃状态</translation> <translation id="6262371516389954471">您的备份内容将上传到 Google 并使用您的 Google 帐号密码进行加密。</translation> <translation id="6263082573641595914">Microsoft CA 版本</translation> <translation id="6263284346895336537">非关键</translation> @@ -7505,6 +7521,7 @@ <translation id="7634280112532283638">垃圾内容和欺诈行为削减</translation> <translation id="7634337648687970851">目前不支持本地数据恢复。</translation> <translation id="7634566076839829401">出了点问题,请重试。</translation> +<translation id="763472884969134151">已由 <ph name="LINK" />完成分析</translation> <translation id="7635048370253485243">已被您的管理员固定</translation> <translation id="7635711411613274199">您在浏览时是否会看到个性化广告取决于此设置、<ph name="BEGIN_LINK1" />广告主题<ph name="LINK_END1" />、您的 <ph name="BEGIN_LINK2" />Cookie 设置<ph name="LINK_END2" />,以及您正查看的网站是否会展示个性化广告</translation> <translation id="7636919061354591437">在此设备上安装</translation> @@ -8184,6 +8201,7 @@ <translation id="8195737548602430447">自动将字幕翻译成目标语言。</translation> <translation id="8197673340773315084">添加一个名称或标签,例如“工作”或“个人”</translation> <translation id="8198456017687137612">正在投放标签页</translation> +<translation id="8198457270656084773">想查看系统设备日志页面?请访问 <ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" />。</translation> <translation id="8198511718495409170">若要将更新后的“<ph name="EXTENSION_NAME" />”相关设置应用到此网站,请重新加载此页面</translation> <translation id="8199300056570174101">网络(服务)和设备属性</translation> <translation id="8200772114523450471">继续</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb index ad860d0f..ec556016 100644 --- a/chrome/app/resources/generated_resources_zh-HK.xtb +++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">讓分頁恢復「使用中」狀態</translation> <translation id="1003088604756913841">在 <ph name="APP" />的新視窗中開啟連結</translation> <translation id="100323615638474026">USB 裝置 (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Google 安全瀏覽</translation> <translation id="1004218526896219317">網站存取權</translation> <translation id="1005274289863221750">使用您的麥克風和相機</translation> <translation id="1005333234656240382">要啟用 ADB 偵錯嗎?</translation> @@ -527,7 +528,7 @@ <translation id="146000042969587795">此頁框由於包含不安全的內容,已被封鎖。</translation> <translation id="1461041542809785877">效能</translation> <translation id="1461177659295855031">移至「書籤列」資料夾</translation> -<translation id="1461288887896722288">你已登入受管理帳戶,建立新的受管理設定檔即可存取一些已連結到該帳戶的資源。</translation> +<translation id="1461288887896722288">您剛才已登入受管帳戶,建立新的受管個人檔案即可存取一些已連結至該帳戶的資源。</translation> <translation id="146219525117638703">ONC 狀態</translation> <translation id="146220085323579959">互聯網已中斷連線。請檢查互聯網連線,然後再試一次。</translation> <translation id="1462850958694534228">檢查新圖示</translation> @@ -912,6 +913,7 @@ <translation id="1769104665586091481">在新視窗中開啟連結(&W)</translation> <translation id="1770407692401984718">將圖片拖曳至此處或</translation> <translation id="177053719077591686">在「Google 雲端硬碟」中備份 Android 應用程式。</translation> +<translation id="1771075623623424448">要查看瀏覽器的裝置記錄頁面嗎?請前往 <ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" />.</translation> <translation id="177336675152937177">代管應用程式數據</translation> <translation id="1776712937009046120">新增使用者</translation> <translation id="1776883657531386793"><ph name="OID" />:<ph name="INFO" /></translation> @@ -1699,6 +1701,15 @@ <translation id="2422125132043002186">已取消 Linux 還原</translation> <translation id="2423578206845792524">另存圖片為(&V)…</translation> <translation id="2424424966051154874">{0,plural, =1{訪客}other{訪客 (#)}}</translation> +<translation id="242684489663276773">此動作將: + <ph name="LINE_BREAKS" /> + • 重設部分 Chrome 設定及 Chrome 快速鍵 + <ph name="LINE_BREAK" /> + • 停用擴充程式 + <ph name="LINE_BREAK" /> + • 刪除 Cookie 和其他暫存網站資料 + <ph name="LINE_BREAKS" /> + 書籤、記錄和已儲存的密碼並不會受到影響。</translation> <translation id="2428510569851653187">請說明分頁當機時您正在執行的動作</translation> <translation id="2428939361789119025">關閉 Wi-Fi</translation> <translation id="2428978615149723410">這些購物車</translation> @@ -4474,6 +4485,7 @@ <translation id="4876895919560854374">鎖定和解鎖屏幕</translation> <translation id="4877276003880815204">檢查元素</translation> <translation id="4877652723592270843">係咪要啟用 ChromeOS Flex 內置嘅螢幕閱讀器 ChromeVox?要嘅話就請同時㩒住校高同校低音量鍵五秒。</translation> +<translation id="4878261017150799673">排除目前運作中的網站</translation> <translation id="4878634973244289103">無法傳送意見,請稍後再試。</translation> <translation id="4878653975845355462">管理員已關閉自訂背景功能</translation> <translation id="4878718769565915065">無法將指紋新增到此安全密鑰</translation> @@ -5261,6 +5273,9 @@ <translation id="5602765853043467355">清除此裝置上的書籤、記錄和密碼等資料。</translation> <translation id="5605758115928394442">已將通知傳送至您的手機,以確認您的身分。</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{已封鎖這個擴充程式}other{已封鎖這些擴充程式}}</translation> +<translation id="560743070587960985">此檔案可能是病毒或惡意軟件。 + +您可將此檔案傳送至 Google,檢查是否不安全。掃瞄通常需時幾秒鐘。</translation> <translation id="560834977503641186">Wi-Fi Sync,了解詳情</translation> <translation id="5608580678041221894">輕按以下按鍵即可調整或移動裁剪區域</translation> <translation id="5609231933459083978">這似乎是無效的應用程式。</translation> @@ -5996,6 +6011,7 @@ <translation id="6254892857036829079">完美</translation> <translation id="6257602895346497974">開啟同步處理功能…</translation> <translation id="62586649943626337">使用分頁群組來整理分頁</translation> +<translation id="6260092874648348841">排除目前運作中的網站</translation> <translation id="6262371516389954471">您的備份會上載至 Google,並透過您的 Google 帳戶密碼加密。</translation> <translation id="6263082573641595914">Microsoft CA 版本</translation> <translation id="6263284346895336537">非重要</translation> @@ -6573,7 +6589,7 @@ <translation id="6787097042755590313">其他分頁</translation> <translation id="6787839852456839824">鍵盤快速鍵</translation> <translation id="6788210894632713004">已解除壓縮的擴充程式</translation> -<translation id="678939393857169499">啟用新版桌面設計。</translation> +<translation id="678939393857169499">啟用全新桌面設計。</translation> <translation id="6789592661892473991">水平分割</translation> <translation id="6789834167207639931">在下一個畫面中再次輸入 Google 帳戶密碼,完成復原程序</translation> <translation id="6790428901817661496">播放</translation> @@ -7532,6 +7548,7 @@ <translation id="7634280112532283638">減少垃圾內容和欺詐行為</translation> <translation id="7634337648687970851">目前不支援本機資料復原。</translation> <translation id="7634566076839829401">發生錯誤,請再試一次。</translation> +<translation id="763472884969134151">由 <ph name="LINK" />提供的分析結果</translation> <translation id="7635048370253485243">已由管理員固定</translation> <translation id="7635711411613274199">瀏覽時是否看到個人化廣告,取決於此設定、<ph name="BEGIN_LINK1" />廣告主題<ph name="LINK_END1" />、<ph name="BEGIN_LINK2" />Cookie 設定<ph name="LINK_END2" />、網站是否顯示個人化廣告</translation> <translation id="7636919061354591437">在此裝置上安裝</translation> @@ -8211,6 +8228,7 @@ <translation id="8195737548602430447">自動將字幕翻譯為指定語言。</translation> <translation id="8197673340773315084">新增名稱或標籤,例如「工作」或「個人」</translation> <translation id="8198456017687137612">正在投放分頁</translation> +<translation id="8198457270656084773">要查看系統的裝置記錄頁面嗎?請前往 <ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" />。</translation> <translation id="8198511718495409170">如要將您已更新的「<ph name="EXTENSION_NAME" />」設定套到此網站,請重新載入此網頁</translation> <translation id="8199300056570174101">網絡 (服務) 和裝置屬性元件</translation> <translation id="8200772114523450471">繼續</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index a89b270..7ace466 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -5,6 +5,7 @@ <translation id="1002085272681738789">讓分頁恢復「使用中」狀態</translation> <translation id="1003088604756913841">在新的「<ph name="APP" />」視窗中開啟連結</translation> <translation id="100323615638474026">USB 裝置 (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation> +<translation id="1003355351496161312">Google 安全瀏覽</translation> <translation id="1004218526896219317">網站存取權</translation> <translation id="1005274289863221750">使用你的麥克風和相機</translation> <translation id="1005333234656240382">是否要啟用 ADB 偵錯?</translation> @@ -902,6 +903,7 @@ <translation id="1769104665586091481">在新視窗中開啟連結(&W)</translation> <translation id="1770407692401984718">將圖片拖曳到這裡或</translation> <translation id="177053719077591686">在 Google 雲端硬碟中備份 Android 應用程式。</translation> +<translation id="1771075623623424448">要查看瀏覽器的裝置記錄頁面嗎?請造訪 <ph name="BEGIN_LINK" /><ph name="CHROME_DEVICE_LOG_LINK" /><ph name="END_LINK" />。</translation> <translation id="177336675152937177">代管應用程式資料</translation> <translation id="1776712937009046120">新增使用者</translation> <translation id="1776883657531386793"><ph name="OID" />:<ph name="INFO" /></translation> @@ -1684,6 +1686,15 @@ <translation id="2422125132043002186">已取消 Linux 還原作業</translation> <translation id="2423578206845792524">另存圖片(&V)...</translation> <translation id="2424424966051154874">{0,plural, =1{訪客}other{訪客 (#)}}</translation> +<translation id="242684489663276773">這個動作將: + <ph name="LINE_BREAKS" /> + • 重設部分 Chrome 設定和 Chrome 快速鍵 + <ph name="LINE_BREAK" /> + • 停用擴充功能 + <ph name="LINE_BREAK" /> + • 刪除 Cookie 和其他暫存網站資料 + <ph name="LINE_BREAKS" /> + 書籤、歷史記錄及已儲存的密碼不會受到影響。</translation> <translation id="2428510569851653187">說明分頁當掉時你正在執行的動作</translation> <translation id="2428939361789119025">關閉 Wi-Fi</translation> <translation id="2428978615149723410">這些購物車</translation> @@ -4457,6 +4468,7 @@ <translation id="4876895919560854374">鎖定及解鎖螢幕</translation> <translation id="4877276003880815204">檢查元素</translation> <translation id="4877652723592270843">是否要啟動 ChromeOS Flex 內建的螢幕閱讀器 ChromeVox?如要啟動,請同時按住音量調高和調低鍵五秒。</translation> +<translation id="4878261017150799673">排除目前運作中的網站</translation> <translation id="4878634973244289103">無法送出意見,請稍後再試。</translation> <translation id="4878653975845355462">你的系統管理員已停用自訂背景功能</translation> <translation id="4878718769565915065">無法將指紋新增到這個安全金鑰</translation> @@ -5244,6 +5256,7 @@ <translation id="5602765853043467355">清除這個裝置的書籤、歷史記錄、密碼和其他設定</translation> <translation id="5605758115928394442">為了確認你的身分,系統已傳送通知到你的手機。</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{已封鎖這個擴充功能}other{已封鎖這些擴充功能}}</translation> +<translation id="560743070587960985">這個檔案可能是病毒或惡意軟體。你可以將該檔案傳送給 Google,檢查是否安全。掃描通常需要幾秒鐘的時間。</translation> <translation id="560834977503641186">Wi-Fi 同步功能,瞭解詳情</translation> <translation id="5608580678041221894">輕觸下列按鍵可調整或移動裁剪區域</translation> <translation id="5609231933459083978">這似乎是無效的應用程式。</translation> @@ -5978,6 +5991,7 @@ <translation id="6254892857036829079">完美</translation> <translation id="6257602895346497974">開啟同步功能...</translation> <translation id="62586649943626337">使用分頁群組來整理分頁</translation> +<translation id="6260092874648348841">排除目前運作中的網站</translation> <translation id="6262371516389954471">備份內容會上傳到 Google,並使用你的 Google 帳戶密碼加密。</translation> <translation id="6263082573641595914">Microsoft CA 版本</translation> <translation id="6263284346895336537">非重要</translation> @@ -7515,6 +7529,7 @@ <translation id="7634280112532283638">減少垃圾內容和詐欺情形</translation> <translation id="7634337648687970851">目前不支援本機資料復原。</translation> <translation id="7634566076839829401">發生錯誤,請再試一次。</translation> +<translation id="763472884969134151">由 <ph name="LINK" />提供的分析結果</translation> <translation id="7635048370253485243">已由系統管理員固定</translation> <translation id="7635711411613274199">上網時是否會看到個人化廣告,取決於這項設定、<ph name="BEGIN_LINK1" />廣告主題<ph name="LINK_END1" />、<ph name="BEGIN_LINK2" />Cookie 設定<ph name="LINK_END2" />,以及網站是否顯示個人化廣告</translation> <translation id="7636919061354591437">安裝到這部裝置</translation> @@ -8194,6 +8209,7 @@ <translation id="8195737548602430447">自動將字幕翻譯成譯文語言。</translation> <translation id="8197673340773315084">新增名稱或標籤,例如「工作」或「個人」</translation> <translation id="8198456017687137612">正在投放分頁</translation> +<translation id="8198457270656084773">要查看系統的裝置記錄頁面嗎?請造訪 <ph name="BEGIN_LINK" /><ph name="OS_DEVICE_LOG_LINK" /><ph name="END_LINK" />。</translation> <translation id="8198511718495409170">如要將更新後的「<ph name="EXTENSION_NAME" />」設定套用到這個網站,請重新載入這個網頁</translation> <translation id="8199300056570174101">網路 (服務) 與裝置屬性</translation> <translation id="8200772114523450471">繼續</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb index 7b0cbfc..09680a6 100644 --- a/chrome/app/resources/generated_resources_zu.xtb +++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -529,6 +529,7 @@ <translation id="146000042969587795">Lo zimele uye wavinjwa ngoba uqukethe okuthile okungavikelekile.</translation> <translation id="1461041542809785877">Ukusebenza</translation> <translation id="1461177659295855031">Hambisa kufolda Yebha Yamabhukhimakhi</translation> +<translation id="1461288887896722288">Usanda kungena ngemvume ku-akhawunti ephethwe, ukwakha iphrofayela entsha ephethwe kuzokuvumela ukuthi ufinyelele izinsiza ezithile ezixhunywe kuleyo akhawunti.</translation> <translation id="146219525117638703">Isimo se-ONC</translation> <translation id="146220085323579959">I-inthanethi inqanyuliwe. Sicela uhlole ukuxhumeka kwakho kwe-inthanethi uphinde uzame futhi.</translation> <translation id="1462850958694534228">Hlola isibuyekezo sesithonjana</translation> @@ -1893,6 +1894,7 @@ <translation id="2575407791320728464">I-URL engavumelekile. Qiniseka ukuthi ifomethwe kahle.</translation> <translation id="2575441894380764255">Ayivumelekile ukubonisa izikhangiso ezisongelayo noma ezidukisayo</translation> <translation id="2575713839157415345">{YEARS,plural, =1{Le divayisi izolondolozwa unyaka o-1 futhi ungakwazi ukuxhuma ngaphandle kwekhodi esikhathini esizayo. Lokhu kusetshwa ngumlawuli wakho.}one{Le divayisi izolondolozwa iminyaka engu-{YEARS} futhi ungakwazi ukuxhuma ngaphandle kwekhodi esikhathini esizayo. Lokhu kusetshwa ngumlawuli wakho.}other{Le divayisi izolondolozwa iminyaka engu-{YEARS} futhi ungakwazi ukuxhuma ngaphandle kwekhodi esikhathini esizayo. Lokhu kusetshwa ngumlawuli wakho.}}</translation> +<translation id="2577446426265992344">engenayo i-Omnibox</translation> <translation id="257779572837908839">Setha njenge-Chromebox yemihlangano</translation> <translation id="2579309488038515659">I-hotspot inikwe amandla</translation> <translation id="2579596474754516455">Skena imifanekiso ye-PDF ukuze uguqule umbhalo wesifundi sesikrini uma kudingekile</translation> @@ -6594,6 +6596,7 @@ <translation id="6787097042755590313">Enye Ithebhu</translation> <translation id="6787839852456839824">Izinqamuleli zekhibhodi</translation> <translation id="6788210894632713004">Isandiso esingapakishiwe</translation> +<translation id="678939393857169499">Inika amandla idizayini entsha yedeskithophu.</translation> <translation id="6789592661892473991">Hlukanisa ngokuvundlile</translation> <translation id="6789834167207639931">Faka iphasiwedi yakho ye-Google Account futhi esikrinini esilandelayo ukuze uqedele ukutakula</translation> <translation id="6790428901817661496">Dlala</translation> @@ -7391,6 +7394,7 @@ <translation id="7481312909269577407">Dlulisela</translation> <translation id="7481358317100446445">Isikulungele</translation> <translation id="748138892655239008">Izicindezeli ezingumsuka zesitifiketi</translation> +<translation id="7483145199632798061">I-Chrome Refresh 2023</translation> <translation id="7484645889979462775">Ungalokothi kuleli sayithi</translation> <translation id="7487141338393529395">Vula ukuhlola ukupela okuthuthukisiwe</translation> <translation id="7487969577036436319">Azikho izingxenye ezifakiwe</translation>
diff --git a/chrome/app/resources/google_chrome_strings_be.xtb b/chrome/app/resources/google_chrome_strings_be.xtb index 3bdd63b0..a210a34 100644 --- a/chrome/app/resources/google_chrome_strings_be.xtb +++ b/chrome/app/resources/google_chrome_strings_be.xtb
@@ -258,6 +258,7 @@ <translation id="5756509061973259733">Профіль Chrome з такім уліковым запісам ужо існуе на гэтай прыладзе</translation> <translation id="5795887333006832406"><ph name="PAGE_TITLE" /> – Google Chrome Canary</translation> <translation id="5804318322022881572">Не ўдалося запусціць Chrome. Паўтарыце спробу.</translation> +<translation id="585620188971323280">змяніць налады запаўнення спосабаў аплаты.</translation> <translation id="5895138241574237353">Перазапусціць</translation> <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> – Уваход у сетку</translation> <translation id="5924017743176219022">Ідзе падключэнне да інтэрнэту...</translation> @@ -395,6 +396,7 @@ <translation id="8516431725144212809">Вашы інтарэсы паводле ацэнкі Chrome</translation> <translation id="8521348052903287641">Уваходнае правіла версіі Google Chrome для распрацоўшчыкаў, якое дазваляе трафік mDNS.</translation> <translation id="8540666473246803645">Google Chrome</translation> +<translation id="8544217240017914508">Google Chrome спрабуе замяніць налады запаўнення спосабаў аплаты.</translation> <translation id="8550334526674375523">Гэты працоўны профіль і ваш асабісты профіль з'яўляюцца поўнасцю асобнымі профілямі.</translation> <translation id="8556340503434111824">Даступная новая версія Google Chrome. Яшчэ хутчэйшая.</translation> <translation id="8571790202382503603">Профілі Chrome патрэбны для раздзельнага выкарыстання браўзера рознымі людзьмі або ў розных мэтах. Выкарыстоўваючы іх, прасцей раздзяляць работу і забавы.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sw.xtb b/chrome/app/resources/google_chrome_strings_sw.xtb index 909cad7..d284f9d1 100644 --- a/chrome/app/resources/google_chrome_strings_sw.xtb +++ b/chrome/app/resources/google_chrome_strings_sw.xtb
@@ -260,7 +260,7 @@ <translation id="5795887333006832406"><ph name="PAGE_TITLE" /> - Toleo la Jaribio la Google Chrome</translation> <translation id="5804318322022881572">Imeshindwa kuanzisha Chrome. Jaribu tena.</translation> <translation id="585620188971323280">kurekebisha mipangilio kwa ajili ya kujaza njia za kulipa.</translation> -<translation id="5895138241574237353">Zzima na uwashe</translation> +<translation id="5895138241574237353">Zima na uwashe</translation> <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - Kuingia katika Akaunti ya Mtandao</translation> <translation id="5924017743176219022">Inaunganisha kwenye Intaneti...</translation> <translation id="5932997892801542621">Unapoandika kwenye sehemu ya anwani au kisanduku cha kutafutia, Chrome hutuma unachokiandika kwenda kwenye Hifadhi ya Google ili upate mapendekezo ya kipengee. Kipengele hiki huwa kimezimwa katika Hali fiche.</translation>
diff --git a/chrome/app/vector_icons/text_decrease.icon b/chrome/app/vector_icons/text_decrease.icon index a2b7c00..5a6afb0f 100644 --- a/chrome/app/vector_icons/text_decrease.icon +++ b/chrome/app/vector_icons/text_decrease.icon
@@ -2,23 +2,26 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -CANVAS_DIMENSIONS, 24, -MOVE_TO, 1, 19, -LINE_TO, 6.25f, 5, -H_LINE_TO, 8.75f, -LINE_TO, 14, 19, -H_LINE_TO, 11.6f, -LINE_TO, 10.33f, 15.43f, -H_LINE_TO, 4.68f, -LINE_TO, 3.4f, 19, +CANVAS_DIMENSIONS, 20, +MOVE_TO, 3.38f, 14, +LINE_TO, 6.47f, 6, +H_LINE_TO, 8.07f, +LINE_TO, 11.13f, 14, +H_LINE_TO, 9.53f, +LINE_TO, 8.83f, 12.02f, +H_LINE_TO, 5.67f, +LINE_TO, 4.93f, 14, +H_LINE_TO, 3.38f, CLOSE, -MOVE_TO, 5.4f, 13.4f, -H_LINE_TO, 9.6f, -LINE_TO, 7.55f, 7.6f, -H_LINE_TO, 7.45f, +MOVE_TO, 6.08f, 10.8f, +H_LINE_TO, 8.4f, +LINE_TO, 7.28f, 7.58f, +H_LINE_TO, 7.22f, +LINE_TO, 6.08f, 10.8f, CLOSE, -MOVE_TO, 15, 13, -V_LINE_TO, 11, -H_LINE_TO, 23, -V_LINE_TO, 13, +MOVE_TO, 11.62f, 10.67f, +V_LINE_TO, 9.33f, +H_LINE_TO, 16.5f, +V_LINE_TO, 10.67f, +H_LINE_TO, 11.62f, CLOSE \ No newline at end of file
diff --git a/chrome/app/vector_icons/text_increase.icon b/chrome/app/vector_icons/text_increase.icon index 3d16c19..2603e558 100644 --- a/chrome/app/vector_icons/text_increase.icon +++ b/chrome/app/vector_icons/text_increase.icon
@@ -2,31 +2,34 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -CANVAS_DIMENSIONS, 24, -MOVE_TO, 1, 19, -LINE_TO, 6.25f, 5, -H_LINE_TO, 8.75f, -LINE_TO, 14, 19, -H_LINE_TO, 11.6f, -LINE_TO, 10.33f, 15.43f, -H_LINE_TO, 4.68f, -LINE_TO, 3.4f, 19, +CANVAS_DIMENSIONS, 20, +MOVE_TO, 3.38f, 14, +LINE_TO, 6.47f, 6, +H_LINE_TO, 8.07f, +LINE_TO, 11.13f, 14, +H_LINE_TO, 9.53f, +LINE_TO, 8.83f, 12.02f, +H_LINE_TO, 5.67f, +LINE_TO, 4.93f, 14, +H_LINE_TO, 3.38f, CLOSE, -MOVE_TO, 5.4f, 13.4f, -H_LINE_TO, 9.6f, -LINE_TO, 7.55f, 7.6f, -H_LINE_TO, 7.45f, +MOVE_TO, 6.08f, 10.8f, +H_LINE_TO, 8.4f, +LINE_TO, 7.28f, 7.58f, +H_LINE_TO, 7.22f, +LINE_TO, 6.08f, 10.8f, CLOSE, -MOVE_TO, 18, 16, -V_LINE_TO, 13, -H_LINE_TO, 15, -V_LINE_TO, 11, -H_LINE_TO, 18, -V_LINE_TO, 8, -H_LINE_TO, 20, -V_LINE_TO, 11, -H_LINE_TO, 23, -V_LINE_TO, 13, -H_LINE_TO, 20, -V_LINE_TO, 16, +MOVE_TO, 13.38f, 12.47f, +V_LINE_TO, 10.67f, +H_LINE_TO, 11.58f, +V_LINE_TO, 9.33f, +H_LINE_TO, 13.38f, +V_LINE_TO, 7.53f, +H_LINE_TO, 14.7f, +V_LINE_TO, 9.33f, +H_LINE_TO, 16.5f, +V_LINE_TO, 10.67f, +H_LINE_TO, 14.7f, +V_LINE_TO, 12.47f, +H_LINE_TO, 13.38f, CLOSE \ No newline at end of file
diff --git a/chrome/app_shim/BUILD.gn b/chrome/app_shim/BUILD.gn index 6029ac6..384a2bd 100644 --- a/chrome/app_shim/BUILD.gn +++ b/chrome/app_shim/BUILD.gn
@@ -21,8 +21,6 @@ "chrome_main_app_mode_mac.mm", ] - configs += [ "//build/config/compiler:enable_arc" ] - deps = [ "//base/allocator:early_zone_registration_mac", "//build:chromeos_buildflags", @@ -97,8 +95,6 @@ "//chrome/common:non_code_constants", ] - configs += [ "//build/config/compiler:enable_arc" ] - frameworks = [ "AppKit.framework", "CoreFoundation.framework",
diff --git a/chrome/app_shim/app_mode_loader_mac.mm b/chrome/app_shim/app_mode_loader_mac.mm index 83f1ec5c..be2a4ee2 100644 --- a/chrome/app_shim/app_mode_loader_mac.mm +++ b/chrome/app_shim/app_mode_loader_mac.mm
@@ -26,10 +26,6 @@ #import "chrome/common/mac/app_mode_chrome_locator.h" #include "chrome/common/mac/app_mode_common.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace { const int kErrorReturnValue = 1; @@ -37,11 +33,12 @@ typedef int (*StartFun)(const app_mode::ChromeAppModeInfo*); int LoadFrameworkAndStart(int argc, char** argv) { + using base::SysNSStringToUTF8; base::CommandLine command_line(argc, argv); @autoreleasepool { // Get the current main bundle, i.e., that of the app loader that's running. - NSBundle* app_bundle = NSBundle.mainBundle; + NSBundle* app_bundle = [NSBundle mainBundle]; if (!app_bundle) { NSLog(@"Couldn't get loader bundle"); return kErrorReturnValue; @@ -157,16 +154,16 @@ } const std::string app_mode_id = - base::SysNSStringToUTF8(info_plist[app_mode::kCrAppModeShortcutIDKey]); + SysNSStringToUTF8(info_plist[app_mode::kCrAppModeShortcutIDKey]); if (!app_mode_id.size()) { NSLog(@"Couldn't get app shortcut ID"); return kErrorReturnValue; } - const std::string app_mode_name = base::SysNSStringToUTF8( - info_plist[app_mode::kCrAppModeShortcutNameKey]); + const std::string app_mode_name = + SysNSStringToUTF8(info_plist[app_mode::kCrAppModeShortcutNameKey]); const std::string app_mode_url = - base::SysNSStringToUTF8(info_plist[app_mode::kCrAppModeShortcutURLKey]); + SysNSStringToUTF8(info_plist[app_mode::kCrAppModeShortcutURLKey]); base::FilePath plist_user_data_dir = base::mac::NSStringToFilePath( info_plist[app_mode::kCrAppModeUserDataDirKey]); @@ -175,7 +172,7 @@ info_plist[app_mode::kCrAppModeProfileDirKey]); // ** 5: Open the framework. - StartFun ChromeAppModeStart = nullptr; + StartFun ChromeAppModeStart = NULL; NSLog(@"Using framework path %s", framework_path.value().c_str()); NSLog(@"Loading framework dylib %s", framework_dylib_path.value().c_str()); void* cr_dylib = dlopen(framework_dylib_path.value().c_str(), RTLD_LAZY);
diff --git a/chrome/app_shim/app_shim_controller.h b/chrome/app_shim/app_shim_controller.h index 653afb6..476dce5 100644 --- a/chrome/app_shim/app_shim_controller.h +++ b/chrome/app_shim/app_shim_controller.h
@@ -10,6 +10,7 @@ #import <AppKit/AppKit.h> #include "base/files/file_path.h" +#include "base/mac/scoped_nsobject.h" #include "chrome/common/mac/app_shim.mojom.h" #include "mojo/public/cpp/bindings/pending_associated_receiver.h" #include "mojo/public/cpp/bindings/pending_receiver.h" @@ -19,10 +20,6 @@ #include "mojo/public/cpp/system/isolated_connection.h" #include "url/gurl.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace apps { class MachBootstrapAcceptorTest; } @@ -155,8 +152,8 @@ // Helper function to search for the Chrome instance holding // chrome::kSingletonLockFilename in the specified |user_data_dir|. - static NSRunningApplication* FindChromeFromSingletonLock( - const base::FilePath& user_data_dir); + static base::scoped_nsobject<NSRunningApplication> + FindChromeFromSingletonLock(const base::FilePath& user_data_dir); static void CreateRenderWidgetHostNSView( uint64_t view_id, @@ -182,14 +179,14 @@ // This process is determined by either: // - The pid specified to the app's command line (if it exists). // - The pid specified in the chrome::kSingletonLockFilename file. - NSRunningApplication* __strong chrome_to_connect_to_; + base::scoped_nsobject<NSRunningApplication> chrome_to_connect_to_; // The Chrome process that was launched by this app in FindOrLaunchChrome. // Note that the app is not compelled to connect to this process (consider the // case where multiple apps launch at the same time, and all launch their own // Chrome -- only one will grab the chrome::kSingletonLockFilename, and all // apps should connect to that). - NSRunningApplication* __strong chrome_launched_by_app_; + base::scoped_nsobject<NSRunningApplication> chrome_launched_by_app_; mojo::IsolatedConnection bootstrap_mojo_connection_; mojo::Remote<chrome::mojom::AppShimHostBootstrap> host_bootstrap_; @@ -198,15 +195,16 @@ mojo::Remote<chrome::mojom::AppShimHost> host_; mojo::PendingReceiver<chrome::mojom::AppShimHost> host_receiver_; - AppShimDelegate* __strong delegate_; + base::scoped_nsobject<AppShimDelegate> delegate_; InitState init_state_ = InitState::kWaitingForAppToFinishLaunch; // The target for NSMenuItems in the profile menu. - ProfileMenuTarget* __strong profile_menu_target_; + base::scoped_nsobject<ProfileMenuTarget> profile_menu_target_; // The target for NSMenuItems in the application dock menu. - ApplicationDockMenuTarget* __strong application_dock_menu_target_; + base::scoped_nsobject<ApplicationDockMenuTarget> + application_dock_menu_target_; // The screen object used in the app sim. std::unique_ptr<display::ScopedNativeScreen> screen_;
diff --git a/chrome/app_shim/app_shim_controller.mm b/chrome/app_shim/app_shim_controller.mm index 110d7ee..371952e 100644 --- a/chrome/app_shim/app_shim_controller.mm +++ b/chrome/app_shim/app_shim_controller.mm
@@ -47,10 +47,6 @@ #include "ui/display/screen.h" #include "ui/gfx/image/image.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - // The ProfileMenuTarget bridges between Objective C (as the target for the // profile menu NSMenuItems) and C++ (the mojo methods called by // AppShimController). @@ -181,8 +177,10 @@ LOG(FATAL) << "Invalid PID: " << chrome_pid_string; } - chrome_to_connect_to_ = [NSRunningApplication - runningApplicationWithProcessIdentifier:chrome_pid]; + chrome_to_connect_to_.reset( + [NSRunningApplication + runningApplicationWithProcessIdentifier:chrome_pid], + base::scoped_policy::RETAIN); if (!chrome_to_connect_to_) { // Sometimes runningApplicationWithProcessIdentifier fails to return the // application, even though it exists. If that happens, try to find the @@ -192,7 +190,7 @@ [NSWorkspace sharedWorkspace].runningApplications; for (unsigned i = 0; i < [apps count]; ++i) { if (apps[i].processIdentifier == chrome_pid) { - chrome_to_connect_to_ = apps[i]; + chrome_to_connect_to_.reset(apps[i], base::scoped_policy::RETAIN); } } if (!chrome_to_connect_to_) { @@ -243,7 +241,8 @@ LOG(FATAL) << "Failed to launch Chrome."; } - shim_controller->chrome_launched_by_app_ = app; + shim_controller->chrome_launched_by_app_.reset( + app, base::scoped_policy::RETAIN); // Start polling to see if Chrome is ready to connect. shim_controller->PollForChromeReady(kPollTimeoutSeconds); @@ -255,7 +254,8 @@ } // static -NSRunningApplication* AppShimController::FindChromeFromSingletonLock( +base::scoped_nsobject<NSRunningApplication> +AppShimController::FindChromeFromSingletonLock( const base::FilePath& user_data_dir) { base::FilePath lock_symlink_path = user_data_dir.Append(chrome::kSingletonLockFilename); @@ -265,16 +265,17 @@ // This indicates that there is no Chrome process running (or that has been // running long enough to get the lock). LOG(INFO) << "Singleton lock not found at " << lock_symlink_path.value(); - return nil; + return base::scoped_nsobject<NSRunningApplication>(); } // Open the associated pid. This could be invalid if Chrome terminated // abnormally and didn't clean up. - NSRunningApplication* process_from_lock = - [NSRunningApplication runningApplicationWithProcessIdentifier:pid]; + base::scoped_nsobject<NSRunningApplication> process_from_lock( + [NSRunningApplication runningApplicationWithProcessIdentifier:pid], + base::scoped_policy::RETAIN); if (!process_from_lock) { LOG(WARNING) << "Singleton lock pid " << pid << " invalid."; - return nil; + return base::scoped_nsobject<NSRunningApplication>(); } // Check the process' bundle id. As above, the specified pid could have been @@ -284,7 +285,7 @@ if (![expected_bundle_id isEqualToString:lock_bundle_id]) { LOG(WARNING) << "Singleton lock pid " << pid << " has unexpected bundle id."; - return nil; + return base::scoped_nsobject<NSRunningApplication>(); } return process_from_lock; @@ -318,7 +319,7 @@ { mojo::PlatformChannelEndpoint endpoint; NSString* browser_bundle_id = - base::mac::ObjCCast<NSString>([NSBundle.mainBundle + base::mac::ObjCCast<NSString>([[NSBundle mainBundle] objectForInfoDictionaryKey:app_mode::kBrowserBundleIDKey]); CHECK(browser_bundle_id); const std::string server_name = base::StringPrintf( @@ -517,15 +518,16 @@ NSObject<RenderWidgetHostViewMacDelegate>* AppShimController::GetDelegateForHost(uint64_t view_id) { - return [[AppShimRenderWidgetHostViewMacDelegate alloc] - initWithRenderWidgetHostNSViewID:view_id]; + return [[[AppShimRenderWidgetHostViewMacDelegate alloc] + initWithRenderWidgetHostNSViewID:view_id] autorelease]; } void AppShimController::CreateCommandDispatcherForWidget(uint64_t widget_id) { if (auto* bridge = remote_cocoa::NativeWidgetNSWindowBridge::GetFromId(widget_id)) { - bridge->SetCommandDispatcher([[ChromeCommandDispatcherDelegate alloc] init], - [[BrowserWindowCommandHandler alloc] init]); + bridge->SetCommandDispatcher( + [[[ChromeCommandDispatcherDelegate alloc] init] autorelease], + [[[BrowserWindowCommandHandler alloc] init] autorelease]); } else { LOG(ERROR) << "Failed to find host for command dispatcher."; } @@ -548,8 +550,8 @@ } [cocoa_profile_menu setHidden:NO]; - NSMenu* menu = [[NSMenu alloc] - initWithTitle:l10n_util::GetNSStringWithFixup(IDS_PROFILES_MENU_NAME)]; + base::scoped_nsobject<NSMenu> menu([[NSMenu alloc] + initWithTitle:l10n_util::GetNSStringWithFixup(IDS_PROFILES_MENU_NAME)]); [cocoa_profile_menu setSubmenu:menu]; // Note that this code to create menu items is nearly identical to the code @@ -558,15 +560,15 @@ const auto& mojo_item = profile_menu_items_[i]; NSString* name = base::SysUTF16ToNSString(mojo_item->name); NSMenuItem* item = - [[NSMenuItem alloc] initWithTitle:name - action:@selector(profileMenuItemSelected:) - keyEquivalent:@""]; - item.tag = mojo_item->menu_index; - item.state = - mojo_item->active ? NSControlStateValueOn : NSControlStateValueOff; - item.target = profile_menu_target_; + [[[NSMenuItem alloc] initWithTitle:name + action:@selector(profileMenuItemSelected:) + keyEquivalent:@""] autorelease]; + [item setTag:mojo_item->menu_index]; + [item setState:mojo_item->active ? NSControlStateValueOn + : NSControlStateValueOff]; + [item setTarget:profile_menu_target_.get()]; gfx::Image icon(mojo_item->icon); - item.image = icon.AsNSImage(); + [item setImage:icon.AsNSImage()]; [menu insertItem:item atIndex:i]; } } @@ -627,19 +629,19 @@ dock_menu_items_.size() == 0) return nullptr; - NSMenu* dockMenu = [[NSMenu alloc] initWithTitle:@""]; + NSMenu* dockMenu = [[[NSMenu alloc] initWithTitle:@""] autorelease]; for (size_t i = 0; i < dock_menu_items_.size(); ++i) { const auto& mojo_item = dock_menu_items_[i]; NSString* name = base::SysUTF16ToNSString(mojo_item->name); NSMenuItem* item = - [[NSMenuItem alloc] initWithTitle:name - action:@selector(commandFromDock:) - keyEquivalent:@""]; - item.tag = i; - item.target = application_dock_menu_target_; - item.enabled = - [application_dock_menu_target_ validateUserInterfaceItem:item]; + [[[NSMenuItem alloc] initWithTitle:name + action:@selector(commandFromDock:) + keyEquivalent:@""] autorelease]; + [item setTag:i]; + [item setTarget:application_dock_menu_target_]; + [item setEnabled:[application_dock_menu_target_ + validateUserInterfaceItem:item]]; [dockMenu addItem:item]; }
diff --git a/chrome/app_shim/app_shim_delegate.h b/chrome/app_shim/app_shim_delegate.h index ebcccde..2f05ef8 100644 --- a/chrome/app_shim/app_shim_delegate.h +++ b/chrome/app_shim/app_shim_delegate.h
@@ -5,6 +5,8 @@ #ifndef CHROME_APP_SHIM_APP_SHIM_DELEGATE_H_ #define CHROME_APP_SHIM_APP_SHIM_DELEGATE_H_ +#include "base/memory/raw_ptr.h" + #import <Cocoa/Cocoa.h> class AppShimController; @@ -12,7 +14,10 @@ // An application delegate to catch user interactions and send the appropriate // IPC messages to Chrome. @interface AppShimDelegate - : NSObject <NSApplicationDelegate, NSUserInterfaceValidations> + : NSObject<NSApplicationDelegate, NSUserInterfaceValidations> { + @private + raw_ptr<AppShimController> _appShimController; // Weak, owns |this| +} - (instancetype)initWithController:(AppShimController*)controller; @end
diff --git a/chrome/app_shim/app_shim_delegate.mm b/chrome/app_shim/app_shim_delegate.mm index 127b370d..7370ec2 100644 --- a/chrome/app_shim/app_shim_delegate.mm +++ b/chrome/app_shim/app_shim_delegate.mm
@@ -5,17 +5,10 @@ #include "chrome/app_shim/app_shim_delegate.h" #include "base/mac/foundation_util.h" -#include "base/memory/raw_ptr.h" #include "chrome/app_shim/app_shim_controller.h" #include "net/base/mac/url_conversions.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -@implementation AppShimDelegate { - raw_ptr<AppShimController> _appShimController; // Weak, owns |this| -} +@implementation AppShimDelegate - (instancetype)initWithController:(AppShimController*)controller { if (self = [super init])
diff --git a/chrome/app_shim/app_shim_render_widget_host_view_mac_delegate.h b/chrome/app_shim/app_shim_render_widget_host_view_mac_delegate.h index 278b0f28..5476a38 100644 --- a/chrome/app_shim/app_shim_render_widget_host_view_mac_delegate.h +++ b/chrome/app_shim/app_shim_render_widget_host_view_mac_delegate.h
@@ -7,11 +7,18 @@ #import <Cocoa/Cocoa.h> +#include "base/mac/scoped_nsobject.h" #import "content/public/browser/render_widget_host_view_mac_delegate.h" @class HistorySwiper; @interface AppShimRenderWidgetHostViewMacDelegate - : NSObject <RenderWidgetHostViewMacDelegate> + : NSObject <RenderWidgetHostViewMacDelegate> { + @private + uint64_t _nsviewIDThatWantsHistoryOverlay; + + // Responsible for 2-finger swipes history navigation. + base::scoped_nsobject<HistorySwiper> _historySwiper; +} - (instancetype)initWithRenderWidgetHostNSViewID: (uint64_t)renderWidgetHostNSViewID;
diff --git a/chrome/app_shim/app_shim_render_widget_host_view_mac_delegate.mm b/chrome/app_shim/app_shim_render_widget_host_view_mac_delegate.mm index 145f5e0a..246bac3 100644 --- a/chrome/app_shim/app_shim_render_widget_host_view_mac_delegate.mm +++ b/chrome/app_shim/app_shim_render_widget_host_view_mac_delegate.mm
@@ -10,31 +10,23 @@ #include "components/remote_cocoa/app_shim/ns_view_ids.h" #include "components/remote_cocoa/common/native_widget_ns_window_host.mojom.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - @interface AppShimRenderWidgetHostViewMacDelegate () <HistorySwiperDelegate> @end -@implementation AppShimRenderWidgetHostViewMacDelegate { - uint64_t _nsviewIDThatWantsHistoryOverlay; - - // Responsible for 2-finger swipes history navigation. - HistorySwiper* __strong _historySwiper; -} +@implementation AppShimRenderWidgetHostViewMacDelegate - (instancetype)initWithRenderWidgetHostNSViewID: (uint64_t)renderWidgetHostNSViewID { if (self = [super init]) { _nsviewIDThatWantsHistoryOverlay = renderWidgetHostNSViewID; - _historySwiper = [[HistorySwiper alloc] initWithDelegate:self]; + _historySwiper.reset([[HistorySwiper alloc] initWithDelegate:self]); } return self; } - (void)dealloc { - _historySwiper.delegate = nil; + [_historySwiper setDelegate:nil]; + [super dealloc]; } // Handle an event. All incoming key and mouse events flow through this
diff --git a/chrome/app_shim/chrome_main_app_mode_mac.mm b/chrome/app_shim/chrome_main_app_mode_mac.mm index 24370d7f7f..e0b53f7 100644 --- a/chrome/app_shim/chrome_main_app_mode_mac.mm +++ b/chrome/app_shim/chrome_main_app_mode_mac.mm
@@ -7,7 +7,6 @@ // those app bundles. #import <Cocoa/Cocoa.h> - #include <utility> #include <vector> @@ -44,10 +43,6 @@ #include "ui/base/resource/resource_bundle.h" #include "url/gurl.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - // The NSApplication for app shims is a vanilla NSApplication, but sub-class it // so that we can DCHECK that we know precisely when it is initialized. @interface AppShimApplication : NSApplication @@ -105,11 +100,10 @@ // localizations from the bundle of the running app (i.e. it is equivalent // to [[NSBundle mainBundle] preferredLocalizations]) instead of the target // bundle. - NSArray<NSString*>* preferred_languages = NSLocale.preferredLanguages; - NSArray<NSString*>* supported_languages = - base::apple::OuterBundle().localizations; + NSArray* preferred_languages = [NSLocale preferredLanguages]; + NSArray* supported_languages = [base::apple::OuterBundle() localizations]; std::string preferred_localization; - for (NSString* __strong language in preferred_languages) { + for (NSString* language in preferred_languages) { // We must convert the "-" separator to "_" to be compatible with // NSBundle::localizations() e.g. "en-GB" becomes "en_GB". // See https://crbug.com/913345. @@ -131,7 +125,7 @@ // Load localized strings and mouse cursor images. ui::ResourceBundle::InitSharedInstanceWithLocale( - locale, nullptr, ui::ResourceBundle::LOAD_COMMON_RESOURCES); + locale, NULL, ui::ResourceBundle::LOAD_COMMON_RESOURCES); ChromeContentClient chrome_content_client; content::SetContentClient(&chrome_content_client);
diff --git a/chrome/browser/3pcd_heuristics/BUILD.gn b/chrome/browser/3pcd_heuristics/BUILD.gn new file mode 100644 index 0000000..5d88e3a --- /dev/null +++ b/chrome/browser/3pcd_heuristics/BUILD.gn
@@ -0,0 +1,32 @@ +# 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. + +source_set("unit_tests") { + testonly = true + sources = [ "opener_heuristic_metrics_unittest.cc" ] + + deps = [ + "//base", + "//chrome/browser", + "//testing/gtest", + ] +} + +source_set("browser_tests") { + testonly = true + sources = [ "opener_heuristic_browsertest.cc" ] + + defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ] + + deps = [ + "//base", + "//chrome/browser", + "//chrome/browser/dips:test_utils", + "//chrome/test:test_support", + "//components/ukm:test_support", + "//content/test:test_support", + "//net:test_support", + "//testing/gtest", + ] +}
diff --git a/chrome/browser/3pcd_heuristics/opener_heuristic_browsertest.cc b/chrome/browser/3pcd_heuristics/opener_heuristic_browsertest.cc new file mode 100644 index 0000000..55007b0 --- /dev/null +++ b/chrome/browser/3pcd_heuristics/opener_heuristic_browsertest.cc
@@ -0,0 +1,413 @@ +// 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/memory/raw_ptr.h" +#include "base/test/simple_test_clock.h" +#include "base/time/time.h" +#include "chrome/browser/3pcd_heuristics/opener_heuristic_metrics.h" +#include "chrome/browser/3pcd_heuristics/opener_heuristic_tab_helper.h" +#include "chrome/browser/dips/dips_service.h" +#include "chrome/browser/dips/dips_storage.h" +#include "chrome/browser/dips/dips_test_utils.h" +#include "chrome/test/base/chrome_test_utils.h" +#include "components/ukm/test_ukm_recorder.h" +#include "content/public/browser/navigation_handle.h" +#include "content/public/browser/render_frame_host.h" +#include "content/public/browser/web_contents_observer.h" +#include "content/public/test/browser_test.h" +#include "content/public/test/browser_test_utils.h" +#include "net/dns/mock_host_resolver.h" +#include "services/metrics/public/cpp/ukm_source.h" +#include "services/metrics/public/cpp/ukm_source_id.h" +#include "third_party/blink/public/common/switches.h" + +using content::NavigationHandle; +using content::RenderFrameHost; +using content::WebContents; +using content::WebContentsObserver; +using testing::ElementsAre; +using testing::Pair; + +namespace { + +// Waits for a pop-up to open. +class PopupObserver : public WebContentsObserver { + public: + explicit PopupObserver( + WebContents* web_contents, + WindowOpenDisposition open_disposition = WindowOpenDisposition::NEW_POPUP) + : WebContentsObserver(web_contents), + open_disposition_(open_disposition) {} + + void Wait() { run_loop_.Run(); } + WebContents* popup() { return popup_; } + + private: + // WebContentsObserver overrides: + void DidOpenRequestedURL(WebContents* new_contents, + RenderFrameHost* source_render_frame_host, + const GURL& url, + const content::Referrer& referrer, + WindowOpenDisposition disposition, + ui::PageTransition transition, + bool started_from_context_menu, + bool renderer_initiated) override { + if (!popup_ && disposition == open_disposition_) { + popup_ = new_contents; + run_loop_.Quit(); + } + } + + const WindowOpenDisposition open_disposition_; + raw_ptr<WebContents> popup_ = nullptr; + base::RunLoop run_loop_; +}; + +// Waits for a navigation in the primary main frame to finish. +class NavigationFinishObserver : public WebContentsObserver { + public: + explicit NavigationFinishObserver(WebContents* web_contents) + : WebContentsObserver(web_contents) {} + + void Wait() { run_loop_.Run(); } + + private: + // WebContentsObserver overrides: + void DidFinishNavigation(NavigationHandle* navigation_handle) override { + if (!navigation_handle->IsInPrimaryMainFrame()) { + return; + } + run_loop_.Quit(); + } + + base::RunLoop run_loop_; +}; + +} // namespace + +class OpenerHeuristicBrowserTest : public PlatformBrowserTest { + public: + void SetUp() override { + OpenerHeuristicTabHelper::SetClockForTesting(&clock_); + PlatformBrowserTest::SetUp(); + } + + void SetUpCommandLine(base::CommandLine* command_line) override { + // Prevents flakiness by handling clicks even before content is drawn. + command_line->AppendSwitch(blink::switches::kAllowPreCommitInput); + } + + void SetUpOnMainThread() override { + ASSERT_TRUE(embedded_test_server()->Start()); + host_resolver()->AddRule("a.test", "127.0.0.1"); + host_resolver()->AddRule("b.test", "127.0.0.1"); + host_resolver()->AddRule("c.test", "127.0.0.1"); + DIPSService::Get(GetActiveWebContents()->GetBrowserContext()) + ->SetStorageClockForTesting(&clock_); + } + + content::WebContents* GetActiveWebContents() { + return chrome_test_utils::GetActiveWebContents(this); + } + + OpenerHeuristicTabHelper* GetTabHelper() { + return OpenerHeuristicTabHelper::FromWebContents(GetActiveWebContents()); + } + + DIPSService* GetDipsService() { + return DIPSService::Get(GetActiveWebContents()->GetBrowserContext()); + } + + void RecordInteraction(const GURL& url, base::Time time) { + auto* dips = GetDipsService(); + dips->storage() + ->AsyncCall(&DIPSStorage::RecordInteraction) + .WithArgs(url, time, dips->GetCookieMode()); + dips->storage()->FlushPostedTasksForTesting(); + } + + // Open a popup window with the given URL and return its WebContents. + base::expected<WebContents*, std::string> OpenPopup(const GURL& url) { + auto* web_contents = GetActiveWebContents(); + PopupObserver observer(web_contents); + if (!content::ExecJs( + web_contents, + content::JsReplace("window.open($1, '', 'popup');", url))) { + return base::unexpected("window.open failed"); + } + observer.Wait(); + + // Wait for the popup to finish navigating to its initial URL. + NavigationFinishObserver(observer.popup()).Wait(); + + // Wait for the read of the past interaction from the DIPS DB to complete, + // so the PopupPastInteraction UKM event is reported. + GetDipsService()->storage()->FlushPostedTasksForTesting(); + + return observer.popup(); + } + + void SimulateMouseClick(WebContents* web_contents) { + UserActivationObserver observer(web_contents, + web_contents->GetPrimaryMainFrame()); + content::SimulateMouseClick(web_contents, 0, + blink::WebMouseEvent::Button::kLeft); + observer.Wait(); + } + + base::SimpleTestClock clock_; +}; + +IN_PROC_BROWSER_TEST_F(OpenerHeuristicBrowserTest, + RootWindowDoesntHavePopupState) { + ASSERT_FALSE(GetTabHelper()->popup_observer_for_testing()); +} + +IN_PROC_BROWSER_TEST_F(OpenerHeuristicBrowserTest, + PopupsWithOpenerHavePopupState) { + WebContents* web_contents = GetActiveWebContents(); + GURL popup_url = embedded_test_server()->GetURL("a.test", "/title1.html"); + + PopupObserver observer(web_contents); + ASSERT_TRUE(content::ExecJs( + web_contents, + content::JsReplace("window.open($1, '', 'popup');", popup_url))); + observer.Wait(); + + auto* popup_tab_helper = + OpenerHeuristicTabHelper::FromWebContents(observer.popup()); + ASSERT_TRUE(popup_tab_helper); + ASSERT_TRUE(popup_tab_helper->popup_observer_for_testing()); +} + +IN_PROC_BROWSER_TEST_F(OpenerHeuristicBrowserTest, + PopupsWithoutOpenerDoNotHavePopupState) { + WebContents* web_contents = GetActiveWebContents(); + GURL popup_url = embedded_test_server()->GetURL("a.test", "/title1.html"); + + PopupObserver observer(web_contents); + ASSERT_TRUE(content::ExecJs( + web_contents, + content::JsReplace("window.open($1, '', 'popup,noopener');", popup_url))); + observer.Wait(); + + auto* popup_tab_helper = + OpenerHeuristicTabHelper::FromWebContents(observer.popup()); + ASSERT_TRUE(popup_tab_helper); + ASSERT_FALSE(popup_tab_helper->popup_observer_for_testing()); +} + +IN_PROC_BROWSER_TEST_F(OpenerHeuristicBrowserTest, NewTabsDoNotHavePopupState) { + WebContents* web_contents = GetActiveWebContents(); + GURL popup_url = embedded_test_server()->GetURL("a.test", "/title1.html"); + + PopupObserver observer(web_contents, + WindowOpenDisposition::NEW_FOREGROUND_TAB); + ASSERT_TRUE(content::ExecJs( + web_contents, content::JsReplace("window.open($1);", popup_url))); + observer.Wait(); + + auto* popup_tab_helper = + OpenerHeuristicTabHelper::FromWebContents(observer.popup()); + ASSERT_TRUE(popup_tab_helper); + ASSERT_FALSE(popup_tab_helper->popup_observer_for_testing()); +} + +IN_PROC_BROWSER_TEST_F(OpenerHeuristicBrowserTest, + PopupPastInteractionIsNotReportedWithoutInteraction) { + ukm::TestAutoSetUkmRecorder ukm_recorder; + GURL popup_url = embedded_test_server()->GetURL("a.test", "/title1.html"); + + // Note: no previous interaction on a.test. + + ASSERT_TRUE(OpenPopup(popup_url).has_value()); + + auto entries = + ukm_recorder.GetEntriesByName("OpenerHeuristic.PopupPastInteraction"); + ASSERT_EQ(entries.size(), 0u); +} + +IN_PROC_BROWSER_TEST_F(OpenerHeuristicBrowserTest, + PopupPastInteractionIsReported_WithoutRedirect) { + ukm::TestAutoSetUkmRecorder ukm_recorder; + GURL popup_url = embedded_test_server()->GetURL("a.test", "/title1.html"); + + RecordInteraction(GURL("https://a.test"), clock_.Now() - base::Hours(3)); + + ASSERT_TRUE(OpenPopup(popup_url).has_value()); + + auto entries = ukm_recorder.GetEntries("OpenerHeuristic.PopupPastInteraction", + {"HoursSinceLastInteraction"}); + ASSERT_EQ(entries.size(), 1u); + // Since the user landed on the page the popup was opened to, the UKM event + // has source type NAVIGATION_ID. + EXPECT_EQ(ukm::GetSourceIdType(entries[0].source_id), + ukm::SourceIdType::NAVIGATION_ID); + EXPECT_EQ(ukm_recorder.GetSourceForSourceId(entries[0].source_id)->url(), + popup_url); + EXPECT_THAT(entries[0].metrics, + ElementsAre(Pair("HoursSinceLastInteraction", 3))); +} + +IN_PROC_BROWSER_TEST_F(OpenerHeuristicBrowserTest, + PopupPastInteractionIsReported_ServerRedirect) { + ukm::TestAutoSetUkmRecorder ukm_recorder; + GURL popup_url = + embedded_test_server()->GetURL("a.test", "/server-redirect?title1.html"); + + RecordInteraction(GURL("https://a.test"), clock_.Now() - base::Hours(3)); + + ASSERT_TRUE(OpenPopup(popup_url).has_value()); + + auto entries = ukm_recorder.GetEntries("OpenerHeuristic.PopupPastInteraction", + {"HoursSinceLastInteraction"}); + ASSERT_EQ(entries.size(), 1u); + // Server redirect causes the UKM event to have source type REDIRECT_ID. + EXPECT_EQ(ukm::GetSourceIdType(entries[0].source_id), + ukm::SourceIdType::REDIRECT_ID); + EXPECT_EQ(ukm_recorder.GetSourceForSourceId(entries[0].source_id)->url(), + popup_url); + EXPECT_THAT(entries[0].metrics, + ElementsAre(Pair("HoursSinceLastInteraction", 3))); +} + +IN_PROC_BROWSER_TEST_F(OpenerHeuristicBrowserTest, + PopupPastInteractionIsReported_ClientRedirect) { + ukm::TestAutoSetUkmRecorder ukm_recorder; + GURL popup_url = + embedded_test_server()->GetURL("a.test", "/client-redirect?title1.html"); + + RecordInteraction(GURL("https://a.test"), clock_.Now() - base::Hours(3)); + + ASSERT_TRUE(OpenPopup(popup_url).has_value()); + + auto entries = ukm_recorder.GetEntries("OpenerHeuristic.PopupPastInteraction", + {"HoursSinceLastInteraction"}); + ASSERT_EQ(entries.size(), 1u); + // With a client redirect, we still get a source of type NAVIGATION_ID (since + // the URL committed). + EXPECT_EQ(ukm::GetSourceIdType(entries[0].source_id), + ukm::SourceIdType::NAVIGATION_ID); + EXPECT_EQ(ukm_recorder.GetSourceForSourceId(entries[0].source_id)->url(), + popup_url); + EXPECT_THAT(entries[0].metrics, + ElementsAre(Pair("HoursSinceLastInteraction", 3))); +} + +IN_PROC_BROWSER_TEST_F(OpenerHeuristicBrowserTest, + PopupPastInteractionIsReportedOnlyOnce) { + ukm::TestAutoSetUkmRecorder ukm_recorder; + GURL popup_url = embedded_test_server()->GetURL("a.test", "/title1.html"); + + RecordInteraction(GURL("https://a.test"), clock_.Now() - base::Hours(3)); + + auto maybe_popup = OpenPopup(popup_url); + ASSERT_TRUE(maybe_popup.has_value()) << maybe_popup.error(); + + ASSERT_EQ( + ukm_recorder.GetEntriesByName("OpenerHeuristic.PopupPastInteraction") + .size(), + 1u); + + ASSERT_TRUE(content::NavigateToURL( + *maybe_popup, embedded_test_server()->GetURL("b.test", "/title1.html"))); + + // After another navigation, PopupPastInteraction isn't reported again (i.e., + // still once total). + ASSERT_EQ( + ukm_recorder.GetEntriesByName("OpenerHeuristic.PopupPastInteraction") + .size(), + 1u); +} + +IN_PROC_BROWSER_TEST_F(OpenerHeuristicBrowserTest, PopupInteraction) { + ukm::TestAutoSetUkmRecorder ukm_recorder; + GURL popup_url = embedded_test_server()->GetURL("a.test", "/title1.html"); + GURL redirect_url = + embedded_test_server()->GetURL("b.test", "/server-redirect?title1.html"); + GURL final_url = embedded_test_server()->GetURL("b.test", "/title1.html"); + + auto maybe_popup = OpenPopup(popup_url); + ASSERT_TRUE(maybe_popup.has_value()) << maybe_popup.error(); + + clock_.Advance(base::Minutes(1)); + ASSERT_TRUE(content::NavigateToURL(*maybe_popup, redirect_url, final_url)); + + ASSERT_EQ( + ukm_recorder.GetEntriesByName("OpenerHeuristic.PopupInteraction").size(), + 0u); + + clock_.Advance(base::Minutes(1)); + SimulateMouseClick(*maybe_popup); + + auto entries = ukm_recorder.GetEntries("OpenerHeuristic.PopupInteraction", + {"SecondsSinceCommitted", "UrlIndex"}); + ASSERT_EQ(entries.size(), 1u); + EXPECT_EQ(ukm::GetSourceIdType(entries[0].source_id), + ukm::SourceIdType::NAVIGATION_ID); + EXPECT_EQ(ukm_recorder.GetSourceForSourceId(entries[0].source_id)->url(), + final_url); + // The time between *popup_url* committing and the click. + EXPECT_EQ(entries[0].metrics["SecondsSinceCommitted"], + BucketizeSecondsSinceCommitted(base::Minutes(2))); + // The user clicked on *final_url*, which was the third URL. + EXPECT_EQ(entries[0].metrics["UrlIndex"], 3); +} + +IN_PROC_BROWSER_TEST_F(OpenerHeuristicBrowserTest, + PopupInteractionIsOnlyReportedOnce) { + ukm::TestAutoSetUkmRecorder ukm_recorder; + GURL popup_url = embedded_test_server()->GetURL("a.test", "/title1.html"); + GURL interaction_url = + embedded_test_server()->GetURL("b.test", "/title1.html"); + GURL final_url = embedded_test_server()->GetURL("c.test", "/title1.html"); + + auto maybe_popup = OpenPopup(popup_url); + ASSERT_TRUE(maybe_popup.has_value()) << maybe_popup.error(); + + ASSERT_TRUE(content::NavigateToURL(*maybe_popup, interaction_url)); + SimulateMouseClick(*maybe_popup); + + ASSERT_EQ( + ukm_recorder.GetEntriesByName("OpenerHeuristic.PopupInteraction").size(), + 1u); + + ASSERT_TRUE(content::NavigateToURL(*maybe_popup, final_url)); + SimulateMouseClick(*maybe_popup); + + // The second click was not reported (still only 1 total). + ASSERT_EQ( + ukm_recorder.GetEntriesByName("OpenerHeuristic.PopupInteraction").size(), + 1u); +} + +IN_PROC_BROWSER_TEST_F(OpenerHeuristicBrowserTest, + PopupInteraction_IgnoreUncommitted) { + ukm::TestAutoSetUkmRecorder ukm_recorder; + GURL popup_url = embedded_test_server()->GetURL("a.test", "/title1.html"); + GURL uncommitted_url = embedded_test_server()->GetURL("c.test", "/nocontent"); + + auto maybe_popup = OpenPopup(popup_url); + ASSERT_TRUE(maybe_popup.has_value()) << maybe_popup.error(); + + clock_.Advance(base::Minutes(1)); + // Attempt a navigation which won't commit (because the HTTP response is No + // Content). + ASSERT_TRUE(content::NavigateToURL(*maybe_popup, uncommitted_url, popup_url)); + + clock_.Advance(base::Minutes(1)); + SimulateMouseClick(*maybe_popup); + + auto entries = ukm_recorder.GetEntries("OpenerHeuristic.PopupInteraction", + {"SecondsSinceCommitted", "UrlIndex"}); + ASSERT_EQ(entries.size(), 1u); + EXPECT_EQ(ukm::GetSourceIdType(entries[0].source_id), + ukm::SourceIdType::NAVIGATION_ID); + EXPECT_EQ(ukm_recorder.GetSourceForSourceId(entries[0].source_id)->url(), + popup_url); + // The uncommitted navigation was ignored. UrlIndex is still 1. + EXPECT_EQ(entries[0].metrics["SecondsSinceCommitted"], + BucketizeSecondsSinceCommitted(base::Minutes(2))); + EXPECT_EQ(entries[0].metrics["UrlIndex"], 1); +}
diff --git a/chrome/browser/3pcd_heuristics/opener_heuristic_metrics.cc b/chrome/browser/3pcd_heuristics/opener_heuristic_metrics.cc new file mode 100644 index 0000000..6a90f0a --- /dev/null +++ b/chrome/browser/3pcd_heuristics/opener_heuristic_metrics.cc
@@ -0,0 +1,80 @@ +// 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/3pcd_heuristics/opener_heuristic_metrics.h" + +#include <memory> + +#include "base/debug/leak_annotations.h" +#include "base/logging.h" +#include "base/metrics/bucket_ranges.h" +#include "base/metrics/histogram.h" + +using base::TimeDelta; + +namespace { + +std::unique_ptr<base::BucketRanges> CreateBucketRanges( + size_t bucket_count, + base::HistogramBase::Sample maximum) { + auto ranges = std::make_unique<base::BucketRanges>(bucket_count + 1); + base::Histogram::InitializeBucketRanges(1, maximum, ranges.get()); + return ranges; +} + +base::Histogram::Sample Bucketize(base::Histogram::Sample value, + const base::BucketRanges& bucket_ranges) { + // Copied from SampleVectorBase::GetBucketIndex() + size_t under = 0; + size_t over = bucket_ranges.size(); + size_t mid; + do { + DCHECK_GE(over, under); + mid = under + (over - under) / 2; + if (mid == under) { + break; + } + if (bucket_ranges.range(mid) <= value) { + under = mid; + } else { + over = mid; + } + } while (true); + + DCHECK_LE(bucket_ranges.range(mid), value); + CHECK_GT(bucket_ranges.range(mid + 1), value); + return bucket_ranges.range(mid); +} + +} // namespace + +base::Histogram::Sample BucketizeHoursSinceLastInteraction(TimeDelta td) { + constexpr size_t bucket_count = 50; + constexpr TimeDelta maximum = base::Days(30); + + // Initialize BucketRanges only once: + static const base::BucketRanges& bucket_ranges = *[=]() { + auto ranges = CreateBucketRanges(bucket_count, maximum.InHours()); + ANNOTATE_LEAKING_OBJECT_PTR(ranges.get()); + return ranges.release(); + }(); + + td = std::clamp(td, TimeDelta(), maximum); + return Bucketize(td.InHours(), bucket_ranges); +} + +base::Histogram::Sample BucketizeSecondsSinceCommitted(TimeDelta td) { + constexpr size_t bucket_count = 50; + constexpr TimeDelta maximum = base::Minutes(3); + + // Initialize BucketRanges only once: + static const base::BucketRanges& bucket_ranges = *[=]() { + auto ranges = CreateBucketRanges(bucket_count, maximum.InSeconds()); + ANNOTATE_LEAKING_OBJECT_PTR(ranges.get()); + return ranges.release(); + }(); + + td = std::clamp(td, TimeDelta(), maximum); + return Bucketize(td.InSeconds(), bucket_ranges); +}
diff --git a/chrome/browser/3pcd_heuristics/opener_heuristic_metrics.h b/chrome/browser/3pcd_heuristics/opener_heuristic_metrics.h new file mode 100644 index 0000000..134000c5 --- /dev/null +++ b/chrome/browser/3pcd_heuristics/opener_heuristic_metrics.h
@@ -0,0 +1,20 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_3PCD_HEURISTICS_OPENER_HEURISTIC_METRICS_H_ +#define CHROME_BROWSER_3PCD_HEURISTICS_OPENER_HEURISTIC_METRICS_H_ + +#include <cstdint> +#include "base/time/time.h" + +// Quantize `td` to a number of hours between 0 and 720 (30 days), and placed in +// one of 50 buckets. The buckets are distributed non-linearly by +// base::Histogram::InitializeBucketRanges(). +int32_t BucketizeHoursSinceLastInteraction(base::TimeDelta td); + +// Quantize `td` similar to UmaHistogramMediumTimes() -- number of seconds up to +// 3 minutes, in 50 buckets. +int32_t BucketizeSecondsSinceCommitted(base::TimeDelta td); + +#endif // CHROME_BROWSER_3PCD_HEURISTICS_OPENER_HEURISTIC_METRICS_H_
diff --git a/chrome/browser/3pcd_heuristics/opener_heuristic_metrics_unittest.cc b/chrome/browser/3pcd_heuristics/opener_heuristic_metrics_unittest.cc new file mode 100644 index 0000000..2b1d44b --- /dev/null +++ b/chrome/browser/3pcd_heuristics/opener_heuristic_metrics_unittest.cc
@@ -0,0 +1,55 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/3pcd_heuristics/opener_heuristic_metrics.h" + +#include "base/time/time.h" +#include "testing/gtest/include/gtest/gtest.h" + +using base::TimeDelta; + +TEST(OpenerHeuristicsMetricsTest, BucketizeHoursSinceLastInteraction) { + // The input value is clamped to be between 0 and 30 days. + EXPECT_EQ(BucketizeHoursSinceLastInteraction(base::TimeDelta::Min()), 0); + EXPECT_EQ(BucketizeHoursSinceLastInteraction(base::Seconds(0)), 0); + EXPECT_EQ(BucketizeHoursSinceLastInteraction(base::Days(30)), + base::Days(30).InHours()); + EXPECT_EQ(BucketizeHoursSinceLastInteraction(base::TimeDelta::Max()), + base::Days(30).InHours()); + + std::set<int32_t> seen_values; + int32_t last_value = 0; + for (TimeDelta td = base::Seconds(0); td <= base::Days(30); + td += base::Hours(1)) { + int32_t value = BucketizeHoursSinceLastInteraction(td); + // Values get placed in increasing buckets + ASSERT_LE(last_value, value); + seen_values.insert(value); + last_value = value; + } + // Exactly 50 buckets + ASSERT_EQ(seen_values.size(), 50u); +} + +TEST(OpenerHeuristicsMetricsTest, BucketizeSecondsSinceCommitted) { + // The input value is clamped to be between 0 and 3 minutes. + EXPECT_EQ(BucketizeSecondsSinceCommitted(base::TimeDelta::Min()), 0); + EXPECT_EQ(BucketizeSecondsSinceCommitted(base::Seconds(0)), 0); + EXPECT_EQ(BucketizeSecondsSinceCommitted(base::Minutes(3)), + base::Minutes(3).InSeconds()); + EXPECT_EQ(BucketizeSecondsSinceCommitted(base::TimeDelta::Max()), + base::Minutes(3).InSeconds()); + + std::set<int32_t> seen_values; + int32_t last_value = 0; + for (TimeDelta td; td <= base::Minutes(3); td += base::Seconds(1)) { + int32_t value = BucketizeSecondsSinceCommitted(td); + // Values get placed in increasing buckets + ASSERT_LE(last_value, value); + seen_values.insert(value); + last_value = value; + } + // Exactly 50 buckets + ASSERT_EQ(seen_values.size(), 50u); +}
diff --git a/chrome/browser/3pcd_heuristics/opener_heuristic_tab_helper.cc b/chrome/browser/3pcd_heuristics/opener_heuristic_tab_helper.cc new file mode 100644 index 0000000..0beb69f --- /dev/null +++ b/chrome/browser/3pcd_heuristics/opener_heuristic_tab_helper.cc
@@ -0,0 +1,195 @@ +// 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/3pcd_heuristics/opener_heuristic_tab_helper.h" + +#include <utility> + +#include "base/time/clock.h" +#include "base/time/default_clock.h" +#include "base/time/time.h" +#include "chrome/browser/3pcd_heuristics/opener_heuristic_metrics.h" +#include "chrome/browser/dips/dips_bounce_detector.h" +#include "chrome/browser/dips/dips_service.h" +#include "chrome/browser/dips/dips_utils.h" +#include "content/public/browser/navigation_handle.h" +#include "net/base/schemeful_site.h" +#include "services/metrics/public/cpp/ukm_builders.h" +#include "services/metrics/public/cpp/ukm_recorder.h" + +using content::NavigationHandle; +using content::RenderFrameHost; +using content::WebContents; + +namespace { + +// We don't need to protect this with a lock since it's only set while +// single-threaded in tests. +base::Clock* g_clock = nullptr; + +base::Clock* GetClock() { + return g_clock ? g_clock : base::DefaultClock::GetInstance(); +} + +} // namespace + +OpenerHeuristicTabHelper::OpenerHeuristicTabHelper(WebContents* web_contents) + : content::WebContentsObserver(web_contents), + content::WebContentsUserData<OpenerHeuristicTabHelper>(*web_contents) {} + +OpenerHeuristicTabHelper::~OpenerHeuristicTabHelper() = default; + +/* static */ +base::Clock* OpenerHeuristicTabHelper::SetClockForTesting(base::Clock* clock) { + return std::exchange(g_clock, clock); +} + +void OpenerHeuristicTabHelper::InitPopup(const GURL& url) { + popup_observer_ = std::make_unique<PopupObserver>(web_contents(), url); + + DIPSService* dips = DIPSService::Get(web_contents()->GetBrowserContext()); + if (!dips) { + // If DIPS is disabled, we can't look up past interaction. + // TODO(rtarpine): consider falling back to SiteEngagementService. + return; + } + + dips->storage() + ->AsyncCall(&DIPSStorage::Read) + .WithArgs(url) + .Then(base::BindOnce(&OpenerHeuristicTabHelper::GotPopupDipsState, + weak_factory_.GetWeakPtr())); +} + +void OpenerHeuristicTabHelper::GotPopupDipsState(const DIPSState& state) { + if (!state.user_interaction_times().has_value()) { + // No previous interaction. + return; + } + + popup_observer_->SetPastInteractionTime( + state.user_interaction_times().value().second); +} + +void OpenerHeuristicTabHelper::DidOpenRequestedURL( + WebContents* new_contents, + RenderFrameHost* source_render_frame_host, + const GURL& url, + const content::Referrer& referrer, + WindowOpenDisposition disposition, + ui::PageTransition transition, + bool started_from_context_menu, + bool renderer_initiated) { + if (disposition != WindowOpenDisposition::NEW_POPUP) { + // Ignore if not a popup. + return; + } + + if (!new_contents->HasOpener()) { + // Ignore if popup doesn't have opener access. + return; + } + + // Create an OpenerHeuristicTabHelper for the popup. + // + // Note: TabHelpers::AttachTabHelpers() creates OpenerHeuristicTabHelper, but + // on Android that can happen after DidOpenRequestedURL() is called (on other + // platforms it seems to happen first). So create it now if it doesn't already + // exist. + OpenerHeuristicTabHelper::CreateForWebContents(new_contents); + OpenerHeuristicTabHelper::FromWebContents(new_contents)->InitPopup(url); +} + +WEB_CONTENTS_USER_DATA_KEY_IMPL(OpenerHeuristicTabHelper); + +OpenerHeuristicTabHelper::PopupObserver::PopupObserver( + WebContents* web_contents, + const GURL& url) + : content::WebContentsObserver(web_contents), initial_url_(url) {} + +OpenerHeuristicTabHelper::PopupObserver::~PopupObserver() = default; + +void OpenerHeuristicTabHelper::PopupObserver::SetPastInteractionTime( + base::Time time) { + CHECK(!time_since_interaction_.has_value()) + << "SetPastInteractionTime() called more than once"; + // Technically we should use the time when the pop-up first opened. But since + // we only report this metric at hourly granularity, it shouldn't matter. + time_since_interaction_ = GetClock()->Now() - time; + + // TODO(rtarpine): consider ignoring interactions that are too old. (This + // shouldn't happen since DIPS already discards old timestamps.) + + EmitPastInteractionIfReady(); +} + +void OpenerHeuristicTabHelper::PopupObserver::EmitPastInteractionIfReady() { + if (!time_since_interaction_.has_value() || !initial_source_id_.has_value()) { + // Not enough information to emit event yet. + return; + } + + ukm::builders::OpenerHeuristic_PopupPastInteraction( + initial_source_id_.value()) + .SetHoursSinceLastInteraction( + BucketizeHoursSinceLastInteraction(time_since_interaction_.value())) + .Record(ukm::UkmRecorder::Get()); +} + +void OpenerHeuristicTabHelper::PopupObserver::DidFinishNavigation( + NavigationHandle* navigation_handle) { + if (!navigation_handle->IsInPrimaryMainFrame() || + !navigation_handle->HasCommitted() || + navigation_handle->IsSameDocument()) { + return; + } + + url_index_ += navigation_handle->GetRedirectChain().size(); + + if (initial_source_id_.has_value()) { + // Only get the source id and time for the first commit. Ignore the rest. + return; + } + + commit_time_ = GetClock()->Now(); + + if (navigation_handle->GetRedirectChain().size() > 1) { + // Get a source id for the URL the popup was originally opened with, + // even though the user was redirected elsewhere. + initial_source_id_ = GetInitialRedirectSourceId(navigation_handle); + } else { + // No redirect happened, get the source id for the committed page. + initial_source_id_ = navigation_handle->GetNextPageUkmSourceId(); + } + + EmitPastInteractionIfReady(); +} + +void OpenerHeuristicTabHelper::PopupObserver::FrameReceivedUserActivation( + RenderFrameHost* render_frame_host) { + if (!render_frame_host->IsInPrimaryMainFrame()) { + return; + } + + if (interaction_reported_) { + // Only report the first interaction. + return; + } + + if (!commit_time_.has_value()) { + // Not sure if this can happen. What happens if the user clicks before the + // popup loads its initial URL? + return; + } + + auto time_since_committed = GetClock()->Now() - *commit_time_; + ukm::builders::OpenerHeuristic_PopupInteraction( + render_frame_host->GetPageUkmSourceId()) + .SetSecondsSinceCommitted( + BucketizeSecondsSinceCommitted(time_since_committed)) + .SetUrlIndex(url_index_) + .Record(ukm::UkmRecorder::Get()); + + interaction_reported_ = true; +}
diff --git a/chrome/browser/3pcd_heuristics/opener_heuristic_tab_helper.h b/chrome/browser/3pcd_heuristics/opener_heuristic_tab_helper.h new file mode 100644 index 0000000..871d4df1 --- /dev/null +++ b/chrome/browser/3pcd_heuristics/opener_heuristic_tab_helper.h
@@ -0,0 +1,96 @@ +// 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_3PCD_HEURISTICS_OPENER_HEURISTIC_TAB_HELPER_H_ +#define CHROME_BROWSER_3PCD_HEURISTICS_OPENER_HEURISTIC_TAB_HELPER_H_ + +#include "base/memory/weak_ptr.h" +#include "base/time/time.h" +#include "content/public/browser/web_contents_observer.h" +#include "content/public/browser/web_contents_user_data.h" +#include "third_party/abseil-cpp/absl/types/optional.h" + +namespace base { +class Clock; +} + +// TODO(rtarpine): remove dependence on DIPSService. +class DIPSState; + +// Observers a WebContents to detect pop-ups with user interaction, in order to +// grant storage access. +class OpenerHeuristicTabHelper + : public content::WebContentsObserver, + public content::WebContentsUserData<OpenerHeuristicTabHelper> { + public: + // Observes a WebContents which *is* a pop-up with opener access, to detect + // user interaction and (TODO:) communicate with its opener. This is only + // public so tests can see it. + class PopupObserver : public content::WebContentsObserver { + public: + PopupObserver(content::WebContents* web_contents, const GURL& initial_url); + ~PopupObserver() override; + + // Set the time that the user previously interacted with this pop-up's site. + void SetPastInteractionTime(base::Time time); + + private: + // Emit the OpenerHeuristic.PopupPastInteraction UKM event if we have all + // the necessary information. + void EmitPastInteractionIfReady(); + + // WebContentsObserver overrides: + void DidFinishNavigation( + content::NavigationHandle* navigation_handle) override; + void FrameReceivedUserActivation( + content::RenderFrameHost* render_frame_host) override; + + // The URL originally passed to window.open(). + const GURL initial_url_; + // How long after the user last interacted with the site until the pop-up + // opened. + absl::optional<base::TimeDelta> time_since_interaction_; + // A source ID for `initial_url_`. + absl::optional<ukm::SourceId> initial_source_id_; + absl::optional<base::Time> commit_time_; + size_t url_index_ = 0; + bool interaction_reported_ = false; + }; + + ~OpenerHeuristicTabHelper() override; + + static base::Clock* SetClockForTesting(base::Clock* clock); + + PopupObserver* popup_observer_for_testing() { return popup_observer_.get(); } + + private: + // To allow use of WebContentsUserData::CreateForWebContents() + friend class content::WebContentsUserData<OpenerHeuristicTabHelper>; + + explicit OpenerHeuristicTabHelper(content::WebContents* web_contents); + + // Called when the observed WebContents is a popup. + void InitPopup(const GURL& url); + // Asynchronous callback for reading past interaction timestamps from the + // DIPSService. + void GotPopupDipsState(const DIPSState& state); + + // WebContentsObserver overrides: + void DidOpenRequestedURL(content::WebContents* new_contents, + content::RenderFrameHost* source_render_frame_host, + const GURL& url, + const content::Referrer& referrer, + WindowOpenDisposition disposition, + ui::PageTransition transition, + bool started_from_context_menu, + bool renderer_initiated) override; + + // Populated only when the observed WebContents is a pop-up. + std::unique_ptr<PopupObserver> popup_observer_; + base::WeakPtrFactory<OpenerHeuristicTabHelper> weak_factory_{this}; + + WEB_CONTENTS_USER_DATA_KEY_DECL(); +}; + +#endif // CHROME_BROWSER_3PCD_HEURISTICS_OPENER_HEURISTIC_TAB_HELPER_H_
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index e4c3e1d..e5f9474 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -138,6 +138,10 @@ # require many files from it. This makes linking more efficient. static_library("browser") { sources = [ + "3pcd_heuristics/opener_heuristic_metrics.cc", + "3pcd_heuristics/opener_heuristic_metrics.h", + "3pcd_heuristics/opener_heuristic_tab_helper.cc", + "3pcd_heuristics/opener_heuristic_tab_helper.h", "about_flags.cc", "about_flags.h", "accessibility/accessibility_labels_service.cc", @@ -3565,6 +3569,10 @@ "device_identity/device_oauth2_token_service_factory.cc", "device_identity/device_oauth2_token_service_factory.h", "device_identity/device_oauth2_token_store.h", + "device_notifications/device_connection_tracker.cc", + "device_notifications/device_connection_tracker.h", + "device_notifications/device_system_tray_icon.cc", + "device_notifications/device_system_tray_icon.h", "diagnostics/diagnostics_controller.cc", "diagnostics/diagnostics_controller.h", "diagnostics/diagnostics_metrics.cc", @@ -5355,6 +5363,8 @@ "lacros/cert/client_cert_store_lacros.h", "lacros/chrome_browser_main_extra_parts_lacros.cc", "lacros/chrome_browser_main_extra_parts_lacros.h", + "lacros/clipboard_history_lacros.cc", + "lacros/clipboard_history_lacros.h", "lacros/desk_template_client_lacros.cc", "lacros/desk_template_client_lacros.h", "lacros/device_oauth2_token_service_lacros.cc", @@ -5508,6 +5518,7 @@ "//chromeos/startup", "//chromeos/startup:constants", "//chromeos/ui/base", + "//chromeos/ui/clipboard_history", "//chromeos/ui/frame", "//chromeos/ui/wm", "//components/arc/common",
diff --git a/chrome/browser/OWNERS b/chrome/browser/OWNERS index 647fce6..b23d751 100644 --- a/chrome/browser/OWNERS +++ b/chrome/browser/OWNERS
@@ -41,6 +41,8 @@ per-file chrome_navigation_browsertest.cc=file://content/OWNERS +per-file chrome_origin_trials_browsertest.cc=file://third_party/blink/common/origin_trials/OWNERS + per-file chrome_security_exploit_browsertest.cc=file://content/OWNERS per-file chrome_service_worker_browsertest.cc=file://content/browser/service_worker/OWNERS
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 3f87ca0..81a3e67 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -2231,6 +2231,17 @@ {" - Artwork with Stockpile", kNtpPhotosModuleStockpileArtWork, std::size(kNtpPhotosModuleStockpileArtWork), nullptr}}; +const FeatureEntry::FeatureParam kNtpRealboxRevertWidthOnBlur[] = { + {ntp_features::kNtpRealboxWidthBehaviorParam, "revert"}}; +const FeatureEntry::FeatureParam kNtpRealboxAlwaysWide[] = { + {ntp_features::kNtpRealboxWidthBehaviorParam, "wide"}}; +const FeatureEntry::FeatureVariation kNtpRealboxWidthBehaviorVariations[] = { + {" - Reverts back on blur if there is secondary column", + kNtpRealboxRevertWidthOnBlur, std::size(kNtpRealboxRevertWidthOnBlur), + nullptr}, + {" - Always wide", kNtpRealboxAlwaysWide, std::size(kNtpRealboxAlwaysWide), + nullptr}}; + const FeatureEntry::FeatureParam kNtpRecipeTasksModuleFakeData[] = { {ntp_features::kNtpRecipeTasksModuleDataParam, "fake"}}; const FeatureEntry::FeatureParam kNtpRecipeTasksModuleHistorical7Days[] = { @@ -6501,6 +6512,13 @@ flag_descriptions::kNtpRealboxUseGoogleGIconDescription, kOsDesktop, FEATURE_VALUE_TYPE(ntp_features::kRealboxUseGoogleGIcon)}, + {"ntp-realbox-width-behavior", + flag_descriptions::kNtpRealboxWidthBehaviorName, + flag_descriptions::kNtpRealboxWidthBehaviorDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(ntp_features::kRealboxWidthBehavior, + kNtpRealboxWidthBehaviorVariations, + "NtpRealboxWidthBehavior")}, + {"ntp-safe-browsing-module", flag_descriptions::kNtpSafeBrowsingModuleName, flag_descriptions::kNtpSafeBrowsingModuleDescription, kOsDesktop, FEATURE_WITH_PARAMS_VALUE_TYPE(ntp_features::kNtpSafeBrowsingModule,
diff --git a/chrome/browser/android/auxiliary_search/auxiliary_search_provider.cc b/chrome/browser/android/auxiliary_search/auxiliary_search_provider.cc index 2772ee1f..ac9a831 100644 --- a/chrome/browser/android/auxiliary_search/auxiliary_search_provider.cc +++ b/chrome/browser/android/auxiliary_search/auxiliary_search_provider.cc
@@ -64,15 +64,13 @@ AuxiliarySearchProvider::~AuxiliarySearchProvider() = default; base::android::ScopedJavaLocalRef<jbyteArray> -AuxiliarySearchProvider::GetSearchableData(JNIEnv* env) const { +AuxiliarySearchProvider::GetBookmarksSearchableData(JNIEnv* env) const { auxiliary_search::AuxiliarySearchGroup group; std::string serialized_group; GetBookmarks(BookmarkModelFactory::GetForBrowserContext(profile_.get()), &group); - // TODO(crbug.com/1445112): read the tabs and fill in the |group|. - if (!group.SerializeToString(&serialized_group)) { serialized_group.clear(); } @@ -86,11 +84,11 @@ std::vector<const BookmarkNode*> nodes; bookmarks::GetMostRecentlyUsedEntries(model, kMaxBookmarksCount, &nodes); for (const BookmarkNode* node : nodes) { - auxiliary_search::AuxiliarySearchGroup_Entry* entry = - group->add_bookmarks(); + auxiliary_search::AuxiliarySearchGroup_Entry* entry = group->add_entry(); entry->set_title(base::UTF16ToUTF8(node->GetTitle())); entry->set_url(node->url().spec()); } + group->set_group_type(auxiliary_search::GroupType::BOOKMARK_GROUP); } // static
diff --git a/chrome/browser/android/auxiliary_search/auxiliary_search_provider.h b/chrome/browser/android/auxiliary_search/auxiliary_search_provider.h index 1a2762d..0905e640 100644 --- a/chrome/browser/android/auxiliary_search/auxiliary_search_provider.h +++ b/chrome/browser/android/auxiliary_search/auxiliary_search_provider.h
@@ -26,7 +26,7 @@ explicit AuxiliarySearchProvider(Profile* profile); ~AuxiliarySearchProvider() override; - base::android::ScopedJavaLocalRef<jbyteArray> GetSearchableData( + base::android::ScopedJavaLocalRef<jbyteArray> GetBookmarksSearchableData( JNIEnv* env) const; private:
diff --git a/chrome/browser/android/auxiliary_search/auxiliary_search_provider_unittest.cc b/chrome/browser/android/auxiliary_search/auxiliary_search_provider_unittest.cc index 57687da..9b673c1 100644 --- a/chrome/browser/android/auxiliary_search/auxiliary_search_provider_unittest.cc +++ b/chrome/browser/android/auxiliary_search/auxiliary_search_provider_unittest.cc
@@ -63,11 +63,11 @@ } provider->GetBookmarks(model_.get(), &group); - EXPECT_EQ(100, group.bookmarks_size()); + EXPECT_EQ(100, group.entry_size()); std::unordered_set<int> bookmark_titles_int; for (int i = 0; i < 100; i++) { - auxiliary_search::AuxiliarySearchGroup_Entry entry = group.bookmarks(i); + auxiliary_search::AuxiliarySearchGroup_Entry entry = group.entry(i); int title_int; EXPECT_TRUE(base::StringToInt(entry.title(), &title_int));
diff --git a/chrome/browser/android/auxiliary_search/proto/auxiliary_search_group.proto b/chrome/browser/android/auxiliary_search/proto/auxiliary_search_group.proto index 0824e12..2cd6944 100644 --- a/chrome/browser/android/auxiliary_search/proto/auxiliary_search_group.proto +++ b/chrome/browser/android/auxiliary_search/proto/auxiliary_search_group.proto
@@ -10,12 +10,18 @@ package auxiliary_search; +enum GroupType { + UNKNOWN_GROUP_TYPE = 0; + BOOKMARK_GROUP = 1; + TAB_GROUP = 2; +} + // Contains information about the tabs and bookmarks. message AuxiliarySearchGroup { message Entry { optional string title = 1; optional string url = 2; } - repeated Entry tabs = 1; - repeated Entry bookmarks = 2; + repeated Entry entry = 1; + optional GroupType group_type = 2; }
diff --git a/chrome/browser/apps/app_shim/BUILD.gn b/chrome/browser/apps/app_shim/BUILD.gn index 9469130f..9ea9942 100644 --- a/chrome/browser/apps/app_shim/BUILD.gn +++ b/chrome/browser/apps/app_shim/BUILD.gn
@@ -22,10 +22,7 @@ "web_app_shim_manager_delegate_mac.h", ] - configs += [ - "//build/config/compiler:enable_arc", - "//build/config/compiler:wexit_time_destructors", - ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] deps = [ "//apps",
diff --git a/chrome/browser/apps/app_shim/app_shim_listener.mm b/chrome/browser/apps/app_shim/app_shim_listener.mm index 26120f6f..e0614ffc 100644 --- a/chrome/browser/apps/app_shim/app_shim_listener.mm +++ b/chrome/browser/apps/app_shim/app_shim_listener.mm
@@ -23,11 +23,7 @@ #include "chrome/common/mac/app_mode_common.h" #include "content/public/browser/browser_task_traits.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -AppShimListener::AppShimListener() = default; +AppShimListener::AppShimListener() {} void AppShimListener::Init() { has_initialized_ = true;
diff --git a/chrome/browser/apps/app_shim/app_shim_listener_browsertest_mac.mm b/chrome/browser/apps/app_shim/app_shim_listener_browsertest_mac.mm index c87e889..cde7451a 100644 --- a/chrome/browser/apps/app_shim/app_shim_listener_browsertest_mac.mm +++ b/chrome/browser/apps/app_shim/app_shim_listener_browsertest_mac.mm
@@ -44,10 +44,6 @@ #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/ipcz/include/ipcz/ipcz.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - // A test version of the AppShimController mojo client in chrome_main_app_mode. class TestShimClient : public chrome::mojom::AppShim { public:
diff --git a/chrome/browser/apps/app_shim/app_shim_manager_mac.cc b/chrome/browser/apps/app_shim/app_shim_manager_mac.cc index ad1c9512..6123a090 100644 --- a/chrome/browser/apps/app_shim/app_shim_manager_mac.cc +++ b/chrome/browser/apps/app_shim/app_shim_manager_mac.cc
@@ -522,6 +522,19 @@ profile = ProfileForPath(host->GetProfilePath()); } } + + // If `recreate_shims` is true, it is possible that the app got uninstalled + // while an initial launch attempt took place (and failed). So check first + // if the app is still installed. + // TODO(mek): Rather than this workaround, we should make sure to destroy + // AppShimHost and terminate app shims when an app is uninstalled. + if (recreate_shims && !delegate_->AppIsInstalled(profile, host->GetAppId())) { + LOG(ERROR) + << "Attempting to launch shim for an app that is no longer installed."; + std::move(terminated_callback).Run(); + return; + } + delegate_->LaunchShim(profile, host->GetAppId(), recreate_shims, std::move(launched_callback), std::move(terminated_callback));
diff --git a/chrome/browser/apps/app_shim/mach_bootstrap_acceptor_unittest.mm b/chrome/browser/apps/app_shim/mach_bootstrap_acceptor_unittest.mm index 8a9c58c..74713e2c 100644 --- a/chrome/browser/apps/app_shim/mach_bootstrap_acceptor_unittest.mm +++ b/chrome/browser/apps/app_shim/mach_bootstrap_acceptor_unittest.mm
@@ -10,10 +10,6 @@ #include "chrome/app_shim/app_shim_controller.h" #include "testing/gtest/include/gtest/gtest.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace apps { class MachBootstrapAcceptorTest : public testing::Test {
diff --git a/chrome/browser/ash/BUILD.gn b/chrome/browser/ash/BUILD.gn index 642907c..b274d546 100644 --- a/chrome/browser/ash/BUILD.gn +++ b/chrome/browser/ash/BUILD.gn
@@ -1733,6 +1733,8 @@ "login/screens/chromevox_hint/chromevox_hint_detector.h", "login/screens/consolidated_consent_screen.cc", "login/screens/consolidated_consent_screen.h", + "login/screens/core_oobe.cc", + "login/screens/core_oobe.h", "login/screens/cryptohome_recovery_screen.cc", "login/screens/cryptohome_recovery_screen.h", "login/screens/cryptohome_recovery_setup_screen.cc",
diff --git a/chrome/browser/ash/app_restore/full_restore_app_launch_handler_browsertest.cc b/chrome/browser/ash/app_restore/full_restore_app_launch_handler_browsertest.cc index 49f415f..2465d530 100644 --- a/chrome/browser/ash/app_restore/full_restore_app_launch_handler_browsertest.cc +++ b/chrome/browser/ash/app_restore/full_restore_app_launch_handler_browsertest.cc
@@ -106,6 +106,7 @@ // Test values for a test WindowInfo object. constexpr int kActivationIndex = 2; constexpr int kDeskId = 2; +const base::Uuid kDeskUuid = base::Uuid::GenerateRandomV4(); constexpr gfx::Rect kCurrentBounds(500, 200); constexpr chromeos::WindowStateType kWindowStateType = chromeos::WindowStateType::kPrimarySnapped; @@ -165,6 +166,7 @@ // Creates a WindowInfo object and then saves it. void CreateAndSaveWindowInfo(int desk_id, + const base::Uuid& desk_uuid, const gfx::Rect& current_bounds, chromeos::WindowStateType window_state_type, ui::WindowShowState pre_minimized_show_state, @@ -180,6 +182,7 @@ ::app_restore::WindowInfo window_info; window_info.window = window.get(); window_info.desk_id = desk_id; + window_info.desk_guid = desk_uuid; window_info.current_bounds = current_bounds; window_info.window_state_type = window_state_type; @@ -202,6 +205,7 @@ window_info.window = window; window_info.activation_index = kActivationIndex; window_info.desk_id = kDeskId; + window_info.desk_guid = kDeskUuid; window_info.current_bounds = kCurrentBounds; window_info.window_state_type = WindowState::Get(window)->GetStateType(); ::full_restore::SaveWindowInfo(window_info); @@ -215,6 +219,7 @@ window_info.window = window; window_info.activation_index = activation_index; window_info.desk_id = kDeskId; + window_info.desk_guid = kDeskUuid; window_info.current_bounds = kCurrentBounds; window_info.window_state_type = window_state_type; ::full_restore::SaveWindowInfo(window_info); @@ -433,7 +438,7 @@ WindowOpenDisposition::NEW_WINDOW, display::kDefaultDisplayId, std::vector<base::FilePath>{}, nullptr)); CreateAndSaveWindowInfo( - kDeskId, kCurrentBounds, chromeos::WindowStateType::kMinimized, + kDeskId, kDeskUuid, kCurrentBounds, chromeos::WindowStateType::kMinimized, ui::SHOW_STATE_MAXIMIZED, kWindowId2, /*snap_percentage=*/0); WaitForAppLaunchInfoSaved(); @@ -896,7 +901,7 @@ app_constants::kChromeAppId, kWindowId1)); constexpr uint32_t kSnapPercentage = 75; - CreateAndSaveWindowInfo(kDeskId, kCurrentBounds, kWindowStateType, + CreateAndSaveWindowInfo(kDeskId, kDeskUuid, kCurrentBounds, kWindowStateType, ui::SHOW_STATE_DEFAULT, kWindowId1, kSnapPercentage); WaitForAppLaunchInfoSaved(); @@ -914,6 +919,7 @@ window->SetProperty(::app_restore::kRestoreWindowIdKey, kWindowId1); auto stored_window_info = GetWindowInfo(window.get()); EXPECT_EQ(kDeskId, *stored_window_info->desk_id); + EXPECT_EQ(kDeskUuid, stored_window_info->desk_guid); EXPECT_EQ(kCurrentBounds, *stored_window_info->current_bounds); EXPECT_EQ(kWindowStateType, *stored_window_info->window_state_type); EXPECT_EQ(kSnapPercentage, *stored_window_info->snap_percentage); @@ -968,7 +974,7 @@ std::make_unique<::app_restore::AppLaunchInfo>( app_constants::kChromeAppId, previous_browser_id)); CreateAndSaveWindowInfo( - kDeskId, kCurrentBounds, chromeos::WindowStateType::kNormal, + kDeskId, kDeskUuid, kCurrentBounds, chromeos::WindowStateType::kNormal, ui::SHOW_STATE_DEFAULT, previous_browser_id, /*snap_percentage=*/0); WaitForAppLaunchInfoSaved(); @@ -1001,7 +1007,7 @@ profile()->GetPath(), std::make_unique<::app_restore::AppLaunchInfo>( app_constants::kLacrosAppId, kWindowId1)); CreateAndSaveWindowInfo( - kDeskId, prerestore_bounds, chromeos::WindowStateType::kNormal, + kDeskId, kDeskUuid, prerestore_bounds, chromeos::WindowStateType::kNormal, ui::SHOW_STATE_DEFAULT, kWindowId1, /*snap_percentage=*/0); WaitForAppLaunchInfoSaved(); @@ -1154,6 +1160,7 @@ AutotestDesksApi().CreateNewDesk(); AutotestDesksApi().CreateNewDesk(); AutotestDesksApi().CreateNewDesk(); + ActivateDesk(2); ::full_restore::SetActiveProfilePath(profile()->GetPath());
diff --git a/chrome/browser/ash/arc/arc_support_host.h b/chrome/browser/ash/arc/arc_support_host.h index d8e86e84..4e4cca8 100644 --- a/chrome/browser/ash/arc/arc_support_host.h +++ b/chrome/browser/ash/arc/arc_support_host.h
@@ -27,9 +27,11 @@ public display::DisplayObserver { public: enum class UIPage { - NO_PAGE, // Hide everything. - TERMS, // Terms content page. - ARC_LOADING, // ARC loading progress page. + NO_PAGE, // Hide everything. + TERMS, // Terms content page. + ARC_LOADING, // ARC loading progress page. + // TODO(b/282761972): Remove the AD page type below, after all places where + // it's used have already been cleaned up. ACTIVE_DIRECTORY_AUTH, // Active Directory user SAML authentication. ERROR, // ARC start error page. }; @@ -70,13 +72,11 @@ // The error message to show. Error error; - // Some messages show an error code with the error string - // e.g. Something went wrong. Error code: 7 - // The value of error code for such errors can be passsed - // using this arg. - // For SIGN_IN_UNKNOWN_ERROR the arg should be specific provisioning result - // code. For SIGN_IN_CLOUD_PROVISION_FLOW_* errors the arg should be error - // code received from ARC. + // Some messages show an error code with the error string (e.g. Something + // went wrong. Error code: 7). The value of error code for such errors can + // be passed using this arg. For SIGN_IN_UNKNOWN_ERROR the arg should be + // specific provisioning result code. For SIGN_IN_CLOUD_PROVISION_FLOW_* + // errors the arg should be error code received from ARC. absl::optional<int> arg; }; @@ -127,8 +127,9 @@ virtual void OnWindowClosed() = 0; // Called when "RETRY" button on the error page is clicked, except when - // terms of service negotiation or manual authentication is onging. In those - // cases, the more specific retry function in the other delegates is called. + // terms of service negotiation or manual authentication is ongoing. In + // those cases, the more specific retry function in the other delegates is + // called. virtual void OnRetryClicked() = 0; // Called when send feedback button on error page is clicked.
diff --git a/chrome/browser/ash/arc/arc_util.cc b/chrome/browser/ash/arc/arc_util.cc index a9a220a..7a26313 100644 --- a/chrome/browser/ash/arc/arc_util.cc +++ b/chrome/browser/ash/arc/arc_util.cc
@@ -104,8 +104,9 @@ // If it can be verified it is not on ecryptfs, then it is ok. struct statfs statfs_buf; - if (statfs(path.value().c_str(), &statfs_buf) < 0) + if (statfs(path.value().c_str(), &statfs_buf) < 0) { return false; + } return statfs_buf.f_type != ECRYPTFS_SUPER_MAGIC; } @@ -129,8 +130,9 @@ // TODO(kinaba): Remove this code for accounts without user prefs. // See the comment for |g_known_compatible_users| for the detail. - if (GetFileSystemCompatibilityPref(account_id) != kFileSystemCompatible) + if (GetFileSystemCompatibilityPref(account_id) != kFileSystemCompatible) { g_known_compatible_users.Get().insert(account_id); + } } std::move(callback).Run(); } @@ -191,9 +193,9 @@ } // Play Store requires an appropriate application install mechanism. Normal - // users do this through GAIA, but Kiosk and Active Directory users use - // different application install mechanism. ARC is not allowed otherwise - // (e.g. in public sessions). cf) crbug.com/605545 + // users do this through GAIA, but Kiosk users use a different application + // install mechanism. ARC is not allowed otherwise (e.g. in public sessions, + // as described in crbug.com/605545). const user_manager::User* user = ash::ProfileHelper::Get()->GetUserByProfile(profile); if (!IsArcAllowedForUser(user)) { @@ -267,8 +269,9 @@ } bool IsArcAllowedForProfile(const Profile* profile) { - if (!IsRealUserProfile(profile)) + if (!IsRealUserProfile(profile)) { return false; + } auto it = g_profile_status_check.Get().find(profile); @@ -319,8 +322,9 @@ // Test runs on Linux workstation does not have expected /etc/lsb-release // field nor profile creation step. Hence it returns a dummy test value. - if (!base::SysInfo::IsRunningOnChromeOS()) + if (!base::SysInfo::IsRunningOnChromeOS()) { return g_arc_blocked_due_to_incompatible_filesystem_for_testing; + } // Conducts the actual check, only when running on a real Chrome OS device. return !IsArcCompatibleFileSystemUsedForUser(user); @@ -332,8 +336,9 @@ bool IsArcCompatibleFileSystemUsedForUser(const user_manager::User* user) { // Returns false for profiles not associated with users (like sign-in profile) - if (!user) + if (!user) { return false; + } // ash::UserSessionManager does the actual file system check and stores // the result to prefs, so that it survives crash-restart. @@ -393,8 +398,9 @@ // TODO(khmel): Consider finding the better way handling this. ArcSessionManager* arc_session_manager = ArcSessionManager::Get(); // |arc_session_manager| can be nullptr in unit_tests. - if (!arc_session_manager) + if (!arc_session_manager) { return false; + } if (enabled) { arc_session_manager->AllowActivation(); arc_session_manager->RequestEnable(); @@ -409,35 +415,25 @@ } bool AreArcAllOptInPreferencesIgnorableForProfile(const Profile* profile) { - // For Active Directory users, a LaForge account is created, where - // backup&restore and location services are not supported, hence the policies - // are unused. - if (IsActiveDirectoryUserForProfile(profile)) - return true; - - // Otherwise, the preferences are ignorable iff both backup&restore and - // location services are set by policy. + // The preferences are ignorable iff both backup&restore and location services + // are set by policy. const PrefService* prefs = profile->GetPrefs(); return prefs->IsManagedPreference(prefs::kArcBackupRestoreEnabled) && prefs->IsManagedPreference(prefs::kArcLocationServiceEnabled); } -bool IsActiveDirectoryUserForProfile(const Profile* profile) { - const user_manager::User* user = - ash::ProfileHelper::Get()->GetUserByProfile(profile); - return user ? user->IsActiveDirectoryUser() : false; -} - bool IsArcOobeOptInActive() { // No OOBE is expected in case Play Store is not available. - if (!IsPlayStoreAvailable()) + if (!IsPlayStoreAvailable()) { return false; + } // Check if Chrome OS OOBE flow is currently showing. // TODO(b/65861628): Redesign the OptIn flow since there is no longer reason // to have two different OptIn flows. - if (!ash::LoginDisplayHost::default_host()) + if (!ash::LoginDisplayHost::default_host()) { return false; + } // ARC OOBE opt-in will only be active if the user did not complete the // onboarding flow yet. The OnboardingCompletedVersion preference will only be @@ -450,20 +446,24 @@ bool IsArcOobeOptInConfigurationBased() { // Ignore if not applicable. - if (!IsArcOobeOptInActive()) + if (!IsArcOobeOptInActive()) { return false; + } // Check that configuration exist. auto* oobe_configuration = ash::OobeConfiguration::Get(); - if (!oobe_configuration) + if (!oobe_configuration) { return false; - if (!oobe_configuration->CheckCompleted()) + } + if (!oobe_configuration->CheckCompleted()) { return false; + } // Check configuration value that triggers automatic ARC TOS acceptance. auto& configuration = oobe_configuration->configuration(); auto auto_accept = configuration.FindBool(ash::configuration::kArcTosAutoAccept); - if (!auto_accept) + if (!auto_accept) { return false; + } return *auto_accept; } @@ -505,8 +505,9 @@ // Demo mode setup flow runs before user is created, therefore this condition // needs to be checked before any user related ones. - if (IsArcDemoModeSetupFlow()) + if (IsArcDemoModeSetupFlow()) { return true; + } if (!user_manager::UserManager::Get()->IsUserLoggedIn()) { VLOG(1) << "Skip ARC Terms of Service screen because user is not " @@ -526,12 +527,6 @@ return false; } - if (IsActiveDirectoryUserForProfile(profile)) { - VLOG(1) << "Skip ARC Terms of Service screen because it does not apply to " - "Active Directory users."; - return false; - } - if (!IsArcTermsOfServiceNegotiationNeeded(profile)) { VLOG(1) << "Skip ARC Terms of Service screen because it is already " "accepted or fully controlled by policy."; @@ -564,7 +559,7 @@ DCHECK(callback); // If ARC is not available, skip the check. - // This shortcut is just for merginally improving the log-in performance on + // This shortcut is just for marginally improving the log-in performance on // old devices without ARC. We can always safely remove the following 4 lines // without changing any functionality when, say, the code clarity becomes // more important in the future. @@ -606,15 +601,18 @@ } bool IsPlayStoreAvailable() { - if (ShouldArcAlwaysStartWithNoPlayStore()) + if (ShouldArcAlwaysStartWithNoPlayStore()) { return false; + } - if (!IsRobotOrOfflineDemoAccountMode()) + if (!IsRobotOrOfflineDemoAccountMode()) { return true; + } // Demo Mode is the only public session scenario that can launch Play. - if (!ash::DemoSession::IsDeviceInDemoMode()) + if (!ash::DemoSession::IsDeviceInDemoMode()) { return false; + } return ash::features::ShouldShowPlayStoreInDemoMode(); } @@ -627,8 +625,9 @@ aura::Window* GetArcWindow(int32_t task_id) { for (auto* window : ChromeShelfController::instance()->GetArcWindows()) { - if (arc::GetWindowTaskId(window) == task_id) + if (arc::GetWindowTaskId(window) == task_id) { return window; + } } return nullptr; @@ -691,10 +690,10 @@ } return base_name + ".RobotAccount"; } - if (profile->IsChild()) + if (profile->IsChild()) { return base_name + ".Child"; - if (IsActiveDirectoryUserForProfile(profile)) - return base_name + ".ActiveDirectory"; + } + return base_name + (policy_util::IsAccountManaged(profile) ? ".Managed" : ".Unmanaged"); }
diff --git a/chrome/browser/ash/arc/arc_util.h b/chrome/browser/ash/arc/arc_util.h index 71a6c1cf..4a7d5f1f 100644 --- a/chrome/browser/ash/arc/arc_util.h +++ b/chrome/browser/ash/arc/arc_util.h
@@ -137,14 +137,9 @@ bool SetArcPlayStoreEnabledForProfile(Profile* profile, bool enabled); // Returns whether all ARC related OptIn preferences (i.e. -// ArcBackupRestoreEnabled and ArcLocationServiceEnabled) are managed or -// unused (e.g. for Active Directory users). +// ArcBackupRestoreEnabled and ArcLocationServiceEnabled) are managed. bool AreArcAllOptInPreferencesIgnorableForProfile(const Profile* profile); -// Returns true iff there is a user associated with |profile|, and it is an -// Active Directory user. -bool IsActiveDirectoryUserForProfile(const Profile* profile); - // Returns true if ChromeOS OOBE opt-in window is currently showing. bool IsArcOobeOptInActive(); @@ -184,7 +179,7 @@ // user. bool IsSecondaryAccountForChildEnabled(); -// Skip to show OOBE/in sesion UI asking users to set up ARC OptIn +// Skip to show OOBE/in session UI asking users to set up ARC OptIn // preferences, iff all of them are managed by the admin policy. Skips in // session play terms of service for managed user and starts ARC directly. // Leaves B&R/GLS off if not set by admin since users don't see the Tos page.
diff --git a/chrome/browser/ash/arc/arc_util_unittest.cc b/chrome/browser/ash/arc/arc_util_unittest.cc index 4e181b2..95c90ddf 100644 --- a/chrome/browser/ash/arc/arc_util_unittest.cc +++ b/chrome/browser/ash/arc/arc_util_unittest.cc
@@ -86,8 +86,7 @@ command_line.AppendSwitch(switches::kTestType); switch (user_type) { - case user_manager::USER_TYPE_REGULAR: // fallthrough - case user_manager::USER_TYPE_ACTIVE_DIRECTORY: + case user_manager::USER_TYPE_REGULAR: LogIn(); break; case user_manager::USER_TYPE_PUBLIC_ACCOUNT: @@ -255,31 +254,6 @@ EXPECT_TRUE(IsArcAllowedForProfile(profile())); } -TEST_F(ChromeArcUtilTest, IsArcAllowedForProfile_ActiveDirectoryEnabled) { - base::CommandLine::ForCurrentProcess()->InitFromArgv( - {"", "--arc-availability=officially-supported"}); - ScopedLogIn login( - GetFakeUserManager(), - AccountId::AdFromUserEmailObjGuid("testing_profile@test", - "f04557de-5da2-40ce-ae9d-b8874d8da96e"), - user_manager::USER_TYPE_ACTIVE_DIRECTORY); - EXPECT_FALSE( - ash::ProfileHelper::Get()->GetUserByProfile(profile())->HasGaiaAccount()); - EXPECT_TRUE(IsArcAllowedForProfileOnFirstCall(profile())); -} - -TEST_F(ChromeArcUtilTest, IsArcAllowedForProfile_ActiveDirectoryDisabled) { - base::CommandLine::ForCurrentProcess()->InitFromArgv({""}); - ScopedLogIn login( - GetFakeUserManager(), - AccountId::AdFromUserEmailObjGuid("testing_profile@test", - "f04557de-5da2-40ce-ae9d-b8874d8da96e"), - user_manager::USER_TYPE_ACTIVE_DIRECTORY); - EXPECT_FALSE( - ash::ProfileHelper::Get()->GetUserByProfile(profile())->HasGaiaAccount()); - EXPECT_FALSE(IsArcAllowedForProfileOnFirstCall(profile())); -} - TEST_F(ChromeArcUtilTest, IsArcAllowedForProfile_KioskArcNotAvailable) { base::CommandLine::ForCurrentProcess()->InitFromArgv({""}); ScopedLogIn login(GetFakeUserManager(), @@ -475,14 +449,6 @@ // OptIn prefs are unset, the function returns false. EXPECT_FALSE(AreArcAllOptInPreferencesIgnorableForProfile(profile())); - // Prefs are unused for Active Directory users. - { - ScopedLogIn login(GetFakeUserManager(), - AccountId::AdFromUserEmailObjGuid( - profile()->GetProfileUserName(), kTestGaiaId)); - EXPECT_TRUE(AreArcAllOptInPreferencesIgnorableForProfile(profile())); - } - // OptIn prefs are set to unmanaged/OFF values, and the function returns // false. profile()->GetPrefs()->SetBoolean(prefs::kArcBackupRestoreEnabled, false); @@ -542,22 +508,6 @@ EXPECT_TRUE(AreArcAllOptInPreferencesIgnorableForProfile(profile())); } -// Test the IsActiveDirectoryUserForProfile() function for non-AD accounts. -TEST_F(ChromeArcUtilTest, IsActiveDirectoryUserForProfile_Gaia) { - ScopedLogIn login(GetFakeUserManager(), - AccountId::FromUserEmailGaiaId( - profile()->GetProfileUserName(), kTestGaiaId)); - EXPECT_FALSE(IsActiveDirectoryUserForProfile(profile())); -} - -// Test the IsActiveDirectoryUserForProfile() function for AD accounts. -TEST_F(ChromeArcUtilTest, IsActiveDirectoryUserForProfile_AD) { - ScopedLogIn login(GetFakeUserManager(), - AccountId::AdFromUserEmailObjGuid( - profile()->GetProfileUserName(), kTestGaiaId)); - EXPECT_TRUE(IsActiveDirectoryUserForProfile(profile())); -} - TEST_F(ChromeArcUtilTest, TermsOfServiceNegotiationNeededForAlreadyAccepted) { base::CommandLine::ForCurrentProcess()->InitFromArgv( {"", "--arc-availability=officially-supported"}); @@ -617,16 +567,6 @@ EXPECT_FALSE(IsArcTermsOfServiceOobeNegotiationNeeded()); } -TEST_F(ChromeArcUtilTest, TermsOfServiceOobeNegotiationNeededAdUser) { - base::CommandLine::ForCurrentProcess()->InitFromArgv( - {"", "--arc-availability=officially-supported"}); - DisableDBusForProfileManager(); - ScopedLogIn login(GetFakeUserManager(), - AccountId::AdFromUserEmailObjGuid( - profile()->GetProfileUserName(), kTestGaiaId)); - EXPECT_FALSE(IsArcTermsOfServiceOobeNegotiationNeeded()); -} - TEST_F(ChromeArcUtilTest, IsArcStatsReportingEnabled) { base::CommandLine::ForCurrentProcess()->InitFromArgv( {"", "--arc-availability=officially-supported"}); @@ -855,7 +795,7 @@ const AccountId account_id = AccountId::FromUserEmailGaiaId( profile()->GetProfileUserName(), kTestGaiaId); - // OOBE OptIn can only start if Onobarding is not completed yet. + // OOBE OptIn can only start if Onboarding is not completed yet. EXPECT_TRUE(IsArcOobeOptInActive()); // Set a version for the Onboarding to indicate that the user completed the
diff --git a/chrome/browser/ash/arc/auth/arc_auth_service.cc b/chrome/browser/ash/arc/auth/arc_auth_service.cc index 9379e22..cb0404ed 100644 --- a/chrome/browser/ash/arc/auth/arc_auth_service.cc +++ b/chrome/browser/ash/arc/auth/arc_auth_service.cc
@@ -93,11 +93,9 @@ return mojom::ChromeAccountType::OFFLINE_DEMO_ACCOUNT; } - if (profile->IsChild()) + if (profile->IsChild()) { return mojom::ChromeAccountType::CHILD_ACCOUNT; - - if (IsActiveDirectoryUserForProfile(profile)) - return mojom::ChromeAccountType::ACTIVE_DIRECTORY_ACCOUNT; + } auto* demo_session = ash::DemoSession::Get(); if (demo_session && demo_session->started()) { @@ -122,14 +120,13 @@ bool is_managed) { mojom::AccountInfoPtr account_info = mojom::AccountInfo::New(); account_info->account_name = account_name; - if (account_type == mojom::ChromeAccountType::ACTIVE_DIRECTORY_ACCOUNT) { - account_info->enrollment_token = auth_info; + + if (!is_enforced) { + account_info->auth_code = absl::nullopt; } else { - if (!is_enforced) - account_info->auth_code = absl::nullopt; - else - account_info->auth_code = auth_info; + account_info->auth_code = auth_info; } + account_info->account_type = account_type; account_info->is_managed = is_managed; return account_info; @@ -156,13 +153,15 @@ // There is no Gaia user for device local accounts, but in this case there is // always only a primary account. - if (user->IsDeviceLocalAccount()) + if (user->IsDeviceLocalAccount()) { return true; + } const AccountInfo account_info = identity_manager->FindExtendedAccountInfoByEmailAddress(account_name); - if (account_info.IsEmpty()) + if (account_info.IsEmpty()) { return false; + } DCHECK(!account_info.gaia.empty()); return IsPrimaryGaiaAccount(account_info.gaia); @@ -173,6 +172,7 @@ std::string GetAccountName(Profile* profile) { switch (GetAccountType(profile)) { case mojom::ChromeAccountType::USER_ACCOUNT: + [[fallthrough]]; case mojom::ChromeAccountType::CHILD_ACCOUNT: // IdentityManager::GetPrimaryAccountInfo( // signin::ConsentLevel::kSignin).email might be more appropriate @@ -181,9 +181,13 @@ ->GetUserByProfile(profile) ->GetDisplayEmail(); case mojom::ChromeAccountType::ROBOT_ACCOUNT: - case mojom::ChromeAccountType::ACTIVE_DIRECTORY_ACCOUNT: + [[fallthrough]]; case mojom::ChromeAccountType::OFFLINE_DEMO_ACCOUNT: return std::string(); + // TODO(b/282761972): Remove the `ACTIVE_DIRECTORY_ACCOUNT` value below, + // after it's removed from the corresponding mojom enum. + case mojom::ChromeAccountType::ACTIVE_DIRECTORY_ACCOUNT: + [[fallthrough]]; case mojom::ChromeAccountType::UNKNOWN: NOTREACHED(); return std::string(); @@ -290,20 +294,24 @@ // provisioning. // For the second and subsequent sessions, `arc::IsArcProvisioned()` will be // `true`. - if (arc::IsArcProvisioned(profile_)) + if (arc::IsArcProvisioned(profile_)) { TriggerAccountsPushToArc(false /* filter_primary_account */); + } - if (pending_get_arc_accounts_callback_) + if (pending_get_arc_accounts_callback_) { DispatchAccountsInArc(std::move(pending_get_arc_accounts_callback_)); + } // Report main account resolution status for provisioned devices. - if (!IsArcProvisioned(profile_)) + if (!IsArcProvisioned(profile_)) { return; + } auto* instance = ARC_GET_INSTANCE_FOR_METHOD(arc_bridge_service_->auth(), GetMainAccountResolutionStatus); - if (!instance) + if (!instance) { return; + } instance->GetMainAccountResolutionStatus( base::BindOnce(&ArcAuthService::OnMainAccountResolutionStatus, @@ -530,8 +538,9 @@ const CoreAccountInfo& account_info) { // Should be consistent with OnAccountAvailableInArc. // TODO(crbug/1260909): Remove IdentityManager::Observer implementation. - if (ash::AccountAppsAvailability::IsArcAccountRestrictionsEnabled()) + if (ash::AccountAppsAvailability::IsArcAccountRestrictionsEnabled()) { return; + } UpsertAccountToArc(account_info); } @@ -540,8 +549,9 @@ const AccountInfo& account_info) { // Should be consistent with OnAccountUnavailableInArc. // TODO(crbug/1260909): Remove IdentityManager::Observer implementation. - if (ash::AccountAppsAvailability::IsArcAccountRestrictionsEnabled()) + if (ash::AccountAppsAvailability::IsArcAccountRestrictionsEnabled()) { return; + } DCHECK(!IsPrimaryGaiaAccount(account_info.gaia)); @@ -586,19 +596,22 @@ void ArcAuthService::Shutdown() { identity_manager_->RemoveObserver(this); - if (account_apps_availability_) + if (account_apps_availability_) { account_apps_availability_->RemoveObserver(this); + } } void ArcAuthService::UpsertAccountToArc(const CoreAccountInfo& account_info) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - if (!ash::IsAccountManagerAvailable(profile_)) + if (!ash::IsAccountManagerAvailable(profile_)) { return; + } // Ignore the update if ARC has not been provisioned yet. - if (!arc::IsArcProvisioned(profile_)) + if (!arc::IsArcProvisioned(profile_)) { return; + } if (identity_manager_->HasAccountWithRefreshTokenInPersistentErrorState( account_info.account_id)) { @@ -609,8 +622,9 @@ auto* instance = ARC_GET_INSTANCE_FOR_METHOD(arc_bridge_service_->auth(), OnAccountUpdated); - if (!instance) + if (!instance) { return; + } const std::string account_name = account_info.email; DCHECK(!account_name.empty()); @@ -620,17 +634,20 @@ void ArcAuthService::RemoveAccountFromArc(const std::string& email) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - if (!ash::IsAccountManagerAvailable(profile_)) + if (!ash::IsAccountManagerAvailable(profile_)) { return; + } // Ignore the update if ARC has not been provisioned yet. - if (!arc::IsArcProvisioned(profile_)) + if (!arc::IsArcProvisioned(profile_)) { return; + } auto* instance = ARC_GET_INSTANCE_FOR_METHOD(arc_bridge_service_->auth(), OnAccountUpdated); - if (!instance) + if (!instance) { return; + } DCHECK(!email.empty()); instance->OnAccountUpdated(email, mojom::AccountUpdateType::REMOVAL); @@ -768,10 +785,12 @@ } void ArcAuthService::OnDataRemovalAccepted(bool accepted) { - if (!accepted) + if (!accepted) { return; - if (!IsArcPlayStoreEnabledForProfile(profile_)) + } + if (!IsArcPlayStoreEnabledForProfile(profile_)) { return; + } VLOG(1) << "Request for data removal on child transition failure is confirmed"; ArcSessionManager::Get()->RequestArcDataRemoval(); @@ -793,8 +812,9 @@ } void ArcAuthService::TriggerAccountsPushToArc(bool filter_primary_account) { - if (!ash::IsAccountManagerAvailable(profile_)) + if (!ash::IsAccountManagerAvailable(profile_)) { return; + } VLOG(1) << "Pushing accounts to ARC " << (filter_primary_account ? "without primary account" @@ -810,8 +830,9 @@ const std::vector<CoreAccountInfo> accounts = identity_manager_->GetAccountsWithRefreshTokens(); for (const CoreAccountInfo& account : accounts) { - if (filter_primary_account && IsPrimaryGaiaAccount(account.gaia)) + if (filter_primary_account && IsPrimaryGaiaAccount(account.gaia)) { continue; + } OnRefreshTokenUpdatedForAccount(account); } @@ -826,8 +847,9 @@ std::vector<mojom::ArcAccountInfoPtr>(); for (const auto& account : accounts) { DCHECK(account.key.account_type() == account_manager::AccountType::kGaia); - if (filter_primary_account && IsPrimaryGaiaAccount(account.key.id())) + if (filter_primary_account && IsPrimaryGaiaAccount(account.key.id())) { continue; + } arc_accounts.emplace_back(mojom::ArcAccountInfo::New( /*email=*/account.raw_email, /*gaia_id=*/account.key.id())); @@ -840,8 +862,9 @@ "OnAccountAvailableInArc"; for (const auto& account : accounts) { DCHECK(account.key.account_type() == account_manager::AccountType::kGaia); - if (filter_primary_account && IsPrimaryGaiaAccount(account.key.id())) + if (filter_primary_account && IsPrimaryGaiaAccount(account.key.id())) { continue; + } OnAccountAvailableInArc(account); }
diff --git a/chrome/browser/ash/arc/auth/arc_auth_service_browsertest.cc b/chrome/browser/ash/arc/auth/arc_auth_service_browsertest.cc index 20aed1908..c7b2b3d4 100644 --- a/chrome/browser/ash/arc/auth/arc_auth_service_browsertest.cc +++ b/chrome/browser/ash/arc/auth/arc_auth_service_browsertest.cc
@@ -304,8 +304,9 @@ } void TearDownOnMainThread() override { - if (arc_bridge_service_) + if (arc_bridge_service_) { arc_bridge_service_->auth()->CloseInstance(&auth_instance_); + } // Explicitly removing the user is required; otherwise ProfileHelper keeps // a dangling pointer to the User. @@ -343,14 +344,8 @@ } void SetAccountAndProfile(const user_manager::UserType user_type) { - AccountId account_id; - if (user_type == user_manager::USER_TYPE_ACTIVE_DIRECTORY) { - account_id = AccountId::AdFromUserEmailObjGuid( - kFakeUserName, "fake-active-directory-guid"); - } else { - account_id = AccountId::FromUserEmailGaiaId( - kFakeUserName, signin::GetTestGaiaIdForEmail(kFakeUserName)); - } + AccountId account_id = AccountId::FromUserEmailGaiaId( + kFakeUserName, signin::GetTestGaiaIdForEmail(kFakeUserName)); const user_manager::User* user = nullptr; switch (user_type) { case user_manager::USER_TYPE_CHILD: @@ -362,11 +357,6 @@ case user_manager::USER_TYPE_PUBLIC_ACCOUNT: user = GetFakeUserManager()->AddPublicAccountUser(account_id); break; - case user_manager::USER_TYPE_ACTIVE_DIRECTORY: - user = GetFakeUserManager()->AddUserWithAffiliationAndTypeAndProfile( - account_id, true /*is_affiliated*/, - user_manager::USER_TYPE_ACTIVE_DIRECTORY, nullptr /*profile*/); - break; case user_manager::USER_TYPE_ARC_KIOSK_APP: user = GetFakeUserManager()->AddUserWithAffiliationAndTypeAndProfile( account_id, false /*is_affiliated*/, @@ -383,8 +373,9 @@ TestingProfile::Builder profile_builder; profile_builder.SetPath(temp_dir_.GetPath().AppendASCII("TestArcProfile")); profile_builder.SetProfileName(kFakeUserName); - if (user_type == user_manager::USER_TYPE_CHILD) + if (user_type == user_manager::USER_TYPE_CHILD) { profile_builder.SetIsSupervisedProfile(); + } profile_ = IdentityTestEnvironmentProfileAdaptor:: CreateProfileForIdentityTestEnvironment(profile_builder); @@ -397,16 +388,13 @@ auto* identity_test_env = identity_test_environment_adaptor_->identity_test_env(); identity_test_env->SetAutomaticIssueOfAccessTokens(true); - if (user_type != user_manager::USER_TYPE_ACTIVE_DIRECTORY) { - // IdentityManager doesn't have a primary account for Active Directory - // sessions. Use ConsentLevel::kSignin because ARC doesn't care about - // browser sync consent. - identity_test_env->MakePrimaryAccountAvailable( - kFakeUserName, signin::ConsentLevel::kSignin); - // Wait for all callbacks to complete, so that they are not called during - // the test execution. - base::RunLoop().RunUntilIdle(); - } + // Use ConsentLevel::kSignin because ARC doesn't care about browser sync + // consent. + identity_test_env->MakePrimaryAccountAvailable( + kFakeUserName, signin::ConsentLevel::kSignin); + // Wait for all callbacks to complete, so that they are not called during + // the test execution. + base::RunLoop().RunUntilIdle(); profile()->GetPrefs()->SetBoolean(prefs::kArcSignedIn, true); profile()->GetPrefs()->SetBoolean(prefs::kArcTermsAccepted, true); @@ -517,8 +505,7 @@ void WaitForGoogleAccountsInArcCallback() { run_loop_->RunUntilIdle(); } - std::pair<std::string, mojom::ChromeAccountType> - RequestPrimaryAccount() { + std::pair<std::string, mojom::ChromeAccountType> RequestPrimaryAccount() { base::RunLoop run_loop; std::string account_name; mojom::ChromeAccountType account_type = mojom::ChromeAccountType::UNKNOWN; @@ -584,34 +571,24 @@ IN_PROC_BROWSER_TEST_P(ArcAuthServiceTest, GetPrimaryAccountForGaiaAccounts) { SetAccountAndProfile(user_manager::USER_TYPE_REGULAR); - const std::pair<std::string, mojom::ChromeAccountType> - primary_account = RequestPrimaryAccount(); + const std::pair<std::string, mojom::ChromeAccountType> primary_account = + RequestPrimaryAccount(); EXPECT_EQ(kFakeUserName, primary_account.first); EXPECT_EQ(mojom::ChromeAccountType::USER_ACCOUNT, primary_account.second); } IN_PROC_BROWSER_TEST_P(ArcAuthServiceTest, GetPrimaryAccountForChildAccounts) { SetAccountAndProfile(user_manager::USER_TYPE_CHILD); - const std::pair<std::string, mojom::ChromeAccountType> - primary_account = RequestPrimaryAccount(); + const std::pair<std::string, mojom::ChromeAccountType> primary_account = + RequestPrimaryAccount(); EXPECT_EQ(kFakeUserName, primary_account.first); EXPECT_EQ(mojom::ChromeAccountType::CHILD_ACCOUNT, primary_account.second); } -IN_PROC_BROWSER_TEST_P(ArcAuthServiceTest, - GetPrimaryAccountForActiveDirectoryAccounts) { - SetAccountAndProfile(user_manager::USER_TYPE_ACTIVE_DIRECTORY); - const std::pair<std::string, mojom::ChromeAccountType> - primary_account = RequestPrimaryAccount(); - EXPECT_EQ(std::string(), primary_account.first); - EXPECT_EQ(mojom::ChromeAccountType::ACTIVE_DIRECTORY_ACCOUNT, - primary_account.second); -} - IN_PROC_BROWSER_TEST_P(ArcAuthServiceTest, GetPrimaryAccountForPublicAccounts) { SetAccountAndProfile(user_manager::USER_TYPE_PUBLIC_ACCOUNT); - const std::pair<std::string, mojom::ChromeAccountType> - primary_account = RequestPrimaryAccount(); + const std::pair<std::string, mojom::ChromeAccountType> primary_account = + RequestPrimaryAccount(); EXPECT_EQ(std::string(), primary_account.first); EXPECT_EQ(mojom::ChromeAccountType::ROBOT_ACCOUNT, primary_account.second); } @@ -986,34 +963,10 @@ } IN_PROC_BROWSER_TEST_P(ArcAuthServiceTest, - AccountUpdatesArePropagatedForActiveDirectoryUsers) { - SetAccountAndProfile(user_manager::USER_TYPE_ACTIVE_DIRECTORY); - // Add a Secondary Account. - AccountInfo account_info = SeedAccountInfo(kSecondaryAccountEmail); - - SetInvalidRefreshTokenForAccount(account_info.account_id); - const int initial_num_calls = auth_instance().num_account_upserted_calls(); - EXPECT_EQ(1, initial_num_calls); - if (IsArcAccountRestrictionsEnabled()) { - // 1 SetAccounts() call with empty list of accounts. - EXPECT_EQ(1, auth_instance().num_set_accounts_calls()); - EXPECT_EQ(0u, auth_instance().last_set_accounts_list()->size()); - } - - // 1 call for the Secondary Account. - EXPECT_EQ(1, initial_num_calls); - - SetRefreshTokenForAccount(account_info.account_id); - // Expect exactly one call for the account update above. - EXPECT_EQ(1, - auth_instance().num_account_upserted_calls() - initial_num_calls); - EXPECT_EQ(kSecondaryAccountEmail, auth_instance().last_upserted_account()); -} - -IN_PROC_BROWSER_TEST_P(ArcAuthServiceTest, AccountUpdatesAreNotPropagatedIfAccountIsNotAvailable) { - if (!IsArcAccountRestrictionsEnabled()) + if (!IsArcAccountRestrictionsEnabled()) { return; + } AccountInfo account_info = SetupGaiaAccount(kSecondaryAccountEmail); @@ -1065,8 +1018,9 @@ IN_PROC_BROWSER_TEST_P(ArcAuthServiceTest, AccountRemovalsAreNotPropagatedIfAccountIsNotAvailable) { - if (!IsArcAccountRestrictionsEnabled()) + if (!IsArcAccountRestrictionsEnabled()) { return; + } SetAccountAndProfile(user_manager::USER_TYPE_REGULAR); SeedAccountInfo(kSecondaryAccountEmail); @@ -1327,7 +1281,7 @@ } // Test failure statuses that lead to showing data removal confirmation and - // ARC++ stopping. This block tests cancelation of data removal. + // ARC++ stopping. This block tests cancellation of data removal. for (mojom::ManagementChangeStatus status : failure_statuses) { EXPECT_EQ(ArcSessionManager::State::ACTIVE, session->state()); // Confirmation dialog is not shown.
diff --git a/chrome/browser/ash/arc/policy/managed_configuration_variables.cc b/chrome/browser/ash/arc/policy/managed_configuration_variables.cc index 67ff219..13f90e5 100644 --- a/chrome/browser/ash/arc/policy/managed_configuration_variables.cc +++ b/chrome/browser/ash/arc/policy/managed_configuration_variables.cc
@@ -193,7 +193,7 @@ DCHECK(search_input.length() >= prefix_size + capture.length()); size_t remaining_size = search_input.length() - (prefix_size + capture.length()); - search_input.set(capture.end(), remaining_size); + search_input = re2::StringPiece(capture.end(), remaining_size); } // Output the remaining |search_input|. output.emplace_back(search_input.data(), search_input.length());
diff --git a/chrome/browser/ash/arc/print_spooler/print_session_impl.cc b/chrome/browser/ash/arc/print_spooler/print_session_impl.cc index 4ccfcd7..646f4111 100644 --- a/chrome/browser/ash/arc/print_spooler/print_session_impl.cc +++ b/chrome/browser/ash/arc/print_spooler/print_session_impl.cc
@@ -22,10 +22,13 @@ #include "base/task/thread_pool.h" #include "base/time/time.h" #include "chrome/browser/ash/arc/print_spooler/arc_print_spooler_util.h" +#include "chrome/browser/pdf/pdf_pref_names.h" #include "chrome/browser/printing/print_view_manager_common.h" #include "chrome/browser/printing/printing_service.h" +#include "chrome/browser/profiles/profile.h" #include "chrome/services/printing/public/mojom/printing_service.mojom.h" #include "components/arc/intent_helper/custom_tab.h" +#include "components/prefs/pref_service.h" #include "content/public/browser/web_contents.h" #include "mojo/public/c/system/types.h" #include "net/base/filename_util.h" @@ -325,6 +328,13 @@ pdf_flattener_.set_disconnect_handler( base::BindOnce(&PrintSessionImpl::OnPdfFlattenerDisconnected, weak_ptr_factory_.GetWeakPtr())); + const PrefService* prefs = + Profile::FromBrowserContext(web_contents_->GetBrowserContext()) + ->GetPrefs(); + if (prefs->IsManagedPreference(prefs::kPdfUseSkiaRendererEnabled)) { + pdf_flattener_->SetUseSkiaRendererPolicy( + prefs->GetBoolean(prefs::kPdfUseSkiaRendererEnabled)); + } } bool inserted = callbacks_.emplace(request_id, std::move(callback)).second;
diff --git a/chrome/browser/ash/arc/session/arc_session_manager.cc b/chrome/browser/ash/arc/session/arc_session_manager.cc index 9ae7f78..36942091 100644 --- a/chrome/browser/ash/arc/session/arc_session_manager.cc +++ b/chrome/browser/ash/arc/session/arc_session_manager.cc
@@ -130,30 +130,33 @@ // * When ARC is managed, and user does not go through OOBE opt-in, // because the whole OptIn flow should happen as seamless as possible for // the user. -// For Active Directory users we always show a page notifying them that they -// have to authenticate with their identity provider (through SAML) to make -// it less weird that a browser window pops up. // Some tests require the Play Store to be shown and forces this using chromeos // switch kArcForceShowPlayStoreApp. bool ShouldLaunchPlayStoreApp(Profile* profile, bool oobe_or_assistant_wizard_start) { - if (!IsPlayStoreAvailable()) + if (!IsPlayStoreAvailable()) { return false; + } - if (oobe_or_assistant_wizard_start) + if (oobe_or_assistant_wizard_start) { return false; + } - if (ShouldShowOptInForTesting()) + if (ShouldShowOptInForTesting()) { return true; + } - if (IsRobotOrOfflineDemoAccountMode()) + if (IsRobotOrOfflineDemoAccountMode()) { return false; + } - if (IsArcOptInVerificationDisabled()) + if (IsArcOptInVerificationDisabled()) { return false; + } - if (ShouldStartArcSilentlyForManagedProfile(profile)) + if (ShouldStartArcSilentlyForManagedProfile(profile)) { return false; + } return true; } @@ -169,17 +172,21 @@ // All other managed sessions will be attended by a user and require an error // UI. bool ShouldUseErrorDialog() { - if (!g_ui_enabled) + if (!g_ui_enabled) { return false; + } - if (IsArcOptInVerificationDisabled()) + if (IsArcOptInVerificationDisabled()) { return false; + } - if (IsArcKioskMode()) + if (IsArcKioskMode()) { return false; + } - if (ash::DemoSession::IsDeviceInDemoMode()) + if (ash::DemoSession::IsDeviceInDemoMode()) { return false; + } return true; } @@ -188,8 +195,9 @@ // TODO(shaochuan): Make this an event observable by StabilityMetricsManager // and eliminate this null check. auto* stability_metrics_manager = StabilityMetricsManager::Get(); - if (!stability_metrics_manager) + if (!stability_metrics_manager) { return; + } stability_metrics_manager->ResetMetrics(); } @@ -197,14 +205,16 @@ // TODO(shaochuan): Make this an event observable by StabilityMetricsManager // and eliminate this null check. auto* stability_metrics_manager = StabilityMetricsManager::Get(); - if (!stability_metrics_manager) + if (!stability_metrics_manager) { return; + } stability_metrics_manager->SetArcEnabledState(enabled); } int GetSignInErrorCode(const arc::mojom::ArcSignInError* sign_in_error) { - if (!sign_in_error) + if (!sign_in_error) { return 0; + } #define IF_ERROR_RETURN_CODE(name, type) \ if (sign_in_error->is_##name()) { \ @@ -292,11 +302,13 @@ return ArcSupportHost::Error::SIGN_IN_BAD_AUTHENTICATION_ERROR; } - if (result.gms_sign_in_error()) + if (result.gms_sign_in_error()) { return ArcSupportHost::Error::SIGN_IN_GMS_SIGNIN_ERROR; + } - if (result.gms_check_in_error()) + if (result.gms_check_in_error()) { return ArcSupportHost::Error::SIGN_IN_GMS_CHECKIN_ERROR; + } if (result.cloud_provision_flow_error()) { return GetCloudProvisionFlowError( @@ -313,11 +325,13 @@ return ArcSupportHost::Error::NETWORK_UNAVAILABLE_ERROR; } - if (result.general_error() == mojom::GeneralSignInError::ARC_DISABLED) + if (result.general_error() == mojom::GeneralSignInError::ARC_DISABLED) { return ArcSupportHost::Error::ANDROID_MANAGEMENT_REQUIRED_ERROR; + } - if (result.stop_reason() == ArcStopReason::LOW_DISK_SPACE) + if (result.stop_reason() == ArcStopReason::LOW_DISK_SPACE) { return ArcSupportHost::Error::LOW_DISK_SPACE_ERROR; + } return ArcSupportHost::Error::SIGN_IN_UNKNOWN_ERROR; } @@ -367,8 +381,9 @@ // For ARCVM, read |kArcSaltPath| if that exists. absl::optional<std::string> salt = ReadSaltOnDisk(base::FilePath(kArcSaltPath)); - if (!salt) + if (!salt) { return ArcSessionManager::ExpansionResult{{}, false}; + } return ArcSessionManager::ExpansionResult{std::move(*salt), true}; } @@ -425,8 +440,9 @@ ScopedOptInFlowTracker& operator=(const ScopedOptInFlowTracker&) = delete; ~ScopedOptInFlowTracker() { - if (shutdown_) + if (shutdown_) { return; + } UpdateOptInFlowResultUMA(success_ ? OptInFlowResult::SUCCEEDED : OptInFlowResult::CANCELED); @@ -478,8 +494,9 @@ arc_session_runner_->AddObserver(this); arc_session_runner_->SetDemoModeDelegate( std::make_unique<ArcDemoModeDelegateImpl>()); - if (ash::SessionManagerClient::Get()) + if (ash::SessionManagerClient::Get()) { ash::SessionManagerClient::Get()->AddObserver(this); + } ResetStabilityMetrics(); ash::ConciergeClient::Get()->AddVmObserver(this); arc_dlc_installer_ = std::make_unique<ArcDlcInstaller>(); @@ -491,8 +508,9 @@ ash::ConciergeClient::Get()->RemoveVmObserver(this); - if (ash::SessionManagerClient::Get()) + if (ash::SessionManagerClient::Get()) { ash::SessionManagerClient::Get()->RemoveObserver(this); + } Shutdown(); arc_session_runner_->RemoveObserver(this); @@ -537,21 +555,25 @@ DCHECK(state_ == State::ACTIVE || state_ == State::STOPPING) << state_; state_ = State::STOPPED; - if (arc_sign_in_timer_.IsRunning()) + if (arc_sign_in_timer_.IsRunning()) { OnProvisioningFinished(ArcProvisioningResult(reason)); + } - for (auto& observer : observer_list_) + for (auto& observer : observer_list_) { observer.OnArcSessionStopped(reason); + } MaybeStartArcDataRemoval(); - if (!enable_requested_ && IsDlcRequired()) + if (!enable_requested_ && IsDlcRequired()) { arc_dlc_installer_->RequestDisable(); + } } void ArcSessionManager::OnSessionRestarting() { - for (auto& observer : observer_list_) + for (auto& observer : observer_list_) { observer.OnArcSessionRestarting(); + } } void ArcSessionManager::OnProvisioningFinished( @@ -576,7 +598,7 @@ const bool provisioning_successful = result.is_success(); if (provisioning_reported_) { - // We don't expect success ArcProvisnioningResult to be reported twice + // We don't expect success ArcProvisioningResult to be reported twice // or reported after an error. DCHECK(!provisioning_successful); // TODO(khmel): Consider changing LOG to NOTREACHED once we guaranty that @@ -586,16 +608,18 @@ return; } provisioning_reported_ = true; - if (scoped_opt_in_tracker_ && !provisioning_successful) + if (scoped_opt_in_tracker_ && !provisioning_successful) { scoped_opt_in_tracker_->TrackError(); + } if (result.general_error() == mojom::GeneralSignInError::CHROME_SERVER_COMMUNICATION_ERROR) { // TODO(poromov): Consider ARC PublicSession offline mode. // Currently ARC session will be exited below, while the main user session // will be kept alive without Android apps. - if (IsRobotOrOfflineDemoAccountMode()) + if (IsRobotOrOfflineDemoAccountMode()) { VLOG(1) << "Robot account auth code fetching error"; + } if (IsArcKioskMode()) { VLOG(1) << "Exiting kiosk session due to provisioning failure"; // Log out the user. All the cleanup will be done in Shutdown() method. @@ -623,13 +647,15 @@ result.cloud_provision_flow_error().value(), profile_); } - if (!provisioning_successful) + if (!provisioning_successful) { UpdateOptInCancelUMA(OptInCancelReason::PROVISIONING_FAILED); + } } if (provisioning_successful) { - if (support_host_) + if (support_host_) { support_host_->Close(); + } if (scoped_opt_in_tracker_) { scoped_opt_in_tracker_->TrackSuccess(); @@ -641,8 +667,9 @@ prefs->SetBoolean(prefs::kArcIsManaged, policy_util::IsAccountManaged(profile_)); - if (prefs->GetBoolean(prefs::kArcSignedIn)) + if (prefs->GetBoolean(prefs::kArcSignedIn)) { return; + } prefs->SetBoolean(prefs::kArcSignedIn, true); @@ -659,16 +686,18 @@ prefs->ClearPref(prefs::kArcProvisioningInitiatedFromOobe); - for (auto& observer : observer_list_) + for (auto& observer : observer_list_) { observer.OnArcInitialStart(); + } return; } VLOG(1) << "ARC provisioning failed: " << result << "."; if (result.stop_reason()) { - if (profile_->GetPrefs()->HasPrefPath(prefs::kArcSignedIn)) + if (profile_->GetPrefs()->HasPrefPath(prefs::kArcSignedIn)) { profile_->GetPrefs()->SetBoolean(prefs::kArcSignedIn, false); + } VLOG(1) << "ARC stopped unexpectedly"; ShutdownSession(); } @@ -881,8 +910,9 @@ void ArcSessionManager::AddObserver(ArcSessionManagerObserver* observer) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); observer_list_.AddObserver(observer); - if (property_files_expansion_result_) + if (property_files_expansion_result_) { observer->OnPropertyFilesExpanded(*property_files_expansion_result_); + } } void ArcSessionManager::RemoveObserver(ArcSessionManagerObserver* observer) { @@ -892,8 +922,9 @@ void ArcSessionManager::NotifyArcPlayStoreEnabledChanged(bool enabled) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - for (auto& observer : observer_list_) + for (auto& observer : observer_list_) { observer.OnArcPlayStoreEnabledChanged(enabled); + } } // This is the special method to support enterprise mojo API. @@ -917,15 +948,11 @@ return; } - // If ARC failed to boot normally, stop ARC. Similarly, if the current page is - // ACTIVE_DIRECTORY_AUTH, closing the window should stop ARC since the user - // chooses to not sign in. In any other case, ARC is booting normally and - // the instance should not be stopped. + // If ARC failed to boot normally, stop ARC. Otherwise, ARC is booting + // normally and the instance should not be stopped. if (state_ != State::CHECKING_REQUIREMENTS && (!support_host_ || - (support_host_->ui_page() != ArcSupportHost::UIPage::ERROR && - support_host_->ui_page() != - ArcSupportHost::UIPage::ACTIVE_DIRECTORY_AUTH))) { + support_host_->ui_page() != ArcSupportHost::UIPage::ERROR)) { return; } @@ -948,8 +975,9 @@ VLOG(1) << "ARC opt-in. Starting ARC session."; - if (IsDlcRequired()) + if (IsDlcRequired()) { arc_dlc_installer_->RequestEnable(); + } // |skipped_terms_of_service_negotiation_| flag must be preserved during the // internal ARC restart. So set it only when ARC is externally requested to // start. @@ -960,8 +988,9 @@ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); activation_is_allowed_ = true; - if (state_ == State::READY) + if (state_ == State::READY) { StartArcForRegularBoot(); + } } bool ArcSessionManager::IsPlaystoreLaunchRequestedForTesting() const { @@ -1035,8 +1064,9 @@ // done or ARC is opted out. const bool opt_in_start = IsArcOobeOptInActive(); const bool signed_in = prefs->GetBoolean(prefs::kArcSignedIn); - if (opt_in_start) + if (opt_in_start) { prefs->SetBoolean(prefs::kArcProvisioningInitiatedFromOobe, true); + } // If it is marked that sign in has been successfully done or if Play Store is // not available, then directly start ARC with skipping Play Store ToS. @@ -1055,8 +1085,9 @@ if (IsArcBlockedDueToIncompatibleFileSystem(profile_)) { // If the next step was the ToS negotiation, show a notification instead. // Otherwise, be silent now. Users are notified when clicking ARC app icons. - if (!skip_terms_of_service_negotiation && g_ui_enabled) + if (!skip_terms_of_service_negotiation && g_ui_enabled) { arc::ShowArcMigrationGuideNotification(profile_); + } return false; } @@ -1086,16 +1117,18 @@ : ArcUiAvailabilityReporter::Mode::kInSessionProvisioning); } - if (!pai_starter_ && IsPlayStoreAvailable()) + if (!pai_starter_ && IsPlayStoreAvailable()) { pai_starter_ = ArcPaiStarter::CreateIfNeeded(profile_); + } if (!fast_app_reinstall_starter_ && IsPlayStoreAvailable()) { fast_app_reinstall_starter_ = ArcFastAppReinstallStarter::CreateIfNeeded( profile_, profile_->GetPrefs()); } - if (should_start_arc_without_user_interaction) + if (should_start_arc_without_user_interaction) { AllowActivation(); + } if (skip_terms_of_service_negotiation) { state_ = State::READY; @@ -1161,8 +1194,9 @@ reenable_arc_ = false; StopArc(); - if (remove_arc_data) + if (remove_arc_data) { RequestArcDataRemoval(); + } } void ArcSessionManager::RequestDisable() { @@ -1204,8 +1238,9 @@ } // To support 1) case above, maybe start data removal. - if (state_ == State::STOPPED) + if (state_ == State::STOPPED) { MaybeStartArcDataRemoval(); + } } void ArcSessionManager::MaybeStartTermsOfServiceNegotiation() { @@ -1278,8 +1313,9 @@ DCHECK(state_ == State::CHECKING_REQUIREMENTS || state_ == State::STOPPED) << state_; - for (auto& observer : observer_list_) + for (auto& observer : observer_list_) { observer.OnArcOptInManagementCheckStarted(); + } } void ArcSessionManager::OnRequirementChecksDone( @@ -1292,8 +1328,9 @@ switch (result) { case ArcRequirementChecker::RequirementCheckResult::kOk: VLOG(1) << "Starting ARC for first sign in."; - for (auto& observer : observer_list_) + for (auto& observer : observer_list_) { observer.OnArcOptInUserAction(); + } StartArc(); break; @@ -1373,13 +1410,15 @@ // ARC must be started only if no pending data removal request exists. DCHECK(!profile_->GetPrefs()->GetBoolean(prefs::kArcDataRemoveRequested)); - for (auto& observer : observer_list_) + for (auto& observer : observer_list_) { observer.OnArcStarted(); + } start_time_ = base::TimeTicks::Now(); // In case ARC started without mini-ARC |pre_start_time_| is not set. - if (pre_start_time_.is_null()) + if (pre_start_time_.is_null()) { pre_start_time_ = start_time_; + } provisioning_reported_ = false; std::string locale; @@ -1467,8 +1506,9 @@ } ShutdownSession(); - if (support_host_) + if (support_host_) { support_host_->Close(); + } } void ArcSessionManager::MaybeStartArcDataRemoval() { @@ -1492,13 +1532,10 @@ state_ = State::STOPPED; if (result.has_value()) { - // Remove Play user ID for Active Directory managed devices. - profile_->GetPrefs()->SetString(prefs::kArcActiveDirectoryPlayUserId, - std::string()); - // Regardless of whether it is successfully done or not, notify observers. - for (auto& observer : observer_list_) + for (auto& observer : observer_list_) { observer.OnArcDataRemoved(); + } // Note: Currently, we may re-enable ARC even if data removal fails. // We may have to avoid it. @@ -1610,10 +1647,11 @@ void ArcSessionManager::OnWindowClosed() { CancelAuthCode(); - // If network-related error occured, collect UMA stats on user action. - if (support_host_ && support_host_->GetShouldShowRunNetworkTests()) + // If network-related error occurred, collect UMA stats on user action. + if (support_host_ && support_host_->GetShouldShowRunNetworkTests()) { UpdateOptInNetworkErrorActionUMA( arc::OptInNetworkErrorActionType::WINDOW_CLOSED); + } } void ArcSessionManager::OnRetryClicked() { @@ -1631,8 +1669,9 @@ // ERROR_WITH_FEEDBACK is set in OnSignInFailed(). In the case, stopping // ARC was postponed to contain its internal state into the report. // Here, on retry, stop it, then restart. - if (support_host_) + if (support_host_) { support_host_->ShowArcLoading(); + } // In unit tests ShutdownSession may be executed inline and OnSessionStopped // is called before |reenable_arc_| is set. reenable_arc_ = true; @@ -1653,9 +1692,10 @@ MaybeStartTermsOfServiceNegotiation(); } - // If network-related error occured, collect UMA stats on user action. - if (support_host_ && support_host_->GetShouldShowRunNetworkTests()) + // If network-related error occurred, collect UMA stats on user action. + if (support_host_ && support_host_->GetShouldShowRunNetworkTests()) { UpdateOptInNetworkErrorActionUMA(arc::OptInNetworkErrorActionType::RETRY); + } } void ArcSessionManager::OnSendFeedbackClicked() { @@ -1663,9 +1703,10 @@ chrome::OpenFeedbackDialog(nullptr, chrome::kFeedbackSourceArcApp); // If network-related error occurred, collect UMA stats on user action. - if (support_host_->GetShouldShowRunNetworkTests()) + if (support_host_->GetShouldShowRunNetworkTests()) { UpdateOptInNetworkErrorActionUMA( arc::OptInNetworkErrorActionType::SEND_FEEDBACK); + } } void ArcSessionManager::OnRunNetworkTestsClicked() { @@ -1674,7 +1715,7 @@ ash::DiagnosticsDialog::DiagnosticsPage::kConnectivity, support_host_->GetNativeWindow()); - // Network-related error occured so collect UMA stats on user action. + // Network-related error occurred so collect UMA stats on user action. UpdateOptInNetworkErrorActionUMA( arc::OptInNetworkErrorActionType::CHECK_NETWORK); } @@ -1708,19 +1749,22 @@ ArcSupportHost::ErrorInfo error_info, bool should_show_send_feedback, bool should_show_run_network_tests) { - if (support_host_) + if (support_host_) { support_host_->ShowError(error_info, should_show_send_feedback, should_show_run_network_tests); - for (auto& observer : observer_list_) + } + for (auto& observer : observer_list_) { observer.OnArcErrorShowRequested(error_info); + } } void ArcSessionManager::EmitLoginPromptVisibleCalled() { // Since 'login-prompt-visible' Upstart signal starts all Upstart jobs the // instance may depend on such as cras, EmitLoginPromptVisibleCalled() is the // safe place to start a mini instance. - if (!IsArcAvailable()) + if (!IsArcAvailable()) { return; + } if (IsArcVmEnabled()) { // For ARCVM, don't try to start ARCVM on login screen. @@ -1734,13 +1778,14 @@ // into ARC. For opt-out users(*), ARCVM will eventually be stopped, but the // stop request may be issued after mini-VM is started. This is a complete // waste of resources and may also cause page caches evictions making Chrome - // UI less reponsive. + // UI less responsive. // (*) This includes non-ARC Kiosk mode. See b/197510998 for more info. VLOG(1) << "Starting ARCVM on login screen is not supported."; return; } - if (!ShouldArcStartManually()) + if (!ShouldArcStartManually()) { StartMiniArc(); + } } void ArcSessionManager::ExpandPropertyFilesAndReadSalt() { @@ -1796,10 +1841,12 @@ SetUserInfo(); } - if (result.second) + if (result.second) { arc_session_runner_->ResumeRunner(); - for (auto& observer : observer_list_) + } + for (auto& observer : observer_list_) { observer.OnPropertyFilesExpanded(*property_files_expansion_result_); + } } void ArcSessionManager::StopMiniArcIfNecessary() {
diff --git a/chrome/browser/ash/arc/session/arc_session_manager_unittest.cc b/chrome/browser/ash/arc/session/arc_session_manager_unittest.cc index 5e279a6..a1ef52a 100644 --- a/chrome/browser/ash/arc/session/arc_session_manager_unittest.cc +++ b/chrome/browser/ash/arc/session/arc_session_manager_unittest.cc
@@ -345,12 +345,14 @@ bool WaitForDataRemoved(ArcSessionManager::State expected_state) { if (arc_session_manager()->state() != - ArcSessionManager::State::REMOVING_DATA_DIR) + ArcSessionManager::State::REMOVING_DATA_DIR) { return false; + } base::RunLoop().RunUntilIdle(); - if (arc_session_manager()->state() != expected_state) + if (arc_session_manager()->state() != expected_state) { return false; + } return true; } @@ -694,7 +696,7 @@ EXPECT_FALSE(arc_session_manager()->sign_in_start_time().is_null()); EXPECT_EQ(ArcSessionManager::State::ACTIVE, arc_session_manager()->state()); - // Here, provisining is not yet completed, so kArcSignedIn should be false. + // Here, provisioning is not yet completed, so kArcSignedIn should be false. EXPECT_FALSE(prefs->GetBoolean(prefs::kArcSignedIn)); EXPECT_FALSE(arc_session_manager()->pre_start_time().is_null()); EXPECT_FALSE(arc_session_manager()->start_time().is_null()); @@ -1200,7 +1202,7 @@ EXPECT_EQ(ArcSessionManager::State::ACTIVE, arc_session_manager()->state()); EXPECT_FALSE(arc_session_manager()->skipped_terms_of_service_negotiation()); - // Simualate internal restart. + // Simulate internal restart. arc_session_manager()->StopAndEnableArc(); // Fake ARC session implementation synchronously calls stop callback and // session manager should be reactivated at this moment. @@ -1416,14 +1418,15 @@ absl::get<arc::mojom::CloudProvisionFlowError>(error)))); } - if (absl::holds_alternative<ArcStopReason>(error)) + if (absl::holds_alternative<ArcStopReason>(error)) { return ArcProvisioningResult(absl::get<ArcStopReason>(error)); + } return ArcProvisioningResult(ChromeProvisioningTimeout{}); } struct ProvisioningErrorDisplayTestParam { - // the reason for arc instance stopping + // The reason for arc instance stopping. absl::variant<arc::mojom::GeneralSignInError, arc::mojom::GMSSignInError, arc::mojom::GMSCheckInError, @@ -1432,10 +1435,10 @@ ChromeProvisioningTimeout> error; - // the error sent to arc support host + // The error sent to arc support host. ArcSupportHost::Error message; - // the error code sent to arc support host + // The error code sent to arc support host. absl::optional<int> arg; }; @@ -1516,19 +1519,13 @@ class ArcSessionManagerPolicyTest : public ArcSessionManagerTestBase, - public testing::WithParamInterface< - std::tuple<bool, bool, bool, int, int>> { + public testing::WithParamInterface<std::tuple<bool, bool, int, int>> { public: void SetUp() override { ArcSessionManagerTestBase::SetUp(); AccountId account_id; - if (is_active_directory_user()) { - account_id = AccountId(AccountId::AdFromUserEmailObjGuid( - profile()->GetProfileUserName(), "1234567890")); - } else { - account_id = AccountId(AccountId::FromUserEmailGaiaId( - profile()->GetProfileUserName(), "1234567890")); - } + account_id = AccountId(AccountId::FromUserEmailGaiaId( + profile()->GetProfileUserName(), "1234567890")); GetFakeUserManager()->AddUser(account_id); GetFakeUserManager()->LoginUser(account_id); // Mocks OOBE environment so that IsArcOobeOptInActive() returns true. @@ -1547,12 +1544,10 @@ bool arc_enabled_pref_managed() const { return std::get<0>(GetParam()); } - bool is_active_directory_user() const { return std::get<1>(GetParam()); } - - bool is_oobe_optin() const { return std::get<2>(GetParam()); } + bool is_oobe_optin() const { return std::get<1>(GetParam()); } base::Value backup_restore_pref_value() const { - switch (std::get<3>(GetParam())) { + switch (std::get<2>(GetParam())) { case 0: return base::Value(); case 1: @@ -1565,7 +1560,7 @@ } base::Value location_service_pref_value() const { - switch (std::get<4>(GetParam())) { + switch (std::get<3>(GetParam())) { case 0: return base::Value(); case 1: @@ -1593,15 +1588,13 @@ EXPECT_FALSE(prefs->GetBoolean(prefs::kArcSignedIn)); EXPECT_FALSE(prefs->GetBoolean(prefs::kArcTermsAccepted)); - EXPECT_EQ(is_active_directory_user(), - IsActiveDirectoryUserForProfile(profile())); - // Enable ARC through user pref or by policy, according to the test parameter. - if (arc_enabled_pref_managed()) + if (arc_enabled_pref_managed()) { prefs->SetManagedPref(prefs::kArcEnabled, std::make_unique<base::Value>(true)); - else + } else { prefs->SetBoolean(prefs::kArcEnabled, true); + } EXPECT_TRUE(IsArcPlayStoreEnabledForProfile(profile())); // Assign test values to the prefs. @@ -1620,19 +1613,14 @@ arc_session_manager()->Initialize(); arc_session_manager()->RequestEnable(); - // Terms of Service are skipped if ARC is enabled by policy and both policies - // are either managed or unused (for Active Directory users a LaForge - // account is created, not a full Dasher account, where the policies have no - // meaning). - // Terms of Service are skipped if ARC is enabled by policy and if it's in - // session opt-in. - const bool prefs_unused = is_active_directory_user(); + // Terms of Service are skipped if ARC is enabled by policy AND (both policies + // are managed OR if ARC is in session opt-in). const bool backup_managed = backup_restore_pref_value().is_bool(); const bool location_managed = location_service_pref_value().is_bool(); const bool is_arc_oobe_optin = is_oobe_optin(); const bool expected_terms_skipping = - arc_enabled_pref_managed() && ((backup_managed && location_managed) || - prefs_unused || !is_arc_oobe_optin); + arc_enabled_pref_managed() && + ((backup_managed && location_managed) || !is_arc_oobe_optin); EXPECT_EQ(ArcSessionManager::State::CHECKING_REQUIREMENTS, arc_session_manager()->state()); EXPECT_EQ(IsArcOobeOptInActive(), is_arc_oobe_optin); @@ -1654,10 +1642,12 @@ // In case Tos is skipped, B&R and GLS should not be set if not managed. if (expected_terms_skipping) { - if (!backup_managed) + if (!backup_managed) { EXPECT_FALSE(prefs->GetBoolean(prefs::kArcBackupRestoreEnabled)); - if (!location_managed) + } + if (!location_managed) { EXPECT_FALSE(prefs->GetBoolean(prefs::kArcLocationServiceEnabled)); + } } // Managed values for the prefs are unset. @@ -1681,7 +1671,6 @@ // testing::Values is incompatible with move-only types, hence ints are used // as a proxy for base::Value. testing::Combine(testing::Bool() /* arc_enabled_pref_managed */, - testing::Bool() /* is_active_directory_user */, testing::Bool() /* is_oobe_optin */, /* backup_restore_pref_value */ testing::Values(0, // base::Value() @@ -1816,8 +1805,9 @@ arc_session_manager()->SetProfile(profile()); arc_session_manager()->Initialize(); - if (IsArcPlayStoreEnabledForProfile(profile())) + if (IsArcPlayStoreEnabledForProfile(profile())) { arc_session_manager()->RequestEnable(); + } } void TearDown() override { @@ -1836,7 +1826,7 @@ void EnableSessionManager() { // To match ConsolidatedConsentScreen logic where Google Play Store - // enabled preferencee is set to true on showing UI, which eventually + // enabled preference is set to true on showing UI, which eventually // triggers a call to RequestEnable(). arc_session_manager()->RequestEnable(); } @@ -2020,7 +2010,7 @@ // Verifies that Android container behaves as expected.* This checks: // * Whether ARC++ container alive or not on error. // * Whether Android data is removed or not on error. -// * ARC++ Container is restared on retry. +// * ARC++ Container is restarted on retry. TEST_P(ArcSessionRetryTest, ContainerRestarted) { arc_session_manager()->SetProfile(profile()); arc_session_manager()->Initialize(); @@ -2051,7 +2041,7 @@ arc_session_manager()->OnRetryClicked(); if (GetParam().data_removed) { - // Check state goes from REMOVING_DATA_DIR to CHECKING_REQUIREMENTS + // Check state goes from REMOVING_DATA_DIR to CHECKING_REQUIREMENTS. EXPECT_TRUE( WaitForDataRemoved(ArcSessionManager::State::CHECKING_REQUIREMENTS)); } @@ -2070,7 +2060,7 @@ arc_session_manager()->Shutdown(); } -// Test that when files have already been expaneded, AddObserver() immediately +// Test that when files have already been expanded, AddObserver() immediately // calls OnPropertyFilesExpanded(). TEST_F(ArcSessionManagerTest, FileExpansion_AlreadyDone) { arc_session_manager()->reset_property_files_expansion_result();
diff --git a/chrome/browser/ash/crosapi/BUILD.gn b/chrome/browser/ash/crosapi/BUILD.gn index d71a06b..92f18b9 100644 --- a/chrome/browser/ash/crosapi/BUILD.gn +++ b/chrome/browser/ash/crosapi/BUILD.gn
@@ -323,6 +323,7 @@ "//chromeos/services/network_config/public/cpp", "//chromeos/startup", "//chromeos/startup:constants", + "//chromeos/ui/clipboard_history", "//chromeos/ui/wm:wm", "//chromeos/version", "//components/app_restore", @@ -500,6 +501,7 @@ "//chromeos/crosapi/cpp:crosapi_constants", "//chromeos/printing", "//chromeos/startup:constants", + "//chromeos/ui/clipboard_history", "//components/component_updater:test_support", "//components/session_manager/core", "//printing/backend",
diff --git a/chrome/browser/ash/crosapi/clipboard_history_ash.cc b/chrome/browser/ash/crosapi/clipboard_history_ash.cc index cbb4c2e..5fa26b4 100644 --- a/chrome/browser/ash/crosapi/clipboard_history_ash.cc +++ b/chrome/browser/ash/crosapi/clipboard_history_ash.cc
@@ -4,12 +4,18 @@ #include "chrome/browser/ash/crosapi/clipboard_history_ash.h" +#include <utility> + #include "ash/public/cpp/clipboard_history_controller.h" #include "base/unguessable_token.h" +#include "chromeos/constants/chromeos_features.h" +#include "chromeos/crosapi/mojom/clipboard_history.mojom.h" +#include "chromeos/ui/clipboard_history/clipboard_history_util.h" namespace crosapi { ClipboardHistoryAsh::ClipboardHistoryAsh() = default; + ClipboardHistoryAsh::~ClipboardHistoryAsh() = default; void ClipboardHistoryAsh::BindReceiver( @@ -39,4 +45,43 @@ } } +void ClipboardHistoryAsh::RegisterClient( + mojo::PendingRemote<mojom::ClipboardHistoryClient> client) { + CHECK(chromeos::features::IsClipboardHistoryRefreshEnabled()); + + // `remote_client_` should be unbounded. Because `remote_client_` is reset in + // the cleaning function when disconnected. + CHECK(!remote_client_.is_bound()); + + remote_client_.Bind(std::move(client)); + + // `remote_client_` is a class member so it is safe to use `this` here. + remote_client_.set_disconnect_handler(base::BindOnce( + &ClipboardHistoryAsh::OnRemoteDisconnected, base::Unretained(this))); +} + +void ClipboardHistoryAsh::UpdateRemoteDescriptorsForTesting() { + // TODO(http://b/278916298): Implement client update in subsequent CLs. + + CHECK(chromeos::features::IsClipboardHistoryRefreshEnabled()); + const std::vector<crosapi::mojom::ClipboardHistoryItemDescriptor> + descriptors = chromeos::clipboard_history::QueryItemDescriptors(); + std::vector<crosapi::mojom::ClipboardHistoryItemDescriptorPtr> + descriptor_ptrs; + for (const auto& descriptor : descriptors) { + descriptor_ptrs.push_back(descriptor.Clone()); + } + + remote_client_->SetClipboardHistoryItemDescriptors( + std::move(descriptor_ptrs)); +} + +void ClipboardHistoryAsh::FlushForTesting() { + remote_client_.FlushForTesting(); // IN-TEST +} + +void ClipboardHistoryAsh::OnRemoteDisconnected() { + remote_client_.reset(); +} + } // namespace crosapi
diff --git a/chrome/browser/ash/crosapi/clipboard_history_ash.h b/chrome/browser/ash/crosapi/clipboard_history_ash.h index 364432b..00d3b37 100644 --- a/chrome/browser/ash/crosapi/clipboard_history_ash.h +++ b/chrome/browser/ash/crosapi/clipboard_history_ash.h
@@ -19,6 +19,8 @@ namespace crosapi { +// Ash-Chrome implementation of `mojom::ClipboardHistory`. Handles +// communications with Lacros. class ClipboardHistoryAsh : public mojom::ClipboardHistory { public: ClipboardHistoryAsh(); @@ -28,7 +30,7 @@ void BindReceiver(mojo::PendingReceiver<mojom::ClipboardHistory> receiver); - // crosapi::mojom::ClipboardHistory: + // mojom::ClipboardHistory: void ShowClipboard( const gfx::Rect& anchor_point, ui::MenuSourceType menu_source_type, @@ -37,11 +39,27 @@ const base::UnguessableToken& item_id, int event_flags, mojom::ClipboardHistoryControllerShowSource paste_source) override; + void RegisterClient( + mojo::PendingRemote<mojom::ClipboardHistoryClient> client) override; + + // Updates the cached descriptors on `remote_client_` with the current + // clipboard history. + void UpdateRemoteDescriptorsForTesting(); + + // Flushes the calls on `remotes_`. + void FlushForTesting(); private: + // Called when the remote client is disconnected. + void OnRemoteDisconnected(); + // This class supports any number of connections. This allows the client to // have multiple, potentially thread-affine, remotes. + // TODO(http://b/281766341): Use `mojo::Receiver` here. mojo::ReceiverSet<mojom::ClipboardHistory> receivers_; + + // There is only one client connection. + mojo::Remote<mojom::ClipboardHistoryClient> remote_client_; }; } // namespace crosapi
diff --git a/chrome/browser/ash/crosapi/clipboard_history_ash_unittest.cc b/chrome/browser/ash/crosapi/clipboard_history_ash_unittest.cc index 1cab66ac..6ba4769 100644 --- a/chrome/browser/ash/crosapi/clipboard_history_ash_unittest.cc +++ b/chrome/browser/ash/crosapi/clipboard_history_ash_unittest.cc
@@ -4,17 +4,42 @@ #include "chrome/browser/ash/crosapi/clipboard_history_ash.h" +#include <memory> #include <string> +#include <vector> #include "ash/clipboard/test_support/mock_clipboard_history_controller.h" +#include "base/functional/callback_helpers.h" +#include "base/test/bind.h" +#include "base/test/scoped_feature_list.h" +#include "base/test/task_environment.h" #include "base/unguessable_token.h" +#include "chromeos/constants/chromeos_features.h" #include "chromeos/crosapi/mojom/clipboard_history.mojom-shared.h" +#include "chromeos/ui/clipboard_history/clipboard_history_util.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/events/event_constants.h" namespace crosapi { +namespace { + +// A mocked client to check the descriptors received from Ash. +class MockedClipboardHistoryClient + : public crosapi::mojom::ClipboardHistoryClient { + public: + // crosapi::mojom::ClipboardHistoryClient: + MOCK_METHOD(void, + SetClipboardHistoryItemDescriptors, + (std::vector<crosapi::mojom::ClipboardHistoryItemDescriptorPtr>), + (override)); + + mojo::Receiver<crosapi::mojom::ClipboardHistoryClient> receiver_{this}; +}; + +} // namespace + class ClipboardHistoryAshTest : public testing::Test { public: ClipboardHistoryAsh clipboard_history_ash_; @@ -44,4 +69,104 @@ } } +class ClipboardHistoryAshWithClientTest : public ClipboardHistoryAshTest { + public: + // ClipboardHistoryAshTest: + void SetUp() override { + // Enable the clipboard history refresh feature. + scoped_feature_list_.InitWithFeatures( + /*enabled_features=*/{chromeos::features::kClipboardHistoryRefresh, + chromeos::features::kJelly}, + /*disabled_features=*/{}); + ClipboardHistoryAshTest::SetUp(); + + // Initialize `mock_client_` + mock_client_ = std::make_unique<MockedClipboardHistoryClient>(); + clipboard_history_ash_.RegisterClient( + mock_client_->receiver_.BindNewPipeAndPassRemote()); + } + + base::test::TaskEnvironment task_environment_; + base::test::ScopedFeatureList scoped_feature_list_; + std::unique_ptr<MockedClipboardHistoryClient> mock_client_; +}; + +// Verifies that the clipboard history client receives clipboard history item +// descriptors from Ash as expected. +TEST_F(ClipboardHistoryAshWithClientTest, Basics) { + std::vector<std::vector<mojom::ClipboardHistoryItemDescriptor>> test_cases = { + // Test case 1: The injected descriptors have different formats. + { + {base::UnguessableToken::Create(), + mojom::ClipboardHistoryDisplayFormat::kText, u"dummy text", + /*file_count=*/0u}, + {base::UnguessableToken::Create(), + mojom::ClipboardHistoryDisplayFormat::kPng, u"dummy png", + /*file_count=*/0u}, + {base::UnguessableToken::Create(), + mojom::ClipboardHistoryDisplayFormat::kHtml, u"dummy html", + /*file_count=*/0u}, + {base::UnguessableToken::Create(), + mojom::ClipboardHistoryDisplayFormat::kFile, u"dummy file", + /*file_count=*/1u}, + }, + // Test case 2: The injected descriptors are text descriptors with special + // contents. + { + // Element 1: A text descriptor with 100 null characters. + {base::UnguessableToken::Create(), + mojom::ClipboardHistoryDisplayFormat::kText, + std::u16string(100, '\0'), + /*file_count=*/0u}, + // Element 2: A text descriptor with 100 control characters. + {base::UnguessableToken::Create(), + mojom::ClipboardHistoryDisplayFormat::kText, std::u16string(100, 1), + /*file_count=*/0u}, + }, + // Test case 3: The injected descriptors contains the descriptors of + // unknown types. + { + {base::UnguessableToken::Create(), + mojom::ClipboardHistoryDisplayFormat::kText, u"dummy text", + /*file_count=*/0u}, + {base::UnguessableToken::Create(), + mojom::ClipboardHistoryDisplayFormat::kUnknown, u"dummy text2", + /*file_count=*/0u}, + {base::UnguessableToken::Create(), + mojom::ClipboardHistoryDisplayFormat::kUnknown, u"dummy text3", + /*file_count=*/0u}, + }, + // Test case 4: The injected descriptor array is empty. + {}}; + for (const auto& input_descriptors : test_cases) { + // Inject the test input. + chromeos::clipboard_history::SetQueryItemDescriptorsImpl( + base::BindLambdaForTesting( + [&input_descriptors]() { return input_descriptors; })); + + // Check the clipboard history item descriptors that the client receives. + EXPECT_CALL(*mock_client_, SetClipboardHistoryItemDescriptors) + .WillOnce([&input_descriptors]( + std::vector<mojom::ClipboardHistoryItemDescriptorPtr> + received_ptrs) { + std::vector<mojom::ClipboardHistoryItemDescriptor> + received_descriptors; + for (const auto& ptr : received_ptrs) { + received_descriptors.emplace_back(ptr->item_id, ptr->display_format, + ptr->display_text, + ptr->file_count); + } + EXPECT_EQ(input_descriptors, received_descriptors); + }); + + // Update the descriptors on `mock_client_`. It is not a real code path. + // The real code path is covered by other tests. + clipboard_history_ash_.UpdateRemoteDescriptorsForTesting(); + clipboard_history_ash_.FlushForTesting(); + + chromeos::clipboard_history::SetQueryItemDescriptorsImpl( + base::NullCallback()); + } +} + } // namespace crosapi
diff --git a/chrome/browser/ash/login/oobe_quick_start/connectivity/fake_connection.cc b/chrome/browser/ash/login/oobe_quick_start/connectivity/fake_connection.cc index 1b66dfb..c303829b 100644 --- a/chrome/browser/ash/login/oobe_quick_start/connectivity/fake_connection.cc +++ b/chrome/browser/ash/login/oobe_quick_start/connectivity/fake_connection.cc
@@ -55,6 +55,12 @@ await_user_verification_callback_ = std::move(callback); } +void FakeConnection::RequestAccountTransferAssertion( + const std::string& challenge_b64url, + RequestAccountTransferAssertionCallback callback) { + request_account_transfer_assertion_callback_ = std::move(callback); +} + void FakeConnection::SendWifiCredentials( absl::optional<mojom::WifiCredentials> credentials) { CHECK(wifi_credentials_callback_); @@ -67,6 +73,11 @@ std::move(await_user_verification_callback_).Run(response); } +void FakeConnection::SendAccountTransferAssertionInfo( + absl::optional<FidoAssertionInfo> assertion_info) { + std::move(request_account_transfer_assertion_callback_).Run(assertion_info); +} + bool FakeConnection::WasHandshakeInitiated() { return handshake_initiated_; }
diff --git a/chrome/browser/ash/login/oobe_quick_start/connectivity/fake_connection.h b/chrome/browser/ash/login/oobe_quick_start/connectivity/fake_connection.h index e29393d2..6bb6a1c 100644 --- a/chrome/browser/ash/login/oobe_quick_start/connectivity/fake_connection.h +++ b/chrome/browser/ash/login/oobe_quick_start/connectivity/fake_connection.h
@@ -7,6 +7,7 @@ #include <cstdint> #include "chrome/browser/ash/login/oobe_quick_start/connectivity/connection.h" +#include "chrome/browser/ash/login/oobe_quick_start/connectivity/fido_assertion_info.h" #include "chromeos/ash/services/nearby/public/mojom/quick_start_decoder_types.mojom.h" namespace ash::quick_start { @@ -44,16 +45,23 @@ void RequestWifiCredentials(int32_t session_id, RequestWifiCredentialsCallback callback) override; void WaitForUserVerification(AwaitUserVerificationCallback callback) override; + void RequestAccountTransferAssertion( + const std::string& challenge_b64url, + RequestAccountTransferAssertionCallback callback) override; bool WasHandshakeInitiated(); void SendWifiCredentials(absl::optional<mojom::WifiCredentials> credentials); void VerifyUser(absl::optional<mojom::UserVerificationResponse> response); + void SendAccountTransferAssertionInfo( + absl::optional<FidoAssertionInfo> assertion_info); private: bool handshake_initiated_ = false; HandshakeSuccessCallback handshake_success_callback_; RequestWifiCredentialsCallback wifi_credentials_callback_; AwaitUserVerificationCallback await_user_verification_callback_; + RequestAccountTransferAssertionCallback + request_account_transfer_assertion_callback_; base::WeakPtrFactory<FakeConnection> weak_ptr_factory_{this}; };
diff --git a/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.cc b/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.cc index 05c3ff01..bc09acb 100644 --- a/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.cc +++ b/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.cc
@@ -11,6 +11,7 @@ #include "base/hash/hash.h" #include "base/uuid.h" #include "base/values.h" +#include "chrome/browser/ash/login/oobe_quick_start/connectivity/fido_assertion_info.h" #include "chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker.h" #include "chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_factory.h" #include "chrome/browser/ash/login/oobe_quick_start/logging/logging.h" @@ -270,4 +271,32 @@ NotifyObservers(); } +void TargetDeviceBootstrapController::AttemptGoogleAccountTransfer() { + CHECK(authenticated_connection_); + + status_.step = Step::TRANSFERRING_GOOGLE_ACCOUNT_DETAILS; + status_.payload.emplace<absl::monostate>(); + NotifyObservers(); + + // TODO: Actually pass through a real challenge here. + authenticated_connection_->RequestAccountTransferAssertion( + "", + base::BindOnce(&TargetDeviceBootstrapController::OnFidoAssertionReceived, + weak_ptr_factory_.GetWeakPtr())); +} + +void TargetDeviceBootstrapController::OnFidoAssertionReceived( + absl::optional<FidoAssertionInfo> assertion) { + if (!assertion.has_value()) { + status_.step = Step::ERROR; + status_.payload = ErrorCode::GAIA_ASSERTION_NOT_RECEIVED; + NotifyObservers(); + return; + } + + status_.step = Step::TRANSFERRED_GOOGLE_ACCOUNT_DETAILS; + status_.payload.emplace<absl::monostate>(); + NotifyObservers(); +} + } // namespace ash::quick_start
diff --git a/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.h b/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.h index 4031fc9..397f9cf 100644 --- a/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.h +++ b/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.h
@@ -12,6 +12,7 @@ #include "base/memory/weak_ptr.h" #include "base/observer_list.h" #include "base/observer_list_types.h" +#include "chrome/browser/ash/login/oobe_quick_start/connectivity/fido_assertion_info.h" #include "chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker.h" #include "chromeos/ash/services/nearby/public/mojom/quick_start_decoder_types.mojom.h" #include "third_party/abseil-cpp/absl/types/variant.h" @@ -38,7 +39,9 @@ CONNECTED, GAIA_CREDENTIALS, CONNECTING_TO_WIFI, - CONNECTED_TO_WIFI + CONNECTED_TO_WIFI, + TRANSFERRING_GOOGLE_ACCOUNT_DETAILS, + TRANSFERRED_GOOGLE_ACCOUNT_DETAILS, }; enum class ErrorCode { @@ -47,6 +50,7 @@ CONNECTION_CLOSED, WIFI_CREDENTIALS_NOT_RECEIVED, USER_VERIFICATION_FAILED, + GAIA_ASSERTION_NOT_RECEIVED, }; using QRCodePixelData = std::vector<uint8_t>; @@ -105,6 +109,7 @@ TargetDeviceConnectionBroker::ConnectionClosedReason reason) override; void AttemptWifiCredentialTransfer(); + void AttemptGoogleAccountTransfer(); private: friend class TargetDeviceBootstrapControllerTest; @@ -126,6 +131,7 @@ void OnWifiCredentialsReceived( absl::optional<mojom::WifiCredentials> credentials); + void OnFidoAssertionReceived(absl::optional<FidoAssertionInfo> assertion); std::unique_ptr<TargetDeviceConnectionBroker> connection_broker_;
diff --git a/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller_unittest.cc b/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller_unittest.cc index 062df70..487d546 100644 --- a/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller_unittest.cc +++ b/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller_unittest.cc
@@ -381,4 +381,53 @@ ErrorCode::USER_VERIFICATION_FAILED); } +TEST_F(TargetDeviceBootstrapControllerTest, + TransferGaiaAccountDetailsSucceeds) { + bootstrap_controller_->StartAdvertising(); + fake_target_device_connection_broker_->on_start_advertising_callback().Run( + /*success=*/true); + fake_target_device_connection_broker_->InitiateConnection(kSourceDeviceId); + fake_target_device_connection_broker_->AuthenticateConnection( + kSourceDeviceId); + + bootstrap_controller_->AttemptGoogleAccountTransfer(); + + EXPECT_EQ(fake_observer_->last_status.step, + Step::TRANSFERRING_GOOGLE_ACCOUNT_DETAILS); + EXPECT_TRUE(absl::holds_alternative<absl::monostate>( + fake_observer_->last_status.payload)); + + fake_target_device_connection_broker_->GetFakeConnection() + ->SendAccountTransferAssertionInfo(FidoAssertionInfo()); + + EXPECT_EQ(fake_observer_->last_status.step, + Step::TRANSFERRED_GOOGLE_ACCOUNT_DETAILS); + EXPECT_TRUE(absl::holds_alternative<absl::monostate>( + fake_observer_->last_status.payload)); +} + +TEST_F(TargetDeviceBootstrapControllerTest, + TransferGaiaAccountDetailsFailsIfEmpty) { + bootstrap_controller_->StartAdvertising(); + fake_target_device_connection_broker_->on_start_advertising_callback().Run( + /*success=*/true); + fake_target_device_connection_broker_->InitiateConnection(kSourceDeviceId); + fake_target_device_connection_broker_->AuthenticateConnection( + kSourceDeviceId); + + bootstrap_controller_->AttemptGoogleAccountTransfer(); + + EXPECT_EQ(fake_observer_->last_status.step, + Step::TRANSFERRING_GOOGLE_ACCOUNT_DETAILS); + EXPECT_TRUE(absl::holds_alternative<absl::monostate>( + fake_observer_->last_status.payload)); + + fake_target_device_connection_broker_->GetFakeConnection() + ->SendAccountTransferAssertionInfo(absl::nullopt); + + EXPECT_EQ(fake_observer_->last_status.step, Step::ERROR); + EXPECT_EQ(absl::get<ErrorCode>(fake_observer_->last_status.payload), + ErrorCode::GAIA_ASSERTION_NOT_RECEIVED); +} + } // namespace ash::quick_start
diff --git a/chrome/browser/ash/login/screens/core_oobe.cc b/chrome/browser/ash/login/screens/core_oobe.cc new file mode 100644 index 0000000..810d91b6 --- /dev/null +++ b/chrome/browser/ash/login/screens/core_oobe.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 "chrome/browser/ash/login/screens/core_oobe.h" +#include "ash/public/cpp/shelf_config.h" +#include "ash/public/cpp/tablet_mode.h" +#include "ash/shell.h" +#include "base/functional/bind.h" +#include "base/functional/callback_forward.h" +#include "build/branding_buildflags.h" +#include "chrome/browser/ash/login/configuration_keys.h" +#include "chrome/browser/ash/login/ui/login_display_host.h" +#include "chrome/browser/ash/login/ui/oobe_dialog_size_utils.h" +#include "chrome/browser/ash/system/input_device_settings.h" +#include "chrome/browser/ui/webui/ash/login/core_oobe_handler.h" +#include "chrome/browser/ui/webui/ash/login/oobe_ui.h" +#include "chrome/common/channel_info.h" +#include "components/version_info/channel.h" +#include "ui/display/screen.h" + +namespace ash { + +CoreOobe::CoreOobe(const std::string& display_type, + base::WeakPtr<CoreOobeView> view) + : view_(view) { + is_oobe_display_ = display_type == OobeUI::kOobeDisplay; + + TabletMode::Get()->AddObserver(this); + OobeConfiguration::Get()->AddAndFireObserver(this); + ChromeKeyboardControllerClient::Get()->AddObserver(this); + + OnKeyboardVisibilityChanged( + ChromeKeyboardControllerClient::Get()->is_keyboard_visible()); + +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) + version_info_updater_.StartUpdate(true); +#else + version_info_updater_.StartUpdate(false); +#endif + + UpdateClientAreaSize( + display::Screen::GetScreen()->GetPrimaryDisplay().size()); + + // Don't show version label on the stable and beta channels by default. + version_info::Channel channel = chrome::GetChannel(); + if (channel != version_info::Channel::STABLE && + channel != version_info::Channel::BETA) { + if (view_) { + view_->ToggleSystemInfo(); + } + } + + if (ash::system::InputDeviceSettings::Get() + ->ForceKeyboardDrivenUINavigation()) { + if (view_) { + view_->EnableKeyboardFlow(); + } + } +} + +CoreOobe::~CoreOobe() { + OobeConfiguration::Get()->RemoveObserver(this); + + // Ash may be released before us. + if (TabletMode::Get()) { + TabletMode::Get()->RemoveObserver(this); + } + + if (ChromeKeyboardControllerClient::Get()) { + ChromeKeyboardControllerClient::Get()->RemoveObserver(this); + } +} + +void CoreOobe::ShowScreenWithData(const OobeScreenId& screen, + absl::optional<base::Value::Dict> data) { + // Defer until fully initialized. + if (ui_init_state_ != CoreOobeView::UiState::kFullyInitialized) { + pending_calls_.show_screen_with_data = + base::BindOnce(&CoreOobe::ShowScreenWithData, base::Unretained(this), + screen, std::move(data)); + return; + } + + // Decide whether or not to show the screen based on availability. + if (view_) { + view_->ShowScreenWithData(screen, std::move(data)); + } +} + +void CoreOobe::ReloadContent() { + // Defer until fully initialized. + if (ui_init_state_ != CoreOobeView::UiState::kFullyInitialized) { + pending_calls_.reload_content = + base::BindOnce(&CoreOobe::ReloadContent, base::Unretained(this)); + return; + } + + if (view_) { + view_->ReloadContent(); + } +} + +void CoreOobe::ForwardCancel() { + // Defer until fully initialized. + if (ui_init_state_ != CoreOobeView::UiState::kFullyInitialized) { + pending_calls_.forward_cancel = + base::BindOnce(&CoreOobe::ForwardCancel, base::Unretained(this)); + return; + } + + if (view_) { + view_->ForwardCancel(); + } +} + +void CoreOobe::UpdateClientAreaSize(const gfx::Size& size) { + if (!view_) { + return; + } + view_->SetShelfHeight(ShelfConfig::Get()->shelf_size()); + + const gfx::Size display_size = + display::Screen::GetScreen()->GetPrimaryDisplay().size(); + const bool is_horizontal = display_size.width() > display_size.height(); + view_->SetOrientation(is_horizontal); + + const gfx::Size dialog_size = CalculateOobeDialogSize( + size, ShelfConfig::Get()->shelf_size(), is_horizontal); + view_->SetDialogSize(dialog_size.width(), dialog_size.height()); +} + +void CoreOobe::TriggerDown() { + if (view_) { + view_->TriggerDown(); + } +} + +void CoreOobe::ToggleSystemInfo() { + if (view_) { + view_->ToggleSystemInfo(); + } +} + +void CoreOobe::LaunchHelpApp(int help_topic_id) { + if (!help_app_.get()) { + help_app_ = new HelpAppLauncher( + LoginDisplayHost::default_host()->GetNativeWindow()); + } + help_app_->ShowHelpTopic( + static_cast<HelpAppLauncher::HelpTopic>(help_topic_id)); +} + +void CoreOobe::OnOSVersionLabelTextUpdated(const std::string& os_version_text) { + if (view_) { + view_->SetOsVersionLabelText(os_version_text); + } +} + +void CoreOobe::OnDeviceInfoUpdated(const std::string& bluetooth_name) { + if (view_) { + view_->SetBluetoothDeviceInfo(bluetooth_name); + } +} + +void CoreOobe::OnKeyboardVisibilityChanged(bool shown) { + if (view_) { + view_->SetVirtualKeyboardShown(shown); + } +} + +void CoreOobe::OnTabletModeStarted() { + OnTabletModeChanged(/*tablet_mode_enabled=*/true); +} + +void CoreOobe::OnTabletModeEnded() { + OnTabletModeChanged(/*tablet_mode_enabled=*/false); +} + +void CoreOobe::OnTabletModeChanged(bool tablet_mode_enabled) { + // Defer until fully initialized. + if (ui_init_state_ != CoreOobeView::UiState::kFullyInitialized) { + pending_calls_.on_tablet_mode_changed = + base::BindOnce(&CoreOobe::OnTabletModeChanged, base::Unretained(this), + tablet_mode_enabled); + return; + } + + if (view_) { + view_->SetTabletModeState(tablet_mode_enabled); + } +} + +void CoreOobe::OnOobeConfigurationChanged() { + // Defer until fully initialized. + if (ui_init_state_ != CoreOobeView::UiState::kFullyInitialized) { + pending_calls_.on_oobe_configuration_changed = base::BindOnce( + &CoreOobe::OnOobeConfigurationChanged, base::Unretained(this)); + return; + } + + if (view_) { + view_->UpdateOobeConfiguration(); + } +} + +void CoreOobe::UpdateUiInitState(CoreOobeView::UiState state) { + switch (state) { + case CoreOobeView::UiState::kUninitialized: + NOTREACHED(); + break; + case CoreOobeView::UiState::kCoreHandlerInitialized: + // JavaScript is now allowed in the handler. + CHECK(ui_init_state_ == CoreOobeView::UiState::kUninitialized); + ui_init_state_ = CoreOobeView::UiState::kCoreHandlerInitialized; + break; + case CoreOobeView::UiState::kFullyInitialized: + // OOBE is fully loaded. + CHECK(ui_init_state_ == CoreOobeView::UiState::kCoreHandlerInitialized); + ui_init_state_ = CoreOobeView::UiState::kFullyInitialized; + // Execute deferred JavaScript in the CoreHandler first. + ExecutePendingCalls(); + // Call AllowJavascript() on all handlers. + LoginDisplayHost::default_host()->GetOobeUI()->InitializeHandlers(); + break; + } +} + +void CoreOobe::ExecutePendingCalls() { + CHECK(ui_init_state_ == CoreOobeView::UiState::kFullyInitialized); + if (pending_calls_.on_tablet_mode_changed) { + std::move(pending_calls_.on_tablet_mode_changed).Run(); + } + if (pending_calls_.on_oobe_configuration_changed) { + std::move(pending_calls_.on_oobe_configuration_changed).Run(); + } + if (pending_calls_.show_screen_with_data) { + std::move(pending_calls_.show_screen_with_data).Run(); + } + if (pending_calls_.reload_content) { + std::move(pending_calls_.reload_content).Run(); + } + if (pending_calls_.forward_cancel) { + std::move(pending_calls_.forward_cancel).Run(); + } +} + +CoreOobe::PendingFrontendCalls::PendingFrontendCalls() = default; +CoreOobe::PendingFrontendCalls::~PendingFrontendCalls() = default; + +} // namespace ash
diff --git a/chrome/browser/ash/login/screens/core_oobe.h b/chrome/browser/ash/login/screens/core_oobe.h new file mode 100644 index 0000000..e8058e0 --- /dev/null +++ b/chrome/browser/ash/login/screens/core_oobe.h
@@ -0,0 +1,142 @@ +// 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_ASH_LOGIN_SCREENS_CORE_OOBE_H_ +#define CHROME_BROWSER_ASH_LOGIN_SCREENS_CORE_OOBE_H_ + +#include "ash/public/cpp/tablet_mode_observer.h" +#include "base/values.h" +#include "chrome/browser/ash/login/help_app_launcher.h" +#include "chrome/browser/ash/login/oobe_configuration.h" +#include "chrome/browser/ash/login/oobe_screen.h" +#include "chrome/browser/ash/login/version_info_updater.h" +#include "chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h" +#include "chrome/browser/ui/webui/ash/login/core_oobe_handler.h" +#include "ui/events/event_source.h" + +namespace ash { + +/** + * --- CoreOobe --- + * Holds all the logic of the underlying OOBE structure that hosts the screens. + * The actual UI part is controlled by (CoreOobeHandler & CoreOobeView) creating + * a separation of the browser logic and the actual renderer implementation of + * it. It can be thought of as a 'BaseScreen' in OOBE's architecture. + * + * ------------------------------------------------ + * | Browser / Business Logic | Renderer / UI | + * ------------------------------------------------ + * | BaseScreen | BaseScreenHandler | All OOBE screens follow + * | | View | this pattern % exceptions + * ------------------------------------------------ + * | CoreOobe | CoreOobeHandler | Main OOBE structure that + * | | CoreOobeView | hosts the screens in the UI + * ------------------------------------------------ + * + * Since the initialization of the UI isn't instantaneous, CoreOobeView has the + * notion of a |CoreOobeView::UiState| and informs this class whenever it + * changes. The possible states are: + * + * - kUninitialized - + * When this class is created and the UI is still executing the import + * dependencies in |oobe.js|. CoreOobeHandler is not allowed to send JS yet. + * + * - kCoreHandlerInitialized - + * The HTML document has been parsed and all the JavaScript imports from + * |oobe.js| have been executed. This state is triggered in the first line of + * |oobe.js| and at this point the |CoreOobeHandler| is allowed to send JS, + * but limited to very basic calls. + * + * - kFullyInitialized - + * The frontend is fully initialized and all screens have been added to the + * HTML document. Some calls to this class that require the full UI to be + * ready will be deferred until we reach this state. + */ + +class CoreOobeView; +class PendingFrontendCalls; + +class CoreOobe : public VersionInfoUpdater::Delegate, + public TabletModeObserver, + public OobeConfiguration::Observer, + public ChromeKeyboardControllerClient::Observer { + public: + explicit CoreOobe(const std::string& display_type, + base::WeakPtr<CoreOobeView> view); + ~CoreOobe() override; + CoreOobe(const CoreOobe&) = delete; + CoreOobe& operator=(const CoreOobe&) = delete; + + // Calls to these methods will be deferred until fully initialized. + // See |CoreOobeView::UiState| for details. + void ShowScreenWithData(const OobeScreenId& screen, + absl::optional<base::Value::Dict> data); + void ReloadContent(); + void ForwardCancel(); + + // These methods can be called at any state of the initialization. + // See |CoreOobeView::UiState| for details. + void UpdateClientAreaSize(const gfx::Size& size); + void TriggerDown(); + void ToggleSystemInfo(); + void LaunchHelpApp(int help_topic_id); + + protected: + // VersionInfoUpdater::Delegate implementation: + void OnOSVersionLabelTextUpdated( + const std::string& os_version_label_text) override; + void OnDeviceInfoUpdated(const std::string& bluetooth_name) override; + void OnEnterpriseInfoUpdated(const std::string& message_text, + const std::string& asset_id) override {} + void OnAdbSideloadStatusUpdated(bool enabled) override {} + + // ChromeKeyboardControllerClient::Observer: + void OnKeyboardVisibilityChanged(bool visible) override; + + // TabletModeObserver: + void OnTabletModeStarted() override; + void OnTabletModeEnded() override; + void OnTabletModeChanged(bool tablet_mode_enabled); + + // OobeConfiguration::Observer: + void OnOobeConfigurationChanged() override; + + private: + // Called by the |CoreOobeHandler| to update the initialization state. + friend class CoreOobeHandler; + void UpdateUiInitState(CoreOobeView::UiState state); + + // Methods that need the full OOBE to be initialized will deferred until + // the |CoreOobeHandler| notifies us with |UiState::kFullyInitialized| + void ExecutePendingCalls(); + + class PendingFrontendCalls { + public: + PendingFrontendCalls(); + ~PendingFrontendCalls(); + + base::OnceClosure on_tablet_mode_changed; + base::OnceClosure on_oobe_configuration_changed; + base::OnceClosure show_screen_with_data; + base::OnceClosure reload_content; + base::OnceClosure forward_cancel; + }; + PendingFrontendCalls pending_calls_; + + // Updates when version info is changed. + VersionInfoUpdater version_info_updater_{this}; + + // Help application used for help dialogs. + scoped_refptr<HelpAppLauncher> help_app_; + + bool is_oobe_display_ = false; + + CoreOobeView::UiState ui_init_state_ = CoreOobeView::UiState::kUninitialized; + + base::WeakPtr<CoreOobeView> view_; +}; + +} // namespace ash + +#endif // CHROME_BROWSER_ASH_LOGIN_SCREENS_CORE_OOBE_H_
diff --git a/chrome/browser/ash/login/screens/quick_start_screen.cc b/chrome/browser/ash/login/screens/quick_start_screen.cc index c1017da..6ba11b8 100644 --- a/chrome/browser/ash/login/screens/quick_start_screen.cc +++ b/chrome/browser/ash/login/screens/quick_start_screen.cc
@@ -101,6 +101,8 @@ case Step::ADVERTISING: case Step::CONNECTED: case Step::PIN_VERIFICATION: + case Step::TRANSFERRING_GOOGLE_ACCOUNT_DETAILS: + case Step::TRANSFERRED_GOOGLE_ACCOUNT_DETAILS: // TODO(b/282934168): Implement these screens fully quick_start::QS_LOG(INFO) << "Hit screen which is not implemented. Continuing";
diff --git a/chrome/browser/ash/login/ui/login_display_host_common.cc b/chrome/browser/ash/login/ui/login_display_host_common.cc index 08e0309..daa74d0 100644 --- a/chrome/browser/ash/login/ui/login_display_host_common.cc +++ b/chrome/browser/ash/login/ui/login_display_host_common.cc
@@ -476,7 +476,7 @@ if (!GetOobeUI()) { return false; } - GetOobeUI()->GetCoreOobeView()->ForwardCancel(); + GetOobeUI()->GetCoreOobe()->ForwardCancel(); return true; }
diff --git a/chrome/browser/ash/login/ui/login_display_host_webui.cc b/chrome/browser/ash/login/ui/login_display_host_webui.cc index a501856..32c56eda 100644 --- a/chrome/browser/ash/login/ui/login_display_host_webui.cc +++ b/chrome/browser/ash/login/ui/login_display_host_webui.cc
@@ -693,8 +693,7 @@ } if (GetOobeUI()) { - GetOobeUI()->GetCoreOobeView()->UpdateClientAreaSize( - primary_display.size()); + GetOobeUI()->GetCoreOobe()->UpdateClientAreaSize(primary_display.size()); if (changed_metrics & DISPLAY_METRIC_PRIMARY) GetOobeUI()->OnDisplayConfigurationChanged(); } @@ -720,7 +719,7 @@ void LoginDisplayHostWebUI::FinishBootingAnimation() { CHECK(features::IsOobeSimonEnabled()); ash::Shell::Get()->booting_animation_controller()->Finish(); - GetOobeUI()->GetCoreOobeView()->TriggerDown(); + GetOobeUI()->GetCoreOobe()->TriggerDown(); } //////////////////////////////////////////////////////////////////////////////// @@ -799,7 +798,7 @@ if (!GetOobeUI()) { return false; } - GetOobeUI()->GetCoreOobeView()->ToggleSystemInfo(); + GetOobeUI()->GetCoreOobe()->ToggleSystemInfo(); return true; }
diff --git a/chrome/browser/ash/login/ui/oobe_ui_dialog_delegate.cc b/chrome/browser/ash/login/ui/oobe_ui_dialog_delegate.cc index 83273d5c..07abaec 100644 --- a/chrome/browser/ash/login/ui/oobe_ui_dialog_delegate.cc +++ b/chrome/browser/ash/login/ui/oobe_ui_dialog_delegate.cc
@@ -413,7 +413,7 @@ void OobeUIDialogDelegate::OnViewBoundsChanged(views::View* observed_view) { if (!widget_) return; - GetOobeUI()->GetCoreOobeView()->UpdateClientAreaSize( + GetOobeUI()->GetCoreOobe()->UpdateClientAreaSize( layout_view_->GetContentsBounds().size()); }
diff --git a/chrome/browser/ash/policy/remote_commands/crd_host_delegate.cc b/chrome/browser/ash/policy/remote_commands/crd_host_delegate.cc index ae871be8..7f71732 100644 --- a/chrome/browser/ash/policy/remote_commands/crd_host_delegate.cc +++ b/chrome/browser/ash/policy/remote_commands/crd_host_delegate.cc
@@ -73,7 +73,9 @@ << ", show_confirmation_dialog " << parameters_.show_confirmation_dialog << ", curtain_local_user_session " - << parameters_.curtain_local_user_session << "}"; + << parameters_.curtain_local_user_session + << ", allow_troubleshooting_tools " + << parameters_.allow_troubleshooting_tools << "}"; remoting_service.StartSession( GetSessionParameters(), GetEnterpriseParameters(), @@ -162,7 +164,8 @@ .suppress_user_dialogs = !parameters_.show_confirmation_dialog, .suppress_notifications = !parameters_.show_confirmation_dialog, .terminate_upon_input = parameters_.terminate_upon_input, - .curtain_local_user_session = parameters_.curtain_local_user_session}; + .curtain_local_user_session = parameters_.curtain_local_user_session, + .allow_troubleshooting_tools = parameters_.allow_troubleshooting_tools}; } void ReportSuccess(const std::string& access_code) {
diff --git a/chrome/browser/ash/policy/remote_commands/crd_host_delegate_unittest.cc b/chrome/browser/ash/policy/remote_commands/crd_host_delegate_unittest.cc index 50e13c0..83e25888 100644 --- a/chrome/browser/ash/policy/remote_commands/crd_host_delegate_unittest.cc +++ b/chrome/browser/ash/policy/remote_commands/crd_host_delegate_unittest.cc
@@ -164,7 +164,11 @@ } // namespace -class CrdHostDelegateTest : public ::testing::Test { +// A test class used for testing the CrdHostDelegate class. +// Use this class as fixture for parametrized tests over boolean value. +// The value is used to verify the correct delivery of individual boolean fields +// of `ChromeOsEnterpriseParams`. +class CrdHostDelegateTest : public testing::TestWithParam<bool> { public: CrdHostDelegateTest() = default; CrdHostDelegateTest(const CrdHostDelegateTest&) = delete; @@ -282,10 +286,9 @@ EXPECT_EQ(actual_parameters->user_name, "<the-user-name>"); } -TEST_F(CrdHostDelegateTest, - ShouldPassShowConfirmationDialogTrueToRemotingService) { +TEST_P(CrdHostDelegateTest, ShouldPassShowConfirmationDialogToRemotingService) { SessionParameters parameters; - parameters.show_confirmation_dialog = true; + parameters.show_confirmation_dialog = GetParam(); remoting::ChromeOsEnterpriseParams actual_parameters; EXPECT_CALL(remoting_service(), StartSession) @@ -295,14 +298,13 @@ error_callback(), session_finished_callback()); - EXPECT_EQ(actual_parameters.suppress_notifications, false); - EXPECT_EQ(actual_parameters.suppress_user_dialogs, false); + EXPECT_NE(actual_parameters.suppress_notifications, GetParam()); + EXPECT_NE(actual_parameters.suppress_user_dialogs, GetParam()); } -TEST_F(CrdHostDelegateTest, - ShouldPassShowConfirmationDialogFalseToRemotingService) { +TEST_P(CrdHostDelegateTest, ShouldPassTerminateUponInputToRemotingService) { SessionParameters parameters; - parameters.show_confirmation_dialog = false; + parameters.terminate_upon_input = GetParam(); remoting::ChromeOsEnterpriseParams actual_parameters; EXPECT_CALL(remoting_service(), StartSession) @@ -312,39 +314,7 @@ error_callback(), session_finished_callback()); - EXPECT_EQ(actual_parameters.suppress_notifications, true); - EXPECT_EQ(actual_parameters.suppress_user_dialogs, true); -} - -TEST_F(CrdHostDelegateTest, - ShouldPassTerminateUponInputFalseToRemotingService) { - SessionParameters parameters; - parameters.terminate_upon_input = false; - - remoting::ChromeOsEnterpriseParams actual_parameters; - EXPECT_CALL(remoting_service(), StartSession) - .WillOnce(SaveParamAndInvokeCallback(&actual_parameters)); - - delegate().StartCrdHostAndGetCode(parameters, success_callback(), - error_callback(), - session_finished_callback()); - - EXPECT_EQ(actual_parameters.terminate_upon_input, false); -} - -TEST_F(CrdHostDelegateTest, ShouldPassTerminateUponInputTrueToRemotingService) { - SessionParameters parameters; - parameters.terminate_upon_input = true; - - remoting::ChromeOsEnterpriseParams actual_parameters; - EXPECT_CALL(remoting_service(), StartSession) - .WillOnce(SaveParamAndInvokeCallback(&actual_parameters)); - - delegate().StartCrdHostAndGetCode(parameters, success_callback(), - error_callback(), - session_finished_callback()); - - EXPECT_EQ(actual_parameters.terminate_upon_input, true); + EXPECT_EQ(actual_parameters.terminate_upon_input, GetParam()); } TEST_F(CrdHostDelegateTest, ShouldPassAdminEmailToRemotingService) { @@ -362,10 +332,10 @@ EXPECT_EQ(actual_parameters->authorized_helper, "the.admin@email.com"); } -TEST_F(CrdHostDelegateTest, - ShouldPassCurtainLocalUserSessionFalseToRemotingService) { +TEST_P(CrdHostDelegateTest, + ShouldPassCurtainLocalUserSessionToRemotingService) { SessionParameters parameters; - parameters.curtain_local_user_session = false; + parameters.curtain_local_user_session = GetParam(); remoting::ChromeOsEnterpriseParams actual_parameters; EXPECT_CALL(remoting_service(), StartSession) @@ -375,13 +345,13 @@ error_callback(), session_finished_callback()); - EXPECT_EQ(actual_parameters.curtain_local_user_session, false); + EXPECT_EQ(actual_parameters.curtain_local_user_session, GetParam()); } -TEST_F(CrdHostDelegateTest, - ShouldPassCurtainLocalUserSessionTrueToRemotingService) { +TEST_P(CrdHostDelegateTest, + ShouldPassAllowTroubleshootingToolsToRemotingService) { SessionParameters parameters; - parameters.curtain_local_user_session = true; + parameters.allow_troubleshooting_tools = GetParam(); remoting::ChromeOsEnterpriseParams actual_parameters; EXPECT_CALL(remoting_service(), StartSession) @@ -391,7 +361,7 @@ error_callback(), session_finished_callback()); - EXPECT_EQ(actual_parameters.curtain_local_user_session, true); + EXPECT_EQ(actual_parameters.allow_troubleshooting_tools, GetParam()); } TEST_F(CrdHostDelegateTest, ShouldReportErrorIfStartSessionReturnsError) { @@ -536,4 +506,8 @@ EXPECT_EQ(ResultCode::FAILURE_DISABLED_BY_POLICY, response.error_code()); } +INSTANTIATE_TEST_SUITE_P(CrdHostDelegateTest, + CrdHostDelegateTest, + testing::Bool()); + } // namespace policy
diff --git a/chrome/browser/ash/policy/remote_commands/device_command_set_volume_job_browsertest.cc b/chrome/browser/ash/policy/remote_commands/device_command_set_volume_job_browsertest.cc index 45e7445a..faa186e 100644 --- a/chrome/browser/ash/policy/remote_commands/device_command_set_volume_job_browsertest.cc +++ b/chrome/browser/ash/policy/remote_commands/device_command_set_volume_job_browsertest.cc
@@ -34,11 +34,23 @@ IN_PROC_BROWSER_TEST_F(DeviceCommandSetVolumeBrowserTest, DeviceSetVolume) { em::RemoteCommandResult result = SendRemoteCommand(RemoteCommandBuilder() - .SetType(em::RemoteCommand_Type_DEVICE_SET_VOLUME) + .SetType(em::RemoteCommand::DEVICE_SET_VOLUME) .SetPayload(R"({"volume": 50})") .Build()); - EXPECT_EQ(result.result(), em::RemoteCommandResult_ResultType_RESULT_SUCCESS); + EXPECT_EQ(result.result(), em::RemoteCommandResult::RESULT_SUCCESS); +} + +IN_PROC_BROWSER_TEST_F(DeviceCommandSetVolumeBrowserTest, + ShouldWorkWith64BitCommandIds) { + em::RemoteCommandResult result = + SendRemoteCommand(RemoteCommandBuilder() + .SetType(em::RemoteCommand::DEVICE_SET_VOLUME) + .SetPayload(R"({"volume": 50})") + .SetCommandId(112233445566778899) + .Build()); + + EXPECT_EQ(result.result(), em::RemoteCommandResult::RESULT_SUCCESS); } } // namespace policy
diff --git a/chrome/browser/ash/policy/remote_commands/device_command_start_crd_session_job.cc b/chrome/browser/ash/policy/remote_commands/device_command_start_crd_session_job.cc index 3b84760..45cc4deb 100644 --- a/chrome/browser/ash/policy/remote_commands/device_command_start_crd_session_job.cc +++ b/chrome/browser/ash/policy/remote_commands/device_command_start_crd_session_job.cc
@@ -28,7 +28,10 @@ #include "chrome/browser/ash/policy/remote_commands/crd_uma_logger.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_manager.h" +#include "chrome/common/pref_names.h" #include "components/policy/proto/device_management_backend.pb.h" +#include "components/prefs/pref_service.h" #include "google_apis/gaia/gaia_constants.h" #include "google_apis/gaia/oauth2_access_token_manager.h" #include "remoting/host/chromeos/features.h" @@ -383,6 +386,7 @@ parameters.show_confirmation_dialog = ShouldShowConfirmationDialog(); parameters.curtain_local_user_session = curtain_local_user_session_; parameters.admin_email = admin_email_; + parameters.allow_troubleshooting_tools = ShouldAllowTroubleshootingTools(); delegate_->StartCrdHostAndGetCode( parameters, @@ -546,6 +550,18 @@ } } +bool DeviceCommandStartCrdSessionJob::ShouldAllowTroubleshootingTools() const { + if (GetCurrentUserSessionType() != + UserSessionType::AUTO_LAUNCHED_KIOSK_SESSION && + GetCurrentUserSessionType() != + UserSessionType::MANUALLY_LAUNCHED_KIOSK_SESSION) { + return false; + } + auto* prefs = ProfileManager::GetActiveUserProfile()->GetPrefs(); + CHECK(prefs); + return prefs->GetBoolean(prefs::kKioskTroubleshootingToolsEnabled); +} + DeviceCommandStartCrdSessionJob::ErrorCallback DeviceCommandStartCrdSessionJob::GetErrorCallback() { return base::BindOnce(&DeviceCommandStartCrdSessionJob::FinishWithError,
diff --git a/chrome/browser/ash/policy/remote_commands/device_command_start_crd_session_job.h b/chrome/browser/ash/policy/remote_commands/device_command_start_crd_session_job.h index 78c2dce..89d8e49 100644 --- a/chrome/browser/ash/policy/remote_commands/device_command_start_crd_session_job.h +++ b/chrome/browser/ash/policy/remote_commands/device_command_start_crd_session_job.h
@@ -48,6 +48,7 @@ bool terminate_upon_input = false; bool show_confirmation_dialog = false; bool curtain_local_user_session = false; + bool allow_troubleshooting_tools = false; }; virtual ~Delegate() = default; @@ -118,6 +119,7 @@ std::string GetRobotAccountUserName() const; bool ShouldShowConfirmationDialog() const; bool ShouldTerminateUponInput() const; + bool ShouldAllowTroubleshootingTools() const; ErrorCallback GetErrorCallback();
diff --git a/chrome/browser/ash/policy/remote_commands/device_command_start_crd_session_unittest.cc b/chrome/browser/ash/policy/remote_commands/device_command_start_crd_session_unittest.cc index f91e32f..5c62752 100644 --- a/chrome/browser/ash/policy/remote_commands/device_command_start_crd_session_unittest.cc +++ b/chrome/browser/ash/policy/remote_commands/device_command_start_crd_session_unittest.cc
@@ -27,10 +27,14 @@ #include "chrome/browser/device_identity/device_oauth2_token_service.h" #include "chrome/browser/device_identity/device_oauth2_token_service_factory.h" #include "chrome/browser/prefs/browser_prefs.h" +#include "chrome/common/pref_names.h" +#include "chrome/test/base/testing_browser_process.h" +#include "chrome/test/base/testing_profile_manager.h" #include "chromeos/ash/components/cryptohome/system_salt_getter.h" #include "chromeos/ash/services/network_config/in_process_instance.h" #include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h" #include "components/policy/proto/device_management_backend.pb.h" +#include "components/prefs/pref_service.h" #include "remoting/host/chromeos/features.h" #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h" #include "services/network/test/test_url_loader_factory.h" @@ -271,6 +275,8 @@ void SetUp() override { DeviceSettingsTestBase::SetUp(); + ASSERT_TRUE(profile_manager_.SetUp()); + user_activity_detector_ = std::make_unique<ui::UserActivityDetector>(); arc_kiosk_app_manager_ = std::make_unique<ash::ArcKioskAppManager>(); web_kiosk_app_manager_ = std::make_unique<ash::WebKioskAppManager>(); @@ -292,6 +298,8 @@ web_kiosk_app_manager_.reset(); arc_kiosk_app_manager_.reset(); + profile_ = nullptr; + DeviceSettingsTestBase::TearDown(); } @@ -300,14 +308,21 @@ const std::string& error_message); Payload CreateNotIdlePayload(int idle_time_in_sec); + void StartSessionOfTypeWithProfile(TestSessionType user_session_type) { + profile_ = test::StartSessionOfTypeWithProfile( + user_session_type, user_manager(), profile_manager_); + } void LogInAsKioskUser() { - test::StartSessionOfType(TestSessionType::kAutoLaunchedWebKioskSession, - user_manager()); + StartSessionOfTypeWithProfile( + TestSessionType::kAutoLaunchedWebKioskSession); } void LogInAsRegularUser() { - test::StartSessionOfType(TestSessionType::kUnaffiliatedUserSession, - user_manager()); + StartSessionOfTypeWithProfile(TestSessionType::kUnaffiliatedUserSession); + } + + void LogInAsAffiliatedUser() { + StartSessionOfTypeWithProfile(TestSessionType::kAffiliatedUserSession); } void SetDeviceIdleTime(int idle_time_in_sec) { @@ -365,6 +380,12 @@ return success; } + void SetKioskTroubleshootingPolicyValue(bool enabled) { + ASSERT_TRUE(profile_); + profile_->GetPrefs()->SetBoolean(prefs::kKioskTroubleshootingToolsEnabled, + enabled); + } + void RunJob(DeviceCommandStartCrdSessionJob& job, base::OnceClosure on_done_closure = base::OnceClosure()) { bool launched = job.Run(base::Time::Now(), base::TimeTicks::Now(), @@ -395,6 +416,9 @@ StubCrdHostDelegate crd_host_delegate_; test::ScopedFakeCrosNetworkConfig fake_cros_network_config_; + + TestingProfileManager profile_manager_{TestingBrowserProcess::GetGlobal()}; + TestingProfile* profile_ = nullptr; }; // Fixture for tests parameterized over the possible session types @@ -403,6 +427,11 @@ : public DeviceCommandStartCrdSessionJobTest, public ::testing::WithParamInterface<test::TestSessionType> {}; +// Fixture for tests parameterized over boolean values. +class DeviceCommandStartCrdSessionJobTestBoolParameterized + : public DeviceCommandStartCrdSessionJobTest, + public ::testing::WithParamInterface<bool> {}; + Payload DeviceCommandStartCrdSessionJobTest::CreateSuccessPayload( const std::string& access_code) { return Payload() @@ -453,7 +482,7 @@ SCOPED_TRACE(base::StringPrintf("Testing session type %s", SessionTypeToString(user_session_type))); - StartSessionOfType(user_session_type, user_manager()); + StartSessionOfTypeWithProfile(user_session_type); Result result = RunJobAndWaitForResult(); bool is_supported = [&]() { @@ -576,6 +605,29 @@ crd_host_delegate().session_parameters().admin_email); } +TEST_P(DeviceCommandStartCrdSessionJobTestBoolParameterized, + ShouldPassAllowTroubleshootingToolsToDelegateForKiosk) { + LogInAsKioskUser(); + + SetKioskTroubleshootingPolicyValue(GetParam()); + EXPECT_SUCCESS(RunJobAndWaitForResult()); + + EXPECT_EQ( + GetParam(), + crd_host_delegate().session_parameters().allow_troubleshooting_tools); +} + +TEST_P(DeviceCommandStartCrdSessionJobTestBoolParameterized, + ShouldNotPassAllowTroubleshootingToolsToDelegateForUser) { + LogInAsAffiliatedUser(); + + SetKioskTroubleshootingPolicyValue(GetParam()); + EXPECT_SUCCESS(RunJobAndWaitForResult()); + + EXPECT_FALSE( + crd_host_delegate().session_parameters().allow_troubleshooting_tools); +} + TEST_F(DeviceCommandStartCrdSessionJobTest, ShouldNotSetAdminEmailWhenNotSpecifiedInPayload) { LogInAsKioskUser(); @@ -596,7 +648,7 @@ return; } - StartSessionOfType(user_session_type, user_manager()); + StartSessionOfTypeWithProfile(user_session_type); Result result = RunJobAndWaitForResult(Payload().Set("ackedUserPresence", false)); @@ -638,7 +690,7 @@ return; } - StartSessionOfType(user_session_type, user_manager()); + StartSessionOfTypeWithProfile(user_session_type); Result result = RunJobAndWaitForResult(Payload().Set("ackedUserPresence", true)); @@ -661,7 +713,7 @@ return; } - StartSessionOfType(user_session_type, user_manager()); + StartSessionOfTypeWithProfile(user_session_type); Result result = RunJobAndWaitForResult(Payload().Set("ackedUserPresence", true)); @@ -705,7 +757,7 @@ base::HistogramTester histogram_tester; - StartSessionOfType(user_session_type, user_manager()); + StartSessionOfTypeWithProfile(user_session_type); RunJobAndWaitForResult(); UmaSessionType expected_session_type = [&]() { @@ -756,7 +808,7 @@ return; } base::HistogramTester histogram_tester; - StartSessionOfType(user_session_type, user_manager()); + StartSessionOfTypeWithProfile(user_session_type); RunJobAndWaitForResult(); crd_host_delegate().TerminateCrdSession(duration); @@ -882,7 +934,7 @@ TestSessionType user_session_type = GetParam(); SCOPED_TRACE(base::StringPrintf("Testing session type %s", SessionTypeToString(user_session_type))); - StartSessionOfType(user_session_type, user_manager()); + StartSessionOfTypeWithProfile(user_session_type); auto payload_without_crd_session_type = Payload(); @@ -904,7 +956,7 @@ TestSessionType user_session_type = GetParam(); SCOPED_TRACE(base::StringPrintf("Testing session type %s", SessionTypeToString(user_session_type))); - StartSessionOfType(user_session_type, user_manager()); + StartSessionOfTypeWithProfile(user_session_type); Result result = RunJobAndWaitForResult( Payload().Set("crdSessionType", CrdSessionType::REMOTE_SUPPORT_SESSION)); @@ -924,7 +976,7 @@ TestSessionType user_session_type = GetParam(); SCOPED_TRACE(base::StringPrintf("Testing session type %s", SessionTypeToString(user_session_type))); - StartSessionOfType(user_session_type, user_manager()); + StartSessionOfTypeWithProfile(user_session_type); AddActiveManagedNetwork(); Result result = RunJobAndWaitForResult( @@ -993,7 +1045,7 @@ return; } - StartSessionOfType(user_session_type, user_manager()); + StartSessionOfTypeWithProfile(user_session_type); Result result = RunJobAndWaitForResult(RemoteAccessPayload()); EXPECT_ERROR(result, ResultCode::FAILURE_UNSUPPORTED_USER_TYPE); @@ -1168,7 +1220,7 @@ return; } AddActiveManagedNetwork(); - StartSessionOfType(user_session_type, user_manager()); + StartSessionOfTypeWithProfile(user_session_type); Result result = RunJobAndWaitForResult(RemoteAccessPayload()); histogram_tester.ExpectUniqueSample( @@ -1189,7 +1241,7 @@ return; } AddActiveManagedNetwork(); - StartSessionOfType(user_session_type, user_manager()); + StartSessionOfTypeWithProfile(user_session_type); Result result = RunJobAndWaitForResult(RemoteAccessPayload()); histogram_tester.ExpectUniqueSample( @@ -1224,7 +1276,7 @@ return; } AddActiveManagedNetwork(); - StartSessionOfType(user_session_type, user_manager()); + StartSessionOfTypeWithProfile(user_session_type); Result result = RunJobAndWaitForResult(RemoteAccessPayload()); crd_host_delegate().TerminateCrdSession(duration); @@ -1263,5 +1315,8 @@ TestSessionType::kAffiliatedUserSession, TestSessionType::kUnaffiliatedUserSession, TestSessionType::kNoSession)); +INSTANTIATE_TEST_SUITE_P(All, + DeviceCommandStartCrdSessionJobTestBoolParameterized, + testing::Bool()); } // namespace policy
diff --git a/chrome/browser/ash/policy/remote_commands/user_session_type_test_util.cc b/chrome/browser/ash/policy/remote_commands/user_session_type_test_util.cc index f5d89b23..7f8906e 100644 --- a/chrome/browser/ash/policy/remote_commands/user_session_type_test_util.cc +++ b/chrome/browser/ash/policy/remote_commands/user_session_type_test_util.cc
@@ -7,6 +7,8 @@ #include "chrome/browser/ash/app_mode/arc/arc_kiosk_app_manager.h" #include "chrome/browser/ash/app_mode/kiosk_app_manager.h" #include "chrome/browser/ash/app_mode/web_app/web_kiosk_app_manager.h" +#include "chrome/browser/ash/login/users/fake_chrome_user_manager.h" +#include "chrome/test/base/testing_profile_manager.h" #include "components/account_id/account_id.h" #include "testing/gtest/include/gtest/gtest.h" @@ -107,4 +109,19 @@ user_manager.LoginUser(CreateUserOfType(session_type, user_manager)); } +TestingProfile* StartSessionOfTypeWithProfile( + TestSessionType session_type, + ash::FakeChromeUserManager& user_manager, + TestingProfileManager& profile_manager) { + if (session_type == TestSessionType::kNoSession) { + // Nothing to do if we don't need a session. + return nullptr; + } + + AccountId account_id = CreateUserOfType(session_type, user_manager); + user_manager.LoginUser(account_id); + return profile_manager.CreateTestingProfile(account_id.GetUserEmail(), + /* is_main_profile= */ true); +} + } // namespace policy::test
diff --git a/chrome/browser/ash/policy/remote_commands/user_session_type_test_util.h b/chrome/browser/ash/policy/remote_commands/user_session_type_test_util.h index e5e2f02a..e46ed8e8 100644 --- a/chrome/browser/ash/policy/remote_commands/user_session_type_test_util.h +++ b/chrome/browser/ash/policy/remote_commands/user_session_type_test_util.h
@@ -9,6 +9,7 @@ #define CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_USER_SESSION_TYPE_TEST_UTIL_H_ #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h" +#include "chrome/test/base/testing_profile_manager.h" namespace policy::test { @@ -43,6 +44,14 @@ void StartSessionOfType(TestSessionType session_type, ash::FakeChromeUserManager& user_manager); +// Start a session of the given type, which involves first creating an user +// of the given type and then logging the user in (unless the session type +// doesn't require a logged in user) and a main TestingProfile creation. +TestingProfile* StartSessionOfTypeWithProfile( + TestSessionType session_type, + ash::FakeChromeUserManager& user_manager, + TestingProfileManager& profile_manager); + } // namespace policy::test #endif // CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_USER_SESSION_TYPE_TEST_UTIL_H_
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/apps/app_events_observer.cc b/chrome/browser/ash/policy/reporting/metrics_reporting/apps/app_events_observer.cc index 804e235..2f6b50bb 100644 --- a/chrome/browser/ash/policy/reporting/metrics_reporting/apps/app_events_observer.cc +++ b/chrome/browser/ash/policy/reporting/metrics_reporting/apps/app_events_observer.cc
@@ -68,7 +68,10 @@ ::apps::InstallReason app_install_reason, ::apps::InstallTime app_install_time) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (!IsAppTypeAllowed(app_type)) { + DCHECK(reporting_settings_); + if (!::ash::reporting::IsAppTypeAllowed( + app_type, reporting_settings_.get(), + ::ash::reporting::kReportAppInventory)) { return; } @@ -98,7 +101,10 @@ ::apps::AppType app_type, ::apps::LaunchSource app_launch_source) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (!IsAppTypeAllowed(app_type)) { + DCHECK(reporting_settings_); + if (!::ash::reporting::IsAppTypeAllowed( + app_type, reporting_settings_.get(), + ::ash::reporting::kReportAppInventory)) { return; } @@ -123,7 +129,10 @@ ::apps::AppType app_type, ::apps::UninstallSource app_uninstall_source) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (!IsAppTypeAllowed(app_type)) { + DCHECK(reporting_settings_); + if (!::ash::reporting::IsAppTypeAllowed( + app_type, reporting_settings_.get(), + ::ash::reporting::kReportAppInventory)) { return; } @@ -148,20 +157,4 @@ observer_.Reset(); } -bool AppEventsObserver::IsAppTypeAllowed(::apps::AppType app_type) const { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(reporting_settings_); - const base::Value::List* allowed_app_types = nullptr; - if (!reporting_settings_->GetList(::ash::reporting::kReportAppInventory, - &allowed_app_types)) { - // Policy likely not set. Disallow app inventory reporting regardless of app - // type. - return false; - } - const absl::optional<std::string> app_category = - ::ash::reporting::GetAppReportingCategoryForType(app_type); - return app_category.has_value() && - base::Contains(*allowed_app_types, app_category.value()); -} - } // namespace reporting
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/apps/app_events_observer.h b/chrome/browser/ash/policy/reporting/metrics_reporting/apps/app_events_observer.h index e67709d..8296611 100644 --- a/chrome/browser/ash/policy/reporting/metrics_reporting/apps/app_events_observer.h +++ b/chrome/browser/ash/policy/reporting/metrics_reporting/apps/app_events_observer.h
@@ -65,10 +65,6 @@ // ::apps::AppPlatformMetrics::Observer: void OnAppPlatformMetricsDestroyed() override; - // Helper that determines if the specified app type is allowlisted for app - // inventory event reporting. - bool IsAppTypeAllowed(::apps::AppType app_type) const; - SEQUENCE_CHECKER(sequence_checker_); // Retriever that retrieves the `AppPlatformMetrics` component so the
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/apps/app_usage_observer.cc b/chrome/browser/ash/policy/reporting/metrics_reporting/apps/app_usage_observer.cc index cbc22ce..f951c5fb 100644 --- a/chrome/browser/ash/policy/reporting/metrics_reporting/apps/app_usage_observer.cc +++ b/chrome/browser/ash/policy/reporting/metrics_reporting/apps/app_usage_observer.cc
@@ -10,9 +10,9 @@ #include "base/time/time.h" #include "chrome/browser/apps/app_service/metrics/app_platform_metrics.h" #include "chrome/browser/ash/policy/reporting/metrics_reporting/apps/app_platform_metrics_retriever.h" +#include "chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_prefs.h" #include "chrome/browser/chromeos/reporting/metric_default_utils.h" #include "chrome/browser/profiles/profile.h" -#include "chromeos/ash/components/settings/cros_settings_names.h" #include "components/prefs/scoped_user_pref_update.h" #include "components/services/app_service/public/cpp/app_launch_util.h" #include "components/services/app_service/public/cpp/app_types.h" @@ -76,9 +76,9 @@ const base::UnguessableToken& instance_id, base::TimeDelta running_time) { DCHECK(reporting_settings_); - auto is_enabled = metrics::kReportDeviceAppInfoDefaultValue; - reporting_settings_->GetBoolean(::ash::kReportDeviceAppInfo, &is_enabled); - if (!profile_ || !is_enabled) { + if (!profile_ || + !::ash::reporting::IsAppTypeAllowed(app_type, reporting_settings_.get(), + ::ash::reporting::kReportAppUsage)) { return; }
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/apps/app_usage_observer_unittest.cc b/chrome/browser/ash/policy/reporting/metrics_reporting/apps/app_usage_observer_unittest.cc index d53343d..854bde0 100644 --- a/chrome/browser/ash/policy/reporting/metrics_reporting/apps/app_usage_observer_unittest.cc +++ b/chrome/browser/ash/policy/reporting/metrics_reporting/apps/app_usage_observer_unittest.cc
@@ -5,14 +5,17 @@ #include "chrome/browser/ash/policy/reporting/metrics_reporting/apps/app_usage_observer.h" #include <memory> +#include <string> +#include <vector> #include "base/json/values_util.h" #include "base/memory/raw_ptr.h" #include "base/time/time.h" #include "base/unguessable_token.h" +#include "base/values.h" #include "chrome/browser/apps/app_service/metrics/app_platform_metrics.h" #include "chrome/browser/apps/app_service/metrics/app_platform_metrics_service_test_base.h" -#include "chromeos/ash/components/settings/cros_settings_names.h" +#include "chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_prefs.h" #include "components/reporting/metrics/fakes/fake_reporting_settings.h" #include "components/reporting/proto/synced/metric_data.pb.h" #include "components/services/app_service/public/cpp/app_types.h" @@ -108,6 +111,15 @@ Eq(expected_usage_time)); } + void SetAllowedAppReportingTypes(const std::vector<std::string>& app_types) { + base::Value::List allowed_app_types; + for (const auto& app_type : app_types) { + allowed_app_types.Append(app_type); + } + reporting_settings_.SetList(::ash::reporting::kReportAppUsage, + std::move(allowed_app_types)); + } + // Fake reporting settings component used by the test. test::FakeReportingSettings reporting_settings_; @@ -116,14 +128,14 @@ }; TEST_F(AppUsageObserverTest, PersistAppUsageDataInPrefStore) { - reporting_settings_.SetBoolean(::ash::kReportDeviceAppInfo, true); + SetAllowedAppReportingTypes({::ash::reporting::kAppCategoryAndroidApps}); // Create a new window for the app and simulate app usage. static constexpr base::TimeDelta kAppUsageDuration = base::Minutes(2); - const auto window = std::make_unique<::aura::Window>(nullptr); - window->Init(::ui::LAYER_NOT_DRAWN); + ::aura::Window window(nullptr); + window.Init(::ui::LAYER_NOT_DRAWN); const base::UnguessableToken& kInstanceId = base::UnguessableToken::Create(); - SimulateAppUsageForInstance(window.get(), kInstanceId, kAppUsageDuration); + SimulateAppUsageForInstance(&window, kInstanceId, kAppUsageDuration); // Verify data is persisted in the pref store. ASSERT_THAT(GetPrefService()->GetDict(::apps::kAppUsageTime).size(), Eq(1UL)); @@ -131,28 +143,44 @@ } TEST_F(AppUsageObserverTest, ShouldNotPersistMicrosecondUsageData) { - reporting_settings_.SetBoolean(::ash::kReportDeviceAppInfo, true); + SetAllowedAppReportingTypes({::ash::reporting::kAppCategoryAndroidApps}); // Create a new window for the app and simulate insignificant app usage. static constexpr base::TimeDelta kAppUsageDuration = base::Microseconds(200); - const auto window = std::make_unique<::aura::Window>(nullptr); - window->Init(::ui::LAYER_NOT_DRAWN); + ::aura::Window window(nullptr); + window.Init(::ui::LAYER_NOT_DRAWN); const base::UnguessableToken& kInstanceId = base::UnguessableToken::Create(); - SimulateAppUsageForInstance(window.get(), kInstanceId, kAppUsageDuration); + SimulateAppUsageForInstance(&window, kInstanceId, kAppUsageDuration); // Verify data is not persisted in the pref store. ASSERT_TRUE(GetPrefService()->GetDict(::apps::kAppUsageTime).empty()); } -TEST_F(AppUsageObserverTest, ShouldNotPersistAppUsageDataIfSettingDisabled) { - reporting_settings_.SetBoolean(::ash::kReportDeviceAppInfo, false); +TEST_F(AppUsageObserverTest, ShouldNotPersistAppUsageDataIfSettingUnset) { + // Create a new window for the app and simulate app usage. + static constexpr base::TimeDelta kAppUsageDuration = base::Minutes(2); + ::aura::Window window(nullptr); + window.Init(::ui::LAYER_NOT_DRAWN); + const base::UnguessableToken& kInstanceId = base::UnguessableToken::Create(); + SimulateAppUsageForInstance(&window, kInstanceId, kAppUsageDuration); + + // Verify there is no data persisted to the pref store. + const auto& usage_dict_pref = + GetPrefService()->GetDict(::apps::kAppUsageTime); + ASSERT_TRUE(usage_dict_pref.empty()); +} + +TEST_F(AppUsageObserverTest, ShouldNotPersistAppUsageDataIfAppTypeDisallowed) { + // Set policy to enable reporting for a different app type than the one being + // used. + SetAllowedAppReportingTypes({::ash::reporting::kAppCategoryPWA}); // Create a new window for the app and simulate app usage. static constexpr base::TimeDelta kAppUsageDuration = base::Minutes(2); - const auto window = std::make_unique<::aura::Window>(nullptr); - window->Init(::ui::LAYER_NOT_DRAWN); + ::aura::Window window(nullptr); + window.Init(::ui::LAYER_NOT_DRAWN); const base::UnguessableToken& kInstanceId = base::UnguessableToken::Create(); - SimulateAppUsageForInstance(window.get(), kInstanceId, kAppUsageDuration); + SimulateAppUsageForInstance(&window, kInstanceId, kAppUsageDuration); // Verify there is no data persisted to the pref store. const auto& usage_dict_pref = @@ -161,21 +189,21 @@ } TEST_F(AppUsageObserverTest, ShouldAggregateAppUsageDataOnSubsequentUsage) { - reporting_settings_.SetBoolean(::ash::kReportDeviceAppInfo, true); + SetAllowedAppReportingTypes({::ash::reporting::kAppCategoryAndroidApps}); // Create a new window for the app and simulate app usage. static constexpr base::TimeDelta kAppUsageDuration = base::Minutes(2); - const auto window = std::make_unique<::aura::Window>(nullptr); - window->Init(::ui::LAYER_NOT_DRAWN); + ::aura::Window window(nullptr); + window.Init(::ui::LAYER_NOT_DRAWN); const base::UnguessableToken& kInstanceId = base::UnguessableToken::Create(); - SimulateAppUsageForInstance(window.get(), kInstanceId, kAppUsageDuration); + SimulateAppUsageForInstance(&window, kInstanceId, kAppUsageDuration); // Verify data is persisted to the pref store. ASSERT_THAT(GetPrefService()->GetDict(::apps::kAppUsageTime).size(), Eq(1UL)); VerifyAppUsageDataInPrefStoreForInstance(kInstanceId, kAppUsageDuration); // Simulate additional app usage. - SimulateAppUsageForInstance(window.get(), kInstanceId, kAppUsageDuration); + SimulateAppUsageForInstance(&window, kInstanceId, kAppUsageDuration); // Verify aggregated usage data is persisted in the pref store. const auto& expected_usage_duration = kAppUsageDuration + kAppUsageDuration; @@ -186,23 +214,23 @@ TEST_F(AppUsageObserverTest, ShouldStopPersistingAppUsageDataWhenSettingDisabled) { - // Enable reporting setting initially. - reporting_settings_.SetBoolean(::ash::kReportDeviceAppInfo, true); + // Allow reporting for specified app type initially. + SetAllowedAppReportingTypes({::ash::reporting::kAppCategoryAndroidApps}); // Create a new window for the app and simulate app usage. static constexpr base::TimeDelta kAppUsageDuration = base::Minutes(2); - const auto window = std::make_unique<::aura::Window>(nullptr); - window->Init(::ui::LAYER_NOT_DRAWN); + ::aura::Window window(nullptr); + window.Init(::ui::LAYER_NOT_DRAWN); const base::UnguessableToken& kInstanceId = base::UnguessableToken::Create(); - SimulateAppUsageForInstance(window.get(), kInstanceId, kAppUsageDuration); + SimulateAppUsageForInstance(&window, kInstanceId, kAppUsageDuration); // Verify data is persisted to the pref store. ASSERT_THAT(GetPrefService()->GetDict(::apps::kAppUsageTime).size(), Eq(1UL)); VerifyAppUsageDataInPrefStoreForInstance(kInstanceId, kAppUsageDuration); - // Disable setting and simulate additional app usage. - reporting_settings_.SetBoolean(::ash::kReportDeviceAppInfo, false); - SimulateAppUsageForInstance(window.get(), kInstanceId, kAppUsageDuration); + // Disallow reporting and simulate additional app usage. + SetAllowedAppReportingTypes({}); + SimulateAppUsageForInstance(&window, kInstanceId, kAppUsageDuration); // Verify usage data remains unchanged in the pref store. ASSERT_THAT(GetPrefService()->GetDict(::apps::kAppUsageTime).size(), Eq(1UL)); @@ -210,24 +238,24 @@ } TEST_F(AppUsageObserverTest, ShouldPersistAppUsageDataForNewInstance) { - reporting_settings_.SetBoolean(::ash::kReportDeviceAppInfo, true); + SetAllowedAppReportingTypes({::ash::reporting::kAppCategoryAndroidApps}); // Create a new window for the app and simulate app usage. static constexpr base::TimeDelta kAppUsageDuration = base::Minutes(2); - const auto window = std::make_unique<::aura::Window>(nullptr); - window->Init(::ui::LAYER_NOT_DRAWN); + ::aura::Window window(nullptr); + window.Init(::ui::LAYER_NOT_DRAWN); const base::UnguessableToken& kInstanceId = base::UnguessableToken::Create(); - SimulateAppUsageForInstance(window.get(), kInstanceId, kAppUsageDuration); + SimulateAppUsageForInstance(&window, kInstanceId, kAppUsageDuration); // Verify data is persisted to the pref store. ASSERT_THAT(GetPrefService()->GetDict(::apps::kAppUsageTime).size(), Eq(1UL)); VerifyAppUsageDataInPrefStoreForInstance(kInstanceId, kAppUsageDuration); // Simulate app usage for a new instance of the same app. - const auto window1 = std::make_unique<::aura::Window>(nullptr); - window1->Init(::ui::LAYER_NOT_DRAWN); + ::aura::Window window1(nullptr); + window1.Init(::ui::LAYER_NOT_DRAWN); const base::UnguessableToken& kInstanceId1 = base::UnguessableToken::Create(); - SimulateAppUsageForInstance(window1.get(), kInstanceId1, kAppUsageDuration); + SimulateAppUsageForInstance(&window1, kInstanceId1, kAppUsageDuration); // Verify the component persists usage data for the new instance. ASSERT_THAT(GetPrefService()->GetDict(::apps::kAppUsageTime).size(), Eq(2UL)); @@ -235,7 +263,7 @@ } TEST_F(AppUsageObserverTest, OnAppPlatformMetricsDestroyed) { - reporting_settings_.SetBoolean(::ash::kReportDeviceAppInfo, true); + SetAllowedAppReportingTypes({::ash::reporting::kAppCategoryAndroidApps}); // Reset `AppPlatformMetricsService` to destroy the `AppPlatformMetrics` // component. @@ -244,10 +272,10 @@ // Create a new window for the app and simulate app usage to verify the // component is no longer tracking app usage metric. static constexpr base::TimeDelta kAppUsageDuration = base::Minutes(2); - const auto window = std::make_unique<::aura::Window>(nullptr); - window->Init(::ui::LAYER_NOT_DRAWN); + ::aura::Window window(nullptr); + window.Init(::ui::LAYER_NOT_DRAWN); const base::UnguessableToken& kInstanceId = base::UnguessableToken::Create(); - SimulateAppUsageForInstance(window.get(), kInstanceId, kAppUsageDuration); + SimulateAppUsageForInstance(&window, kInstanceId, kAppUsageDuration); // Verify there is no data persisted to the pref store. const auto& usage_dict_pref =
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/apps/app_usage_telemetry_sampler_browsertest.cc b/chrome/browser/ash/policy/reporting/metrics_reporting/apps/app_usage_telemetry_sampler_browsertest.cc index 1dda521..5c7382f 100644 --- a/chrome/browser/ash/policy/reporting/metrics_reporting/apps/app_usage_telemetry_sampler_browsertest.cc +++ b/chrome/browser/ash/policy/reporting/metrics_reporting/apps/app_usage_telemetry_sampler_browsertest.cc
@@ -5,15 +5,12 @@ #include <memory> #include <string> #include <tuple> +#include <vector> #include "base/check.h" #include "base/functional/bind.h" -#include "base/no_destructor.h" -#include "base/notreached.h" #include "base/strings/string_piece_forward.h" -#include "base/synchronization/lock.h" #include "base/test/scoped_feature_list.h" -#include "base/thread_annotations.h" #include "base/time/time.h" #include "base/time/time_override.h" #include "chrome/browser/apps/app_service/metrics/app_platform_metrics.h" @@ -22,12 +19,11 @@ #include "chrome/browser/ash/policy/affiliation/affiliation_mixin.h" #include "chrome/browser/ash/policy/affiliation/affiliation_test_helper.h" #include "chrome/browser/ash/policy/core/device_policy_cros_browser_test.h" -#include "chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager.h" +#include "chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_prefs.h" #include "chrome/browser/ash/profiles/profile_helper.h" -#include "chrome/browser/ash/settings/scoped_testing_cros_settings.h" -#include "chrome/browser/ash/settings/stub_cros_settings_provider.h" #include "chrome/browser/chromeos/reporting/metric_default_utils.h" #include "chrome/browser/policy/dm_token_utils.h" +#include "chrome/browser/profiles/profile.h" #include "chrome/browser/sync/sync_service_factory.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_window.h" @@ -37,7 +33,6 @@ #include "chrome/browser/web_applications/user_display_mode.h" #include "chrome/browser/web_applications/web_app_id.h" #include "chrome/test/base/in_process_browser_test.h" -#include "chromeos/ash/components/settings/cros_settings_names.h" #include "chromeos/dbus/missive/missive_client_test_observer.h" #include "components/app_constants/constants.h" #include "components/keyed_service/content/browser_context_dependency_manager.h" @@ -59,13 +54,11 @@ #include "third_party/blink/public/mojom/manifest/display_mode.mojom-shared.h" #include "url/gurl.h" -using ::reporting::test::MockClock; using ::testing::AllOf; using ::testing::Eq; using ::testing::Ge; using ::testing::Le; using ::testing::StrEq; -using ::testing::UnorderedPointwise; namespace reporting { namespace { @@ -89,11 +82,6 @@ // Used when validating reported app usage data. constexpr base::TimeDelta kWebAppUsageBufferPeriod = base::Seconds(5); -MATCHER(ContainsAppId, - "Matches app id in app usage proto with the expected one") { - return std::get<0>(arg).app_id() == std::get<1>(arg); -} - // Assert app usage telemetry data in a record with relevant DM token and // returns the underlying `MetricData` object. const MetricData AssertAppUsageTelemetryData(Priority priority, @@ -127,9 +115,8 @@ protected: AppUsageTelemetrySamplerBrowserTest() { // Initialize the MockClock. - MockClock::Get(); + test::MockClock::Get(); crypto_home_mixin_.MarkUserAsExisting(affiliation_mixin_.account_id()); - scoped_feature_list_.InitAndEnableFeature(kEnableAppMetricsReporting); ::policy::SetDMTokenForTesting( ::policy::DMToken::CreateValidToken(kDMToken)); } @@ -142,7 +129,6 @@ void SetUpOnMainThread() override { ::policy::DevicePolicyCrosBrowserTest::SetUpOnMainThread(); - SetPolicyEnabled(true); if (::content::IsPreTest()) { // Preliminary setup - set up affiliated user. ::policy::AffiliationTestHelper::PreLoginUser( @@ -153,6 +139,7 @@ // Login as affiliated user otherwise and set up test environment. ::policy::AffiliationTestHelper::LoginUser(affiliation_mixin_.account_id()); ::web_app::test::UninstallAllWebApps(profile()); + SetAllowedAppReportingTypes({::ash::reporting::kAppCategoryPWA}); test_ukm_recorder_ = std::make_unique<::ukm::TestAutoSetUkmRecorder>(); } @@ -191,12 +178,12 @@ // window to prevent further usage tracking. Browser* const app_browser = ::web_app::LaunchWebAppBrowser(profile(), app_id); - MockClock::Get().Advance(running_time); + test::MockClock::Get().Advance(running_time); ::web_app::CloseAndWait(app_browser); // Trigger usage telemetry collection by advancing the clock. Wait before // returning to ensure usage data gets persisted in the user pref store. - MockClock::Get().Advance(kAppUsageCollectionInterval); + test::MockClock::Get().Advance(kAppUsageCollectionInterval); ::content::RunAllTasksUntilIdle(); } @@ -227,18 +214,6 @@ } } - const AppUsageData::AppUsage& GetAppUsageInfoForApp( - const AppUsageData& app_usage_data, - const ::web_app::AppId& app_id) { - for (const auto& app_usage : app_usage_data.app_usage()) { - if (app_usage.app_id() == app_id) { - return app_usage; - } - } - NOTREACHED_NORETURN() << "App usage info missing for app with id: " - << app_id; - } - void VerifyWebAppUsageUKM(base::StringPiece instance_id, const base::TimeDelta& running_time) { const auto entries = @@ -274,9 +249,13 @@ } } - void SetPolicyEnabled(bool is_enabled) { - scoped_testing_cros_settings_.device_settings()->SetBoolean( - ::ash::kReportDeviceAppInfo, is_enabled); + void SetAllowedAppReportingTypes(const std::vector<std::string>& app_types) { + base::Value::List allowed_app_types; + for (const auto& app_type : app_types) { + allowed_app_types.Append(app_type); + } + profile()->GetPrefs()->SetList(::ash::reporting::kReportAppUsage, + std::move(allowed_app_types)); } Profile* profile() const { @@ -293,9 +272,6 @@ ::policy::AffiliationMixin affiliation_mixin_{&mixin_host_, &test_helper_}; ::ash::CryptohomeMixin crypto_home_mixin_{&mixin_host_}; - base::test::ScopedFeatureList scoped_feature_list_; - ::ash::ScopedTestingCrosSettings scoped_testing_cros_settings_; - base::CallbackListSubscription create_sync_service_subscription_; std::unique_ptr<::ukm::TestAutoSetUkmRecorder> test_ukm_recorder_; }; @@ -307,8 +283,6 @@ } IN_PROC_BROWSER_TEST_F(AppUsageTelemetrySamplerBrowserTest, ReportUsageData) { - ASSERT_TRUE(base::FeatureList::IsEnabled(kEnableAppMetricsReporting)); - // Install webapp and simulate its usage. const auto& app_id = InstallStandaloneWebApp(GURL(kWebAppUrl)); static constexpr base::TimeDelta kAppUsageDuration = base::Minutes(2); @@ -318,31 +292,27 @@ // Force telemetry collection by advancing the timer and verify data that is // being enqueued via ERP. - MockClock::Get().Advance( - metrics::kDefaultDeviceActivityHeartbeatCollectionRate); + test::MockClock::Get().Advance( + metrics::kDefaultAppUsageTelemetryCollectionRate); const auto [priority, record] = missive_observer.GetNextEnqueuedRecord(); const auto metric_data = AssertAppUsageTelemetryData(priority, record); - // Data reported includes usage from the web app + the native Chrome - // component application since these leverage the browser. + // Data reported only includes usage from the web app. Derivative usage from + // the native Chrome component application (since these leverage the browser) + // should be filtered out by the policy setting. const auto& app_usage_data = metric_data.telemetry_data().app_telemetry().app_usage_data(); - ASSERT_THAT(app_usage_data.app_usage().size(), Eq(2)); - ASSERT_THAT( - app_usage_data.app_usage(), - UnorderedPointwise( - ContainsAppId(), - {app_id, static_cast<std::string>(::app_constants::kChromeAppId)})); - const auto& app_usage = GetAppUsageInfoForApp(app_usage_data, app_id); + ASSERT_THAT(app_usage_data.app_usage().size(), Eq(1)); + const auto& app_usage = app_usage_data.app_usage().at(0); VerifyAppUsage(app_usage, app_id, kAppUsageDuration); // Trigger upload to UKM by advancing the timer. - MockClock::Get().Advance(kAppUsageUKMReportingInterval); + test::MockClock::Get().Advance(kAppUsageUKMReportingInterval); ::content::RunAllTasksUntilIdle(); VerifyWebAppUsageUKM(app_usage.app_instance_id(), kAppUsageDuration); // Advance the timer and verify data is cleared by the next upload cycle. - MockClock::Get().Advance(kAppUsageUKMReportingInterval); + test::MockClock::Get().Advance(kAppUsageUKMReportingInterval); ::content::RunAllTasksUntilIdle(); ASSERT_FALSE(profile() ->GetPrefs() @@ -358,7 +328,6 @@ IN_PROC_BROWSER_TEST_F(AppUsageTelemetrySamplerBrowserTest, ReportUsageDataWhenSyncDisabled) { - ASSERT_TRUE(base::FeatureList::IsEnabled(kEnableAppMetricsReporting)); sync_service()->SetDisableReasons( {::syncer::SyncService::DISABLE_REASON_ENTERPRISE_POLICY}); @@ -371,26 +340,21 @@ // Force telemetry collection by advancing the timer and verify data that is // being enqueued via ERP. - MockClock::Get().Advance( - metrics::kDefaultDeviceActivityHeartbeatCollectionRate); + test::MockClock::Get().Advance( + metrics::kDefaultAppUsageTelemetryCollectionRate); const auto [priority, record] = missive_observer.GetNextEnqueuedRecord(); const auto metric_data = AssertAppUsageTelemetryData(priority, record); - // Data reported includes usage from the web app + the native Chrome - // component application since these leverage the browser. + // Data reported only includes usage from the web app. Derivative usage from + // the native Chrome component application (since these leverage the browser) + // should be filtered out by the policy setting. const auto& app_usage_data = metric_data.telemetry_data().app_telemetry().app_usage_data(); - ASSERT_THAT(app_usage_data.app_usage().size(), Eq(2)); - ASSERT_THAT( - app_usage_data.app_usage(), - UnorderedPointwise( - ContainsAppId(), - {app_id, static_cast<std::string>(::app_constants::kChromeAppId)})); - const auto& app_usage = GetAppUsageInfoForApp(app_usage_data, app_id); - VerifyAppUsage(app_usage, app_id, kAppUsageDuration); + ASSERT_THAT(app_usage_data.app_usage().size(), Eq(1)); + VerifyAppUsage(app_usage_data.app_usage().at(0), app_id, kAppUsageDuration); // Advance timer and verify no data is reported to UKM. - MockClock::Get().Advance(kAppUsageUKMReportingInterval); + test::MockClock::Get().Advance(kAppUsageUKMReportingInterval); ::content::RunAllTasksUntilIdle(); ASSERT_THAT( test_ukm_recorder_->GetEntriesByName(kAppUsageUKMEntryName).size(), @@ -405,8 +369,8 @@ IN_PROC_BROWSER_TEST_F(AppUsageTelemetrySamplerBrowserTest, ReportUsageDataWhenPolicyDisabled) { - ASSERT_TRUE(base::FeatureList::IsEnabled(kEnableAppMetricsReporting)); - SetPolicyEnabled(false); + // Disable policy. + SetAllowedAppReportingTypes({}); // Install web app and simulate its usage. const auto& app_id = InstallStandaloneWebApp(GURL(kWebAppUrl)); @@ -417,8 +381,8 @@ // Force telemetry collection by advancing the timer and verify no data is // being enqueued. - MockClock::Get().Advance( - metrics::kDefaultDeviceActivityHeartbeatCollectionRate); + test::MockClock::Get().Advance( + metrics::kDefaultAppUsageTelemetryCollectionRate); ::content::RunAllTasksUntilIdle(); ASSERT_FALSE(missive_observer.HasNewEnqueuedRecords()); }
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager.cc b/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager.cc index 75c6212..027fdb5 100644 --- a/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager.cc +++ b/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager.cc
@@ -22,6 +22,7 @@ #include "chrome/browser/ash/policy/reporting/metrics_reporting/apps/app_events_observer.h" #include "chrome/browser/ash/policy/reporting/metrics_reporting/apps/app_platform_metrics_retriever.h" #include "chrome/browser/ash/policy/reporting/metrics_reporting/apps/app_usage_observer.h" +#include "chrome/browser/ash/policy/reporting/metrics_reporting/apps/app_usage_telemetry_periodic_collector.h" #include "chrome/browser/ash/policy/reporting/metrics_reporting/apps/app_usage_telemetry_sampler.h" #include "chrome/browser/ash/policy/reporting/metrics_reporting/audio/audio_events_observer.h" #include "chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler.h" @@ -76,11 +77,6 @@ } // namespace -// static -BASE_FEATURE(kEnableAppMetricsReporting, - "EnableAppMetricsReporting", - base::FEATURE_DISABLED_BY_DEFAULT); - bool MetricReportingManager::Delegate::IsAffiliated(Profile* profile) const { const user_manager::User* const user = ::ash::ProfileHelper::Get()->GetUserByProfile(profile); @@ -308,22 +304,10 @@ /*init_delay=*/base::TimeDelta()); InitPeripheralsCollectors(); - // Start observing app events only if the app service is available for the - // given profile. + // Start observing app events and telemetry only if the app service is + // available for the given profile. if (delegate_->IsAppServiceAvailableForProfile(profile)) { - // Initialize the `AppUsageObserver` so we can start tracking app usage - // reports right away. - app_usage_observer_ = - AppUsageObserver::Create(profile, &reporting_settings_); - auto app_events_observer = std::make_unique<AppEventsObserver>( - std::make_unique<AppPlatformMetricsRetriever>(profile->GetWeakPtr()), - user_reporting_settings_.get()); - InitEventObserverManager( - std::move(app_events_observer), user_event_report_queue_.get(), - user_reporting_settings_.get(), - /*enable_setting_path=*/::ash::reporting::kReportAppInventory, - metrics::kReportAppInventoryEnabledDefaultValue, - /*init_delay=*/base::TimeDelta()); + InitAppCollectors(profile); } } @@ -336,11 +320,6 @@ InitDisplayCollectors(); InitDeviceActivityCollector(); - if (base::FeatureList::IsEnabled(kEnableAppMetricsReporting) && - delegate_->IsAppServiceAvailableForProfile(profile)) { - InitAppCollectors(profile); - } - initial_upload_timer_.Start(FROM_HERE, GetUploadDelay(), this, &MetricReportingManager::UploadTelemetry); } @@ -535,18 +514,33 @@ void MetricReportingManager::InitAppCollectors(Profile* profile) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(!base::Contains(telemetry_collectors_, kAppTelemetry)); + DCHECK(user_event_report_queue_); + DCHECK(user_reporting_settings_); + DCHECK(user_telemetry_report_queue_); + // App events. + auto app_events_observer = std::make_unique<AppEventsObserver>( + std::make_unique<AppPlatformMetricsRetriever>(profile->GetWeakPtr()), + user_reporting_settings_.get()); + InitEventObserverManager( + std::move(app_events_observer), user_event_report_queue_.get(), + user_reporting_settings_.get(), + /*enable_setting_path=*/::ash::reporting::kReportAppInventory, + metrics::kReportAppInventoryEnabledDefaultValue, + /*init_delay=*/base::TimeDelta()); + + // App telemetry. + app_usage_observer_ = + AppUsageObserver::Create(profile, user_reporting_settings_.get()); auto app_usage_telemetry_sampler = std::make_unique<AppUsageTelemetrySampler>(profile->GetWeakPtr()); - InitPeriodicCollector( - kAppTelemetry, app_usage_telemetry_sampler.get(), - user_telemetry_report_queue_.get(), - /*enable_setting_path=*/::ash::kReportDeviceAppInfo, - metrics::kReportDeviceAppInfoDefaultValue, - ::ash::kDeviceActivityHeartbeatCollectionRateMs, - metrics::GetDefaultCollectionRate( - metrics::kDefaultDeviceActivityHeartbeatCollectionRate), - /*rate_unit_to_ms=*/1, delegate_->GetInitDelay()); + auto app_usage_telemetry_collector = + std::make_unique<AppUsageTelemetryPeriodicCollector>( + app_usage_telemetry_sampler.get(), user_telemetry_report_queue_.get(), + user_reporting_settings_.get()); samplers_.push_back(std::move(app_usage_telemetry_sampler)); + telemetry_collectors_.insert( + {kAppTelemetry, std::move(app_usage_telemetry_collector)}); } void MetricReportingManager::InitAudioCollectors() {
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager.h b/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager.h index 835bb05..b22394e7 100644 --- a/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager.h +++ b/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager.h
@@ -37,9 +37,6 @@ class CollectorBase; class Sampler; -// Feature flag that can be set to facilitate app metrics reporting. -BASE_DECLARE_FEATURE(kEnableAppMetricsReporting); - // Class to initialize and start info, event, and telemetry collection and // reporting. class MetricReportingManager : public policy::ManagedSessionService::Observer,
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager_unittest.cc b/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager_unittest.cc index 0a1b3a0..271796b 100644 --- a/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager_unittest.cc +++ b/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager_unittest.cc
@@ -234,9 +234,6 @@ 1}; const MetricReportingSettingData app_event_settings = { ::ash::reporting::kReportAppInventory, false, "", 1}; -const MetricReportingSettingData app_telemetry_settings = { - ::ash::kReportDeviceAppInfo, false, - ::ash::kDeviceActivityHeartbeatCollectionRateMs, 1}; const MetricReportingSettingData device_activity_telemetry_settings = { ::ash::kDeviceActivityHeartbeatEnabled, false, ::ash::kDeviceActivityHeartbeatCollectionRateMs, 1}; @@ -381,8 +378,10 @@ test_case.setting_data.setting_enabled_default_value, init_delay)) .WillByDefault( [&]() { return std::make_unique<FakeCollector>(&collector_count); }); + + // Mock app service unavailability to eliminate noise. ON_CALL(*mock_delegate_ptr, IsAppServiceAvailableForProfile) - .WillByDefault(Return(true)); + .WillByDefault(Return(false)); auto metric_reporting_manager = MetricReportingManager::CreateForTesting( std::move(mock_delegate_), nullptr); @@ -610,8 +609,10 @@ int observer_manager_count = 0; ON_CALL(*mock_delegate_ptr, IsAffiliated) .WillByDefault(Return(test_case.is_affiliated)); + + // Mock app service unavailability to eliminate noise. ON_CALL(*mock_delegate_ptr, IsAppServiceAvailableForProfile) - .WillByDefault(Return(true)); + .WillByDefault(Return(false)); ON_CALL( *mock_delegate_ptr, CreateEventObserverManager( @@ -705,8 +706,9 @@ int collector_count = 0; ON_CALL(*mock_delegate_ptr, IsAffiliated) .WillByDefault(Return(test_case.is_affiliated)); + // Mock app service unavailability to eliminate noise. ON_CALL(*mock_delegate_ptr, IsAppServiceAvailableForProfile) - .WillByDefault(Return(true)); + .WillByDefault(Return(false)); ON_CALL(*mock_delegate_ptr, CreatePeriodicCollector( _, telemetry_queue_ptr_.get(), _, @@ -753,57 +755,6 @@ EXPECT_EQ(collector_count, 0); } -TEST_F(MetricReportingManagerTelemetryTest, - ShouldNotInitializeAppTelemetrySamplersWhenAppServiceUnavailable) { - // Enable app metrics reporting feature flag. - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeature(kEnableAppMetricsReporting); - - const base::TimeDelta init_delay = metrics::InitDelayParam::Get(); - const base::TimeDelta upload_delay = mock_delegate_->GetInitialUploadDelay(); - auto* const mock_delegate_ptr = mock_delegate_.get(); - int collector_count = 0; - ON_CALL(*mock_delegate_ptr, IsAffiliated).WillByDefault(Return(true)); - ON_CALL(*mock_delegate_ptr, IsAppServiceAvailableForProfile) - .WillByDefault(Return(false)); - ON_CALL(*mock_delegate_ptr, - CreatePeriodicCollector( - _, telemetry_queue_ptr_.get(), _, - app_telemetry_settings.enable_setting_path, - app_telemetry_settings.setting_enabled_default_value, - app_telemetry_settings.rate_setting_path, _, - app_telemetry_settings.rate_unit_to_ms, init_delay)) - .WillByDefault( - [&]() { return std::make_unique<FakeCollector>(&collector_count); }); - ON_CALL(*mock_delegate_ptr, - CreatePeriodicCollector( - _, user_telemetry_queue_ptr_.get(), _, - app_telemetry_settings.enable_setting_path, - app_telemetry_settings.setting_enabled_default_value, - app_telemetry_settings.rate_setting_path, _, - app_telemetry_settings.rate_unit_to_ms, init_delay)) - .WillByDefault( - [&]() { return std::make_unique<FakeCollector>(&collector_count); }); - - const auto metric_reporting_manager = - MetricReportingManager::CreateForTesting(std::move(mock_delegate_), - nullptr); - EXPECT_EQ(collector_count, 0); - task_environment_.FastForwardBy(upload_delay + init_delay); - EXPECT_EQ(telemetry_queue_ptr_->GetNumFlush(), 1); - metric_reporting_manager->OnLogin(profile()); - EXPECT_EQ(collector_count, 0); - - const int expected_login_flush_count = 1; - task_environment_.FastForwardBy(upload_delay + init_delay); - EXPECT_EQ(telemetry_queue_ptr_->GetNumFlush(), - 1 + expected_login_flush_count); - - ON_CALL(*mock_delegate_ptr, IsDeprovisioned).WillByDefault(Return(true)); - metric_reporting_manager->DeviceSettingsUpdated(); - EXPECT_EQ(collector_count, 0); -} - INSTANTIATE_TEST_SUITE_P( MetricReportingManagerTelemetryTests, MetricReportingManagerTelemetryTest, @@ -857,33 +808,7 @@ /*is_affiliated=*/true, device_activity_telemetry_settings, /*has_init_delay=*/true, /*expected_count_before_login=*/0, - /*expected_count_after_login=*/1}, - {"AppTelemetry_Unaffiliated", /*enabled_features=*/{}, - /*disabled_features=*/{}, - /*is_affiliated=*/false, app_telemetry_settings, - /*has_init_delay=*/true, - /*expected_count_before_login=*/0, - /*expected_count_after_login=*/0}, - {"AppTelemetry_Default", /*enabled_features=*/{}, - /*disabled_features=*/{}, - /*is_affiliated=*/true, app_telemetry_settings, - /*has_init_delay=*/true, - /*expected_count_before_login=*/0, - /*expected_count_after_login=*/0}, - {"AppTelemetry_FeatureFlagEnabled", - /*enabled_features=*/{kEnableAppMetricsReporting}, - /*disabled_features=*/{}, - /*is_affiliated=*/true, app_telemetry_settings, - /*has_init_delay=*/true, - /*expected_count_before_login=*/0, - /*expected_count_after_login=*/1}, - {"AppTelemetry_FeatureFlagDisabled", - /*enabled_features=*/{}, - /*disabled_features=*/{kEnableAppMetricsReporting}, - /*is_affiliated=*/true, app_telemetry_settings, - /*has_init_delay=*/true, - /*expected_count_before_login=*/0, - /*expected_count_after_login=*/0}}), + /*expected_count_after_login=*/1}}), [](const testing::TestParamInfo< MetricReportingManagerTelemetryTest::ParamType>& info) { return info.param.test_name;
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_prefs.cc b/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_prefs.cc index 0f8dc08..da08287 100644 --- a/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_prefs.cc +++ b/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_prefs.cc
@@ -4,9 +4,11 @@ #include "chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_prefs.h" +#include "base/containers/contains.h" #include "base/values.h" #include "chrome/browser/chromeos/reporting/metric_default_utils.h" #include "components/pref_registry/pref_registry_syncable.h" +#include "components/reporting/metrics/reporting_settings.h" #include "components/services/app_service/public/cpp/app_types.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -52,4 +54,19 @@ } } +bool IsAppTypeAllowed(::apps::AppType app_type, + const ::reporting::ReportingSettings* reporting_settings, + const std::string& policy_setting) { + DCHECK(reporting_settings); + const base::Value::List* allowed_app_types; + if (!reporting_settings->GetList(policy_setting, &allowed_app_types)) { + // Policy likely unset. Disallow app usage reporting regardless of app type. + return false; + } + const absl::optional<std::string> app_category = + GetAppReportingCategoryForType(app_type); + return app_category.has_value() && + base::Contains(*allowed_app_types, app_category.value()); +} + } // namespace ash::reporting
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_prefs.h b/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_prefs.h index 74c41ef..307f63b 100644 --- a/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_prefs.h +++ b/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_prefs.h
@@ -5,6 +5,8 @@ #ifndef CHROME_BROWSER_ASH_POLICY_REPORTING_METRICS_REPORTING_METRIC_REPORTING_PREFS_H_ #define CHROME_BROWSER_ASH_POLICY_REPORTING_METRICS_REPORTING_METRIC_REPORTING_PREFS_H_ +#include <string> + #include "third_party/abseil-cpp/absl/types/optional.h" namespace user_prefs { @@ -15,6 +17,10 @@ enum class AppType; } +namespace reporting { +class ReportingSettings; +} + namespace ash::reporting { // A list pref that controls app inventory event reporting for the specified app @@ -47,6 +53,12 @@ absl::optional<std::string> GetAppReportingCategoryForType( ::apps::AppType app_type); +// Retrieves the corresponding app reporting policy and returns true if the app +// type is in the retrieved allowlist. False otherwise. +bool IsAppTypeAllowed(::apps::AppType app_type, + const ::reporting::ReportingSettings* reporting_settings, + const std::string& policy_setting); + } // namespace ash::reporting #endif // CHROME_BROWSER_ASH_POLICY_REPORTING_METRICS_REPORTING_METRIC_REPORTING_PREFS_H_
diff --git a/chrome/browser/ash/video_conference/video_conference_integration_browsertest.cc b/chrome/browser/ash/video_conference/video_conference_integration_browsertest.cc index 83280afe..938c890 100644 --- a/chrome/browser/ash/video_conference/video_conference_integration_browsertest.cc +++ b/chrome/browser/ash/video_conference/video_conference_integration_browsertest.cc
@@ -8,7 +8,7 @@ #include "ash/strings/grit/ash_strings.h" #include "ash/system/audio/audio_effects_controller.h" #include "ash/system/status_area_widget_test_helper.h" -#include "ash/system/toast/toast_manager_impl.h" +#include "ash/system/toast/anchored_nudge_manager_impl.h" #include "ash/system/video_conference/bubble/bubble_view_ids.h" #include "ash/system/video_conference/bubble/return_to_app_panel.h" #include "ash/system/video_conference/video_conference_tray.h" @@ -47,8 +47,24 @@ namespace ash::video_conference { -constexpr char kVideoConferenceTrayUseWhileDisabledToastId[] = - "video_conference_tray_toast_ids.use_while_disable"; +namespace { + +bool IsNudgeShown(const std::string& id) { + return Shell::Get()->anchored_nudge_manager()->IsNudgeShown(id); +} + +const std::u16string& GetNudgeText(const std::string& id) { + return Shell::Get()->anchored_nudge_manager()->GetNudgeText(id); +} + +views::View* GetNudgeAnchorView(const std::string& id) { + return Shell::Get()->anchored_nudge_manager()->GetNudgeAnchorView(id); +} + +} // namespace + +constexpr char kVideoConferenceTrayUseWhileDisabledNudgeId[] = + "video_conference_tray_nudge_ids.use_while_disabled"; const char16_t kTitle1[] = u"Title1"; const char16_t kTitle2[] = u"Title2"; @@ -132,8 +148,6 @@ camera_bt_ = GetVcTray()->camera_icon(); mic_bt_ = GetVcTray()->audio_icon(); share_bt_ = GetVcTray()->screen_share_icon(); - - toast_manager_ = Shell::Get()->toast_manager(); } // Navigate to the url in a new tab. @@ -237,9 +251,6 @@ return nullptr; } - const std::u16string GetCurrentToastText() { - return toast_manager_->GetCurrentOverlayForTesting()->GetText(); - } // Helper function that triggers the VcTray with // (1) tab video_conference_demo.html @@ -284,7 +295,6 @@ raw_ptr<VideoConferenceTrayButton, ExperimentalAsh> mic_bt_ = nullptr; raw_ptr<VideoConferenceTrayButton, ExperimentalAsh> share_bt_ = nullptr; - raw_ptr<ToastManagerImpl, ExperimentalAsh> toast_manager_ = nullptr; raw_ptr<Browser, ExperimentalAsh> browser_ = nullptr; base::test::ScopedFeatureList scoped_feature_list_; @@ -635,6 +645,8 @@ /*use_microphone=*/true, /*use_screen_sharing=*/false); + auto* nudge_id = kVideoConferenceTrayUseWhileDisabledNudgeId; + // Stop microphone and wait for is_capturing to populate. StopMicrophone(web_contents); WAIT_FOR_CONDITION(!mic_bt_->is_capturing()); @@ -645,20 +657,19 @@ // Start accessing microphone should trigger UseWhileDisabled. StartMicrophone(web_contents); - WAIT_FOR_CONDITION( - toast_manager_->IsRunning(kVideoConferenceTrayUseWhileDisabledToastId)); + WAIT_FOR_CONDITION(IsNudgeShown(nudge_id)); - // Check the toast message is as expected. + // Check the nudge message and anchor view is as expected. EXPECT_EQ( - GetCurrentToastText(), + GetNudgeText(nudge_id), l10n_util::GetStringFUTF16( IDS_ASH_VIDEO_CONFERENCE_TOAST_USE_WHILE_SOFTWARE_DISABLED, kTitle1, l10n_util::GetStringUTF16(IDS_ASH_VIDEO_CONFERENCE_MICROPHONE_NAME))); + EXPECT_EQ(GetNudgeAnchorView(nudge_id), GetVcTray()->audio_icon()); - // Remove current toast for the next step. - toast_manager_->Cancel(kVideoConferenceTrayUseWhileDisabledToastId); - WAIT_FOR_CONDITION( - !toast_manager_->IsRunning(kVideoConferenceTrayUseWhileDisabledToastId)); + // Remove current nudge for the next step. + Shell::Get()->anchored_nudge_manager()->Cancel(nudge_id); + WAIT_FOR_CONDITION(!IsNudgeShown(nudge_id)); // Clicking on the camera icon should mute it. ClickButton(camera_bt_); @@ -666,15 +677,15 @@ // Start accessing camera should trigger UseWhileDisabled. StartCamera(web_contents); - WAIT_FOR_CONDITION( - toast_manager_->IsRunning(kVideoConferenceTrayUseWhileDisabledToastId)); + WAIT_FOR_CONDITION(IsNudgeShown(nudge_id)); - // Check the toast message is as expected. + // Check the nudge message and anchor view is as expected. EXPECT_EQ( - GetCurrentToastText(), + GetNudgeText(nudge_id), l10n_util::GetStringFUTF16( IDS_ASH_VIDEO_CONFERENCE_TOAST_USE_WHILE_SOFTWARE_DISABLED, kTitle1, l10n_util::GetStringUTF16(IDS_ASH_VIDEO_CONFERENCE_CAMERA_NAME))); + EXPECT_EQ(GetNudgeAnchorView(nudge_id), GetVcTray()->camera_icon()); } IN_PROC_BROWSER_TEST_P(VideoConferenceIntegrationTest,
diff --git a/chrome/browser/browsing_data/browsing_data_model_browsertest.cc b/chrome/browser/browsing_data/browsing_data_model_browsertest.cc index b21004b..d3a2a154 100644 --- a/chrome/browser/browsing_data/browsing_data_model_browsertest.cc +++ b/chrome/browser/browsing_data/browsing_data_model_browsertest.cc
@@ -89,7 +89,7 @@ trustedBiddingSignalsKeys: ['key1'], userBiddingSignals: {some: 'json', data: {here: [1, 2, 3]}}, ads: [{ - renderUrl: $4, + renderURL: $4, metadata: {ad: 'metadata', here: [1, 2, 3]}, }], },
diff --git a/chrome/browser/chooser_controller/OWNERS b/chrome/browser/chooser_controller/OWNERS index ff41043..c82c4e3 100644 --- a/chrome/browser/chooser_controller/OWNERS +++ b/chrome/browser/chooser_controller/OWNERS
@@ -1 +1,3 @@ +chengweih@chromium.org +mattreynolds@chromium.org reillyg@chromium.org
diff --git a/chrome/browser/chrome_origin_trials_browsertest.cc b/chrome/browser/chrome_origin_trials_browsertest.cc index f1a2d39..4d38609 100644 --- a/chrome/browser/chrome_origin_trials_browsertest.cc +++ b/chrome/browser/chrome_origin_trials_browsertest.cc
@@ -72,123 +72,6 @@ 0x07, 0x58, 0xf8, 0xd1, 0x11, 0x50, 0x40, 0xcf, 0xff, 0x41, 0x83, 0x29, 0xd9, 0x7b, 0x99, 0x08, 0x80, 0x2e, 0x53, 0x0b}; -// Token 3 -// generate_token.py http://localhost Feature3 --expire-timestamp=2000000000 -const char kToken3Encoded[] = - "0MkZnXAAvIP08B1so7hGptn+TVzextwwPpov15HrC1G/" - "ODiS+rcLf9VmTorMGvVeD1qtMLSp9fV3o+iRyqEZBw=="; -const uint8_t kToken3Signature[kTokenSignatureSize] = { - 0xd0, 0xc9, 0x19, 0x9d, 0x70, 0x00, 0xbc, 0x83, 0xf4, 0xf0, 0x1d, - 0x6c, 0xa3, 0xb8, 0x46, 0xa6, 0xd9, 0xfe, 0x4d, 0x5c, 0xde, 0xc6, - 0xdc, 0x30, 0x3e, 0x9a, 0x2f, 0xd7, 0x91, 0xeb, 0x0b, 0x51, 0xbf, - 0x38, 0x38, 0x92, 0xfa, 0xb7, 0x0b, 0x7f, 0xd5, 0x66, 0x4e, 0x8a, - 0xcc, 0x1a, 0xf5, 0x5e, 0x0f, 0x5a, 0xad, 0x30, 0xb4, 0xa9, 0xf5, - 0xf5, 0x77, 0xa3, 0xe8, 0x91, 0xca, 0xa1, 0x19, 0x07}; - -// Token 4 -// generate_token.py http://localhost Feature4 --expire-timestamp=2000000000 -const char kToken4Encoded[] = - "x6nmohz1AIru1NOk3AfAvAOqlO8YAbk34lwRRv97KcmYjnO0ty/" - "rJoYK7+oy9XyjWlKPR+iIsEo6MJXBSes+Dw=="; -const uint8_t kToken4Signature[kTokenSignatureSize] = { - 0xc7, 0xa9, 0xe6, 0xa2, 0x1c, 0xf5, 0x00, 0x8a, 0xee, 0xd4, 0xd3, - 0xa4, 0xdc, 0x07, 0xc0, 0xbc, 0x03, 0xaa, 0x94, 0xef, 0x18, 0x01, - 0xb9, 0x37, 0xe2, 0x5c, 0x11, 0x46, 0xff, 0x7b, 0x29, 0xc9, 0x98, - 0x8e, 0x73, 0xb4, 0xb7, 0x2f, 0xeb, 0x26, 0x86, 0x0a, 0xef, 0xea, - 0x32, 0xf5, 0x7c, 0xa3, 0x5a, 0x52, 0x8f, 0x47, 0xe8, 0x88, 0xb0, - 0x4a, 0x3a, 0x30, 0x95, 0xc1, 0x49, 0xeb, 0x3e, 0x0f}; - -// Token 5 -// generate_token.py http://localhost Feature5 --expire-timestamp=2000000000 -const char kToken5Encoded[] = - "UAesWB38gFs4UxRMz+1v8i/" - "AvwaBZsqawnq11ekBNFCvP+L6RGamKijtKHrmtAGhrrF0O3zrh+4J3CGdWaYQCQ=="; -const uint8_t kToken5Signature[kTokenSignatureSize] = { - 0x50, 0x07, 0xac, 0x58, 0x1d, 0xfc, 0x80, 0x5b, 0x38, 0x53, 0x14, - 0x4c, 0xcf, 0xed, 0x6f, 0xf2, 0x2f, 0xc0, 0xbf, 0x06, 0x81, 0x66, - 0xca, 0x9a, 0xc2, 0x7a, 0xb5, 0xd5, 0xe9, 0x01, 0x34, 0x50, 0xaf, - 0x3f, 0xe2, 0xfa, 0x44, 0x66, 0xa6, 0x2a, 0x28, 0xed, 0x28, 0x7a, - 0xe6, 0xb4, 0x01, 0xa1, 0xae, 0xb1, 0x74, 0x3b, 0x7c, 0xeb, 0x87, - 0xee, 0x09, 0xdc, 0x21, 0x9d, 0x59, 0xa6, 0x10, 0x09}; - -// Token 6 -// generate_token.py http://localhost Feature6 --expire-timestamp=2000000000 -const char kToken6Encoded[] = - "SrjYQZAV/sChC7CXzP6Hv6Tvun3FMcg87ary8hAtAXNBcZ0w2M+k1nNyvbbXPF0G5U/" - "7DihaWyvaU6Oho+ecCg=="; -const uint8_t kToken6Signature[kTokenSignatureSize] = { - 0x4a, 0xb8, 0xd8, 0x41, 0x90, 0x15, 0xfe, 0xc0, 0xa1, 0x0b, 0xb0, - 0x97, 0xcc, 0xfe, 0x87, 0xbf, 0xa4, 0xef, 0xba, 0x7d, 0xc5, 0x31, - 0xc8, 0x3c, 0xed, 0xaa, 0xf2, 0xf2, 0x10, 0x2d, 0x01, 0x73, 0x41, - 0x71, 0x9d, 0x30, 0xd8, 0xcf, 0xa4, 0xd6, 0x73, 0x72, 0xbd, 0xb6, - 0xd7, 0x3c, 0x5d, 0x06, 0xe5, 0x4f, 0xfb, 0x0e, 0x28, 0x5a, 0x5b, - 0x2b, 0xda, 0x53, 0xa3, 0xa1, 0xa3, 0xe7, 0x9c, 0x0a}; - -// Token 7 -// generate_token.py http://localhost Feature7 --expire-timestamp=2000000000 -const char kToken7Encoded[] = - "MWABLgE6rUbcRXnu8O/" - "zMQ0arYbDgTwAKxzVkSuhm28TI3PLQRO1nSFxcbJhsmlF77YhCKanuTe5bc0e+NI8DQ=="; -const uint8_t kToken7Signature[kTokenSignatureSize] = { - 0x31, 0x60, 0x01, 0x2e, 0x01, 0x3a, 0xad, 0x46, 0xdc, 0x45, 0x79, - 0xee, 0xf0, 0xef, 0xf3, 0x31, 0x0d, 0x1a, 0xad, 0x86, 0xc3, 0x81, - 0x3c, 0x00, 0x2b, 0x1c, 0xd5, 0x91, 0x2b, 0xa1, 0x9b, 0x6f, 0x13, - 0x23, 0x73, 0xcb, 0x41, 0x13, 0xb5, 0x9d, 0x21, 0x71, 0x71, 0xb2, - 0x61, 0xb2, 0x69, 0x45, 0xef, 0xb6, 0x21, 0x08, 0xa6, 0xa7, 0xb9, - 0x37, 0xb9, 0x6d, 0xcd, 0x1e, 0xf8, 0xd2, 0x3c, 0x0d}; - -// Token 8 -// generate_token.py http://localhost Feature8 --expire-timestamp=2000000000 -const char kToken8Encoded[] = - "M7tESBhBT4c3p3B8AKQ7EPyCxVq0tkro5FnaFcTMK7hxJxN94uabeRiQ6rew1CuDiv/" - "be7psx1kRWQYJNgsOCQ=="; -const uint8_t kToken8Signature[kTokenSignatureSize] = { - 0x33, 0xbb, 0x44, 0x48, 0x18, 0x41, 0x4f, 0x87, 0x37, 0xa7, 0x70, - 0x7c, 0x00, 0xa4, 0x3b, 0x10, 0xfc, 0x82, 0xc5, 0x5a, 0xb4, 0xb6, - 0x4a, 0xe8, 0xe4, 0x59, 0xda, 0x15, 0xc4, 0xcc, 0x2b, 0xb8, 0x71, - 0x27, 0x13, 0x7d, 0xe2, 0xe6, 0x9b, 0x79, 0x18, 0x90, 0xea, 0xb7, - 0xb0, 0xd4, 0x2b, 0x83, 0x8a, 0xff, 0xdb, 0x7b, 0xba, 0x6c, 0xc7, - 0x59, 0x11, 0x59, 0x06, 0x09, 0x36, 0x0b, 0x0e, 0x09}; - -// Token 9 -// generate_token.py http://localhost Feature9 --expire-timestamp=2000000000 -const char kToken9Encoded[] = - "m7Pf/Nzxf26+5u3qx5ruUuR44L9iBoBl7O16Zgh/CEsFzYeTvjDOUQ7k8MpI/" - "USRqytp8xfJD8d6g3LSlhyKAw=="; -const uint8_t kToken9Signature[kTokenSignatureSize] = { - 0x9b, 0xb3, 0xdf, 0xfc, 0xdc, 0xf1, 0x7f, 0x6e, 0xbe, 0xe6, 0xed, - 0xea, 0xc7, 0x9a, 0xee, 0x52, 0xe4, 0x78, 0xe0, 0xbf, 0x62, 0x06, - 0x80, 0x65, 0xec, 0xed, 0x7a, 0x66, 0x08, 0x7f, 0x08, 0x4b, 0x05, - 0xcd, 0x87, 0x93, 0xbe, 0x30, 0xce, 0x51, 0x0e, 0xe4, 0xf0, 0xca, - 0x48, 0xfd, 0x44, 0x91, 0xab, 0x2b, 0x69, 0xf3, 0x17, 0xc9, 0x0f, - 0xc7, 0x7a, 0x83, 0x72, 0xd2, 0x96, 0x1c, 0x8a, 0x03}; - -// Token 10 -// generate_token.py http://localhost Feature10 --expire-timestamp=2000000000 -const char kToken10Encoded[] = - "6RvhT78FdWLfwM7aRxorOBr8PG1z6BGzsEWH3tDZZrc3vQhM7VG3m19AX74noaAQ18F6LUG1Zd" - "brhHELUpflDw=="; -const uint8_t kToken10Signature[kTokenSignatureSize] = { - 0xe9, 0x1b, 0xe1, 0x4f, 0xbf, 0x05, 0x75, 0x62, 0xdf, 0xc0, 0xce, - 0xda, 0x47, 0x1a, 0x2b, 0x38, 0x1a, 0xfc, 0x3c, 0x6d, 0x73, 0xe8, - 0x11, 0xb3, 0xb0, 0x45, 0x87, 0xde, 0xd0, 0xd9, 0x66, 0xb7, 0x37, - 0xbd, 0x08, 0x4c, 0xed, 0x51, 0xb7, 0x9b, 0x5f, 0x40, 0x5f, 0xbe, - 0x27, 0xa1, 0xa0, 0x10, 0xd7, 0xc1, 0x7a, 0x2d, 0x41, 0xb5, 0x65, - 0xd6, 0xeb, 0x84, 0x71, 0x0b, 0x52, 0x97, 0xe5, 0x0f}; - -// Token 11 -// generate_token.py http://localhost Feature11 --expire-timestamp=2000000000 -const char kToken11Encoded[] = - "vdHX5gXbkCVod3P93hkFWwBbTdXHvb+832BYMtTICKf8xyrbUATnfjBSxTWNNc+ptK+/" - "RAr2jOWVHuH+YR+UBQ=="; -const uint8_t kToken11Signature[kTokenSignatureSize] = { - 0xbd, 0xd1, 0xd7, 0xe6, 0x05, 0xdb, 0x90, 0x25, 0x68, 0x77, 0x73, - 0xfd, 0xde, 0x19, 0x05, 0x5b, 0x00, 0x5b, 0x4d, 0xd5, 0xc7, 0xbd, - 0xbf, 0xbc, 0xdf, 0x60, 0x58, 0x32, 0xd4, 0xc8, 0x08, 0xa7, 0xfc, - 0xc7, 0x2a, 0xdb, 0x50, 0x04, 0xe7, 0x7e, 0x30, 0x52, 0xc5, 0x35, - 0x8d, 0x35, 0xcf, 0xa9, 0xb4, 0xaf, 0xbf, 0x44, 0x0a, 0xf6, 0x8c, - 0xe5, 0x95, 0x1e, 0xe1, 0xfe, 0x61, 0x1f, 0x94, 0x05}; - const DisabledTokensTestData kDisabledTokensTests[] = { // One token { @@ -197,19 +80,6 @@ }, // Two tokens {{kToken1Encoded, kToken2Encoded}, {kToken1Signature, kToken2Signature}}, - // Eleven tokens: Almost max - // Closest to the max case of 1024 characters. - // The size of the first eleven base64 encoded 64 character bitset is 978. - // See SetupOriginTrialsCommandLine in - // components/embedder_support/origin_trials/component_updater_utils.cc - // When crbug.com/1216609 is addressed, this case should be adjusted to - // accommodate a higher max. - {{kToken1Encoded, kToken2Encoded, kToken3Encoded, kToken4Encoded, - kToken5Encoded, kToken6Encoded, kToken7Encoded, kToken8Encoded, - kToken9Encoded, kToken10Encoded, kToken11Encoded}, - {kToken1Signature, kToken2Signature, kToken3Signature, kToken4Signature, - kToken5Signature, kToken6Signature, kToken7Signature, kToken8Signature, - kToken9Signature, kToken10Signature, kToken11Signature}}, }; class ChromeOriginTrialsTest : public InProcessBrowserTest { @@ -349,7 +219,10 @@ ChromeOriginTrialsDisabledTokensTest, ::testing::ValuesIn(kDisabledTokensTests)); -const uint16_t kAboveMaxTokensToProduce = 12; +// Should match kMaxDisabledTokens in +// components/embedder_support/origin_trials/origin_trials_settings_storage.cc +const uint16_t kMaxTokensToProduce = 1024; +const uint16_t kAboveMaxTokensToProduce = 1025; // Tests to verify the behavior of the policy once the number of disabled tokens // provided exceeds the limit. @@ -375,6 +248,19 @@ }; // namespace IN_PROC_BROWSER_TEST_F(ChromeOriginTrialsDisabledTokensLimitTest, + PRE_DisabledTokensMaxTokensAppliedToPolicy) { + AddDisabledTokensToPrefs(CreateDisabledTokens(kMaxTokensToProduce)); +} + +IN_PROC_BROWSER_TEST_F(ChromeOriginTrialsDisabledTokensLimitTest, + DisabledTokensMaxTokensAppliedToPolicy) { + blink::OriginTrialPolicy* policy = + content::GetContentClientForTesting()->GetOriginTrialPolicy(); + ASSERT_TRUE(policy); + ASSERT_EQ(policy->GetDisabledTokensForTesting()->size(), kMaxTokensToProduce); +} + +IN_PROC_BROWSER_TEST_F(ChromeOriginTrialsDisabledTokensLimitTest, PRE_DisabledTokensOverSizeLimitAreIgnored) { AddDisabledTokensToPrefs(CreateDisabledTokens(kAboveMaxTokensToProduce)); }
diff --git a/chrome/browser/client_hints/client_hints_browsertest.cc b/chrome/browser/client_hints/client_hints_browsertest.cc index 1d2542c..14aaf07 100644 --- a/chrome/browser/client_hints/client_hints_browsertest.cc +++ b/chrome/browser/client_hints/client_hints_browsertest.cc
@@ -4345,7 +4345,7 @@ return last_ua_ch_val_; } - void CheckSecClientHintUaCount() { + void CheckSecClientHintUaCount(int additional_client_hint) { net::HttpRequestHeaders::Iterator header_iterator( url_loader_interceptor_->GetLastRequestHeaders()); int sec_ch_ua_count = 0; @@ -4357,13 +4357,17 @@ } if (GetParam() == UserAgentOriginTrialTestType::UAReductionAndDeprecation) { - // Two Accept-CH client hints in header: sec-ch-ua-reduced and - // sec-ch-ua-full. - EXPECT_EQ(sec_ch_ua_count, kSecChUaLowEntropyCount + 2); + // Three Accept-CH client hints in header: sec-ch-ua-reduced, + // sec-ch-ua-full and additional client hints added for the accept_ch + // header. + EXPECT_EQ(sec_ch_ua_count, + kSecChUaLowEntropyCount + 2 + additional_client_hint); } else { - // One Accept-CH client hint in header: sec-ch-ua-reduced or - // sec-ch-ua-full. - EXPECT_EQ(sec_ch_ua_count, kSecChUaLowEntropyCount + 1); + // Two Accept-CH client hint in header: sec-ch-ua-reduced or + // sec-ch-ua-full and additional client hints added for the accept_ch + // header. + EXPECT_EQ(sec_ch_ua_count, + kSecChUaLowEntropyCount + 1 + additional_client_hint); } } @@ -4372,6 +4376,15 @@ client_hint)); } + void VerifyAcceptCHAddedToHeader(const std::string& client_hint) { + ASSERT_TRUE(url_loader_interceptor_->GetLastRequestHeaders().HasHeader( + client_hint)); + } + + GURL basic_request_url() const { + return GURL(base::StrCat({kOriginUrl, "/basic.html"})); + } + GURL ua_with_valid_origin_trial_token_url() const { return GURL(base::StrCat( {kOriginUrl, "/accept_ch_ua_with_valid_origin_trial.html"})); @@ -4431,6 +4444,10 @@ return GURL(base::StrCat({kOriginUrl, "/simple.html"})); } + GURL simple_with_subresource_request_url() const { + return GURL(base::StrCat({kOriginUrl, "/simple_with_subresource.html"})); + } + GURL style_css_request_url() const { return GURL(base::StrCat({kOriginUrl, "/style.css"})); } @@ -4603,8 +4620,7 @@ std::string path = "chrome/test/data/client_hints"; path.append(static_cast<std::string>(params->url_request.url.path_piece())); - if (params->url_request.url.path() == "/style.css" || - params->url_request.url.path() == "/simple.html") { + if (params->url_request.url.path() == "/basic.html") { URLLoaderInterceptor::WriteResponse(path, params->client.get()); return true; } @@ -4644,7 +4660,10 @@ switch (GetParam()) { case UserAgentOriginTrialTestType::UAReduction: if (test_options_.has_accept_ch_header) { - base::StrAppend(&headers, {"Accept-CH: ", "sec-ch-ua-reduced", "\n"}); + base::StrAppend( + &headers, + {"Accept-CH: ", "sec-ch-ua-reduced, sec-ch-ua-platform-version", + "\n"}); } if (test_options_.has_critical_ch_header) { base::StrAppend(&headers, @@ -4660,7 +4679,9 @@ break; case UserAgentOriginTrialTestType::UADeprecation: if (test_options_.has_accept_ch_header) { - base::StrAppend(&headers, {"Accept-CH: ", "sec-ch-ua-full", "\n"}); + base::StrAppend(&headers, + {"Accept-CH: ", + "sec-ch-ua-full, sec-ch-ua-platform-version", "\n"}); } if (test_options_.has_critical_ch_header) { base::StrAppend(&headers, {"Critical-CH: ", "sec-ch-ua-full", "\n"}); @@ -4677,7 +4698,9 @@ if (test_options_.has_accept_ch_header) { base::StrAppend( &headers, - {"Accept-CH: ", "sec-ch-ua-reduced, sec-ch-ua-full", "\n"}); + {"Accept-CH: ", + "sec-ch-ua-reduced, sec-ch-ua-full, sec-ch-ua-platform-version", + "\n"}); } if (test_options_.has_critical_ch_header) { base::StrAppend( @@ -4752,7 +4775,8 @@ content::EvalJs(web_contents, "navigator.platform")); #endif - CheckSecClientHintUaCount(); + // One additional client hints: sec-ch-ua-platform-version. + CheckSecClientHintUaCount(/*additional_client_hint=*/1); } IN_PROC_BROWSER_TEST_P(SameOriginUaOriginTrialBrowserTest, @@ -4829,7 +4853,8 @@ /*ch_ua_exist_expected=*/true, /*critical_ch_ua_exist_expected=*/true); - CheckSecClientHintUaCount(); + // One additional client hints: sec-ch-ua-platform-version. + CheckSecClientHintUaCount(/*additional_client_hint=*/1); } IN_PROC_BROWSER_TEST_P(SameOriginUaOriginTrialBrowserTest, @@ -4853,7 +4878,8 @@ SetTestOptions( {/*has_ot_token=*/true, /*valid_ot_token=*/true, /*has_accept_ch_header=*/true, /*has_critical_ch_header=*/false}, - {accept_ch_ua_iframe_request_url(), simple_request_url()}); + {accept_ch_ua_iframe_request_url(), simple_request_url(), + simple_with_subresource_request_url()}); // The last resource request processed for this navigation will be an embedded // iframe request. Since Accept-CH has either Sec-CH-UA-Reduced or @@ -4866,7 +4892,14 @@ UserAgentOriginTrialTestType::UAReduction, /*ch_ua_exist_expected=*/true); - CheckSecClientHintUaCount(); + // One additional client hints: sec-ch-ua-platform-version. + CheckSecClientHintUaCount(/*additional_client_hint=*/1); + + // Iframe request to simple_request_url should not clear existing client + // hints cache when response header has the client hints used for origin + // trial. The subresource request in simple_request_url should also send + // corresponding client hints. + VerifyAcceptCHAddedToHeader("sec-ch-ua-platform-version"); // Make sure the last intercepted URL was the request for the embedded iframe. EXPECT_EQ(last_request_url().path(), "/simple.html"); @@ -4875,13 +4908,10 @@ IN_PROC_BROWSER_TEST_P(SameOriginUaOriginTrialBrowserTest, IframeRequestUaWithValidOriginTrialTokenIgnoreSandbox) { SetTestOptions( - { - /*has_ot_token=*/true, - /*valid_ot_token=*/true, - /*has_accept_ch_header=*/true, - /*has_critical_ch_header=*/false, - }, - {accept_ch_ua_iframe_sandbox_request_url(), simple_request_url()}); + {/*has_ot_token=*/true, /*valid_ot_token=*/true, + /*has_accept_ch_header=*/true, /*has_critical_ch_header=*/false}, + {accept_ch_ua_iframe_sandbox_request_url(), simple_request_url(), + simple_with_subresource_request_url()}); // Ensure that frames with sandbox flags don't interfere with the origin trial NavigateAndCheckHeaders(accept_ch_ua_iframe_sandbox_request_url(), @@ -4889,7 +4919,10 @@ UserAgentOriginTrialTestType::UAReduction, /*ch_ua_exist_expected=*/true); - CheckSecClientHintUaCount(); + // The origin trial client hints don't honor sandbox flags, but no additional + // hints should send. Sandboxed frames should ignore the Accept-CH header and + // should not access Client Hints storage + CheckSecClientHintUaCount(/*additional_client_hint=*/0); // Make sure the last intercepted URL was the request for the embedded iframe. EXPECT_EQ(last_request_url().path(), "/simple.html"); @@ -4900,7 +4933,8 @@ SetTestOptions( {/*has_ot_token=*/true, /*valid_ot_token=*/true, /*has_accept_ch_header=*/true, /*has_critical_ch_header=*/true}, - {critical_ch_ua_iframe_request_url(), simple_request_url()}); + {critical_ch_ua_iframe_request_url(), simple_request_url(), + simple_with_subresource_request_url()}); // The last resource request processed for this navigation will be an embedded // iframe request. Since Accept-CH has either Sec-CH-UA-Reduced or @@ -4913,7 +4947,14 @@ UserAgentOriginTrialTestType::UAReduction, /*ch_ua_exist_expected=*/true); - CheckSecClientHintUaCount(); + // One additional client hints: sec-ch-ua-platform-version. + CheckSecClientHintUaCount(/*additional_client_hint=*/1); + + // Iframe request to simple_request_url should not clear existing client + // hints cache when response header has the client hints used for origin + // trial. The subresource request in simple_request_url should also send + // corresponding client hints. + VerifyAcceptCHAddedToHeader("sec-ch-ua-platform-version"); // Make sure the last intercepted URL was the request for the embedded iframe. EXPECT_EQ(last_request_url().path(), "/simple.html"); @@ -5047,7 +5088,7 @@ SetTestOptions( {/*has_ot_token=*/true, /*valid_ot_token=*/true, /*has_accept_ch_header=*/true, /*has_critical_ch_header=*/false}, - {ua_with_valid_origin_trial_token_url(), simple_request_url()}); + {ua_with_valid_origin_trial_token_url(), basic_request_url()}); // The first navigation sets Sec-CH-UA-Reduced/Sec-CH-UA-Full in the client // hints storage for the origin. @@ -5056,7 +5097,7 @@ /*ch_ua_exist_expected=*/false); // The second navigation doesn't contain an Accept-CH header in the // response, so Sec-CH-UA-Reduced/Sec-CH-UA-Full is removed from the storage. - NavigateAndCheckHeaders(simple_request_url(), + NavigateAndCheckHeaders(basic_request_url(), /*ch_ua_reduced_expected=*/GetParam() == UserAgentOriginTrialTestType::UAReduction, /*ch_ua_exist_expected=*/true);
diff --git a/chrome/browser/device_notifications/OWNERS b/chrome/browser/device_notifications/OWNERS new file mode 100644 index 0000000..c5da8c5f --- /dev/null +++ b/chrome/browser/device_notifications/OWNERS
@@ -0,0 +1,2 @@ +file://chrome/browser/usb/OWNERS +file://chrome/browser/hid/OWNERS
diff --git a/chrome/browser/device_notifications/device_connection_tracker.cc b/chrome/browser/device_notifications/device_connection_tracker.cc new file mode 100644 index 0000000..a7d8cce --- /dev/null +++ b/chrome/browser/device_notifications/device_connection_tracker.cc
@@ -0,0 +1,140 @@ +// 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/device_notifications/device_connection_tracker.h" + +#include <string> + +#include "base/notreached.h" +#include "build/build_config.h" +#include "chrome/browser/device_notifications/device_system_tray_icon.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/chrome_pages.h" +#include "content/public/browser/browser_thread.h" +#include "extensions/buildflags/buildflags.h" +#include "url/origin.h" + +#if BUILDFLAG(ENABLE_EXTENSIONS) +#include "extensions/browser/extension_registry.h" +#include "extensions/common/constants.h" +#endif // BUILDFLAG(ENABLE_EXTENSIONS) + +namespace { + +using base::TimeTicks; + +std::string GetOriginName(Profile* profile, const url::Origin& origin) { +#if BUILDFLAG(ENABLE_EXTENSIONS) + if (origin.scheme() == extensions::kExtensionScheme) { + const auto* extension_registry = + extensions::ExtensionRegistry::Get(profile); + CHECK(extension_registry); + const extensions::Extension* extension = + extension_registry->GetExtensionById( + origin.host(), extensions::ExtensionRegistry::EVERYTHING); + // The extension must be installed if we are generating the name. + CHECK(extension); + return extension->name(); + } +#endif // BUILDFLAG(ENABLE_EXTENSIONS) + NOTREACHED_NORETURN(); +} + +} // namespace + +DeviceConnectionTracker::DeviceConnectionTracker(Profile* profile) + : profile_(profile) {} + +DeviceConnectionTracker::~DeviceConnectionTracker() { + CleanUp(); +} + +void DeviceConnectionTracker::IncrementConnectionCount( + const url::Origin& origin) { + bool to_stage_profile = origins_.empty(); + auto& state = origins_[origin]; + + CHECK_GE(state.count, 0); + if (state.count == 0) { + state.name = GetOriginName(profile_, origin); + } + ++state.count; + state.timestamp = TimeTicks::Now(); + ++total_connection_count_; + + auto* system_tray_icon = GetSystemTrayIcon(); + if (!system_tray_icon) { + return; + } + if (to_stage_profile) { + system_tray_icon->StageProfile(profile_); + } else { + system_tray_icon->NotifyConnectionCountUpdated(profile_); + } +} + +void DeviceConnectionTracker::DecrementConnectionCount( + const url::Origin& origin) { + auto it = origins_.find(origin); + CHECK(it != origins_.end()); + + auto& state = it->second; + CHECK_GT(state.count, 0); + --state.count; + state.timestamp = TimeTicks::Now(); + --total_connection_count_; + if (state.count == 0) { + content::BrowserThread::GetTaskRunnerForThread(content::BrowserThread::UI) + ->PostDelayedTask( + FROM_HERE, + base::BindOnce(&DeviceConnectionTracker::CleanUpOrigin, + weak_factory_.GetWeakPtr(), origin, state.timestamp), + kOriginInactiveTime); + } + + auto* system_tray_icon = GetSystemTrayIcon(); + if (!system_tray_icon) { + return; + } + system_tray_icon->NotifyConnectionCountUpdated(profile_); +} + +void DeviceConnectionTracker::ShowSiteSettings(const url::Origin& origin) { + chrome::ShowSiteSettings(profile_, origin.GetURL()); +} + +void DeviceConnectionTracker::CleanUp() { + if (!origins_.empty()) { + origins_.clear(); + total_connection_count_ = 0; + auto* system_tray_icon = GetSystemTrayIcon(); + if (system_tray_icon) { + system_tray_icon->UnstageProfile(profile_, /*immediate=*/true); + } + } +} + +void DeviceConnectionTracker::CleanUpOrigin(const url::Origin& origin, + const TimeTicks& timestamp) { + auto it = origins_.find(origin); + if (it == origins_.end()) { + // This can happen if the connection bounces within 1 microsecond, which is + // the base unit of base::TimeTicks. The first CleanUpOrigin call will clear + // the origin because it sees the timestamp as the same. + return; + } + auto& state = it->second; + if (state.count == 0 && state.timestamp == timestamp) { + origins_.erase(it); + auto* system_tray_icon = GetSystemTrayIcon(); + if (!system_tray_icon) { + return; + } + if (origins_.empty()) { + system_tray_icon->UnstageProfile(profile_, /*immediate=*/true); + } else { + system_tray_icon->NotifyConnectionCountUpdated(profile_); + } + } +}
diff --git a/chrome/browser/device_notifications/device_connection_tracker.h b/chrome/browser/device_notifications/device_connection_tracker.h new file mode 100644 index 0000000..b7036d4f --- /dev/null +++ b/chrome/browser/device_notifications/device_connection_tracker.h
@@ -0,0 +1,74 @@ +// 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_DEVICE_NOTIFICATIONS_DEVICE_CONNECTION_TRACKER_H_ +#define CHROME_BROWSER_DEVICE_NOTIFICATIONS_DEVICE_CONNECTION_TRACKER_H_ + +#include "base/containers/flat_map.h" +#include "chrome/browser/device_notifications/device_system_tray_icon.h" +#include "chrome/browser/profiles/profile.h" +#include "components/keyed_service/core/keyed_service.h" +#include "url/origin.h" + +// Manages the opened device connection count by the profile. +class DeviceConnectionTracker : public KeyedService { + public: + struct OriginState { + // The number of active connections. + int count; + // The last time the state was updated. + base::TimeTicks timestamp; + // String representation for the origin. + std::string name; + + bool operator==(const OriginState& other) const { + return count == other.count && timestamp == other.timestamp && + name == other.name; + } + }; + + explicit DeviceConnectionTracker(Profile* profile); + DeviceConnectionTracker(DeviceConnectionTracker&&) = delete; + DeviceConnectionTracker& operator=(DeviceConnectionTracker&) = delete; + ~DeviceConnectionTracker() override; + + virtual void IncrementConnectionCount(const url::Origin& origin); + virtual void DecrementConnectionCount(const url::Origin& origin); + + virtual void ShowContentSettingsExceptions() = 0; + virtual void ShowSiteSettings(const url::Origin& origin); + + // This is used by either the destructor or + // the corresponding ConnectionTrackerFactory::BrowserContextShutdown to + // remove its profile from DeviceSystemTrayIcon. + void CleanUp(); + + int total_connection_count() { return total_connection_count_; } + Profile* profile() { return profile_; } + + const base::flat_map<url::Origin, OriginState>& origins() { return origins_; } + + // The time period that an origin remains tracked before it is removed from + // `origins_`. + static constexpr base::TimeDelta kOriginInactiveTime = base::Seconds(10); + + // Removes the `origin` from the `origins_` list if it has not had any new + // connections since `timestamp`. + void CleanUpOrigin(const url::Origin& origin, + const base::TimeTicks& timestamp); + + int total_connection_count_ = 0; + raw_ptr<Profile> profile_; + + // The structure that tracks the connection count for each origin that has + // active connection(s). + base::flat_map<url::Origin, OriginState> origins_; + + private: + virtual DeviceSystemTrayIcon* GetSystemTrayIcon() = 0; + + base::WeakPtrFactory<DeviceConnectionTracker> weak_factory_{this}; +}; + +#endif // CHROME_BROWSER_DEVICE_NOTIFICATIONS_DEVICE_CONNECTION_TRACKER_H_
diff --git a/chrome/browser/device_notifications/device_system_tray_icon.cc b/chrome/browser/device_notifications/device_system_tray_icon.cc new file mode 100644 index 0000000..c103600b --- /dev/null +++ b/chrome/browser/device_notifications/device_system_tray_icon.cc
@@ -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. + +#include "chrome/browser/device_notifications/device_system_tray_icon.h" + +DeviceSystemTrayIcon::DeviceSystemTrayIcon() = default; + +DeviceSystemTrayIcon::~DeviceSystemTrayIcon() = default;
diff --git a/chrome/browser/device_notifications/device_system_tray_icon.h b/chrome/browser/device_notifications/device_system_tray_icon.h new file mode 100644 index 0000000..81191b80 --- /dev/null +++ b/chrome/browser/device_notifications/device_system_tray_icon.h
@@ -0,0 +1,40 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_DEVICE_NOTIFICATIONS_DEVICE_SYSTEM_TRAY_ICON_H_ +#define CHROME_BROWSER_DEVICE_NOTIFICATIONS_DEVICE_SYSTEM_TRAY_ICON_H_ + +class Profile; + +class DeviceSystemTrayIcon { + public: + DeviceSystemTrayIcon(); + DeviceSystemTrayIcon(const DeviceSystemTrayIcon&) = delete; + DeviceSystemTrayIcon& operator=(const DeviceSystemTrayIcon&) = delete; + virtual ~DeviceSystemTrayIcon(); + + // Stage `profile` to be shown in the system tray icon. + virtual void StageProfile(Profile* profile) = 0; + + // TODO(crbug.com/1353104): Remove support for non-immediate unstage request. + // Unstage `profile` that is being shown in the system tray icon. The profile + // will be removed immediately when `immediate` is true, otherwise it is + // scheduled to be removed later. + virtual void UnstageProfile(Profile* profile, bool immediate) = 0; + + // Notify the system tray icon the connection count of the `profile` has + // changed. + virtual void NotifyConnectionCountUpdated(Profile* profile) = 0; + + protected: + // This function is called after the `profile` object is added to the + // `profiles_`. + virtual void ProfileAdded(Profile* profile) = 0; + + // This function is called after the `profile` object is removed from the + // `profiles_`. + virtual void ProfileRemoved(Profile* profile) = 0; +}; + +#endif // CHROME_BROWSER_DEVICE_NOTIFICATIONS_DEVICE_SYSTEM_TRAY_ICON_H_
diff --git a/chrome/browser/dips/dips_bounce_detector.cc b/chrome/browser/dips/dips_bounce_detector.cc index 2e37dd9..74183f1 100644 --- a/chrome/browser/dips/dips_bounce_detector.cc +++ b/chrome/browser/dips/dips_bounce_detector.cc
@@ -700,3 +700,9 @@ } WEB_CONTENTS_USER_DATA_KEY_IMPL(DIPSWebContentsObserver); + +ukm::SourceId GetInitialRedirectSourceId( + content::NavigationHandle* navigation_handle) { + DIPSNavigationHandleImpl handle(navigation_handle); + return handle.GetRedirectSourceId(0); +}
diff --git a/chrome/browser/dips/dips_bounce_detector.h b/chrome/browser/dips/dips_bounce_detector.h index af273c3..a925ebbe 100644 --- a/chrome/browser/dips/dips_bounce_detector.h +++ b/chrome/browser/dips/dips_bounce_detector.h
@@ -339,4 +339,7 @@ WEB_CONTENTS_USER_DATA_KEY_DECL(); }; +ukm::SourceId GetInitialRedirectSourceId( + content::NavigationHandle* navigation_handle); + #endif // CHROME_BROWSER_DIPS_DIPS_BOUNCE_DETECTOR_H_
diff --git a/chrome/browser/dips/dips_service.cc b/chrome/browser/dips/dips_service.cc index d72bfdb..b09944ff 100644 --- a/chrome/browser/dips/dips_service.cc +++ b/chrome/browser/dips/dips_service.cc
@@ -372,7 +372,15 @@ if ((dips::kTriggeringAction.Get() == DIPSTriggeringAction::kStatefulBounce ? stateful : true)) { - UmaHistogramDeletion(GetCookieMode(), DIPSDeletionAction::kExceptedAs1p); + // TODO(crbug.com/1447035): Investigate and fix the presence of empty + // site(s) in the `site_to_clear` list. Once this is fixed remove this + // escape. + if (url.is_empty()) { + UmaHistogramDeletion(GetCookieMode(), DIPSDeletionAction::kIgnored); + } else { + UmaHistogramDeletion(GetCookieMode(), + DIPSDeletionAction::kExceptedAs1p); + } } const std::set<std::string> site_to_clear{GetSiteForDIPS(url)}; @@ -469,6 +477,12 @@ UmaHistogramClearedSitesCount(GetCookieMode(), sites_to_clear.size()); for (const auto& site : sites_to_clear) { + // TODO(crbug.com/1447035): Investigate and fix the presence of empty + // site(s) in the `site_to_clear` list. Once this is fixed remove this loop + // escape. + if (site.empty()) { + continue; + } const ukm::SourceId source_id = ukm::UkmRecorder::GetSourceIdForDipsSite( base::PassKey<DIPSService>(), site); ukm::builders::DIPS_Deletion(source_id) @@ -484,6 +498,13 @@ std::vector<std::string> non_excepted_sites; for (const auto& site : sites_to_clear) { + // TODO(crbug.com/1447035): Investigate and fix the presence of empty + // site(s) in the `site_to_clear` list. Once this is fixed remove this + // loop escape. + if (site.empty()) { + UmaHistogramDeletion(GetCookieMode(), DIPSDeletionAction::kIgnored); + continue; + } if (Has3PCExceptionAs3P(site)) { UmaHistogramDeletion(GetCookieMode(), DIPSDeletionAction::kExceptedAs3p); @@ -511,6 +532,13 @@ } } else { for (auto it = sites_to_clear.begin(); it != sites_to_clear.end(); it++) { + // TODO(crbug.com/1447035): Investigate and fix the presence of empty + // site(s) in the `site_to_clear` list. Once this is fixed remove this + // loop escape. + if (it->empty()) { + UmaHistogramDeletion(GetCookieMode(), DIPSDeletionAction::kIgnored); + continue; + } UmaHistogramDeletion(GetCookieMode(), DIPSDeletionAction::kDisallowed); }
diff --git a/chrome/browser/dips/dips_service_unittest.cc b/chrome/browser/dips/dips_service_unittest.cc index e6476b54..7ce2103f 100644 --- a/chrome/browser/dips/dips_service_unittest.cc +++ b/chrome/browser/dips/dips_service_unittest.cc
@@ -777,3 +777,37 @@ DIPSDeletionAction::kEnforced, 1); EXPECT_TRUE(GetDIPSState(url).has_value()); } + +TEST_F(DIPSServiceHistogramTest, Deletion_Ignored) { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeatureWithParameters( + dips::kFeature, + {{"delete", "true"}, {"triggering_action", "stateful_bounce"}}); + + // Verify the histogram is initially empty. + EXPECT_TRUE(histograms() + .GetTotalCountsForPrefix(kUmaHistogramDeletionPrefix) + .empty()); + + // Record a bounce. + GURL url; + base::Time bounce_time = base::Time::FromDoubleT(2); + GetService()->RecordBounceForTesting(url, GURL("https://initial.com"), + GURL("https://final.com"), bounce_time, + true); + WaitOnStorage(); + + // Time-travel to after the grace period has ended for the bounce. + AdvanceTimeTo(bounce_time + grace_period + tiny_delta); + FireDIPSTimer(); + task_environment_.RunUntilIdle(); + + // Verify a deletion metric was emitted and the DIPS entry was not removed. + base::HistogramTester::CountsMap expected_counts; + expected_counts[kUmaHistogramDeletionPrefix + kBlock3PC] = 1; + EXPECT_THAT(histograms().GetTotalCountsForPrefix(kUmaHistogramDeletionPrefix), + testing::ContainerEq(expected_counts)); + histograms().ExpectUniqueSample(kUmaHistogramDeletionPrefix + kBlock3PC, + DIPSDeletionAction::kIgnored, 1); + EXPECT_TRUE(GetDIPSState(url).has_value()); +}
diff --git a/chrome/browser/dips/dips_utils.h b/chrome/browser/dips/dips_utils.h index 2c33787..52b941f 100644 --- a/chrome/browser/dips/dips_utils.h +++ b/chrome/browser/dips/dips_utils.h
@@ -216,7 +216,8 @@ kExceptedAs1p = 1, kExceptedAs3p = 2, kEnforced = 3, - kMaxValue = kEnforced, + kIgnored = 4, + kMaxValue = kIgnored, }; #endif // CHROME_BROWSER_DIPS_DIPS_UTILS_H_
diff --git a/chrome/browser/download/bubble/download_bubble_update_service.cc b/chrome/browser/download/bubble/download_bubble_update_service.cc index a20619e..41b647f 100644 --- a/chrome/browser/download/bubble/download_bubble_update_service.cc +++ b/chrome/browser/download/bubble/download_bubble_update_service.cc
@@ -667,7 +667,19 @@ if (delayed_crx_guids_.contains(item->GetGuid())) { return; } - GetCacheForItem(item).OnDownloadItemUpdated(item); + CacheManager& cache = GetCacheForItem(item); + // When persisted web app download items are restored from the history + // database, we first get a OnDownloadCreated() notification about the item + // without its DownloadItemWebAppData, causing the item to go into the main + // cache, followed by an OnDownloadUpdated() notification after the + // DownloadItemWebAppData is added. In order to keep the item in the + // appropriate cache for the web app, and NOT in the main cache, we must + // remove it from the main cache explicitly here. Note this assumes that an + // item's associated web app id never changes once it is tagged. + if (!IsMainCache(cache)) { + main_cache_.OnDownloadItemRemoved(item); + } + cache.OnDownloadItemUpdated(item); auto* web_app_data = DownloadItemWebAppData::Get(item); for (Browser* browser : chrome::FindAllBrowsersWithProfile(profile_)) {
diff --git a/chrome/browser/download/bubble/download_bubble_update_service_unittest.cc b/chrome/browser/download/bubble/download_bubble_update_service_unittest.cc index 579f7ec..1bbc7c9 100644 --- a/chrome/browser/download/bubble/download_bubble_update_service_unittest.cc +++ b/chrome/browser/download/bubble/download_bubble_update_service_unittest.cc
@@ -828,6 +828,42 @@ EXPECT_EQ(app_b_info.all_models_size, 1u); } +TEST_F(DownloadBubbleUpdateServiceTest, + DownloadUpdatedWithWebAppDataAfterCreation) { + base::Time now = base::Time::Now(); + web_app::AppId app_id = "app"; + // This simulates the restoration of a web app download from the history + // database, during which the item is created first without the + // DownloadItemWebAppData, and then subsequently tagged with the data. + InitDownloadItem(DownloadState::IN_PROGRESS, "app_download", + /*is_paused=*/false, now); + DownloadItemWebAppData::CreateAndAttachToItem(&GetDownloadItem(0), app_id); + GetDownloadItem(0).NotifyObserversDownloadUpdated(); + + DownloadUIModelPtrVector models; + EXPECT_TRUE( + update_service_->GetAllModelsToDisplay(models, /*web_app_id=*/nullptr)); + EXPECT_TRUE(models.empty()); + + EXPECT_TRUE(update_service_->GetAllModelsToDisplay(models, &app_id)); + ASSERT_EQ(models.size(), 1u); + EXPECT_EQ(models[0]->GetContentId().id, "app_download"); + + DownloadDisplayController::ProgressInfo non_app_progress_info = + update_service_->GetProgressInfo(/*web_app_id=*/nullptr); + EXPECT_EQ(non_app_progress_info.download_count, 0); + + DownloadDisplayController::ProgressInfo app_progress_info = + update_service_->GetProgressInfo(&app_id); + EXPECT_EQ(app_progress_info.download_count, 1); + + AllDownloadUIModelsInfo non_app_info = + update_service_->GetAllModelsInfo(/*web_app_id=*/nullptr); + EXPECT_EQ(non_app_info.all_models_size, 0u); + AllDownloadUIModelsInfo app_info = update_service_->GetAllModelsInfo(&app_id); + EXPECT_EQ(app_info.all_models_size, 1u); +} + class DownloadBubbleUpdateServiceIncognitoTest : public DownloadBubbleUpdateServiceTest { public:
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation/browser/browser_attestation_service.cc b/chrome/browser/enterprise/connectors/device_trust/attestation/browser/browser_attestation_service.cc index de86fba..b4e252b 100644 --- a/chrome/browser/enterprise/connectors/device_trust/attestation/browser/browser_attestation_service.cc +++ b/chrome/browser/enterprise/connectors/device_trust/attestation/browser/browser_attestation_service.cc
@@ -206,29 +206,33 @@ } // Add profile and/or device signature to the signed data. - SignedData signed_data; + auto signed_data = std::make_unique<SignedData>(); + auto* signed_data_ptr = signed_data.get(); + auto barrier_closure = base::BarrierClosure( /*num_closures=*/attesters_.size(), base::BindOnce(&BrowserAttestationService::OnResponseSigned, weak_factory_.GetWeakPtr(), std::move(callback), - encrypted_response.value(), std::ref(signed_data))); + encrypted_response.value(), std::move(signed_data))); for (const auto& attester : attesters_) { - attester->SignResponse(levels, encrypted_response.value(), - std::ref(signed_data), barrier_closure); + attester->SignResponse(levels, encrypted_response.value(), *signed_data_ptr, + barrier_closure); } } void BrowserAttestationService::OnResponseSigned( AttestationCallback callback, const std::string& encrypted_response, - SignedData& signed_data) { + std::unique_ptr<SignedData> signed_data) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + CHECK(signed_data); + // Encode the challenge-response values into a JSON string and return them. - signed_data.set_data(encrypted_response); + signed_data->set_data(encrypted_response); std::string serialized_attestation_response; - if (!signed_data.SerializeToString(&serialized_attestation_response)) { + if (!signed_data->SerializeToString(&serialized_attestation_response)) { std::move(callback).Run( {std::string(), DTAttestationResult::kFailedToSerializeResponse}); return; @@ -243,7 +247,7 @@ std::move(callback).Run( {json_response, json_response.empty() ? DTAttestationResult::kEmptySerializedResponse - : signed_data.has_signature() + : signed_data->has_signature() ? DTAttestationResult::kSuccess : DTAttestationResult::kSuccessNoSignature}); }
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation/browser/browser_attestation_service.h b/chrome/browser/enterprise/connectors/device_trust/attestation/browser/browser_attestation_service.h index 36c9fb1..f49ebf5 100644 --- a/chrome/browser/enterprise/connectors/device_trust/attestation/browser/browser_attestation_service.h +++ b/chrome/browser/enterprise/connectors/device_trust/attestation/browser/browser_attestation_service.h
@@ -56,7 +56,7 @@ void OnResponseSigned(AttestationCallback callback, const std::string& encrypted_response, - SignedData& signed_data); + std::unique_ptr<SignedData> signed_data); GoogleKeys google_keys_;
diff --git a/chrome/browser/extensions/BUILD.gn b/chrome/browser/extensions/BUILD.gn index b0fd330a..e01f8130 100644 --- a/chrome/browser/extensions/BUILD.gn +++ b/chrome/browser/extensions/BUILD.gn
@@ -1054,6 +1054,7 @@ deps += [ # TODO(crbug.com/1340540): Find an appropriate spot for printing_metrics. "//chrome/browser/chromeos/extensions/printing_metrics", + "//chrome/browser/pdf:pdf_pref_names", "//chromeos/printing", "//printing/backend", ]
diff --git a/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc b/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc index 3e172422..ae8a258e 100644 --- a/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc +++ b/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc
@@ -6608,7 +6608,7 @@ biddingLogicUrl: $2, userBiddingSignals: [], ads: [{ - renderUrl: 'https://example.com/render', + renderURL: 'https://example.com/render', metadata: {ad: 'metadata', here: [1, 2, 3]} }] }, /*joinDurationSec=*/ 300);
diff --git a/chrome/browser/extensions/api/printing/print_job_submitter.cc b/chrome/browser/extensions/api/printing/print_job_submitter.cc index 3bd46da..4194b66 100644 --- a/chrome/browser/extensions/api/printing/print_job_submitter.cc +++ b/chrome/browser/extensions/api/printing/print_job_submitter.cc
@@ -16,6 +16,7 @@ #include "base/values.h" #include "chrome/browser/extensions/api/printing/print_job_controller.h" #include "chrome/browser/extensions/api/printing/printing_api_utils.h" +#include "chrome/browser/pdf/pdf_pref_names.h" #include "chrome/browser/printing/printing_service.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/extensions/extensions_dialogs.h" @@ -215,6 +216,14 @@ pdf_flattener_->set_disconnect_handler( base::BindOnce(&PrintJobSubmitter::OnPdfFlattenerDisconnected, weak_ptr_factory_.GetWeakPtr())); + const PrefService* prefs = + Profile::FromBrowserContext(browser_context_)->GetPrefs(); + if (prefs && + prefs->IsManagedPreference(prefs::kPdfUseSkiaRendererEnabled)) { + (*pdf_flattener_) + ->SetUseSkiaRendererPolicy( + prefs->GetBoolean(prefs::kPdfUseSkiaRendererEnabled)); + } } (*pdf_flattener_) ->FlattenPdf(std::move(memory.region),
diff --git a/chrome/browser/extensions/api/runtime/runtime_apitest.cc b/chrome/browser/extensions/api/runtime/runtime_apitest.cc index e3a4ef4..aa8d4833 100644 --- a/chrome/browser/extensions/api/runtime/runtime_apitest.cc +++ b/chrome/browser/extensions/api/runtime/runtime_apitest.cc
@@ -493,7 +493,7 @@ // uninstalled, its uninstall url does not open. // TODO(crbug.com/1446468): Flaky on multiple builds. IN_PROC_BROWSER_TEST_P(RuntimeApiTest, - DISABLE_DoNotOpenUninstallUrlForBlocklistedExtensions) { + DISABLED_DoNotOpenUninstallUrlForBlocklistedExtensions) { ExtensionTestMessageListener ready_listener("ready"); // Load an extension that has set an uninstall url. scoped_refptr<const extensions::Extension> extension =
diff --git a/chrome/browser/extensions/service_worker_registration_apitest.cc b/chrome/browser/extensions/service_worker_registration_apitest.cc index 087a8e9e..b6bd93ef 100644 --- a/chrome/browser/extensions/service_worker_registration_apitest.cc +++ b/chrome/browser/extensions/service_worker_registration_apitest.cc
@@ -205,9 +205,10 @@ // Tests that the service worker is properly unregistered when the extension is // disabled or uninstalled. +// TODO(crbug.com/1446468): Flaky on multiple platforms. IN_PROC_BROWSER_TEST_F( ServiceWorkerRegistrationApiTest, - DisablingOrUninstallingAnExtensionUnregistersTheServiceWorker) { + DISABLED_DisablingOrUninstallingAnExtensionUnregistersTheServiceWorker) { static constexpr char kManifest[] = R"({ "name": "Extension",
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 1669d0f..b310f25 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -745,7 +745,7 @@ { "name": "bluetooth-coredump", "owners": ["mmandlik", "chromeos-bt-team@google.com"], - "expiry_milestone": 115 + "expiry_milestone": 120 }, { "name": "bluetooth-fix-a2dp-packet-size", @@ -755,7 +755,7 @@ { "name": "bluetooth-floss-coredump", "owners": ["mmandlik", "chromeos-bt-team@google.com"], - "expiry_milestone": 115 + "expiry_milestone": 120 }, { "name": "bluetooth-long-autosuspend", @@ -5372,6 +5372,11 @@ "expiry_milestone": 120 }, { + "name": "ntp-realbox-width-behavior", + "owners": [ "johntlee", "mahmadi" ], + "expiry_milestone": 130 + }, + { "name": "ntp-recipe-tasks-module", "owners": [ "rtatum", "tiborg" ], "expiry_milestone": 120
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index a3ee755f..7122315c 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -4649,6 +4649,10 @@ const char kNtpRealboxPedalsDescription[] = "Shows pedals in the NTP Realbox when enabled."; +const char kNtpRealboxWidthBehaviorName[] = "NTP Realbox Width Behavior"; +const char kNtpRealboxWidthBehaviorDescription[] = + "Determines the width of the NTP realbox."; + const char kNtpRealboxRoundedCornersName[] = "NTP Realbox Rounded Corners"; const char kNtpRealboxRoundedCornersDescription[] = "Make NTP realbox dropdown corners match that of the Searchbox.";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 5dc08c5..5e42c5f 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -2662,6 +2662,9 @@ extern const char kNtpRealboxPedalsName[]; extern const char kNtpRealboxPedalsDescription[]; +extern const char kNtpRealboxWidthBehaviorName[]; +extern const char kNtpRealboxWidthBehaviorDescription[]; + extern const char kNtpRealboxRoundedCornersName[]; extern const char kNtpRealboxRoundedCornersDescription[];
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc index 823e1e6..98a64bf 100644 --- a/chrome/browser/flags/android/chrome_feature_list.cc +++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -245,6 +245,7 @@ &kNotificationPermissionVariant, &kNotificationPermissionBottomSheet, &kPageAnnotationsService, + &kPreconnectOnTabCreation, &kBookmarksImprovedSaveFlow, &kBookmarksRefresh, &kOmahaMinSdkVersionAndroid, @@ -778,6 +779,10 @@ "PageAnnotationsService", base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kPreconnectOnTabCreation, + "PreconnectOnTabCreation", + base::FEATURE_DISABLED_BY_DEFAULT); + BASE_FEATURE(kBookmarksImprovedSaveFlow, "BookmarksImprovedSaveFlow", base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/chrome/browser/flags/android/chrome_feature_list.h b/chrome/browser/flags/android/chrome_feature_list.h index 0abfa13..db3ad2cc 100644 --- a/chrome/browser/flags/android/chrome_feature_list.h +++ b/chrome/browser/flags/android/chrome_feature_list.h
@@ -121,6 +121,7 @@ BASE_DECLARE_FEATURE(kOmniboxWarmRecycledViewPool); BASE_DECLARE_FEATURE(kOptimizeGeolocationHeaderGeneration); BASE_DECLARE_FEATURE(kPageAnnotationsService); +BASE_DECLARE_FEATURE(kPreconnectOnTabCreation); BASE_DECLARE_FEATURE(kBookmarksImprovedSaveFlow); BASE_DECLARE_FEATURE(kBookmarksRefresh); BASE_DECLARE_FEATURE(kOpaqueOriginForIncomingIntents);
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 ac4f67f..fa907240 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
@@ -5,11 +5,8 @@ package org.chromium.chrome.browser.flags; import androidx.annotation.AnyThread; -import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; -import com.google.common.collect.ImmutableMap; - import org.chromium.base.FieldTrialList; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.NativeMethods; @@ -42,116 +39,23 @@ * value in shared preferences. */ public class CachedFeatureFlags { - /** - * Non-dynamic preference keys used historically for specific features. - * - * Do not add new values to this list. To add a new cached feature flag, just follow the - * instructions in the class javadoc. - */ - private static final Map<String, String> sNonDynamicPrefKeys = - ImmutableMap.<String, String>builder() - .put(ChromeFeatureList.COMMAND_LINE_ON_NON_ROOTED, - ChromePreferenceKeys.FLAGS_CACHED_COMMAND_LINE_ON_NON_ROOTED_ENABLED) - .put(ChromeFeatureList.SWAP_PIXEL_FORMAT_TO_FIX_CONVERT_FROM_TRANSLUCENT, - ChromePreferenceKeys - .FLAGS_CACHED_SWAP_PIXEL_FORMAT_TO_FIX_CONVERT_FROM_TRANSLUCENT) - .put(ChromeFeatureList.START_SURFACE_ANDROID, - ChromePreferenceKeys.FLAGS_CACHED_START_SURFACE_ENABLED) - .put(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, - ChromePreferenceKeys.FLAGS_CACHED_GRID_TAB_SWITCHER_ENABLED) - .put(ChromeFeatureList.TAB_GROUPS_ANDROID, - ChromePreferenceKeys.FLAGS_CACHED_TAB_GROUPS_ANDROID_ENABLED) - .build(); - - private static ValuesReturned sValuesReturned = new ValuesReturned(); private static ValuesOverridden sValuesOverridden = new ValuesOverridden(); - private static CachedFlagsSafeMode sSafeMode = new CachedFlagsSafeMode(); private static String sReachedCodeProfilerTrialGroup; - /** - * Rules from highest to lowest priority: - * 1. If the flag has been forced by @EnableFeatures/@DisableFeatures or - * {@link CachedFlag#setForTesting}, the forced value is returned. - * 2. If a value was previously returned in the same run, the same value is returned for - * consistency. - * 3. If native is loaded, the value from {@link ChromeFeatureList} is returned. - * 4. If in a previous run, the value from {@link ChromeFeatureList} was cached to SharedPrefs, - * it is returned. - * 5. The default value passed as a parameter is returned. - */ - @AnyThread - static boolean isEnabled(CachedFlag cachedFlag) { - sSafeMode.onFlagChecked(); - - String featureName = cachedFlag.getFeatureName(); - boolean defaultValue = cachedFlag.getDefaultValue(); - String preferenceName = getPrefForFeatureFlag(featureName); - - Boolean flag; - synchronized (sValuesReturned.boolValues) { - flag = sValuesReturned.boolValues.get(preferenceName); - if (flag != null) { - return flag; - } - - flag = sSafeMode.isEnabled(featureName, preferenceName, defaultValue); - if (flag == null) { - SharedPreferencesManager prefs = SharedPreferencesManager.getInstance(); - if (prefs.contains(preferenceName)) { - flag = prefs.readBoolean(preferenceName, false); - } else { - flag = defaultValue; - } - } - - sValuesReturned.boolValues.put(preferenceName, flag); - } - return flag; - } - @CalledByNative @AnyThread static boolean isEnabled(String featureName) { CachedFlag cachedFlag = ChromeFeatureList.sAllCachedFlags.get(featureName); - assert cachedFlag != null : String.format("%s not found in ChromeFeatureList", featureName); + assert cachedFlag != null; - return isEnabled(cachedFlag); - } - - /** - * Caches the value of a feature from {@link ChromeFeatureList} to SharedPrefs. - * - * @param featureName the feature name from ChromeFeatureList. - */ - static void cacheFeature(String featureName) { - String preferenceName = getPrefForFeatureFlag(featureName); - boolean isEnabledInNative = ChromeFeatureList.isEnabled(featureName); - SharedPreferencesManager.getInstance().writeBoolean(preferenceName, isEnabledInNative); - } - - /** - * Forces a feature to be enabled or disabled for testing. - * - * Do not call this from tests; use @EnableFeatures/@DisableFeatures annotations or - * {@link CachedFlag#setForTesting(Boolean)} instead. - * - * @param featureName the feature name from ChromeFeatureList. - * @param value the value that {@link CachedFlag#isEnabled()} will be forced to return. If null, - * remove any values previously forced. - */ - static void setForTesting(String featureName, @Nullable Boolean value) { - String preferenceName = getPrefForFeatureFlag(featureName); - synchronized (sValuesReturned.boolValues) { - sValuesReturned.boolValues.put(preferenceName, value); - } + return cachedFlag.isEnabled(); } /** * Sets the feature flags to use in JUnit and instrumentation tests. * - * Do not call this from tests; use @EnableFeatures/@DisableFeatures annotations or - * {@link CachedFlag#setForTesting(Boolean)} instead. + * Do not call this from tests; use @EnableFeatures/@DisableFeatures annotations instead. */ @VisibleForTesting public static void setFeaturesForTesting(Map<String, Boolean> features) { @@ -159,9 +63,7 @@ sValuesOverridden.enableOverrides(); - for (Map.Entry<String, Boolean> entry : features.entrySet()) { - setForTesting(entry.getKey(), entry.getValue()); - } + CachedFlag.setFeaturesForTesting(features); } /** @@ -181,7 +83,7 @@ */ public static void cacheAdditionalNativeFlags() { cacheNetworkServiceWarmUpEnabled(); - sSafeMode.cacheSafeModeForCachedFlagsEnabled(); + CachedFlagsSafeMode.getInstance().cacheSafeModeForCachedFlagsEnabled(); cacheReachedCodeProfilerTrialGroup(); // Propagate REACHED_CODE_PROFILER feature value to LibraryLoader. This can't be done in @@ -268,156 +170,140 @@ * Call when entering an initialization flow that should result in caching flags. */ public static void onStartOrResumeCheckpoint() { - sSafeMode.onStartOrResumeCheckpoint(); + CachedFlagsSafeMode.getInstance().onStartOrResumeCheckpoint(); } /** * Call when aborting an initialization flow that would have resulted in caching flags. */ public static void onPauseCheckpoint() { - sSafeMode.onPauseCheckpoint(); + CachedFlagsSafeMode.getInstance().onPauseCheckpoint(); } /** * Call when finishing an initialization flow with flags having been cached successfully. */ public static void onEndCheckpoint() { - sSafeMode.onEndCheckpoint(sValuesReturned); + CachedFlagsSafeMode.getInstance().onEndCheckpoint(); } public static @CachedFlagsSafeMode.Behavior int getSafeModeBehaviorForTesting() { - return sSafeMode.getBehaviorForTesting(); + return CachedFlagsSafeMode.getInstance().getBehaviorForTesting(); } @AnyThread static boolean getConsistentBooleanValue(String preferenceName, boolean defaultValue) { - sSafeMode.onFlagChecked(); + CachedFlagsSafeMode.getInstance().onFlagChecked(); if (sValuesOverridden.isEnabled()) { return sValuesOverridden.getBool(preferenceName, defaultValue); } Boolean value; - synchronized (sValuesReturned.boolValues) { - value = sValuesReturned.boolValues.get(preferenceName); + synchronized (ValuesReturned.sBoolValues) { + value = ValuesReturned.sBoolValues.get(preferenceName); if (value != null) { return value; } - value = sSafeMode.getBooleanFieldTrialParam(preferenceName, defaultValue); + value = CachedFlagsSafeMode.getInstance().getBooleanFieldTrialParam( + preferenceName, defaultValue); if (value == null) { value = SharedPreferencesManager.getInstance().readBoolean( preferenceName, defaultValue); } - sValuesReturned.boolValues.put(preferenceName, value); + ValuesReturned.sBoolValues.put(preferenceName, value); } return value; } @AnyThread static String getConsistentStringValue(String preferenceName, String defaultValue) { - sSafeMode.onFlagChecked(); + CachedFlagsSafeMode.getInstance().onFlagChecked(); if (sValuesOverridden.isEnabled()) { return sValuesOverridden.getString(preferenceName, defaultValue); } String value; - synchronized (sValuesReturned.stringValues) { - value = sValuesReturned.stringValues.get(preferenceName); + synchronized (ValuesReturned.sStringValues) { + value = ValuesReturned.sStringValues.get(preferenceName); if (value != null) { return value; } - value = sSafeMode.getStringFieldTrialParam(preferenceName, defaultValue); + value = CachedFlagsSafeMode.getInstance().getStringFieldTrialParam( + preferenceName, defaultValue); if (value == null) { value = SharedPreferencesManager.getInstance().readString( preferenceName, defaultValue); } - sValuesReturned.stringValues.put(preferenceName, value); + ValuesReturned.sStringValues.put(preferenceName, value); } return value; } @AnyThread static int getConsistentIntValue(String preferenceName, int defaultValue) { - sSafeMode.onFlagChecked(); + CachedFlagsSafeMode.getInstance().onFlagChecked(); if (sValuesOverridden.isEnabled()) { return sValuesOverridden.getInt(preferenceName, defaultValue); } Integer value; - synchronized (sValuesReturned.intValues) { - value = sValuesReturned.intValues.get(preferenceName); + synchronized (ValuesReturned.sIntValues) { + value = ValuesReturned.sIntValues.get(preferenceName); if (value != null) { return value; } - value = sSafeMode.getIntFieldTrialParam(preferenceName, defaultValue); + value = CachedFlagsSafeMode.getInstance().getIntFieldTrialParam( + preferenceName, defaultValue); if (value == null) { value = SharedPreferencesManager.getInstance().readInt( preferenceName, defaultValue); } - sValuesReturned.intValues.put(preferenceName, value); + ValuesReturned.sIntValues.put(preferenceName, value); } return value; } @AnyThread static double getConsistentDoubleValue(String preferenceName, double defaultValue) { - sSafeMode.onFlagChecked(); + CachedFlagsSafeMode.getInstance().onFlagChecked(); if (sValuesOverridden.isEnabled()) { return sValuesOverridden.getDouble(preferenceName, defaultValue); } Double value; - synchronized (sValuesReturned.doubleValues) { - value = sValuesReturned.doubleValues.get(preferenceName); + synchronized (ValuesReturned.sDoubleValues) { + value = ValuesReturned.sDoubleValues.get(preferenceName); if (value != null) { return value; } - value = sSafeMode.getDoubleFieldTrialParam(preferenceName, defaultValue); + value = CachedFlagsSafeMode.getInstance().getDoubleFieldTrialParam( + preferenceName, defaultValue); if (value == null) { value = SharedPreferencesManager.getInstance().readDouble( preferenceName, defaultValue); } - sValuesReturned.doubleValues.put(preferenceName, value); + ValuesReturned.sDoubleValues.put(preferenceName, value); } return value; } - @AnyThread - private static String getPrefForFeatureFlag(String featureName) { - String legacyPrefKey = sNonDynamicPrefKeys.get(featureName); - if (legacyPrefKey == null) { - return ChromePreferenceKeys.FLAGS_CACHED.createKey(featureName); - } else { - return legacyPrefKey; - } - } - @VisibleForTesting public static void resetFlagsForTesting() { - sValuesReturned.clearForTesting(); + ValuesReturned.clearForTesting(); sValuesOverridden.removeOverrides(); - sSafeMode.clearMemoryForTesting(); - } - - @VisibleForTesting - public static void resetDiskForTesting() { - SharedPreferencesManager.getInstance().removeKeysWithPrefix( - ChromePreferenceKeys.FLAGS_CACHED); - for (Map.Entry<String, String> e : sNonDynamicPrefKeys.entrySet()) { - String prefKey = e.getValue(); - SharedPreferencesManager.getInstance().removeKey(prefKey); - } + CachedFlagsSafeMode.getInstance().clearMemoryForTesting(); } @VisibleForTesting @@ -427,7 +313,7 @@ @VisibleForTesting static void setSafeModeExperimentEnabledForTesting(Boolean value) { - sSafeMode.setExperimentEnabledForTesting(value); + CachedFlagsSafeMode.getInstance().setExperimentEnabledForTesting(value); } @NativeMethods
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFieldTrialParameterUnitTest.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFieldTrialParameterUnitTest.java index 17b18e3b..fc85001 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFieldTrialParameterUnitTest.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFieldTrialParameterUnitTest.java
@@ -97,7 +97,7 @@ MockitoAnnotations.initMocks(this); CachedFeatureFlags.resetFlagsForTesting(); - CachedFeatureFlags.resetDiskForTesting(); + CachedFlag.resetDiskForTesting(); TestValues testValues = new TestValues(); @@ -122,7 +122,7 @@ @After public void tearDown() { CachedFeatureFlags.resetFlagsForTesting(); - CachedFeatureFlags.resetDiskForTesting(); + CachedFlag.resetDiskForTesting(); FeatureList.setTestValues(null); }
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFlag.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFlag.java index ac6131f..7fb4e194 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFlag.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFlag.java
@@ -8,6 +8,8 @@ import androidx.annotation.VisibleForTesting; import org.chromium.base.Flag; +import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; +import org.chromium.chrome.browser.preferences.SharedPreferencesManager; import java.util.HashMap; import java.util.List; @@ -16,19 +18,70 @@ /** * Flags of this type may be used before native is loaded and return the value read * from native and cached to SharedPreferences in a previous run. - * @see {@link CachedFeatureFlags#isEnabled(String, boolean)} + * + * @see {@link #isEnabled()} */ public class CachedFlag extends Flag { private final boolean mDefaultValue; + @Nullable + private final String mLegacySharedPreferenceKey; public CachedFlag(String featureName, boolean defaultValue) { super(featureName); + mLegacySharedPreferenceKey = null; mDefaultValue = defaultValue; } + /** + * @deprecated This is the constructor for legacy CachedFlags that predate unifying them + * under a SharedPreferences prefix. + */ + @Deprecated + public CachedFlag(String featureName, String sharedPreferenceKey, boolean defaultValue) { + super(featureName); + mLegacySharedPreferenceKey = sharedPreferenceKey; + mDefaultValue = defaultValue; + } + + /** + * Rules from highest to lowest priority: + * 1. If the flag has been forced by @EnableFeatures/@DisableFeatures or + * {@link CachedFlag#setForTesting}, the forced value is returned. + * 2. If a value was previously returned in the same run, the same value is returned for + * consistency. + * 3. If native is loaded, the value from {@link ChromeFeatureList} is returned. + * 4. If in a previous run, the value from {@link ChromeFeatureList} was cached to SharedPrefs, + * it is returned. + * 5. The default value passed as a parameter is returned. + */ @Override public boolean isEnabled() { - return CachedFeatureFlags.isEnabled(this); + CachedFlagsSafeMode.getInstance().onFlagChecked(); + + String preferenceName = getSharedPreferenceKey(); + + Boolean flag; + synchronized (ValuesReturned.sBoolValues) { + Map<String, Boolean> boolValuesReturned = ValuesReturned.sBoolValues; + flag = boolValuesReturned.get(preferenceName); + if (flag != null) { + return flag; + } + + flag = CachedFlagsSafeMode.getInstance().isEnabled( + mFeatureName, preferenceName, mDefaultValue); + if (flag == null) { + SharedPreferencesManager prefs = SharedPreferencesManager.getInstance(); + if (prefs.contains(preferenceName)) { + flag = prefs.readBoolean(preferenceName, false); + } else { + flag = mDefaultValue; + } + } + + boolValuesReturned.put(preferenceName, flag); + } + return flag; } /** @@ -39,15 +92,69 @@ } @Override - protected void clearInMemoryCachedValueForTesting() {} - - @VisibleForTesting - public void setForTesting(@Nullable Boolean value) { - CachedFeatureFlags.setForTesting(mFeatureName, value); + protected void clearInMemoryCachedValueForTesting() { + // ValuesReturned is cleared by CachedFeatureFlags#resetFlagsForTesting(). } - public void cacheFeature() { - CachedFeatureFlags.cacheFeature(mFeatureName); + /** + * Forces a feature to be enabled or disabled for testing. + * + * @deprecated do not call this from tests; use @EnableFeatures/@DisableFeatures instead, + * since batched tests need to be split by feature flag configuration. + */ + @VisibleForTesting + @Deprecated + public void setForTesting(@Nullable Boolean value) { + setValueReturnedForTesting(value); + } + + private void setValueReturnedForTesting(@Nullable Boolean value) { + synchronized (ValuesReturned.sBoolValues) { + ValuesReturned.sBoolValues.put(getSharedPreferenceKey(), value); + } + } + + /** + * Caches the value of the feature from {@link ChromeFeatureList} to SharedPrefs. + */ + void cacheFeature() { + boolean isEnabledInNative = ChromeFeatureList.isEnabled(mFeatureName); + SharedPreferencesManager.getInstance().writeBoolean( + getSharedPreferenceKey(), isEnabledInNative); + } + + @Nullable + String getLegacySharedPreferenceKey() { + return mLegacySharedPreferenceKey; + } + + String getSharedPreferenceKey() { + if (mLegacySharedPreferenceKey != null) { + return mLegacySharedPreferenceKey; + } else { + return ChromePreferenceKeys.FLAGS_CACHED.createKey(mFeatureName); + } + } + + static void setFeaturesForTesting(Map<String, Boolean> features) { + for (Map.Entry<String, Boolean> entry : features.entrySet()) { + CachedFlag possibleCachedFlag = ChromeFeatureList.sAllCachedFlags.get(entry.getKey()); + if (possibleCachedFlag != null) { + possibleCachedFlag.setValueReturnedForTesting(entry.getValue()); + } + } + } + + @VisibleForTesting + public static void resetDiskForTesting() { + SharedPreferencesManager.getInstance().removeKeysWithPrefix( + ChromePreferenceKeys.FLAGS_CACHED); + for (Map.Entry<String, CachedFlag> e : ChromeFeatureList.sAllCachedFlags.entrySet()) { + String legacyPreferenceKey = e.getValue().getLegacySharedPreferenceKey(); + if (legacyPreferenceKey != null) { + SharedPreferencesManager.getInstance().removeKey(legacyPreferenceKey); + } + } } /**
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFlagsSafeMode.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFlagsSafeMode.java index 3f52e98b..9baa379 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFlagsSafeMode.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFlagsSafeMode.java
@@ -67,7 +67,14 @@ private AtomicBoolean mStartCheckpointWritten = new AtomicBoolean(false); private AtomicBoolean mEndCheckpointWritten = new AtomicBoolean(false); - CachedFlagsSafeMode() {} + private static final CachedFlagsSafeMode sInstance = new CachedFlagsSafeMode(); + + public static CachedFlagsSafeMode getInstance() { + return sInstance; + } + + // Singleton + private CachedFlagsSafeMode() {} /** * Call right before any flag is checked. The first time this is called, check if safe mode @@ -154,7 +161,7 @@ * Call when all flags have been cached. Signals that the current configuration is safe. It will * be saved to be used in Safe Mode. */ - void onEndCheckpoint(ValuesReturned safeValuesReturned) { + void onEndCheckpoint() { if (mEndCheckpointWritten.getAndSet(true)) { // Limit to one reset per run. return; @@ -172,7 +179,7 @@ @Override protected Void doInBackground() { try { - writeSafeValues(safeValuesReturned); + writeSafeValues(); } catch (Exception e) { Log.e(TAG, "Exception writing safe values.", e); cancel(true); @@ -232,7 +239,7 @@ SAFE_VALUES_FILE, Context.MODE_PRIVATE); } - private void writeSafeValues(ValuesReturned safeValuesReturned) { + private void writeSafeValues() { TraceEvent.begin("writeSafeValues"); SharedPreferences.Editor editor = getSafeValuePreferences().edit(); @@ -241,24 +248,24 @@ // will. editor.clear(); - synchronized (safeValuesReturned.boolValues) { - for (Entry<String, Boolean> pair : safeValuesReturned.boolValues.entrySet()) { + synchronized (ValuesReturned.sBoolValues) { + for (Entry<String, Boolean> pair : ValuesReturned.sBoolValues.entrySet()) { editor.putBoolean(pair.getKey(), pair.getValue()); } } - synchronized (safeValuesReturned.intValues) { - for (Entry<String, Integer> pair : safeValuesReturned.intValues.entrySet()) { + synchronized (ValuesReturned.sIntValues) { + for (Entry<String, Integer> pair : ValuesReturned.sIntValues.entrySet()) { editor.putInt(pair.getKey(), pair.getValue()); } } - synchronized (safeValuesReturned.doubleValues) { - for (Entry<String, Double> pair : safeValuesReturned.doubleValues.entrySet()) { + synchronized (ValuesReturned.sDoubleValues) { + for (Entry<String, Double> pair : ValuesReturned.sDoubleValues.entrySet()) { long ieee754LongValue = Double.doubleToRawLongBits(pair.getValue()); editor.putLong(pair.getKey(), ieee754LongValue); } } - synchronized (safeValuesReturned.stringValues) { - for (Entry<String, String> pair : safeValuesReturned.stringValues.entrySet()) { + synchronized (ValuesReturned.sStringValues) { + for (Entry<String, String> pair : ValuesReturned.sStringValues.entrySet()) { editor.putString(pair.getKey(), pair.getValue()); } }
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 a319d7b9..3f2b9498 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
@@ -5,6 +5,7 @@ package org.chromium.chrome.browser.flags; import org.chromium.base.FeatureMap; +import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; import java.util.List; import java.util.Map; @@ -348,6 +349,7 @@ public static final String PREFETCH_NOTIFICATION_SCHEDULING_INTEGRATION = "PrefetchNotificationSchedulingIntegration"; public static final String PRERENDER2 = "Prerender2"; + public static final String PRECONNECT_ON_TAB_CREATION = "PreconnectOnTabCreation"; public static final String PRIVACY_GUIDE = "PrivacyGuideAndroid"; public static final String PRIVACY_SANDBOX_FPS_UI = "PrivacySandboxFirstPartySetsUI"; public static final String PRIVACY_SANDBOX_SETTINGS_3 = "PrivacySandboxSettings3"; @@ -520,7 +522,8 @@ public static final CachedFlag sCloseTabSaveTabList = new CachedFlag(CLOSE_TAB_SAVE_TAB_LIST, true); public static final CachedFlag sCommandLineOnNonRooted = - new CachedFlag(COMMAND_LINE_ON_NON_ROOTED, false); + new CachedFlag(COMMAND_LINE_ON_NON_ROOTED, + ChromePreferenceKeys.FLAGS_CACHED_COMMAND_LINE_ON_NON_ROOTED_ENABLED, false); public static final CachedFlag sCriticalPersistedTabData = new CachedFlag(CRITICAL_PERSISTED_TAB_DATA, false); public static final CachedFlag sDelayTempStripRemoval = @@ -552,8 +555,8 @@ public static final CachedFlag sShouldIgnoreIntentSkipInternalCheck = new CachedFlag(SHOULD_IGNORE_INTENT_SKIP_INTERNAL_CHECK, true); public static final CachedFlag sSpareTab = new CachedFlag(SPARE_TAB, false); - public static final CachedFlag sStartSurfaceAndroid = - new CachedFlag(START_SURFACE_ANDROID, true); + public static final CachedFlag sStartSurfaceAndroid = new CachedFlag( + START_SURFACE_ANDROID, ChromePreferenceKeys.FLAGS_CACHED_START_SURFACE_ENABLED, true); public static final CachedFlag sStartSurfaceDisabledFeedImprovement = new CachedFlag(START_SURFACE_DISABLED_FEED_IMPROVEMENT, false); public static final CachedFlag sStartSurfaceOnTablet = @@ -565,11 +568,14 @@ public static final CachedFlag sStartSurfaceWithAccessibility = new CachedFlag(START_SURFACE_WITH_ACCESSIBILITY, false); public static final CachedFlag sStoreHoursAndroid = new CachedFlag(STORE_HOURS, false); - public static final CachedFlag sSwapPixelFormatToFixConvertFromTranslucent = - new CachedFlag(SWAP_PIXEL_FORMAT_TO_FIX_CONVERT_FROM_TRANSLUCENT, true); - public static final CachedFlag sTabGridLayoutAndroid = - new CachedFlag(TAB_GRID_LAYOUT_ANDROID, true); - public static final CachedFlag sTabGroupsAndroid = new CachedFlag(TAB_GROUPS_ANDROID, true); + public static final CachedFlag sSwapPixelFormatToFixConvertFromTranslucent = new CachedFlag( + SWAP_PIXEL_FORMAT_TO_FIX_CONVERT_FROM_TRANSLUCENT, + ChromePreferenceKeys.FLAGS_CACHED_SWAP_PIXEL_FORMAT_TO_FIX_CONVERT_FROM_TRANSLUCENT, + true); + public static final CachedFlag sTabGridLayoutAndroid = new CachedFlag(TAB_GRID_LAYOUT_ANDROID, + ChromePreferenceKeys.FLAGS_CACHED_GRID_TAB_SWITCHER_ENABLED, true); + public static final CachedFlag sTabGroupsAndroid = new CachedFlag( + TAB_GROUPS_ANDROID, ChromePreferenceKeys.FLAGS_CACHED_TAB_GROUPS_ANDROID_ENABLED, true); public static final CachedFlag sTabGroupsContinuationAndroid = new CachedFlag(TAB_GROUPS_CONTINUATION_ANDROID, false); public static final CachedFlag sTabGroupsForTablets =
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ValuesReturned.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ValuesReturned.java index 9c39d48..70c7beb 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ValuesReturned.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ValuesReturned.java
@@ -13,29 +13,29 @@ /** * Keeps track of values returned for cached flags and field trial parameters. */ -class ValuesReturned { - @GuardedBy("boolValues") - public final Map<String, Boolean> boolValues = new HashMap<>(); - @GuardedBy("stringValues") - public final Map<String, String> stringValues = new HashMap<>(); - @GuardedBy("intValues") - public final Map<String, Integer> intValues = new HashMap<>(); - @GuardedBy("doubleValues") - public final Map<String, Double> doubleValues = new HashMap<>(); +abstract class ValuesReturned { + @GuardedBy("sBoolValues") + static final Map<String, Boolean> sBoolValues = new HashMap<>(); + @GuardedBy("sStringValues") + static final Map<String, String> sStringValues = new HashMap<>(); + @GuardedBy("sIntValues") + static final Map<String, Integer> sIntValues = new HashMap<>(); + @GuardedBy("sDoubleValues") + static final Map<String, Double> sDoubleValues = new HashMap<>(); @VisibleForTesting - final void clearForTesting() { - synchronized (boolValues) { - boolValues.clear(); + static void clearForTesting() { + synchronized (sBoolValues) { + sBoolValues.clear(); } - synchronized (stringValues) { - stringValues.clear(); + synchronized (sStringValues) { + sStringValues.clear(); } - synchronized (intValues) { - intValues.clear(); + synchronized (sIntValues) { + sIntValues.clear(); } - synchronized (doubleValues) { - doubleValues.clear(); + synchronized (sDoubleValues) { + sDoubleValues.clear(); } } }
diff --git a/chrome/browser/hid/hid_connection_tracker.cc b/chrome/browser/hid/hid_connection_tracker.cc index 3f9810e7..79b911c 100644 --- a/chrome/browser/hid/hid_connection_tracker.cc +++ b/chrome/browser/hid/hid_connection_tracker.cc
@@ -4,150 +4,21 @@ #include "chrome/browser/hid/hid_connection_tracker.h" -#include <string> - -#include "base/notreached.h" -#include "base/strings/strcat.h" -#include "base/strings/utf_string_conversions.h" -#include "build/build_config.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/hid/hid_system_tray_icon.h" -#include "chrome/browser/notifications/notification_display_service.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/chrome_pages.h" -#include "chrome/grit/chromium_strings.h" -#include "chrome/grit/generated_resources.h" -#include "components/vector_icons/vector_icons.h" -#include "content/public/browser/browser_thread.h" -#include "extensions/buildflags/buildflags.h" -#include "ui/base/l10n/l10n_util.h" -#include "ui/message_center/public/cpp/notification.h" -#include "ui/message_center/public/cpp/notification_delegate.h" -#include "url/origin.h" - -#if BUILDFLAG(ENABLE_EXTENSIONS) -#include "extensions/browser/extension_registry.h" -#include "extensions/common/constants.h" -#endif // BUILDFLAG(ENABLE_EXTENSIONS) - -namespace { - -using base::TimeTicks; - -std::string GetOriginName(Profile* profile, const url::Origin& origin) { -#if BUILDFLAG(ENABLE_EXTENSIONS) - if (origin.scheme() == extensions::kExtensionScheme) { - const auto* extension_registry = - extensions::ExtensionRegistry::Get(profile); - CHECK(extension_registry); - const extensions::Extension* extension = - extension_registry->GetExtensionById( - origin.host(), extensions::ExtensionRegistry::EVERYTHING); - // The extension must be installed if we are generating the name. - CHECK(extension); - return extension->name(); - } -#endif // BUILDFLAG(ENABLE_EXTENSIONS) - NOTREACHED_NORETURN(); -} - -} // namespace HidConnectionTracker::HidConnectionTracker(Profile* profile) - : profile_(profile) {} + : DeviceConnectionTracker(profile) {} -HidConnectionTracker::~HidConnectionTracker() { - CleanUp(); -} - -void HidConnectionTracker::IncrementConnectionCount(const url::Origin& origin) { - bool to_stage_profile = origins_.empty(); - auto& state = origins_[origin]; - - CHECK_GE(state.count, 0); - if (state.count == 0) { - state.name = GetOriginName(profile_, origin); - } - state.count++; - state.timestamp = TimeTicks::Now(); - total_connection_count_++; - - auto* hid_system_tray_icon = g_browser_process->hid_system_tray_icon(); - if (!hid_system_tray_icon) { - return; - } - if (to_stage_profile) { - hid_system_tray_icon->StageProfile(profile_); - } else { - hid_system_tray_icon->NotifyConnectionCountUpdated(profile_); - } -} - -void HidConnectionTracker::DecrementConnectionCount(const url::Origin& origin) { - auto it = origins_.find(origin); - CHECK(it != origins_.end()); - - auto& state = it->second; - CHECK_GT(state.count, 0); - state.count--; - state.timestamp = TimeTicks::Now(); - total_connection_count_--; - if (state.count == 0) { - content::BrowserThread::GetTaskRunnerForThread(content::BrowserThread::UI) - ->PostDelayedTask( - FROM_HERE, - base::BindOnce(&HidConnectionTracker::CleanUpOrigin, - weak_factory_.GetWeakPtr(), origin, state.timestamp), - kOriginInactiveTime); - } - - auto* hid_system_tray_icon = g_browser_process->hid_system_tray_icon(); - if (!hid_system_tray_icon) { - return; - } - hid_system_tray_icon->NotifyConnectionCountUpdated(profile_); -} +HidConnectionTracker::~HidConnectionTracker() = default; void HidConnectionTracker::ShowContentSettingsExceptions() { chrome::ShowContentSettingsExceptionsForProfile( profile_, ContentSettingsType::HID_CHOOSER_DATA); } -void HidConnectionTracker::ShowSiteSettings(const url::Origin& origin) { - chrome::ShowSiteSettings(profile_, origin.GetURL()); -} - -void HidConnectionTracker::CleanUp() { - if (!origins_.empty()) { - origins_.clear(); - total_connection_count_ = 0; - auto* hid_system_tray_icon = g_browser_process->hid_system_tray_icon(); - if (hid_system_tray_icon) { - hid_system_tray_icon->UnstageProfile(profile_, /*immediate=*/true); - } - } -} - -void HidConnectionTracker::CleanUpOrigin(const url::Origin& origin, - const TimeTicks& timestamp) { - auto it = origins_.find(origin); - if (it == origins_.end()) { - // This can happen if the connection bounces within 1 microsecond, which is - // the base unit of base::TimeTicks. The first CleanUpOrigin call will clear - // the origin because it sees the timestamp as the same. - return; - } - auto& state = it->second; - if (state.count == 0 && state.timestamp == timestamp) { - origins_.erase(it); - auto* hid_system_tray_icon = g_browser_process->hid_system_tray_icon(); - if (!hid_system_tray_icon) { - return; - } - if (origins_.empty()) { - hid_system_tray_icon->UnstageProfile(profile_, /*immediate=*/true); - } else { - hid_system_tray_icon->NotifyConnectionCountUpdated(profile_); - } - } +DeviceSystemTrayIcon* HidConnectionTracker::GetSystemTrayIcon() { + return static_cast<DeviceSystemTrayIcon*>( + g_browser_process->hid_system_tray_icon()); }
diff --git a/chrome/browser/hid/hid_connection_tracker.h b/chrome/browser/hid/hid_connection_tracker.h index 9373d4a7..dd9ea87 100644 --- a/chrome/browser/hid/hid_connection_tracker.h +++ b/chrome/browser/hid/hid_connection_tracker.h
@@ -5,67 +5,20 @@ #ifndef CHROME_BROWSER_HID_HID_CONNECTION_TRACKER_H_ #define CHROME_BROWSER_HID_HID_CONNECTION_TRACKER_H_ -#include "base/containers/flat_map.h" -#include "chrome/browser/profiles/profile.h" -#include "components/keyed_service/core/keyed_service.h" -#include "url/origin.h" +#include "chrome/browser/device_notifications/device_connection_tracker.h" // Manages the opened device connection count by the profile. -class HidConnectionTracker : public KeyedService { +class HidConnectionTracker : public DeviceConnectionTracker { public: - struct OriginState { - // The number of active connections. - int count; - // The last time the state was updated. - base::TimeTicks timestamp; - // String representation for the origin. - std::string name; - - bool operator==(const OriginState& other) const { - return count == other.count && timestamp == other.timestamp && - name == other.name; - } - }; - explicit HidConnectionTracker(Profile* profile); HidConnectionTracker(HidConnectionTracker&&) = delete; HidConnectionTracker& operator=(HidConnectionTracker&) = delete; ~HidConnectionTracker() override; - virtual void IncrementConnectionCount(const url::Origin& origin); - virtual void DecrementConnectionCount(const url::Origin& origin); - - virtual void ShowContentSettingsExceptions(); - virtual void ShowSiteSettings(const url::Origin& origin); - - // This is used by either the destructor or - // HidConnectionTrackerFactory::BrowserContextShutdown to remove its profile - // from HidSystemTrayIcon. - void CleanUp(); - - int total_connection_count() { return total_connection_count_; } - Profile* profile() { return profile_; } - - const base::flat_map<url::Origin, OriginState>& origins() { return origins_; } - - // The time period that an origin remains tracked before it is removed from - // |origins_|. - static constexpr base::TimeDelta kOriginInactiveTime = base::Seconds(10); + void ShowContentSettingsExceptions() override; private: - // Removes the |origin| from the |origins_| list if it has not had any new - // connections since |timestamp|. - void CleanUpOrigin(const url::Origin& origin, - const base::TimeTicks& timestamp); - - int total_connection_count_ = 0; - raw_ptr<Profile> profile_; - - // The structure that tracks the connection count for each origin that has - // active connection(s). - base::flat_map<url::Origin, OriginState> origins_; - - base::WeakPtrFactory<HidConnectionTracker> weak_factory_{this}; + DeviceSystemTrayIcon* GetSystemTrayIcon() override; }; #endif // CHROME_BROWSER_HID_HID_CONNECTION_TRACKER_H_
diff --git a/chrome/browser/hid/hid_connection_tracker_unittest.cc b/chrome/browser/hid/hid_connection_tracker_unittest.cc index add959b..9707d92 100644 --- a/chrome/browser/hid/hid_connection_tracker_unittest.cc +++ b/chrome/browser/hid/hid_connection_tracker_unittest.cc
@@ -47,7 +47,6 @@ public: MOCK_METHOD(void, StageProfile, (Profile*), (override)); MOCK_METHOD(void, UnstageProfile, (Profile*, bool), (override)); - MOCK_METHOD(bool, ContainProfile, (Profile*), (override)); MOCK_METHOD(void, ProfileAdded, (Profile*), (override)); MOCK_METHOD(void, ProfileRemoved, (Profile*), (override)); MOCK_METHOD(void, NotifyConnectionCountUpdated, (Profile*), (override));
diff --git a/chrome/browser/hid/hid_system_tray_icon.cc b/chrome/browser/hid/hid_system_tray_icon.cc index 7607cfc..30349fb 100644 --- a/chrome/browser/hid/hid_system_tray_icon.cc +++ b/chrome/browser/hid/hid_system_tray_icon.cc
@@ -113,8 +113,3 @@ // immediate set to true so the entry will be removed from |profiles_| // immediately. } - -bool HidSystemTrayIcon::ContainProfile(Profile* profile) { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - return profiles_.contains(profile); -}
diff --git a/chrome/browser/hid/hid_system_tray_icon.h b/chrome/browser/hid/hid_system_tray_icon.h index cdae557f..84c4f19e 100644 --- a/chrome/browser/hid/hid_system_tray_icon.h +++ b/chrome/browser/hid/hid_system_tray_icon.h
@@ -11,33 +11,21 @@ #include "base/containers/flat_set.h" #include "base/memory/weak_ptr.h" #include "base/time/time.h" +#include "chrome/browser/device_notifications/device_system_tray_icon.h" #include "ui/gfx/image/image_skia.h" #include "url/origin.h" class Profile; -class HidSystemTrayIcon { +class HidSystemTrayIcon : public DeviceSystemTrayIcon { public: HidSystemTrayIcon(); HidSystemTrayIcon(const HidSystemTrayIcon&) = delete; HidSystemTrayIcon& operator=(const HidSystemTrayIcon&) = delete; - virtual ~HidSystemTrayIcon(); + ~HidSystemTrayIcon() override; - // Stage |profile| to be shown in the system tray icon. - virtual void StageProfile(Profile* profile); - - // TODO(crbug.com/1353104): Remove support for non-immediate unstage request. - // Unstage |profile| that is being shown in the system tray icon. The profile - // will be removed immediately when |immediate| is true, otherwise it is - // scheduled to be removed later. - virtual void UnstageProfile(Profile* profile, bool immediate); - - // Notify the system tray icon the connection count of the |profile| has - // changed. - virtual void NotifyConnectionCountUpdated(Profile* profile) = 0; - - // Check if the |profile| is being tracked by the system tray icon. - virtual bool ContainProfile(Profile* profile); + void StageProfile(Profile* profile) override; + void UnstageProfile(Profile* profile, bool immediate) override; // The time period that a profile is shown in the system tray icon while it is // unstaging. @@ -62,14 +50,6 @@ base::flat_map<Profile*, bool> profiles_; private: - // This function is called after the |profile| object is added to the - // |profiles_|. - virtual void ProfileAdded(Profile* profile) = 0; - - // This function is called after the |profile| object is removed from the - // |profiles_|. - virtual void ProfileRemoved(Profile* profile) = 0; - // Remove |profile| from the system tray icon if it is still unstaging. void CleanUpProfile(base::WeakPtr<Profile> profile);
diff --git a/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthControllerImpl.java b/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthControllerImpl.java index 6a45d2fc..f2a29aa 100644 --- a/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthControllerImpl.java +++ b/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthControllerImpl.java
@@ -114,7 +114,7 @@ private final LayoutStateProvider.LayoutStateObserver mLayoutStateObserver = new LayoutStateProvider.LayoutStateObserver() { @Override - public void onStartedShowing(int layoutType, boolean showToolbar) { + public void onStartedShowing(int layoutType) { if (layoutType == LayoutType.BROWSING) { showDialogIfRequired(); }
diff --git a/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthControllerImplTest.java b/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthControllerImplTest.java index bf1d5bda..5e45ad8 100644 --- a/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthControllerImplTest.java +++ b/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthControllerImplTest.java
@@ -387,7 +387,7 @@ mIncognitoReauthController.isReauthPageShowing()); // Trigger layout state change to indicate we are now showing a tab. - mLayoutStateObserverArgumentCaptor.getValue().onStartedShowing(LayoutType.BROWSING, false); + mLayoutStateObserverArgumentCaptor.getValue().onStartedShowing(LayoutType.BROWSING); assertTrue("Re-auth screen should be shown if we are about to show a tab.", mIncognitoReauthController.isReauthPageShowing()); }
diff --git a/chrome/browser/interest_group/interest_group_permissions_browsertest.cc b/chrome/browser/interest_group/interest_group_permissions_browsertest.cc index cbee5c8..6f1c5281 100644 --- a/chrome/browser/interest_group/interest_group_permissions_browsertest.cc +++ b/chrome/browser/interest_group/interest_group_permissions_browsertest.cc
@@ -131,7 +131,7 @@ trustedBiddingSignalsKeys: ['key1'], userBiddingSignals: {some: 'json', data: {here: [1, 2, 3]}}, ads: [{ - renderUrl: $4, + renderURL: $4, metadata: {ad: 'metadata', here: [1, 2, 3]}, }], },
diff --git a/chrome/browser/lacros/chrome_browser_main_extra_parts_lacros.cc b/chrome/browser/lacros/chrome_browser_main_extra_parts_lacros.cc index 776e9dd..fa430da0 100644 --- a/chrome/browser/lacros/chrome_browser_main_extra_parts_lacros.cc +++ b/chrome/browser/lacros/chrome_browser_main_extra_parts_lacros.cc
@@ -20,6 +20,7 @@ #include "chrome/browser/lacros/arc/arc_icon_cache.h" #include "chrome/browser/lacros/automation_manager_lacros.h" #include "chrome/browser/lacros/browser_service_lacros.h" +#include "chrome/browser/lacros/clipboard_history_lacros.h" #include "chrome/browser/lacros/desk_template_client_lacros.h" #include "chrome/browser/lacros/download_controller_client_lacros.h" #include "chrome/browser/lacros/drivefs_cache.h" @@ -52,6 +53,7 @@ #include "chromeos/components/kiosk/kiosk_utils.h" #include "chromeos/components/quick_answers/public/cpp/controller/quick_answers_controller.h" #include "chromeos/components/quick_answers/quick_answers_client.h" +#include "chromeos/constants/chromeos_features.h" #include "chromeos/crosapi/mojom/crosapi.mojom.h" #include "chromeos/lacros/lacros_service.h" #include "chromeos/startup/browser_params_proxy.h" @@ -131,6 +133,10 @@ task_manager_provider_ = std::make_unique<crosapi::TaskManagerLacros>(); web_page_info_provider_ = std::make_unique<crosapi::WebPageInfoProviderLacros>(); + if (chromeos::features::IsClipboardHistoryRefreshEnabled()) { + clipboard_history_lacros_ = + std::make_unique<crosapi::ClipboardHistoryLacros>(); + } memory_pressure::MultiSourceMemoryPressureMonitor* monitor = static_cast<memory_pressure::MultiSourceMemoryPressureMonitor*>(
diff --git a/chrome/browser/lacros/chrome_browser_main_extra_parts_lacros.h b/chrome/browser/lacros/chrome_browser_main_extra_parts_lacros.h index c127915..1d12eee 100644 --- a/chrome/browser/lacros/chrome_browser_main_extra_parts_lacros.h +++ b/chrome/browser/lacros/chrome_browser_main_extra_parts_lacros.h
@@ -41,6 +41,7 @@ } // namespace arc namespace crosapi { +class ClipboardHistoryLacros; class SearchControllerLacros; class TaskManagerLacros; class WebAppProviderBridgeLacros; @@ -198,6 +199,10 @@ // Handles getting and setting multitask menu nudge related prefs from ash. std::unique_ptr<MultitaskMenuNudgeDelegateLacros> multitask_menu_nudge_delegate_; + + // Caches the clipboard history item descriptors in Lacros. Used only when + // the clipboard history refresh feature is enabled. + std::unique_ptr<crosapi::ClipboardHistoryLacros> clipboard_history_lacros_; }; #endif // CHROME_BROWSER_LACROS_CHROME_BROWSER_MAIN_EXTRA_PARTS_LACROS_H_
diff --git a/chrome/browser/lacros/clipboard_history_lacros.cc b/chrome/browser/lacros/clipboard_history_lacros.cc new file mode 100644 index 0000000..2b9c256 --- /dev/null +++ b/chrome/browser/lacros/clipboard_history_lacros.cc
@@ -0,0 +1,66 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/lacros/clipboard_history_lacros.h" + +#include "base/functional/bind.h" +#include "chromeos/constants/chromeos_features.h" +#include "chromeos/crosapi/mojom/clipboard_history.mojom.h" +#include "chromeos/lacros/lacros_service.h" + +namespace crosapi { + +namespace { +ClipboardHistoryLacros* g_instance = nullptr; +} // namespace + +ClipboardHistoryLacros::ClipboardHistoryLacros() : receiver_(this) { + CHECK(chromeos::features::IsClipboardHistoryRefreshEnabled()); + CHECK(!g_instance); + g_instance = this; + + // Register on the Ash side to receive descriptor updates. + chromeos::LacrosService* service = chromeos::LacrosService::Get(); + if (service->IsAvailable<mojom::ClipboardHistory>()) { + service->GetRemote<mojom::ClipboardHistory>()->RegisterClient( + receiver_.BindNewPipeAndPassRemote()); + + // `receiver_` is a class member so it is safe to use `this` pointer here. + receiver_.set_disconnect_handler(base::BindOnce( + &ClipboardHistoryLacros::OnDisconnected, base::Unretained(this))); + } +} + +ClipboardHistoryLacros::~ClipboardHistoryLacros() { + CHECK(g_instance); + g_instance = nullptr; +} + +// static +ClipboardHistoryLacros* ClipboardHistoryLacros::Get() { + CHECK(g_instance); + return g_instance; +} + +void ClipboardHistoryLacros::SetClipboardHistoryItemDescriptors( + std::vector<mojom::ClipboardHistoryItemDescriptorPtr> descriptor_ptrs) { + std::vector<mojom::ClipboardHistoryItemDescriptor> filtered_items; + for (const auto& descriptor_ptr : descriptor_ptrs) { + // Ignore the received descriptors of unknown types. + if (descriptor_ptr->display_format == + mojom::ClipboardHistoryDisplayFormat::kUnknown) { + continue; + } + filtered_items.emplace_back( + descriptor_ptr->item_id, descriptor_ptr->display_format, + descriptor_ptr->display_text, descriptor_ptr->file_count); + } + cached_descriptors_ = std::move(filtered_items); +} + +void ClipboardHistoryLacros::OnDisconnected() { + receiver_.reset(); +} + +} // namespace crosapi
diff --git a/chrome/browser/lacros/clipboard_history_lacros.h b/chrome/browser/lacros/clipboard_history_lacros.h new file mode 100644 index 0000000..af18f7bc --- /dev/null +++ b/chrome/browser/lacros/clipboard_history_lacros.h
@@ -0,0 +1,50 @@ +// 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_LACROS_CLIPBOARD_HISTORY_LACROS_H_ +#define CHROME_BROWSER_LACROS_CLIPBOARD_HISTORY_LACROS_H_ + +#include <vector> + +#include "chromeos/crosapi/mojom/clipboard_history.mojom.h" +#include "mojo/public/cpp/bindings/receiver.h" + +namespace crosapi { + +// The Lacros implementation of `mojom::ClipboardHistoryClient`. A singleton +// that caches the clipboard history item descriptors received from Ash. Created +// only if the clipboard history refresh feature is enabled. +class ClipboardHistoryLacros : public mojom::ClipboardHistoryClient { + public: + ClipboardHistoryLacros(); + ClipboardHistoryLacros(const ClipboardHistoryLacros&) = delete; + ClipboardHistoryLacros& operator=(const ClipboardHistoryLacros&) = delete; + ~ClipboardHistoryLacros() override; + + static ClipboardHistoryLacros* Get(); + + const std::vector<mojom::ClipboardHistoryItemDescriptor>& cached_descriptors() + const { + return cached_descriptors_; + } + + private: + // mojom::ClipboardHistoryClient: + void SetClipboardHistoryItemDescriptors( + std::vector<mojom::ClipboardHistoryItemDescriptorPtr> descriptor_ptrs) + override; + + // Called when the communication channel with Ash is disconnected. + void OnDisconnected(); + + // The cached clipboard history item descriptors. Updated by Ash. + std::vector<mojom::ClipboardHistoryItemDescriptor> cached_descriptors_; + + // Mojo endpoint that's responsible for receiving messages from Ash. + mojo::Receiver<mojom::ClipboardHistoryClient> receiver_; +}; + +} // namespace crosapi + +#endif // CHROME_BROWSER_LACROS_CLIPBOARD_HISTORY_LACROS_H_
diff --git a/chrome/browser/lacros/clipboard_history_lacros_browsertest.cc b/chrome/browser/lacros/clipboard_history_lacros_browsertest.cc index 82668764..ea0de66 100644 --- a/chrome/browser/lacros/clipboard_history_lacros_browsertest.cc +++ b/chrome/browser/lacros/clipboard_history_lacros_browsertest.cc
@@ -13,17 +13,48 @@ #include "third_party/blink/public/common/context_menu_data/edit_flags.h" #include "ui/base/clipboard/scoped_clipboard_writer.h" -using ClipboardHistoryBrowserTest = InProcessBrowserTest; +class ClipboardHistoryRefreshLacrosTest + : public InProcessBrowserTest, + public testing::WithParamInterface< + /*enable_clipboard_history_refresh=*/bool> { + public: + // InProcessBrowserTest: + void SetUp() override { + std::vector<std::string> enabled_features{"ClipboardHistoryRefresh", + "Jelly"}; + std::vector<std::string> disabled_features; + if (!GetParam()) { + std::swap(enabled_features, disabled_features); + } + StartUniqueAshChrome(enabled_features, disabled_features, + /*additional_cmdline_switches=*/{}, + /*bug_number_and_reason=*/ + {"b/267681869 Switch to shared ash when clipboard " + "history refresh is enabled by default"}); + + InProcessBrowserTest::SetUp(); + } + + // Returns whether the clipboard history interface is available. It may not be + // available on earlier versions of Ash Chrome. + bool IsInterfaceAvailable() const { + chromeos::LacrosService* lacros_service = chromeos::LacrosService::Get(); + return lacros_service && + lacros_service->IsAvailable<crosapi::mojom::ClipboardHistory>(); + } +}; + +INSTANTIATE_TEST_SUITE_P(All, + ClipboardHistoryRefreshLacrosTest, + /*enable_clipboard_history_refresh=*/testing::Bool()); // Verifies that the Lacros render view context menu clipboard history option is // enabled when and only when there are clipboard item(s) to show. -IN_PROC_BROWSER_TEST_F(ClipboardHistoryBrowserTest, MenuOptionEnabled) { +IN_PROC_BROWSER_TEST_P(ClipboardHistoryRefreshLacrosTest, MenuOptionEnabled) { // If the clipboard history interface is not available on this version of // ash-chrome, this test cannot meaningfully run. - chromeos::LacrosService* lacros_service = chromeos::LacrosService::Get(); - if (!lacros_service || - !lacros_service->IsAvailable<crosapi::mojom::ClipboardHistory>()) { - GTEST_SKIP() << "Unsupported Ash version."; + if (!IsInterfaceAvailable()) { + return; } content::ContextMenuParams params;
diff --git a/chrome/browser/lacros/clipboard_history_lacros_unittest.cc b/chrome/browser/lacros/clipboard_history_lacros_unittest.cc new file mode 100644 index 0000000..d89502cc --- /dev/null +++ b/chrome/browser/lacros/clipboard_history_lacros_unittest.cc
@@ -0,0 +1,140 @@ +// 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/lacros/clipboard_history_lacros.h" + +#include <utility> + +#include "base/test/task_environment.h" +#include "base/unguessable_token.h" +#include "chromeos/constants/chromeos_features.h" +#include "chromeos/crosapi/mojom/clipboard_history.mojom.h" +#include "chromeos/lacros/lacros_service.h" +#include "chromeos/lacros/lacros_test_helper.h" +#include "chromeos/startup/browser_init_params.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/base/ui_base_types.h" +#include "ui/gfx/geometry/rect.h" + +namespace crosapi { + +namespace { + +using ::testing::ElementsAre; + +// Matchers -------------------------------------------------------------------- + +MATCHER_P2(MatchDescriptor, display_format, display_text, "") { + return arg.display_format == display_format && + arg.display_text == display_text; +} + +// Helper classes -------------------------------------------------------------- + +class MockClipboardHistoryAsh : public mojom::ClipboardHistory { + public: + MockClipboardHistoryAsh() { + ON_CALL(*this, RegisterClient) + .WillByDefault(testing::Invoke( + [&](mojo::PendingRemote<mojom::ClipboardHistoryClient> client) { + remote_.Bind(std::move(client)); + })); + } + + // mojom::ClipboardHistory: + MOCK_METHOD(void, + ShowClipboard, + (const gfx::Rect&, + ui::MenuSourceType, + mojom::ClipboardHistoryControllerShowSource), + (override)); + MOCK_METHOD(void, + PasteClipboardItemById, + (const base::UnguessableToken&, + int, + mojom::ClipboardHistoryControllerShowSource), + (override)); + MOCK_METHOD(void, + RegisterClient, + (mojo::PendingRemote<mojom::ClipboardHistoryClient>), + (override)); + + mojo::Receiver<mojom::ClipboardHistory> receiver_{this}; + + mojo::Remote<mojom::ClipboardHistoryClient> remote_; +}; + +} // namespace + +class ClipboardHistoryLacrosTest : public testing::Test { + public: + // testing::Test: + void SetUp() override { + // Enable the clipboard history refresh feature. + crosapi::mojom::BrowserInitParamsPtr params_ptr = + crosapi::mojom::BrowserInitParams::New(); + params_ptr->enable_clipboard_history_refresh = true; + chromeos::BrowserInitParams::SetInitParamsForTests(std::move(params_ptr)); + + // Inject the mock clipboard history interface. + chromeos::LacrosService::Get()->InjectRemoteForTesting( + mock_clipboard_history_ash_.receiver_.BindNewPipeAndPassRemote()); + } + + MockClipboardHistoryAsh mock_clipboard_history_ash_; + + private: + base::test::TaskEnvironment task_environment_; + chromeos::ScopedLacrosServiceTestHelper helper_; +}; + +TEST_F(ClipboardHistoryLacrosTest, Basics) { + // Verifies that `ClipboardHistoryLacros` calls the clipboard history + // interface to register itself as a client. + EXPECT_CALL(mock_clipboard_history_ash_, RegisterClient).Times(1); + ClipboardHistoryLacros client; + chromeos::LacrosService::Get() + ->GetRemote<crosapi::mojom::ClipboardHistory>() + .FlushForTesting(); + + std::vector<crosapi::mojom::ClipboardHistoryItemDescriptorPtr> + descriptor_ptrs_from_ash; + descriptor_ptrs_from_ash.push_back( + crosapi::mojom::ClipboardHistoryItemDescriptor::New( + base::UnguessableToken::Create(), + mojom::ClipboardHistoryDisplayFormat::kText, u"A", + /*file_count=*/0u)); + descriptor_ptrs_from_ash.push_back( + crosapi::mojom::ClipboardHistoryItemDescriptor::New( + base::UnguessableToken::Create(), + mojom::ClipboardHistoryDisplayFormat::kHtml, u"HTML", + /*file_count=*/0u)); + descriptor_ptrs_from_ash.push_back( + crosapi::mojom::ClipboardHistoryItemDescriptor::New( + base::UnguessableToken::Create(), + mojom::ClipboardHistoryDisplayFormat::kUnknown, u"garbage", + /*file_count=*/0u)); + + // Send a non-empty descriptor array from Ash. Verify the descriptors cached + // on Lacros. The descriptors of unknown types should be filtered out. + mock_clipboard_history_ash_.remote_->SetClipboardHistoryItemDescriptors( + std::move(descriptor_ptrs_from_ash)); + mock_clipboard_history_ash_.remote_.FlushForTesting(); + EXPECT_THAT( + client.cached_descriptors(), + ElementsAre( + MatchDescriptor(crosapi::mojom::ClipboardHistoryDisplayFormat::kText, + u"A"), + MatchDescriptor(crosapi::mojom::ClipboardHistoryDisplayFormat::kHtml, + u"HTML"))); + + // Send an empty descriptor array from Ash. Verify the descriptors cached + // on Lacros. + mock_clipboard_history_ash_.remote_->SetClipboardHistoryItemDescriptors({}); + mock_clipboard_history_ash_.remote_.FlushForTesting(); + EXPECT_TRUE(client.cached_descriptors().empty()); +} + +} // namespace crosapi
diff --git a/chrome/browser/media/router/discovery/access_code/access_code_cast_sink_service.cc b/chrome/browser/media/router/discovery/access_code/access_code_cast_sink_service.cc index a614474..773449d8 100644 --- a/chrome/browser/media/router/discovery/access_code/access_code_cast_sink_service.cc +++ b/chrome/browser/media/router/discovery/access_code/access_code_cast_sink_service.cc
@@ -601,7 +601,7 @@ } std::vector<MediaSinkInternal> validated_sinks; - std::vector<const MediaSink::Id> invalid_sinks; + std::vector<MediaSink::Id> invalid_sinks; for (const auto sink_value : stored_sinks) { const std::string& sink_id_string = sink_value.first; const auto* dict_value = sink_value.second.GetIfDict();
diff --git a/chrome/browser/new_tab_page/modules/feed/DEPS b/chrome/browser/new_tab_page/modules/feed/DEPS deleted file mode 100644 index 3a4d90a5..0000000 --- a/chrome/browser/new_tab_page/modules/feed/DEPS +++ /dev/null
@@ -1,5 +0,0 @@ -specific_include_rules = { - "feed_handler\.cc": [ - "+chrome/browser/ui/views", - ] -}
diff --git a/chrome/browser/new_tab_page/modules/feed/feed_handler.cc b/chrome/browser/new_tab_page/modules/feed/feed_handler.cc index a0fdf9c..7983a95 100644 --- a/chrome/browser/new_tab_page/modules/feed/feed_handler.cc +++ b/chrome/browser/new_tab_page/modules/feed/feed_handler.cc
@@ -8,9 +8,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/browser/ui/browser_finder.h" -#include "chrome/browser/ui/views/frame/browser_view.h" -#include "chrome/browser/ui/views/side_panel/side_panel_coordinator.h" -#include "chrome/browser/ui/views/side_panel/side_panel_entry.h" +#include "chrome/browser/ui/side_panel/side_panel_ui.h" #include "chrome/common/channel_info.h" #include "chrome/common/chrome_version.h" #include "components/feed/core/v2/public/ntp_feed_content_fetcher.h" @@ -88,16 +86,9 @@ if (!browser) return; - BrowserView* const browser_view = - BrowserView::GetBrowserViewForBrowser(browser); - if (!browser_view) - return; - - // TODO(https://crbug.com/1341399): When possible, show the side panel feed in - // a way that doesn't depend on Views and remove the DEPS rule. - if (browser_view->side_panel_coordinator()) { - browser_view->side_panel_coordinator()->Show(SidePanelEntry::Id::kFeed); - } + SidePanelUI* side_panel_ui = SidePanelUI::GetSidePanelUIForBrowser(browser); + DCHECK(side_panel_ui); + side_panel_ui->Show(SidePanelEntryId::kFeed); } } // namespace ntp
diff --git a/chrome/browser/policy/status_provider/user_cloud_policy_status_provider.cc b/chrome/browser/policy/status_provider/user_cloud_policy_status_provider.cc index 9ddb6bc9..c9cb96c1 100644 --- a/chrome/browser/policy/status_provider/user_cloud_policy_status_provider.cc +++ b/chrome/browser/policy/status_provider/user_cloud_policy_status_provider.cc
@@ -26,6 +26,17 @@ UserCloudPolicyStatusProvider::~UserCloudPolicyStatusProvider() = default; base::Value::Dict UserCloudPolicyStatusProvider::GetStatus() { + signin::IdentityManager* identity_manager = + IdentityManagerFactory::GetForProfile(profile_); + const bool is_flex_org = + identity_manager && identity_manager + ->FindExtendedAccountInfoByEmailAddress( + profile_->GetProfileUserName()) + .IsMemberOfFlexOrg(); + if (!is_flex_org && !core_->store()->is_managed()) { + return {}; + } + ProfileAttributesEntry* entry = g_browser_process->profile_manager() ->GetProfileAttributesStorage() @@ -37,17 +48,6 @@ policy::PolicyStatusProvider::GetStatusFromCore(core_); if (enrollment_token.empty()) { - signin::IdentityManager* identity_manager = - IdentityManagerFactory::GetForProfile(profile_); - const bool is_flex_org = - identity_manager && identity_manager - ->FindExtendedAccountInfoByEmailAddress( - profile_->GetProfileUserName()) - .IsMemberOfFlexOrg(); - if (!is_flex_org && !core_->store()->is_managed()) { - return {}; - } - SetDomainExtractedFromUsername(dict); GetUserAffiliationStatus(&dict, profile_); dict.Set(policy::kFlexOrgWarningKey, is_flex_org);
diff --git a/chrome/browser/printing/pdf_to_emf_converter.cc b/chrome/browser/printing/pdf_to_emf_converter.cc index 32b7c83..3bcfbae 100644 --- a/chrome/browser/printing/pdf_to_emf_converter.cc +++ b/chrome/browser/printing/pdf_to_emf_converter.cc
@@ -32,6 +32,7 @@ #include "mojo/public/cpp/bindings/remote.h" #include "printing/emf_win.h" #include "printing/pdf_render_settings.h" +#include "third_party/abseil-cpp/absl/types/optional.h" using content::BrowserThread; @@ -69,6 +70,7 @@ public: PdfConverterImpl(scoped_refptr<base::RefCountedMemory> data, const PdfRenderSettings& conversion_settings, + const absl::optional<bool>& use_skia, StartCallback start_callback); PdfConverterImpl(const PdfConverterImpl&) = delete; @@ -135,6 +137,8 @@ const PdfRenderSettings settings_; + absl::optional<bool> use_skia_; + // Document loaded callback. PdfConverter::StartCallback start_callback_; @@ -197,8 +201,11 @@ PdfConverterImpl::PdfConverterImpl(scoped_refptr<base::RefCountedMemory> data, const PdfRenderSettings& settings, + const absl::optional<bool>& use_skia, StartCallback start_callback) - : settings_(settings), start_callback_(std::move(start_callback)) { + : settings_(settings), + use_skia_(use_skia), + start_callback_(std::move(start_callback)) { DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK(start_callback_); @@ -248,6 +255,9 @@ pdf_to_emf_converter_.set_disconnect_handler(base::BindOnce( &PdfConverterImpl::OnFailed, weak_ptr_factory_.GetWeakPtr(), std::string("Connection to PdfToEmfConverter error."))); + if (use_skia_) { + pdf_to_emf_converter_->SetUseSkiaRendererPolicy(*use_skia_); + } std::move(start_callback_).Run(page_count); page_count_ = page_count; } @@ -376,8 +386,9 @@ std::unique_ptr<PdfConverter> PdfConverter::StartPdfConverter( scoped_refptr<base::RefCountedMemory> data, const PdfRenderSettings& conversion_settings, + const absl::optional<bool>& use_skia, StartCallback start_callback) { - return std::make_unique<PdfConverterImpl>(data, conversion_settings, + return std::make_unique<PdfConverterImpl>(data, conversion_settings, use_skia, std::move(start_callback)); }
diff --git a/chrome/browser/printing/pdf_to_emf_converter.h b/chrome/browser/printing/pdf_to_emf_converter.h index eb23ae1..836a2ed3 100644 --- a/chrome/browser/printing/pdf_to_emf_converter.h +++ b/chrome/browser/printing/pdf_to_emf_converter.h
@@ -9,6 +9,7 @@ #include "base/functional/callback_forward.h" #include "base/memory/ref_counted_memory.h" +#include "third_party/abseil-cpp/absl/types/optional.h" namespace printing { @@ -29,6 +30,7 @@ static std::unique_ptr<PdfConverter> StartPdfConverter( scoped_refptr<base::RefCountedMemory> data, const PdfRenderSettings& conversion_settings, + const absl::optional<bool>& use_skia, StartCallback start_callback); // Requests conversion of the page. `page_index` is 0-base page index for the
diff --git a/chrome/browser/printing/pdf_to_emf_converter_browsertest.cc b/chrome/browser/printing/pdf_to_emf_converter_browsertest.cc index 12921e8..5bce4b4 100644 --- a/chrome/browser/printing/pdf_to_emf_converter_browsertest.cc +++ b/chrome/browser/printing/pdf_to_emf_converter_browsertest.cc
@@ -25,6 +25,8 @@ #include "printing/emf_win.h" #include "printing/metafile.h" #include "printing/pdf_render_settings.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/abseil-cpp/absl/types/optional.h" #ifndef NTDDI_WIN10_VB // Windows 10.0.19041 #error "Older Windows SDK unsupported" @@ -41,6 +43,8 @@ constexpr uint32_t kInvalidPageCount = std::numeric_limits<uint32_t>::max(); +const absl::optional<bool> kUseSkiaOptions[]{absl::nullopt, true, false}; + void StartCallbackImpl(base::OnceClosure quit_closure, uint32_t* page_count_out, uint32_t page_count_in) { @@ -105,7 +109,9 @@ return base::HexEncode(base::SHA1HashSpan(span)); } -class PdfToEmfConverterBrowserTest : public InProcessBrowserTest { +class PdfToEmfConverterBrowserTest + : public InProcessBrowserTest, + public ::testing::WithParamInterface<absl::optional<bool>> { public: PdfToEmfConverterBrowserTest(const PdfToEmfConverterBrowserTest&) = delete; PdfToEmfConverterBrowserTest& operator=(const PdfToEmfConverterBrowserTest&) = @@ -152,7 +158,7 @@ base::RunLoop run_loop; uint32_t page_count = kInvalidPageCount; pdf_converter_ = PdfConverter::StartPdfConverter( - test_input_, pdf_settings, + test_input_, pdf_settings, /*use_skia=*/GetParam(), base::BindOnce(&StartCallbackImpl, run_loop.QuitClosure(), &page_count)); run_loop.Run(); @@ -236,32 +242,33 @@ } // namespace -IN_PROC_BROWSER_TEST_F(PdfToEmfConverterBrowserTest, FailureNoTempFile) { +IN_PROC_BROWSER_TEST_P(PdfToEmfConverterBrowserTest, FailureNoTempFile) { ScopedSimulateFailureCreatingTempFileForTests fail_creating_temp_file; base::RunLoop run_loop; uint32_t page_count = kInvalidPageCount; std::unique_ptr<PdfConverter> pdf_converter = PdfConverter::StartPdfConverter( base::MakeRefCounted<base::RefCountedStaticMemory>(), PdfRenderSettings(), + /*use_skia=*/GetParam(), base::BindOnce(&StartCallbackImpl, run_loop.QuitClosure(), &page_count)); run_loop.Run(); EXPECT_EQ(0u, page_count); } -IN_PROC_BROWSER_TEST_F(PdfToEmfConverterBrowserTest, FailureBadPdf) { +IN_PROC_BROWSER_TEST_P(PdfToEmfConverterBrowserTest, FailureBadPdf) { scoped_refptr<base::RefCountedStaticMemory> bad_pdf_data = base::MakeRefCounted<base::RefCountedStaticMemory>("0123456789", 10); base::RunLoop run_loop; uint32_t page_count = kInvalidPageCount; std::unique_ptr<PdfConverter> pdf_converter = PdfConverter::StartPdfConverter( - bad_pdf_data, PdfRenderSettings(), + bad_pdf_data, PdfRenderSettings(), /*use_skia=*/GetParam(), base::BindOnce(&StartCallbackImpl, run_loop.QuitClosure(), &page_count)); run_loop.Run(); EXPECT_EQ(0u, page_count); } -IN_PROC_BROWSER_TEST_F(PdfToEmfConverterBrowserTest, EmfBasic) { +IN_PROC_BROWSER_TEST_P(PdfToEmfConverterBrowserTest, EmfBasic) { const PdfRenderSettings pdf_settings( kLetter200DpiRect, gfx::Point(0, 0), k200DpiSize, /*autorotate=*/false, @@ -279,7 +286,7 @@ } } -IN_PROC_BROWSER_TEST_F(PdfToEmfConverterBrowserTest, +IN_PROC_BROWSER_TEST_P(PdfToEmfConverterBrowserTest, EmfWithReducedRasterizationBasic) { const PdfRenderSettings pdf_settings( kLetter200DpiRect, gfx::Point(0, 0), k200DpiSize, @@ -299,7 +306,7 @@ } } -IN_PROC_BROWSER_TEST_F(PdfToEmfConverterBrowserTest, PostScriptLevel2Basic) { +IN_PROC_BROWSER_TEST_P(PdfToEmfConverterBrowserTest, PostScriptLevel2Basic) { const PdfRenderSettings pdf_settings( kLetter200DpiRect, gfx::Point(0, 0), k200DpiSize, /*autorotate=*/false, /*use_color=*/true, @@ -318,7 +325,7 @@ } } -IN_PROC_BROWSER_TEST_F(PdfToEmfConverterBrowserTest, PostScriptLevel3Basic) { +IN_PROC_BROWSER_TEST_P(PdfToEmfConverterBrowserTest, PostScriptLevel3Basic) { const PdfRenderSettings pdf_settings( kLetter200DpiRect, gfx::Point(0, 0), k200DpiSize, /*autorotate=*/false, /*use_color=*/true, @@ -337,7 +344,7 @@ } } -IN_PROC_BROWSER_TEST_F(PdfToEmfConverterBrowserTest, +IN_PROC_BROWSER_TEST_P(PdfToEmfConverterBrowserTest, PostScriptLevel3WithType42FontsBasic) { const PdfRenderSettings pdf_settings( kLetter200DpiRect, gfx::Point(0, 0), k200DpiSize, @@ -357,7 +364,7 @@ } } -IN_PROC_BROWSER_TEST_F(PdfToEmfConverterBrowserTest, PostScriptLevel2Mono) { +IN_PROC_BROWSER_TEST_P(PdfToEmfConverterBrowserTest, PostScriptLevel2Mono) { const PdfRenderSettings pdf_settings( kLetter200DpiRect, gfx::Point(0, 0), k200DpiSize, /*autorotate=*/false, /*use_color=*/false, @@ -366,7 +373,7 @@ "bug_767343_mono.emf"); } -IN_PROC_BROWSER_TEST_F(PdfToEmfConverterBrowserTest, PostScriptLevel3Mono) { +IN_PROC_BROWSER_TEST_P(PdfToEmfConverterBrowserTest, PostScriptLevel3Mono) { const PdfRenderSettings pdf_settings( kLetter200DpiRect, gfx::Point(0, 0), k200DpiSize, /*autorotate=*/false, /*use_color=*/false, @@ -375,7 +382,7 @@ "bug_767343_mono.emf"); } -IN_PROC_BROWSER_TEST_F(PdfToEmfConverterBrowserTest, +IN_PROC_BROWSER_TEST_P(PdfToEmfConverterBrowserTest, PostScriptLevel2WithZeroSizedText) { const PdfRenderSettings pdf_settings( kLetter200DpiRect, gfx::Point(0, 0), k200DpiSize, @@ -385,7 +392,7 @@ "bug_767343.emf"); } -IN_PROC_BROWSER_TEST_F(PdfToEmfConverterBrowserTest, +IN_PROC_BROWSER_TEST_P(PdfToEmfConverterBrowserTest, PostScriptLevel3WithZeroSizedText) { const PdfRenderSettings pdf_settings( kLetter200DpiRect, gfx::Point(0, 0), k200DpiSize, @@ -395,7 +402,7 @@ "bug_767343.emf"); } -IN_PROC_BROWSER_TEST_F(PdfToEmfConverterBrowserTest, +IN_PROC_BROWSER_TEST_P(PdfToEmfConverterBrowserTest, PostScriptLevel2WithNegativeSizedText) { const PdfRenderSettings pdf_settings( kLetter200DpiRect, gfx::Point(0, 0), k200DpiSize, @@ -405,7 +412,7 @@ "bug_806746.emf"); } -IN_PROC_BROWSER_TEST_F(PdfToEmfConverterBrowserTest, +IN_PROC_BROWSER_TEST_P(PdfToEmfConverterBrowserTest, PostScriptLevel3WithNegativeSizedText) { const PdfRenderSettings pdf_settings( kLetter200DpiRect, gfx::Point(0, 0), k200DpiSize, @@ -415,7 +422,7 @@ "bug_806746.emf"); } -IN_PROC_BROWSER_TEST_F(PdfToEmfConverterBrowserTest, +IN_PROC_BROWSER_TEST_P(PdfToEmfConverterBrowserTest, PostScriptLevel2WithLineCapLineJoin) { const PdfRenderSettings pdf_settings( kLetter200DpiRect, gfx::Point(0, 0), k200DpiSize, @@ -425,7 +432,7 @@ "bug_1030689.emf"); } -IN_PROC_BROWSER_TEST_F(PdfToEmfConverterBrowserTest, +IN_PROC_BROWSER_TEST_P(PdfToEmfConverterBrowserTest, PostScriptLevel3WithLineCapLineJoin) { const PdfRenderSettings pdf_settings( kLetter200DpiRect, gfx::Point(0, 0), k200DpiSize, @@ -435,7 +442,7 @@ "bug_1030689.emf"); } -IN_PROC_BROWSER_TEST_F(PdfToEmfConverterBrowserTest, PostScriptLevel2Bezier) { +IN_PROC_BROWSER_TEST_P(PdfToEmfConverterBrowserTest, PostScriptLevel2Bezier) { const PdfRenderSettings pdf_settings( kLetter200DpiRect, gfx::Point(0, 0), k200DpiSize, /*autorotate=*/false, /*use_color=*/true, @@ -444,7 +451,7 @@ "bezier.emf"); } -IN_PROC_BROWSER_TEST_F(PdfToEmfConverterBrowserTest, PostScriptLevel3Bezier) { +IN_PROC_BROWSER_TEST_P(PdfToEmfConverterBrowserTest, PostScriptLevel3Bezier) { const PdfRenderSettings pdf_settings( kLetter200DpiRect, gfx::Point(0, 0), k200DpiSize, /*autorotate=*/false, /*use_color=*/true, @@ -453,7 +460,7 @@ "bezier.emf"); } -IN_PROC_BROWSER_TEST_F(PdfToEmfConverterBrowserTest, PostScriptLevel2Image) { +IN_PROC_BROWSER_TEST_P(PdfToEmfConverterBrowserTest, PostScriptLevel2Image) { const PdfRenderSettings pdf_settings( kLetter200DpiRect, gfx::Point(0, 0), k200DpiSize, /*autorotate=*/false, /*use_color=*/true, @@ -462,7 +469,7 @@ "embedded_images_ps_level2.emf"); } -IN_PROC_BROWSER_TEST_F(PdfToEmfConverterBrowserTest, PostScriptLevel3Image) { +IN_PROC_BROWSER_TEST_P(PdfToEmfConverterBrowserTest, PostScriptLevel3Image) { const PdfRenderSettings pdf_settings( kLetter200DpiRect, gfx::Point(0, 0), k200DpiSize, /*autorotate=*/false, /*use_color=*/true, @@ -472,7 +479,7 @@ } // Regression test for crbug.com/1399155. -IN_PROC_BROWSER_TEST_F(PdfToEmfConverterBrowserTest, +IN_PROC_BROWSER_TEST_P(PdfToEmfConverterBrowserTest, PostScriptLevel2FaxCompress) { const PdfRenderSettings pdf_settings( kLetter200DpiRect, gfx::Point(0, 0), k200DpiSize, @@ -483,7 +490,7 @@ } // Regression test for crbug.com/1399155. -IN_PROC_BROWSER_TEST_F(PdfToEmfConverterBrowserTest, +IN_PROC_BROWSER_TEST_P(PdfToEmfConverterBrowserTest, PostScriptLevel3FaxCompress) { const PdfRenderSettings pdf_settings( kLetter200DpiRect, gfx::Point(0, 0), k200DpiSize, @@ -493,4 +500,8 @@ "bug_1399155.emf"); } +INSTANTIATE_TEST_SUITE_P(All, + PdfToEmfConverterBrowserTest, + testing::ValuesIn(kUseSkiaOptions)); + } // namespace printing
diff --git a/chrome/browser/printing/print_job.cc b/chrome/browser/printing/print_job.cc index b496ff4..3a66a52b 100644 --- a/chrome/browser/printing/print_job.cc +++ b/chrome/browser/printing/print_job.cc
@@ -28,6 +28,7 @@ #if BUILDFLAG(IS_WIN) #include "base/command_line.h" +#include "chrome/browser/pdf/pdf_pref_names.h" #include "chrome/browser/printing/pdf_to_emf_converter.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/chrome_features.h" @@ -38,6 +39,7 @@ #include "printing/pdf_render_settings.h" #include "printing/printed_page_win.h" #include "printing/printing_features.h" +#include "third_party/abseil-cpp/absl/types/optional.h" #endif @@ -145,6 +147,10 @@ #if BUILDFLAG(IS_WIN) pdf_page_mapping_ = PageNumber::GetPages(settings->ranges(), page_count); + PrefService* prefs = GetPrefsForWebContents(GetWebContents(rfh_id_)); + if (prefs && prefs->IsManagedPreference(prefs::kPdfUseSkiaRendererEnabled)) { + use_skia_ = prefs->GetBoolean(prefs::kPdfUseSkiaRendererEnabled); + } #endif auto new_doc = base::MakeRefCounted<PrintedDocument>(std::move(settings), @@ -312,14 +318,18 @@ #if BUILDFLAG(IS_WIN) class PrintJob::PdfConversionState { public: - PdfConversionState(const gfx::Size& page_size, const gfx::Rect& content_area) - : page_size_(page_size), content_area_(content_area) {} + PdfConversionState(const gfx::Size& page_size, + const gfx::Rect& content_area, + const absl::optional<bool>& use_skia) + : page_size_(page_size), + content_area_(content_area), + use_skia_(use_skia) {} void Start(scoped_refptr<base::RefCountedMemory> data, const PdfRenderSettings& conversion_settings, PdfConverter::StartCallback start_callback) { - converter_ = PdfConverter::StartPdfConverter(data, conversion_settings, - std::move(start_callback)); + converter_ = PdfConverter::StartPdfConverter( + data, conversion_settings, use_skia_, std::move(start_callback)); } void GetMorePages(PdfConverter::GetPageCallback get_page_callback) { @@ -349,6 +359,7 @@ int pages_in_progress_ = 0; const gfx::Size page_size_; const gfx::Rect content_area_; + absl::optional<bool> use_skia_; std::unique_ptr<PdfConverter> converter_; }; @@ -359,7 +370,7 @@ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); DCHECK(!pdf_conversion_state_); pdf_conversion_state_ = - std::make_unique<PdfConversionState>(page_size, content_area); + std::make_unique<PdfConversionState>(page_size, content_area, use_skia_); const PrintSettings& settings = document()->settings(); @@ -427,7 +438,7 @@ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); DCHECK(!pdf_conversion_state_); pdf_conversion_state_ = - std::make_unique<PdfConversionState>(gfx::Size(), gfx::Rect()); + std::make_unique<PdfConversionState>(gfx::Size(), gfx::Rect(), use_skia_); gfx::Rect page_area = gfx::Rect(0, 0, page_size.width(), page_size.height()); const PrintSettings& settings = document()->settings(); PdfRenderSettings render_settings( @@ -446,8 +457,8 @@ bool ps_level2) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); DCHECK(!pdf_conversion_state_); - pdf_conversion_state_ = std::make_unique<PdfConversionState>( - gfx::Size(), gfx::Rect()); + pdf_conversion_state_ = + std::make_unique<PdfConversionState>(gfx::Size(), gfx::Rect(), use_skia_); const PrintSettings& settings = document()->settings(); PdfRenderSettings::Mode mode;
diff --git a/chrome/browser/printing/print_job.h b/chrome/browser/printing/print_job.h index f0a77ac6..85fa9f2e 100644 --- a/chrome/browser/printing/print_job.h +++ b/chrome/browser/printing/print_job.h
@@ -22,6 +22,10 @@ #include "chromeos/crosapi/mojom/local_printer.mojom.h" #endif +#if BUILDFLAG(IS_WIN) +#include "third_party/abseil-cpp/absl/types/optional.h" +#endif + namespace base { class Location; class RefCountedMemory; @@ -255,6 +259,7 @@ class PdfConversionState; std::unique_ptr<PdfConversionState> pdf_conversion_state_; std::vector<uint32_t> pdf_page_mapping_; + absl::optional<bool> use_skia_; #endif // BUILDFLAG(IS_WIN) #if BUILDFLAG(IS_CHROMEOS)
diff --git a/chrome/browser/recent_tabs/internal/android/java/strings/translations/android_restore_tabs_strings_be.xtb b/chrome/browser/recent_tabs/internal/android/java/strings/translations/android_restore_tabs_strings_be.xtb index 6c8791b..6451343 100644 --- a/chrome/browser/recent_tabs/internal/android/java/strings/translations/android_restore_tabs_strings_be.xtb +++ b/chrome/browser/recent_tabs/internal/android/java/strings/translations/android_restore_tabs_strings_be.xtb
@@ -11,5 +11,6 @@ <translation id="4386361164755260473">{TABS_COUNT,plural, =1{Адкрыць <ph name="TABS_COUNT_ONE" /> укладку}one{Адкрыць <ph name="TABS_COUNT_MANY" /> укладку}few{Адкрыць <ph name="TABS_COUNT_MANY" /> укладкі}many{Адкрыць <ph name="TABS_COUNT_MANY" /> укладак}other{Адкрыць <ph name="TABS_COUNT_MANY" /> укладкі}}</translation> <translation id="4811934403802581334">Будуць адноўлены ўсе абраныя ўкладкі з абранай прылады.</translation> <translation id="5336031759968328813">Паглядзець усе ўкладкі</translation> +<translation id="8019269305087157499">Адкрыць з</translation> <translation id="8725404154479306799">Прагляд укладак, адкрытых на старых прыладах</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/common/automation_predicate.js b/chrome/browser/resources/chromeos/accessibility/common/automation_predicate.js index 6eca586..1f3c814 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/automation_predicate.js +++ b/chrome/browser/resources/chromeos/accessibility/common/automation_predicate.js
@@ -466,6 +466,7 @@ Role.GENERIC_CONTAINER, Role.DOCUMENT, Role.GROUP, + Role.PDF_ROOT, Role.LIST, Role.LIST_ITEM, Role.TAB,
diff --git a/chrome/browser/resources/chromeos/accessibility/common/automation_predicate_test.js b/chrome/browser/resources/chromeos/accessibility/common/automation_predicate_test.js index 2ca0079..9dd745d 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/automation_predicate_test.js +++ b/chrome/browser/resources/chromeos/accessibility/common/automation_predicate_test.js
@@ -12,6 +12,8 @@ await super.setUpDeferred(); await importModule( 'AutomationPredicate', '/common/automation_predicate.js'); + await importModule( + 'createMockNode', '/common/testing/test_node_generator.js'); } }; @@ -78,3 +80,12 @@ assertEquals(undefined, button.defaultActionVerb); assertFalse(AutomationPredicate.container(container)); }); + +AX_TEST_F( + 'AccessibilityExtensionAutomationPredicateTest', 'PdfRootRoleAsContainer', + async function() { + const pdfRoot = + createMockNode({role: chrome.automation.RoleType.PDF_ROOT}); + assertTrue(!!pdfRoot); + assertTrue(AutomationPredicate.container(pdfRoot)); + });
diff --git a/chrome/browser/resources/chromeos/accessibility/common/cursors/cursors_test.js b/chrome/browser/resources/chromeos/accessibility/common/cursors/cursors_test.js index 1d7ceea..0df1555 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/cursors/cursors_test.js +++ b/chrome/browser/resources/chromeos/accessibility/common/cursors/cursors_test.js
@@ -31,6 +31,8 @@ await importModule( 'AutomationPredicate', '/common/automation_predicate.js'); await importModule('constants', '/common/constants.js'); + await importModule( + 'createMockNode', '/common/testing/test_node_generator.js'); // Various aliases globalThis.CHARACTER = CursorUnit.CHARACTER; globalThis.WORD = CursorUnit.WORD; @@ -714,6 +716,50 @@ ]); }); +AX_TEST_F( + 'AccessibilityExtensionCursorsTest', 'MovementByNodeInPdf', + async function() { + const root = + createMockNode({role: chrome.automation.RoleType.ROOT_WEB_AREA}); + const pdfRoot = createMockNode( + {role: chrome.automation.RoleType.PDF_ROOT, parent: root, root}); + const paragraph1 = createMockNode({ + role: chrome.automation.RoleType.PARAGRAPH, + display: 'block', + parent: pdfRoot, + pdfRoot, + }); + const text1 = createMockNode({ + role: chrome.automation.RoleType.STATIC_TEXT, + parent: paragraph1, + pdfRoot, + name: 'First text in PDF', + }); + const paragraph2 = createMockNode({ + role: chrome.automation.RoleType.PARAGRAPH, + display: 'block', + parent: pdfRoot, + pdfRoot, + }); + const text2 = createMockNode({ + role: chrome.automation.RoleType.STATIC_TEXT, + parent: paragraph2, + pdfRoot, + name: 'Second text in PDF', + }); + + let cursor = new Cursor(root.firstChild, 0); + assertEquals(chrome.automation.RoleType.PDF_ROOT, cursor.node.role); + + cursor = cursor.move(NODE, DIRECTIONAL, FORWARD); + assertEquals(chrome.automation.RoleType.STATIC_TEXT, cursor.node.role); + assertEquals('First text in PDF', cursor.node.name); + + cursor = cursor.move(NODE, DIRECTIONAL, FORWARD); + assertEquals(chrome.automation.RoleType.STATIC_TEXT, cursor.node.role); + assertEquals('Second text in PDF', cursor.node.name); + }); + TEST_F('AccessibilityExtensionCursorsTest', 'CopiedSelection', function() { const site = ` <p>hello</p><p>world</p>
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_icons.html b/chrome/browser/resources/chromeos/login/components/oobe_icons.html index 2b68a4e..5a763b8 100644 --- a/chrome/browser/resources/chromeos/login/components/oobe_icons.html +++ b/chrome/browser/resources/chromeos/login/components/oobe_icons.html
@@ -41,6 +41,12 @@ <path fill="#1A73E8" fill-rule="nonzero" d="M9.992 2C5.576 2 2 5.584 2 10s3.576 8 7.992 8C14.416 18 18 14.416 18 10s-3.584-8-8.008-8zm5.544 4.8h-2.36c-.256-1-.624-1.96-1.104-2.848A6.424 6.424 0 0 1 15.536 6.8zM10 3.632A11.27 11.27 0 0 1 11.528 6.8H8.472A11.27 11.27 0 0 1 10 3.632zM3.808 11.6A6.594 6.594 0 0 1 3.6 10c0-.552.08-1.088.208-1.6h2.704A13.212 13.212 0 0 0 6.4 10c0 .544.048 1.072.112 1.6H3.808zm.656 1.6h2.36c.256 1 .624 1.96 1.104 2.848A6.39 6.39 0 0 1 4.464 13.2zm2.36-6.4h-2.36a6.39 6.39 0 0 1 3.464-2.848A12.52 12.52 0 0 0 6.824 6.8zM10 16.368A11.27 11.27 0 0 1 8.472 13.2h3.056A11.27 11.27 0 0 1 10 16.368zm1.872-4.768H8.128A11.77 11.77 0 0 1 8 10c0-.544.056-1.08.128-1.6h3.744c.072.52.128 1.056.128 1.6s-.056 1.072-.128 1.6zm.2 4.448a12.52 12.52 0 0 0 1.104-2.848h2.36a6.424 6.424 0 0 1-3.464 2.848zm1.416-4.448c.064-.528.112-1.056.112-1.6s-.048-1.072-.112-1.6h2.704c.128.512.208 1.048.208 1.6s-.08 1.088-.208 1.6h-2.704z"> </path> </g> + <g id="selected"> + <path fill-rule="evenodd" clip-rule="evenodd" d="M19 10C19 14.9706 14.9706 19 10 19C5.02944 19 1 14.9706 1 10C1 5.02944 5.02944 1 10 1C14.9706 1 19 5.02944 19 10ZM14.1705 6.9545C13.7312 6.51516 13.0188 6.51516 12.5795 6.9545L8.875 10.659L7.4205 9.2045C6.98116 8.76517 6.26884 8.76517 5.8295 9.2045C5.39016 9.64384 5.39016 10.3562 5.8295 10.7955L8.0795 13.0455C8.51884 13.4848 9.23116 13.4848 9.6705 13.0455L14.1705 8.5455C14.6098 8.10616 14.6098 7.39384 14.1705 6.9545Z" fill="var(--cros-sys-primary)"></path> + </g> + <g id="sync"> + <path fill-rule="evenodd" clip-rule="evenodd" d="M8.99977 3.07092L8.9991 5.1002C6.71731 5.56382 5 7.58136 5 10C5 11.8507 6.00553 13.4666 7.50008 14.3311L7.5 12H9V17H4V15.5L5.6705 15.5009C4.04414 14.2191 3 12.2315 3 10C3 6.55562 5.48772 3.69227 8.76441 3.1087L8.99977 3.07092ZM16 3V4.5L14.3315 4.5007C15.9567 5.78256 17 7.76944 17 10C17 13.5264 14.3924 16.4438 11.0002 16.9291L11.0009 14.8998C13.2827 14.4362 15 12.4186 15 10C15 8.14968 13.9949 6.5341 12.5009 5.66945L12.5 8H11V3H16Z" fill="var(--cros-sys-on_secondary_container"></path> + </g> </defs> </svg> </iron-iconset-svg> @@ -108,7 +114,7 @@ </g> </g> <g id="game-controller"> - <path fill-rule="evenodd" clip-rule="evenodd" d="M28.8 6.39999H3.2C1.44 6.39999 0 7.83999 0 9.59999V22.4C0 24.16 1.44 25.6 3.2 25.6H28.8C30.56 25.6 32 24.16 32 22.4V9.59999C32 7.83999 30.56 6.39999 28.8 6.39999ZM28.8 22.4H3.2V9.59999H28.8V22.4ZM8 20.8H11.2V17.6H14.4V14.4H11.2V11.2H8V14.4H4.8V17.6H8V20.8ZM20 20.8C21.3255 20.8 22.4 19.7255 22.4 18.4C22.4 17.0745 21.3255 16 20 16C18.6745 16 17.6 17.0745 17.6 18.4C17.6 19.7255 18.6745 20.8 20 20.8ZM24.8 16C26.1255 16 27.2 14.9255 27.2 13.6C27.2 12.2745 26.1255 11.2 24.8 11.2C23.4745 11.2 22.4 12.2745 22.4 13.6C22.4 14.9255 23.4745 16 24.8 16Z"></path> + <path fill-rule="evenodd" clip-rule="evenodd" d="M28.8 6.39999H3.2C1.44 6.39999 0 7.83999 0 9.59999V22.4C0 24.16 1.44 25.6 3.2 25.6H28.8C30.56 25.6 32 24.16 32 22.4V9.59999C32 7.83999 30.56 6.39999 28.8 6.39999ZM28.8 22.4H3.2V9.59999H28.8V22.4ZM8 20.8H11.2V17.6H14.4V14.4H11.2V11.2H8V14.4H4.8V17.6H8V20.8ZM20 20.8C21.3255 20.8 22.4 19.7255 22.4 18.4C22.4 17.0745 21.3255 16 20 16C18.6745 16 17.6 17.0745 17.6 18.4C17.6 19.7255 18.6745 20.8 20 20.8ZM24.8 16C26.1255 16 27.2 14.9255 27.2 13.6C27.2 12.2745 26.1255 11.2 24.8 11.2C23.4745 11.2 22.4 12.2745 22.4 13.6C22.4 14.9255 23.4745 16 24.8 16Z" fill="var(--cros-sys-primary)"></path> </g> <g id="lock"> <defs> @@ -294,6 +300,52 @@ <path fill="#1A73E8" fill-rule="nonzero" d="M19.984 4C11.152 4 4 11.168 4 20s7.152 16 15.984 16C28.832 36 36 28.832 36 20S28.832 4 19.984 4zm11.088 9.6h-4.72c-.512-2-1.248-3.92-2.208-5.696a12.847 12.847 0 0 1 6.928 5.696zM20 7.264a22.539 22.539 0 0 1 3.056 6.336h-6.112A22.539 22.539 0 0 1 20 7.264zM7.616 23.2A13.187 13.187 0 0 1 7.2 20c0-1.104.16-2.176.416-3.2h5.408c-.128 1.056-.224 2.112-.224 3.2s.096 2.144.224 3.2H7.616zm1.312 3.2h4.72c.512 2 1.248 3.92 2.208 5.696A12.779 12.779 0 0 1 8.928 26.4zm4.72-12.8h-4.72a12.779 12.779 0 0 1 6.928-5.696 25.039 25.039 0 0 0-2.208 5.696zM20 32.736a22.539 22.539 0 0 1-3.056-6.336h6.112A22.539 22.539 0 0 1 20 32.736zm3.744-9.536h-7.488C16.112 22.144 16 21.088 16 20s.112-2.16.256-3.2h7.488c.144 1.04.256 2.112.256 3.2s-.112 2.144-.256 3.2zm.4 8.896a25.039 25.039 0 0 0 2.208-5.696h4.72a12.847 12.847 0 0 1-6.928 5.696zm2.832-8.896c.128-1.056.224-2.112.224-3.2s-.096-2.144-.224-3.2h5.408c.256 1.024.416 2.096.416 3.2s-.16 2.176-.416 3.2h-5.408z"> </path> </g> + <g id="theme-choobe"> + <path d="M6 9C6 7.89543 6.89543 7 8 7H20V33H8C6.89543 33 6 32.1046 6 31V9Z" fill="var(--cros-sys-primary)"></path> + <path d="M18 29H9L18 19V29Z" fill="var(--cros-sys-on_primary)"></path> + <path d="M22 31H33L22 19V31Z" fill="var(--cros-sys-inverse_primary)"></path> + <path d="M22 8H32C33.1046 8 34 8.89543 34 10V30C34 31.1046 33.1046 32 32 32H22" fill="var(--cros-sys-inverse_primary)" stroke-width="2"></path> + </g> + <g id="scroll-choobe"> + <path d="M8 16C8 14.8954 8.89543 14 10 14H30C31.1046 14 32 14.8954 32 16V24C32 25.1046 31.1046 26 30 26H10C8.89543 26 8 25.1046 8 24V16Z" fill="var(--cros-sys-primary)"></path> + <path d="M19.134 3.5C19.5189 2.83333 20.4811 2.83333 20.866 3.5L24.3301 9.5C24.715 10.1667 24.2339 11 23.4641 11H16.5359C15.7661 11 15.285 10.1667 15.6699 9.5L19.134 3.5Z" fill="var(--cros-sys-primary)" fill-opacity="0.3"></path> + <path d="M20.866 36.5C20.4811 37.1667 19.5189 37.1667 19.134 36.5L15.6699 30.5C15.285 29.8333 15.7661 29 16.5359 29L23.4641 29C24.2339 29 24.715 29.8333 24.3301 30.5L20.866 36.5Z" fill="var(--cros-sys-primary)" fill-opacity="0.3"></path> + </g> + <g id="display-size-choobe"> + <path fill-rule="evenodd" clip-rule="evenodd" d="M12 6C10.8954 6 10 6.89543 10 8V21H16C17.1046 21 18 21.8954 18 23V30H32C33.1046 30 34 29.1046 34 28V8C34 6.89543 33.1046 6 32 6H12Z" fill="var(--cros-sys-primary)"></path> + <rect x="6" y="23" width="10" height="10" rx="2" fill="var(--cros-sys-primary)" fill-opacity="0.3"></rect> + <rect x="17" y="11" width="11" height="3" fill="var(--cros-sys-on_primary)"></rect> + <rect x="8" y="25" width="6" height="2" fill="var(--cros-sys-primary)"></rect> + <rect x="21" y="14" width="3" height="10" fill="var(--cros-sys-on_primary)"></rect> + <rect x="10" y="27" width="2" height="4" fill="var(--cros-sys-primary)"></rect> + </g> + <g id="pin-choobe"> + <path d="M15 8C15 9.65685 13.6569 11 12 11C10.3431 11 9 9.65685 9 8C9 6.34315 10.3431 5 12 5C13.6569 5 15 6.34315 15 8Z" fill="var(--cros-sys-primary)"fill-opacity="0.3"></path> + <path d="M15 16C15 17.6569 13.6569 19 12 19C10.3431 19 9 17.6569 9 16C9 14.3431 10.3431 13 12 13C13.6569 13 15 14.3431 15 16Z" fill="var(--cros-sys-primary)"></path> + <path d="M15 24C15 25.6569 13.6569 27 12 27C10.3431 27 9 25.6569 9 24C9 22.3431 10.3431 21 12 21C13.6569 21 15 22.3431 15 24Z" fill="var(--cros-sys-primary)"></path> + <path d="M23 8C23 9.65685 21.6569 11 20 11C18.3431 11 17 9.65685 17 8C17 6.34315 18.3431 5 20 5C21.6569 5 23 6.34315 23 8Z" fill="var(--cros-sys-primary)" fill-opacity="0.3"></path> + <path d="M23 16C23 17.6569 21.6569 19 20 19C18.3431 19 17 17.6569 17 16C17 14.3431 18.3431 13 20 13C21.6569 13 23 14.3431 23 16Z" fill="var(--cros-sys-primary)"fill-opacity="0.3"></path> + <path d="M23 24C23 25.6569 21.6569 27 20 27C18.3431 27 17 25.6569 17 24C17 22.3431 18.3431 21 20 21C21.6569 21 23 22.3431 23 24Z" fill="var(--cros-sys-primary)" fill-opacity="0.3"></path> + <path d="M23 32C23 33.6569 21.6569 35 20 35C18.3431 35 17 33.6569 17 32C17 30.3431 18.3431 29 20 29C21.6569 29 23 30.3431 23 32Z" fill="var(--cros-sys-primary)"></path> + <path d="M31 8C31 9.65685 29.6569 11 28 11C26.3431 11 25 9.65685 25 8C25 6.34315 26.3431 5 28 5C29.6569 5 31 6.34315 31 8Z" fill="var(--cros-sys-primary)"></path> + <path d="M31 16C31 17.6569 29.6569 19 28 19C26.3431 19 25 17.6569 25 16C25 14.3431 26.3431 13 28 13C29.6569 13 31 14.3431 31 16Z" fill="var(--cros-sys-primary)" fill-opacity="0.3"></path> + <path d="M31 24C31 25.6569 29.6569 27 28 27C26.3431 27 25 25.6569 25 24C25 22.3431 26.3431 21 28 21C29.6569 21 31 22.3431 31 24Z" fill="var(--cros-sys-primary)"></path> + </g> + <g id="keyboard-choobe"> + <path fill-rule="evenodd" clip-rule="evenodd" d="M36 11H4V29H36V11ZM4 9C2.89543 9 2 9.89543 2 11V29C2 30.1046 2.89543 31 4 31H36C37.1046 31 38 30.1046 38 29V11C38 9.89543 37.1046 9 36 9H4Z" fill="var(--cros-sys-primary)"></path> + <path d="M10 15C10 16.1046 9.10457 17 8 17C6.89543 17 6 16.1046 6 15C6 13.8954 6.89543 13 8 13C9.10457 13 10 13.8954 10 15Z" fill="var(--cros-sys-primary)"></path> + <path d="M13 20C13 21.1046 12.1046 22 11 22C9.89543 22 9 21.1046 9 20C9 18.8954 9.89543 18 11 18C12.1046 18 13 18.8954 13 20Z" fill="var(--cros-sys-primary)"></path> + <path d="M9 25C9 26.1046 8.10457 27 7 27C5.89543 27 5 26.1046 5 25C5 23.8954 5.89543 23 7 23C8.10457 23 9 23.8954 9 25Z" fill="var(--cros-sys-primary)" fill-opacity="0.3"></path> + <path d="M34 25C34 26.1046 33.1046 27 32 27C30.8954 27 30 26.1046 30 25C30 23.8954 30.8954 23 32 23C33.1046 23 34 23.8954 34 25Z" fill="var(--cros-sys-primary)" fill-opacity="0.3"></path> + <path d="M16 15C16 16.1046 15.1046 17 14 17C12.8954 17 12 16.1046 12 15C12 13.8954 12.8954 13 14 13C15.1046 13 16 13.8954 16 15Z" fill="var(--cros-sys-primary)"></path> + <path d="M19 20C19 21.1046 18.1046 22 17 22C15.8954 22 15 21.1046 15 20C15 18.8954 15.8954 18 17 18C18.1046 18 19 18.8954 19 20Z" fill="var(--cros-sys-primary)" fill-opacity="0.3"></path> + <path d="M22 15C22 16.1046 21.1046 17 20 17C18.8954 17 18 16.1046 18 15C18 13.8954 18.8954 13 20 13C21.1046 13 22 13.8954 22 15Z" fill="var(--cros-sys-primary)" fill-opacity="0.3"></path> + <path d="M25 20C25 21.1046 24.1046 22 23 22C21.8954 22 21 21.1046 21 20C21 18.8954 21.8954 18 23 18C24.1046 18 25 18.8954 25 20Z" fill="var(--cros-sys-primary)" fill-opacity="0.3"></path> + <path d="M28 15C28 16.1046 27.1046 17 26 17C24.8954 17 24 16.1046 24 15C24 13.8954 24.8954 13 26 13C27.1046 13 28 13.8954 28 15Z" fill="var(--cros-sys-primary)" fill-opacity="0.3"></path> + <path d="M31 20C31 21.1046 30.1046 22 29 22C27.8954 22 27 21.1046 27 20C27 18.8954 27.8954 18 29 18C30.1046 18 31 18.8954 31 20Z" fill="var(--cros-sys-primary)" fill-opacity="0.3"></path> + <path d="M34 15C34 16.1046 33.1046 17 32 17C30.8954 17 30 16.1046 30 15C30 13.8954 30.8954 13 32 13C33.1046 13 34 13.8954 34 15Z" fill="var(--cros-sys-primary)"></path> + <path d="M11 25.5C11 24.6716 11.6716 24 12.5 24H26.5C27.3284 24 28 24.6716 28 25.5C28 26.3284 27.3284 27 26.5 27H12.5C11.6716 27 11 26.3284 11 25.5Z" fill="var(--cros-sys-primary)"></path> + </g> </defs> </svg> </iron-iconset-svg>
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_screens_list.html b/chrome/browser/resources/chromeos/login/components/oobe_screens_list.html index 9719080..e53c1c1 100644 --- a/chrome/browser/resources/chromeos/login/components/oobe_screens_list.html +++ b/chrome/browser/resources/chromeos/login/components/oobe_screens_list.html
@@ -11,30 +11,29 @@ --> <style include="oobe-dialog-host-styles cros-color-overrides"> - /* TODO(b/260302591) Update the color to semantic color. --> */ :host { --cr-card-button-height: 150px; - --cr-card-button-checked: var(--google-blue-500); } #screensList { - column-gap: 16px; - display: grid; - grid-template-columns: repeat(2, 1fr); overflow-y: auto; width: 100%; } .screen-title { - color: var(--cros-text-color-primary); + color: var(--cros-sys-on_surface); font: var(--cros-body-1-font); } + .screen-subtitle { + color: var(--cros-sys-on_surface_variant); + font: var(--cros-body-2-font); + } + .screen-item { - background-color: var(--cros-highlight-color); - border: none; + background-color: var(--cros-sys-base_elevated); border-radius: 16px; - height: var(--cr-card-button-height); + height: 80px; margin-bottom: 16px; padding: 0; transition: color 250ms linear, background-color 250ms linear; @@ -42,17 +41,16 @@ } .screen-icon { - --iron-icon-fill-color: var(--cros-icon-color-blue); align-items: center; align-self: center; display: flex; height: 32px; margin-inline-end: 16px; - margin-inline-start: 24px ; + margin-inline-start: 16px ; width: 32px; } - .screen-title { + .text-container { align-items: center; display: flex; flex-direction: column; @@ -60,31 +58,89 @@ margin-inline-end: 16px; } - /* If we have an odd number of screens then the last - screen will cover the entire row. */ - .screen-item:nth-child(odd):last-of-type { - width: calc(200% + 16px); + .screen-item:focus { + border: 2px solid var(--cros-sys-focus_ring); } .screen-item[checked=true] { - background-color: var(--cr-card-button-checked); - } - - .screen-item[checked=true] .screen-icon { - --iron-icon-fill-color: var(--cros-icon-color-primary-inverted); + background-color: var(--cros-sys-primary_container); } .screen-item[checked=true] .screen-title { - color: var(--cros-button-label-color-primary); + color: var(--cros-sys-on_surface); + } + + .screen-item[checked=true] .screen-subtitle { + color: var(--cros-sys-on_surface_variant); + } + + .info-icon { + align-self: center; + margin-inline-end: 30px; + margin-inline-start: auto; + } + + .screen-item[visited] { + --cros-sys-inverse_primary : var(--cros-color-secondary-light); + --cros-sys-primary : var(--cros-color-secondary-light); + background-color: var(--cros-button-background-color-primary-disabled); + } + + :root.jelly-enabled .screen-item[visited] { + --cros-sys-inverse_primary : var(--cros-sys-secondary-light); + --cros-sys-primary : var(--cros-sys-secondary-light); + background-color: var(--cros-sys-hover_on_subtle); + } + + .screen-item[visited] .screen-title { + color: var(--cros-sys-on_surface); + } + + .screen-item[visited] .screen-subtitle { + color: var(--cros-sys-on_surface_variant); + } + + .screen-item[disabled] { + --cros-sys-inverse_primary : var(--cros-sys-disabled); + --cros-sys-primary : var(--cros-sys-disabled); + background-color: var(--disabled-bg-action); + } + + :root.jelly-enabled .screen-item[disabled] { + --cros-sys-inverse_primary : var(--cros-sys-disabled); + --cros-sys-primary : var(--cros-sys-disabled); + background-color: var(--cros-sys-disabled_container); + } + + .screen-item[disabled] .screen-title { + color: var(--cros-sys-disabled); + } + + .screen-item[disabled] .screen-subtitle { + color: var(--cros-sys-disabled); } </style> <div id="screensList"> - <template is="dom-repeat" items="{{screensList}}" as="screen"> - <cr-button class="screen-item" on-click="onClick_"> - <div class="flex horizontal layout center-justified center"> + <template is="dom-repeat" items="{{screensList_}}" as="screen"> + <cr-button visited$="[[isScreenVisited(screen.selected , screen.is_completed)]]" + disabled="[[isScreenDisabled(screen.is_revisitable , screen.is_completed)]]" + class="screen-item" + on-click="onClick_"> + <div class="flex horizontal layout"> + <div class="icon"> <iron-icon class="screen-icon" icon="[[screen.icon]]"></iron-icon> - <div class="screen-title">[[i18nDynamic(locale, screen.title)]]</div> + </div> + <div class="text-container"> + <div class="screen-title">[[screen.title]]</div> + <div class="screen-subtitle">[[screen.subtitle]]</div> + </div> + <div class="info-icon"> + <iron-icon hidden="[[isSyncedIconHidden(screen.synced , screen.selected)]]" + id="sync" icon="oobe-20:sync"></iron-icon> + <iron-icon hidden="[[!screen.selected]]" + id="selected" icon="oobe-20:selected"></iron-icon> + </div> </div> </cr-button> </template>
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_screens_list.js b/chrome/browser/resources/chromeos/login/components/oobe_screens_list.js index 6686e3d..a12e17d0 100644 --- a/chrome/browser/resources/chromeos/login/components/oobe_screens_list.js +++ b/chrome/browser/resources/chromeos/login/components/oobe_screens_list.js
@@ -47,9 +47,10 @@ * List of screens to display. * @type {!Array<ScreenItem>} */ - screensList: { + screensList_: { type: Array, value: [], + notify: true, }, /** * List of selected screens. @@ -73,7 +74,7 @@ * Initialize the list of screens. */ init(screens) { - this.screensList = screens; + this.screensList_ = screens; } /** @@ -85,10 +86,14 @@ onClick_(e) { const clickedScreen = e.model.screen; - const selected = clickedScreen.selected; - clickedScreen.selected = !selected; - e.currentTarget.setAttribute('checked', !selected); - if (!selected) { + const previousSelectedState = clickedScreen.selected; + const curentSelectedState = !previousSelectedState; + const path = + `screensList_.${this.screensList_.indexOf(clickedScreen)}.selected`; + this.set(path, curentSelectedState); + e.currentTarget.setAttribute('checked', curentSelectedState); + + if (curentSelectedState) { this.selectedScreensCount++; this.screensSelected.push(clickedScreen.screenID); } else { @@ -96,6 +101,19 @@ this.screensSelected.splice( this.screensSelected.indexOf(clickedScreen.screenID), 1); } + this.notifyPath('screensList_'); + } + + isScreenDisabled(is_revisitable, is_completed) { + return (!is_revisitable) && is_completed; + } + + isSyncedIconHidden(is_synced, is_selected) { + return (!is_synced) || (is_selected); + } + + isScreenVisited(is_selected, is_completed) { + return is_completed && !is_selected; } }
diff --git a/chrome/browser/resources/chromeos/login/debug/debug.js b/chrome/browser/resources/chromeos/login/debug/debug.js index a508406..c975c70 100644 --- a/chrome/browser/resources/chromeos/login/debug/debug.js +++ b/chrome/browser/resources/chromeos/login/debug/debug.js
@@ -1567,10 +1567,53 @@ data: { screens: [ { - title: 'choobeThemeSelectionTileTitle', - icon: 'oobe-32:stars', + screenID: 'screenID1', + icon: 'oobe-40:theme-choobe', + title: 'choobeThemeSelectionTitle', + subtitle: 'choobeThemeSelectionTitle', + synced: false, + is_revisitable: true, selected: false, - screenID: 'screenID', + is_completed: false, + }, + { + screenID: 'screenID2', + icon: 'oobe-40:scroll-choobe', + title: 'choobeThemeSelectionTitle', + subtitle: 'choobeThemeSelectionTitle', + synced: true, + is_revisitable: false, + selected: false, + is_completed: false, + }, + { + screenID: 'screenID3', + icon: 'oobe-40:pin-choobe', + title: 'choobeThemeSelectionTitle', + synced: false, + is_revisitable: false, + selected: false, + is_completed: true, + }, + { + screenID: 'screenID4', + icon: 'oobe-40:keyboard-choobe', + title: 'choobeThemeSelectionTitle', + subtitle: 'choobeThemeSelectionTitle', + synced: true, + is_revisitable: true, + selected: false, + is_completed: false, + }, + { + screenID: 'screenID5', + icon: 'oobe-40:display-size-choobe', + title: 'choobeThemeSelectionTitle', + subtitle: 'choobeThemeSelectionTitle', + synced: false, + is_revisitable: true, + selected: false, + is_completed: true, }, ], },
diff --git a/chrome/browser/resources/chromeos/login/oobe.js b/chrome/browser/resources/chromeos/login/oobe.js index ac4152c..68b468b 100644 --- a/chrome/browser/resources/chromeos/login/oobe.js +++ b/chrome/browser/resources/chromeos/login/oobe.js
@@ -25,6 +25,7 @@ // Everything has been imported at this point. traceExecution(TraceEvent.FIRST_LINE_AFTER_IMPORTS); +chrome.send('initializeCoreHandler'); // Create the global values attached to `window` that are used // for accessing OOBE controls from the browser side.
diff --git a/chrome/browser/resources/chromeos/login/screens/common/sync_consent.html b/chrome/browser/resources/chromeos/login/screens/common/sync_consent.html index 0964b7b..8d24574 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/sync_consent.html +++ b/chrome/browser/resources/chromeos/login/screens/common/sync_consent.html
@@ -207,8 +207,8 @@ </p> </div> <div slot="content" class="layout vertical landscape-vertical-centered"> - <img slot="subtitle" src="images/os_sync_consent.svg" - class="oobe-illustration" aria-hidden="true"> + <img src="images/os_sync_consent.svg" class="oobe-illustration" + aria-hidden="true"> </div> <div slot="bottom-buttons"> <oobe-text-button id="manageButton"
diff --git a/chrome/browser/resources/new_tab_page/realbox/realbox.html b/chrome/browser/resources/new_tab_page/realbox/realbox.html index b1db5bd..987694c 100644 --- a/chrome/browser/resources/new_tab_page/realbox/realbox.html +++ b/chrome/browser/resources/new_tab_page/realbox/realbox.html
@@ -20,10 +20,16 @@ * Maintain a larger width if the secondary side can be shown and was at any * point available to be shown. */ - :host([can-show-secondary-side][had-secondary-side]) { + :host([can-show-secondary-side][had-secondary-side]), + :host([can-show-secondary-side][width-behavior_='wide']) { --cr-realbox-width: 746px; } + :host([can-show-secondary-side][width-behavior_='revert']:not( + [dropdown-is-visible])) { + --cr-realbox-width: var(--cr-realbox-min-width); + } + /** * Show the secondary side if it can be shown and is currently available to be * shown.
diff --git a/chrome/browser/resources/new_tab_page/realbox/realbox.ts b/chrome/browser/resources/new_tab_page/realbox/realbox.ts index dc95e0c..e360346 100644 --- a/chrome/browser/resources/new_tab_page/realbox/realbox.ts +++ b/chrome/browser/resources/new_tab_page/realbox/realbox.ts
@@ -214,6 +214,12 @@ type: String, computed: `computeInputAriaLive_(selectedMatch_)`, }, + + widthBehavior_: { + type: String, + value: loadTimeData.getString('realboxWidthBehavior'), + reflectToAttribute: true, + }, }; }
diff --git a/chrome/browser/resources/password_manager/checkup_section.ts b/chrome/browser/resources/password_manager/checkup_section.ts index fe9f3159..b851af4 100644 --- a/chrome/browser/resources/password_manager/checkup_section.ts +++ b/chrome/browser/resources/password_manager/checkup_section.ts
@@ -119,6 +119,12 @@ computed: 'computeBannerImage_(status_, compromisedPasswords_, ' + 'reusedPasswords_, weakPasswords_)', }, + + groupCount_: { + type: Number, + value: 0, + observer: 'updateCheckedPasswordsText_', + }, }; } @@ -132,11 +138,13 @@ private weakPasswords_: chrome.passwordsPrivate.PasswordUiEntry[]; private reusedPasswords_: chrome.passwordsPrivate.PasswordUiEntry[]; private didCheckAutomatically_: boolean = false; + private groupCount_: number; private statusChangedListener_: PasswordCheckStatusChangedListener|null = null; private insecureCredentialsChangedListener_: CredentialsChangedListener|null = null; + private setSavedPasswordsListener_: CredentialsChangedListener|null = null; override connectedCallback() { super.connectedCallback(); @@ -168,6 +176,11 @@ }); }; + this.setSavedPasswordsListener_ = _passwordList => { + PasswordManagerImpl.getInstance().getCredentialGroups().then( + groups => this.groupCount_ = groups.length); + }; + PasswordManagerImpl.getInstance().getPasswordCheckStatus().then( this.statusChangedListener_); PasswordManagerImpl.getInstance().addPasswordCheckStatusListener( @@ -177,6 +190,11 @@ this.insecureCredentialsChangedListener_); PasswordManagerImpl.getInstance().addInsecureCredentialsListener( this.insecureCredentialsChangedListener_); + + PasswordManagerImpl.getInstance().getCredentialGroups().then( + groups => this.groupCount_ = groups.length); + PasswordManagerImpl.getInstance().addSavedPasswordListChangedListener( + this.setSavedPasswordsListener_); } override disconnectedCallback() { @@ -191,6 +209,11 @@ PasswordManagerImpl.getInstance().removeInsecureCredentialsListener( this.insecureCredentialsChangedListener_); this.insecureCredentialsChangedListener_ = null; + + assert(this.setSavedPasswordsListener_); + PasswordManagerImpl.getInstance().removeSavedPasswordListChangedListener( + this.setSavedPasswordsListener_); + this.setSavedPasswordsListener_ = null; } override currentRouteChanged(route: Route): void { @@ -211,7 +234,43 @@ if (oldStatus !== undefined && oldStatus.state === newStatus.state) { return; } - switch (newStatus.state) { + + await this.updateCheckedPasswordsText_(); + + if (newStatus.state === CheckState.NO_PASSWORDS) { + return; + } + + // Announce password check result and focus retry/refresh button when + // password check is finished. + if (!!oldStatus && oldStatus.state === CheckState.RUNNING && + newStatus.state !== CheckState.RUNNING) { + let stateText: string; + if (this.compromisedPasswords_.length > 0) { + stateText = this.i18n('checkupResultRed'); + } else if (this.hasAnyIssues_()) { + stateText = this.i18n('checkupResultYellow'); + } else { + stateText = this.i18n('checkupResultGreen'); + } + getAnnouncerInstance().announce( + [this.checkedPasswordsText_, stateText].join('. ')); + focusWithoutInk( + this.showRetryButton_() ? this.$.retryButton : this.$.refreshButton); + } else if ( + !!oldStatus && oldStatus.state !== CheckState.RUNNING && + newStatus.state === CheckState.RUNNING) { + // Announce password checkup has started. + getAnnouncerInstance().announce('Password check started'); + } + } + + private async updateCheckedPasswordsText_() { + if (!this.status_) { + return; + } + + switch (this.status_.state) { case CheckState.IDLE: case CheckState.OFFLINE: case CheckState.SIGNED_OUT: @@ -220,31 +279,12 @@ case CheckState.NO_PASSWORDS: this.checkedPasswordsText_ = await PluralStringProxyImpl.getInstance().getPluralString( - 'checkedPasswords', this.status_.totalNumberOfPasswords || 0); - if (!!oldStatus && oldStatus.state === CheckState.RUNNING && - newStatus.state !== CheckState.NO_PASSWORDS) { - let stateText: string; - if (this.compromisedPasswords_.length > 0) { - stateText = this.i18n('checkupResultRed'); - } else if (this.hasAnyIssues_()) { - stateText = this.i18n('checkupResultYellow'); - } else { - stateText = this.i18n('checkupResultGreen'); - } - getAnnouncerInstance().announce( - [this.checkedPasswordsText_, stateText].join('. ')); - focusWithoutInk( - this.showRetryButton_() ? this.$.retryButton : - this.$.refreshButton); - } + 'checkedPasswords', this.groupCount_); return; case CheckState.CANCELED: this.checkedPasswordsText_ = this.i18n('checkupCanceled'); return; case CheckState.RUNNING: - if (!!oldStatus && oldStatus.state !== CheckState.RUNNING) { - getAnnouncerInstance().announce('Password check started'); - } this.checkedPasswordsText_ = await PluralStringProxyImpl.getInstance().getPluralString( 'checkingPasswords', this.status_.totalNumberOfPasswords || 0);
diff --git a/chrome/browser/resources/password_manager/dialogs/add_password_dialog.html b/chrome/browser/resources/password_manager/dialogs/add_password_dialog.html index a6342b90..3f1026c2 100644 --- a/chrome/browser/resources/password_manager/dialogs/add_password_dialog.html +++ b/chrome/browser/resources/password_manager/dialogs/add_password_dialog.html
@@ -104,7 +104,7 @@ $i18n{addPasswordFooter} </div> <div class="divider"></div> - <cr-textarea label="$i18n{notesLabel}" id="noteInput" value="{{note_}}" + <cr-textarea label="$i18n{noteLabel}" id="noteInput" value="{{note_}}" invalid="[[isNoteInputInvalid_(note_)]]" has-max-height autogrow first-footer="[[getFirstNoteFooter_(note_)]]" second-footer="[[getSecondNoteFooter_(note_)]]">
diff --git a/chrome/browser/resources/password_manager/dialogs/edit_password_dialog.html b/chrome/browser/resources/password_manager/dialogs/edit_password_dialog.html index b9b1963b..41671a1 100644 --- a/chrome/browser/resources/password_manager/dialogs/edit_password_dialog.html +++ b/chrome/browser/resources/password_manager/dialogs/edit_password_dialog.html
@@ -79,7 +79,7 @@ <div id="footnote"> [[getFootnote_(credential)]] </div> - <cr-textarea id="passwordNote" label="$i18n{notesLabel}" value="{{note_}}" + <cr-textarea id="passwordNote" label="$i18n{noteLabel}" value="{{note_}}" invalid="[[isNoteInputInvalid_(note_)]]" has-max-height autogrow first-footer="[[getFirstNoteFooter_(note_)]]" second-footer="[[getSecondNoteFooter_(note_)]]">
diff --git a/chrome/browser/resources/password_manager/password_details_card.html b/chrome/browser/resources/password_manager/password_details_card.html index aa61ed84..ee3b7ad 100644 --- a/chrome/browser/resources/password_manager/password_details_card.html +++ b/chrome/browser/resources/password_manager/password_details_card.html
@@ -137,7 +137,7 @@ </div> <div class="column-container"> <div hidden="[[isFederated_(password)]]"> - <div class="cr-form-field-label">$i18n{notesLabel}</div> + <div class="cr-form-field-label">$i18n{noteLabel}</div> <div id="noteField" class="input-field"> <div id="noteValue" role="textbox" limit-note$="[[!showNoteFully_]]"> <span>[[getNoteValue_(password.note)]]</span>
diff --git a/chrome/browser/resources/settings/autofill_page/autofill_section.html b/chrome/browser/resources/settings/autofill_page/autofill_section.html index 6dd0f55..7445555 100644 --- a/chrome/browser/resources/settings/autofill_page/autofill_section.html +++ b/chrome/browser/resources/settings/autofill_page/autofill_section.html
@@ -48,7 +48,7 @@ </span> </span> <iron-icon icon="cr20:cloud-off" - hidden$="[[isInAccountOrSyncable_(item, accountInfo_)]]" + hidden$="[[!isCloudOffVisible_(item, accountInfo_)]]" aria-label="$i18n{localAddressIconA11yLabel}" role="img"> </iron-icon>
diff --git a/chrome/browser/resources/settings/autofill_page/autofill_section.ts b/chrome/browser/resources/settings/autofill_page/autofill_section.ts index d6a6e311..612f8ae 100644 --- a/chrome/browser/resources/settings/autofill_page/autofill_section.ts +++ b/chrome/browser/resources/settings/autofill_page/autofill_section.ts
@@ -220,13 +220,14 @@ this.autofillManager_.saveAddress(event.detail); } - private isInAccountOrSyncable_( + private isCloudOffVisible_( address: chrome.autofillPrivate.AddressEntry, accountInfo?: chrome.autofillPrivate.AccountInfo): boolean { - return address.metadata?.source === - chrome.autofillPrivate.AddressSource.ACCOUNT || - !!accountInfo?.isSyncEnabledForAutofillProfiles; + return address.metadata?.source !== + chrome.autofillPrivate.AddressSource.ACCOUNT && + !!accountInfo && !accountInfo?.isSyncEnabledForAutofillProfiles; } + /** * @returns the title for the More Actions button corresponding to the address * which is described by `label` and `sublabel`.
diff --git a/chrome/browser/resources/settings/chromeos/common/load_time_booleans.ts b/chrome/browser/resources/settings/chromeos/common/load_time_booleans.ts index 8d058714..bb1af58 100644 --- a/chrome/browser/resources/settings/chromeos/common/load_time_booleans.ts +++ b/chrome/browser/resources/settings/chromeos/common/load_time_booleans.ts
@@ -20,6 +20,10 @@ return loadTimeData.getBoolean('androidAppsVisible'); } +export function isArcVmEnabled(): boolean { + return loadTimeData.getBoolean('isArcVmEnabled'); +} + export function isPlayStoreAvailable(): boolean { return loadTimeData.getBoolean('isPlayStoreAvailable'); }
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/android_apps_subpage.html b/chrome/browser/resources/settings/chromeos/os_apps_page/android_apps_subpage.html index 0253407..5f2e480 100644 --- a/chrome/browser/resources/settings/chromeos/os_apps_page/android_apps_subpage.html +++ b/chrome/browser/resources/settings/chromeos/os_apps_page/android_apps_subpage.html
@@ -8,7 +8,7 @@ </cr-link-row> </template> -<template is="dom-if" if="[[showArcvmManageUsb]]"> +<template is="dom-if" if="[[isArcVmManageUsbAvailable]]"> <cr-link-row class="hr" label="$i18n{guestOsSharedUsbDevicesLabel}"
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/android_apps_subpage.ts b/chrome/browser/resources/settings/chromeos/os_apps_page/android_apps_subpage.ts index 49b654d5..4ef0af8 100644 --- a/chrome/browser/resources/settings/chromeos/os_apps_page/android_apps_subpage.ts +++ b/chrome/browser/resources/settings/chromeos/os_apps_page/android_apps_subpage.ts
@@ -71,7 +71,7 @@ }, /** Whether Arc VM manage usb subpage should be shown. */ - showArcvmManageUsb: Boolean, + isArcVmManageUsbAvailable: Boolean, /** * Used by DeepLinkingMixin to focus this page's deep links. @@ -87,7 +87,7 @@ } androidAppsInfo: AndroidAppsInfo; - showArcvmManageUsb: boolean; + isArcVmManageUsbAvailable: boolean; private dialogBody_: string; private playStoreEnabled_: boolean;
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.html b/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.html index 9cff40b..39c6e85 100644 --- a/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.html +++ b/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.html
@@ -119,15 +119,15 @@ <template is="dom-if" route-path="/androidAppsDetails"> <os-settings-subpage page-title="$i18n{androidAppsPageLabel}"> <settings-android-apps-subpage - android-apps-info="[[androidAppsInfo]]" prefs="{{prefs}}" - show-arcvm-manage-usb="[[showArcvmManageUsb]]"> + android-apps-info="[[androidAppsInfo]]" + is-arc-vm-manage-usb-available="[[isArcVmManageUsbAvailable_]]"> </settings-android-apps-subpage> </os-settings-subpage> </template> </template> - <template is="dom-if" if="[[showArcvmManageUsb]]" restamp> + <template is="dom-if" if="[[isArcVmManageUsbAvailable_]]" restamp> <template is="dom-if" route-path="/androidAppsDetails/sharedUsbDevices"> <os-settings-subpage page-title="$i18n{guestOsSharedUsbDevicesLabel}"> <settings-guest-os-shared-usb-devices guest-os-type="arcvm">
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.ts b/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.ts index 5b2344f..a0f9b166 100644 --- a/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.ts +++ b/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.ts
@@ -35,7 +35,7 @@ import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {androidAppsVisible, isPlayStoreAvailable, isPluginVmAvailable} from '../common/load_time_booleans.js'; +import {androidAppsVisible, isArcVmEnabled, isPlayStoreAvailable, isPluginVmAvailable} from '../common/load_time_booleans.js'; import {DeepLinkingMixin} from '../deep_linking_mixin.js'; import {App as AppWithNotifications, AppNotificationsHandlerInterface, AppNotificationsObserverReceiver, Readiness} from '../mojom-webui/app_notification_handler.mojom-webui.js'; import {Setting} from '../mojom-webui/setting.mojom-webui.js'; @@ -100,10 +100,12 @@ }, }, - /** - * Show ARCVM Manage USB related settings and sub-page. - */ - showArcvmManageUsb: Boolean, + isArcVmManageUsbAvailable_: { + type: Boolean, + value: () => { + return isArcVmEnabled(); + }, + }, /** * Whether the App Notifications page should be shown. @@ -192,11 +194,11 @@ androidAppsInfo: AndroidAppsInfo; searchTerm: string; - showArcvmManageUsb: boolean; private app_: App; private appNotificationsObserverReceiver_: AppNotificationsObserverReceiver; private appsWithNotifications_: AppWithNotifications[]; private focusConfig_: Map<string, string>; + private isArcVmManageUsbAvailable_: boolean; private isDndEnabled_: boolean; private isPlayStoreAvailable_: boolean; private isPluginVmAvailable_: boolean;
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_main/os_settings_main.html b/chrome/browser/resources/settings/chromeos/os_settings_main/os_settings_main.html index ed9e70d..5c7a2eef 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings_main/os_settings_main.html +++ b/chrome/browser/resources/settings/chromeos/os_settings_main/os_settings_main.html
@@ -41,7 +41,6 @@ class="cr-centered-card-container" prefs="{{prefs}}" page-availability="[[pageAvailability]]" - show-arcvm-manage-usb="[[showArcvmManageUsb]]"; on-showing-section="onShowingSection_" on-subpage-expand="onShowingSubpage_" on-showing-main-page="onShowingMainPage_"
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_main/os_settings_main.ts b/chrome/browser/resources/settings/chromeos/os_settings_main/os_settings_main.ts index c02ad66..c77cd7d 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings_main/os_settings_main.ts +++ b/chrome/browser/resources/settings/chromeos/os_settings_main/os_settings_main.ts
@@ -93,9 +93,6 @@ * Dictionary defining page availability. */ pageAvailability: Object, - - showArcvmManageUsb: Boolean, - }; } @@ -103,7 +100,6 @@ advancedToggleExpanded: boolean; toolbarSpinnerActive: boolean; pageAvailability: OsPageAvailability; - showArcvmManageUsb: boolean; private overscroll_: number; private showPages_: MainPageVisibility; private showingSubpage_: boolean;
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.html b/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.html index 2ac7971..be66361c 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.html +++ b/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.html
@@ -207,8 +207,7 @@ <os-settings-section page-title="$i18n{appsPageTitle}" section="apps"> <os-settings-apps-page prefs="{{prefs}}" - android-apps-info="[[androidAppsInfo]]" - show-arcvm-manage-usb="[[showArcvmManageUsb]]"> + android-apps-info="[[androidAppsInfo]]"> </os-settings-apps-page> </os-settings-section> </template>
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.ts b/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.ts index 34a33ae..8a5f195 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.ts +++ b/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.ts
@@ -71,8 +71,6 @@ notify: true, }, - showArcvmManageUsb: Boolean, - androidAppsInfo: Object, /**
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_routes.ts b/chrome/browser/resources/settings/chromeos/os_settings_routes.ts index d94dd16d..d59f47e 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings_routes.ts +++ b/chrome/browser/resources/settings/chromeos/os_settings_routes.ts
@@ -5,7 +5,7 @@ import {assert} from 'chrome://resources/js/assert_ts.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; -import {androidAppsVisible, isCrostiniSupported, isGuest, isKerberosEnabled, isPluginVmAvailable, isPowerwashAllowed} from './common/load_time_booleans.js'; +import {androidAppsVisible, isArcVmEnabled, isCrostiniSupported, isGuest, isKerberosEnabled, isPluginVmAvailable, isPowerwashAllowed} from './common/load_time_booleans.js'; import * as routesMojom from './mojom-webui/routes.mojom-webui.js'; /** Class for navigable routes. */ @@ -378,8 +378,7 @@ r.ANDROID_APPS_DETAILS = createSubpage( r.APPS, routesMojom.GOOGLE_PLAY_STORE_SUBPAGE_PATH, Subpage.kGooglePlayStore); - if (loadTimeData.valueExists('showArcvmManageUsb') && - loadTimeData.getBoolean('showArcvmManageUsb')) { + if (isArcVmEnabled()) { r.ANDROID_APPS_DETAILS_ARC_VM_SHARED_USB_DEVICES = createSubpage( r.ANDROID_APPS_DETAILS, routesMojom.ARC_VM_USB_PREFERENCES_SUBPAGE_PATH,
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.html b/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.html index e8f51f0..ee40e80 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.html +++ b/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.html
@@ -141,7 +141,6 @@ prefs="{{prefs}}" toolbar-spinner-active="{{toolbarSpinnerActive_}}" page-availability="[[pageAvailability_]]" - show-arcvm-manage-usb="[[showArcvmManageUsb_]]" advanced-toggle-expanded="{{advancedOpenedInMain_}}"> </os-settings-main> <!-- An additional child of the flex #container to take up space,
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.ts b/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.ts index f9a84945..fadf3b73 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.ts +++ b/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.ts
@@ -140,8 +140,6 @@ }, }, - showArcvmManageUsb_: Boolean, - showToolbar_: Boolean, showNavMenu_: Boolean, @@ -163,7 +161,6 @@ private advancedOpenedInMenu_: boolean; private toolbarSpinnerActive_: boolean; private pageAvailability_: OsPageAvailability; - private showArcvmManageUsb_: boolean; private showToolbar_: boolean; private showNavMenu_: boolean; private narrowThreshold_: number; @@ -217,7 +214,6 @@ loadTimeData.getString('controlledSettingChildRestriction'), }; - this.showArcvmManageUsb_ = loadTimeData.getBoolean('showArcvmManageUsb'); this.showNavMenu_ = !loadTimeData.getBoolean('isKioskModeActive'); this.showToolbar_ = !loadTimeData.getBoolean('isKioskModeActive');
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.html b/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.html index 57231f5..3573c177 100644 --- a/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.html +++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.html
@@ -1,8 +1,4 @@ <style include="sp-shared-style"> - :host([has-checkbox]) cr-url-list-item { - pointer-events: none; - } - :host([drop-position='into']) cr-url-list-item { background: var(--cr-hover-background-color); } @@ -16,10 +12,6 @@ padding-inline-start: 14px; } - cr-checkbox { - pointer-events: auto; - } - /* Visually hide the label but allow the screen reader to pick it up. */ cr-checkbox::part(label-container) { clip: rect(0,0,0,0); @@ -60,8 +52,8 @@ on-contextmenu="onContextMenu_" force-hover="[[forceHover]]"> <template is="dom-if" if="[[hasCheckbox]]" restamp> - <cr-checkbox slot="prefix" hidden="[[!hasCheckbox]]" - on-change="onCheckboxChange_" + <cr-checkbox id="checkbox" slot="prefix" hidden="[[!hasCheckbox]]" + on-checked-changed="onCheckboxChange_" disabled="[[checkboxDisabled]]"> $i18n{checkboxA11yLabel} </cr-checkbox>
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.ts b/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.ts index 7b768c8..976aed0 100644 --- a/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.ts +++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.ts
@@ -156,18 +156,27 @@ private onRowClicked_(event: MouseEvent) { // Ignore clicks on the row when it has an input, to ensure the row doesn't // eat input clicks. - if (!this.hasInput) { - event.preventDefault(); - event.stopPropagation(); - this.dispatchEvent(new CustomEvent('row-clicked', { - bubbles: true, - composed: true, - detail: { - bookmark: this.bookmark, - event: event, - }, - })); + if (this.hasInput) { + return; } + event.preventDefault(); + event.stopPropagation(); + if (this.hasCheckbox) { + // Clicking the row should trigger a checkbox click rather than a + // standard row click. + const checkbox = + this.shadowRoot!.querySelector<CrCheckboxElement>('#checkbox')!; + checkbox.checked = !checkbox.checked; + return; + } + this.dispatchEvent(new CustomEvent('row-clicked', { + bubbles: true, + composed: true, + detail: { + bookmark: this.bookmark, + event: event, + }, + })); } /**
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html index e40d7b1e..a5de9b5 100644 --- a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html +++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html
@@ -183,7 +183,8 @@ </template> </div> - <div class="sp-card"> + <div class="sp-card" + hidden$="[[shouldHideCard_(labels_.*, searchQuery_, shownBookmarks_)]]"> <sp-heading hidden$="[[shouldHideHeader_( labels_.*, searchQuery_, shownBookmarks_)]]"
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts index b24bfc2..1f918c5 100644 --- a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts +++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts
@@ -770,6 +770,10 @@ return this.hasActiveLabels_() || !!this.searchQuery_; } + private shouldHideCard_(): boolean { + return this.shouldHideHeader_() && this.shownBookmarks_.length === 0; + } + private shouldHideHeader_(): boolean { return this.hasActiveLabels_() || !!this.searchQuery_; }
diff --git a/chrome/browser/resources/side_panel/customize_chrome/categories.ts b/chrome/browser/resources/side_panel/customize_chrome/categories.ts index 6267cd0..b496447 100644 --- a/chrome/browser/resources/side_panel/customize_chrome/categories.ts +++ b/chrome/browser/resources/side_panel/customize_chrome/categories.ts
@@ -188,7 +188,6 @@ private async onUploadImageClick_() { const {success} = await this.pageHandler_.chooseLocalCustomBackground(); if (success) { - this.pageHandler_.setDefaultColor(); this.dispatchEvent(new Event('local-image-upload')); } }
diff --git a/chrome/browser/resources/side_panel/shared/sp_shared_style.css b/chrome/browser/resources/side_panel/shared/sp_shared_style.css index 0a17292..f6cd51f 100644 --- a/chrome/browser/resources/side_panel/shared/sp_shared_style.css +++ b/chrome/browser/resources/side_panel/shared/sp_shared_style.css
@@ -57,6 +57,7 @@ border-bottom-right-radius: 12px; box-sizing: border-box; margin-inline-end: calc(-1 * var(--sp-body-padding)); + padding-block-end: var(--sp-card-block-padding); } :host-context([chrome-refresh-2023]) .sp-scroller .sp-card,
diff --git a/chrome/browser/resources/webui_gallery/demos/side_panel/sp_components_demo.html b/chrome/browser/resources/webui_gallery/demos/side_panel/sp_components_demo.html index 64b8b6a..7141a6a2 100644 --- a/chrome/browser/resources/webui_gallery/demos/side_panel/sp_components_demo.html +++ b/chrome/browser/resources/webui_gallery/demos/side_panel/sp_components_demo.html
@@ -37,6 +37,18 @@ min-height: 0; } + #multipleCards { + height: 200px; + } + + .multiple-card-content { + align-items: center; + display: flex; + height: 300px; + justify-content: center; + width: 100%; + } + #emptyStateDemo { align-items: center; gap: 0; @@ -115,6 +127,23 @@ </sp-footer> </div> +<h2>Multiple cards</h2> +<div id="multipleCards" class="side-panel-demo sp-scroller"> + <div class="sp-card"> + <sp-heading hide-back-button> + <h3 slot="heading">Heading</h3> + </sp-heading> + <div class="multiple-card-content">Some content</div> + </div> + <hr class="sp-cards-separator"> + <div class="sp-card"> + <sp-heading hide-back-button> + <h3 slot="heading">Heading</h3> + </sp-heading> + <div class="multiple-card-content">Some content</div> + </div> +</div> + <h2>Empty state</h2> <div id="emptyStateDemo" class="demos"> <sp-empty-state
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/android_share_sheet/AndroidShareSheetController.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/android_share_sheet/AndroidShareSheetController.java index f7b71203..adad989e 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/android_share_sheet/AndroidShareSheetController.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/android_share_sheet/AndroidShareSheetController.java
@@ -140,11 +140,9 @@ Log.i(TAG, "No custom actions provided."); } - // Update the image being shared into ShareParams's url based on the information from - // chromeShareExtras. - if (chromeShareExtras.isImage()) { - String imageUrlToShare = getUrlToShare(params, chromeShareExtras); - params.setUrl(imageUrlToShare); + // If an URL is not provided along with the image, use the content URL if it is provided. + if (chromeShareExtras.isImage() && params.getUrl().isEmpty()) { + params.setUrl(chromeShareExtras.getContentUrl().getSpec()); } if (!isLinkSharing(params, chromeShareExtras)) { @@ -224,6 +222,9 @@ || contents.contains(ContentType.LINK_PAGE_NOT_VISIBLE); } + /** + * Get the URL to share either from ShareParams or ChromeShareExtras. + */ private static String getUrlToShare( ShareParams shareParams, ChromeShareExtras chromeShareExtras) { if (!TextUtils.isEmpty(shareParams.getUrl())) {
diff --git a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/android_share_sheet/AndroidShareSheetControllerUnitTest.java b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/android_share_sheet/AndroidShareSheetControllerUnitTest.java index dade8326..59bf412 100644 --- a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/android_share_sheet/AndroidShareSheetControllerUnitTest.java +++ b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/android_share_sheet/AndroidShareSheetControllerUnitTest.java
@@ -279,8 +279,30 @@ Intent intent = Shadows.shadowOf((Activity) mActivity).peekNextStartedActivity(); Intent sharingIntent = intent.getParcelableExtra(Intent.EXTRA_INTENT); - Assert.assertEquals("ImageUri does not match.", JUnitTestGURLs.GOOGLE_URL_DOGS, - sharingIntent.getStringExtra(Intent.EXTRA_TEXT)); + Assert.assertEquals("ImageUri does not match. Page URL should be used.", + JUnitTestGURLs.GOOGLE_URL, sharingIntent.getStringExtra(Intent.EXTRA_TEXT)); + } + + @Test + public void shareImageWithLinkUrl() { + Uri testImageUri = Uri.parse("content://test.image.uri"); + ShareParams params = new ShareParams.Builder(mWindow, "", JUnitTestGURLs.EXAMPLE_URL) + .setFileContentType("image/png") + .setSingleImageUri(testImageUri) + .setBypassFixingDomDistillerUrl(true) + .build(); + ChromeShareExtras chromeShareExtras = + new ChromeShareExtras.Builder() + .setDetailedContentType(DetailedContentType.IMAGE) + .setContentUrl(JUnitTestGURLs.getGURL(JUnitTestGURLs.GOOGLE_URL)) + .setImageSrcUrl(JUnitTestGURLs.getGURL(JUnitTestGURLs.GOOGLE_URL_DOGS)) + .build(); + mController.showShareSheet(params, chromeShareExtras, 1L); + + Intent intent = Shadows.shadowOf((Activity) mActivity).peekNextStartedActivity(); + Intent sharingIntent = intent.getParcelableExtra(Intent.EXTRA_INTENT); + Assert.assertEquals("ImageUri does not match. Link URL has higher priority over page URL.", + JUnitTestGURLs.EXAMPLE_URL, sharingIntent.getStringExtra(Intent.EXTRA_TEXT)); } @Test @@ -460,7 +482,7 @@ R.string.sharing_send_tab_to_self, R.string.qr_code_share_icon_label); chooseCustomAction(intent, R.string.qr_code_share_icon_label); - Assert.assertEquals("Last URL does not match content being shared.", + Assert.assertEquals("Image source URL should be used for QR Code.", JUnitTestGURLs.GOOGLE_URL_DOGS, ShadowQrCodeDialog.sLastUrl); }
diff --git a/chrome/browser/support_tool/ash/network_health_data_collector.cc b/chrome/browser/support_tool/ash/network_health_data_collector.cc index 2fb66999..9c08f7b 100644 --- a/chrome/browser/support_tool/ash/network_health_data_collector.cc +++ b/chrome/browser/support_tool/ash/network_health_data_collector.cc
@@ -69,19 +69,20 @@ while (re2::RE2::Consume(&input, regex_pattern, &skipped_part, &matched_network_name, &matched_guid)) { - skipped_part.AppendToString(&redacted); + redacted.append(skipped_part.data(), skipped_part.size()); if (matched_network_name == "N/A" || matched_network_name.empty() || matched_guid == "N/A" || matched_guid.empty()) { redacted += "Name: N/A\nGUID: N/A\n"; continue; } - std::string replacement = ash::NetworkGuidId(matched_guid.ToString()); + std::string replacement = ash::NetworkGuidId( + std::string(matched_guid.data(), matched_guid.size())); redacted += base::StringPrintf("Name: %s\nGUID: %s\n", replacement.c_str(), replacement.c_str()); } // Append the rest of the input to `redacted`. Only the unmatched last part // will be present in the `input` as we're using Consume() function. - input.AppendToString(&redacted); + redacted.append(input.data(), input.size()); return redacted; }
diff --git a/chrome/browser/support_tool/ash/ui_hierarchy_data_collector.cc b/chrome/browser/support_tool/ash/ui_hierarchy_data_collector.cc index 3bb5af9..3012f27 100644 --- a/chrome/browser/support_tool/ash/ui_hierarchy_data_collector.cc +++ b/chrome/browser/support_tool/ash/ui_hierarchy_data_collector.cc
@@ -84,12 +84,12 @@ while (re2::RE2::Consume(&input, regex_pattern, &skipped_part, &matched_window_title)) { - skipped_part.AppendToString(&redacted); + redacted.append(skipped_part.data(), skipped_part.size()); redacted += "title=<REDACTED>\n"; } // Append the rest of the input to `redacted`. Only the unmatched last part // will be present in the `input` as we're using Consume() function. - input.AppendToString(&redacted); + redacted.append(input.data(), input.size()); return redacted; }
diff --git a/chrome/browser/sync/test/integration/saved_tab_groups_helper.cc b/chrome/browser/sync/test/integration/saved_tab_groups_helper.cc index 161164f..6b51be88 100644 --- a/chrome/browser/sync/test/integration/saved_tab_groups_helper.cc +++ b/chrome/browser/sync/test/integration/saved_tab_groups_helper.cc
@@ -99,4 +99,196 @@ const absl::optional<base::Uuid>& tab_uuid) { CheckExitCondition(); } + +// =================================== +// --- SavedTabGroupMatchesChecker --- +// =================================== +SavedTabGroupMatchesChecker::SavedTabGroupMatchesChecker( + SavedTabGroupKeyedService* service, + SavedTabGroup group) + : group_(group), service_(service) { + CHECK(service_); + service_->model()->AddObserver(this); +} + +SavedTabGroupMatchesChecker::~SavedTabGroupMatchesChecker() { + service_->model()->RemoveObserver(this); +} + +bool SavedTabGroupMatchesChecker::IsExitConditionSatisfied(std::ostream* os) { + *os << "Waiting for data for group with uuid '" + + group_.saved_guid().AsLowercaseString() + "' to be updated."; + + const SavedTabGroupModel* const model = service_->model(); + + // Expect that a group in the model has the id, title, and color of `group_`. + // Other fields are either not synced (e.g. `local_group_id_`), have to do + // with the group's relationship to other entities (e.g. `position_`, + // `saved_tabs_`), or are implementation details (creation/update time). + for (const SavedTabGroup& group : model->saved_tab_groups()) { + if (group.saved_guid() == group_.saved_guid()) { + return group.title() == group_.title() && group.color() == group_.color(); + } + } + + return false; +} + +void SavedTabGroupMatchesChecker::SavedTabGroupAddedFromSync( + const base::Uuid& uuid) { + CheckExitCondition(); +} + +void SavedTabGroupMatchesChecker::SavedTabGroupUpdatedFromSync( + const base::Uuid& group_uuid, + const absl::optional<base::Uuid>& tab_uuid) { + CheckExitCondition(); +} + +// ============================== +// --- SavedTabMatchesChecker --- +// ============================== +SavedTabMatchesChecker::SavedTabMatchesChecker( + SavedTabGroupKeyedService* service, + SavedTabGroupTab tab) + : tab_(tab), service_(service) { + CHECK(service_); + service_->model()->AddObserver(this); +} + +SavedTabMatchesChecker::~SavedTabMatchesChecker() { + service_->model()->RemoveObserver(this); +} + +bool SavedTabMatchesChecker::IsExitConditionSatisfied(std::ostream* os) { + *os << "Waiting for data for tab with uuid '" + + tab_.saved_tab_guid().AsLowercaseString() + "' to be updated."; + + const SavedTabGroupModel* const model = service_->model(); + + // Expect that a tab in the model has the id, url, and title of `tab_`. Other + // fields are either not synced (e.g. `local_tab_id_`, `favicon_`), have to do + // with the group's relationship to other entities (e.g. `position_`, + // `saved_group_`), or are implementation details (creation/update time). + for (const SavedTabGroup& group : model->saved_tab_groups()) { + for (const SavedTabGroupTab& tab : group.saved_tabs()) { + if (tab.saved_tab_guid() == tab_.saved_tab_guid()) { + return tab.url() == tab_.url() && tab.title() == tab_.title(); + } + } + } + + return false; +} + +void SavedTabMatchesChecker::SavedTabGroupAddedFromSync( + const base::Uuid& uuid) { + CheckExitCondition(); +} + +void SavedTabMatchesChecker::SavedTabGroupUpdatedFromSync( + const base::Uuid& group_uuid, + const absl::optional<base::Uuid>& tab_uuid) { + CheckExitCondition(); +} + +// ========================= +// --- GroupOrderChecker --- +// ========================= +GroupOrderChecker::GroupOrderChecker(SavedTabGroupKeyedService* service, + std::vector<base::GUID> group_ids) + : group_ids_(group_ids), service_(service) { + CHECK(service_); + service_->model()->AddObserver(this); +} + +GroupOrderChecker::~GroupOrderChecker() { + service_->model()->RemoveObserver(this); +} + +bool GroupOrderChecker::IsExitConditionSatisfied(std::ostream* os) { + *os << "Waiting for saved group ordering to be updated."; + + const SavedTabGroupModel* const model = service_->model(); + + if (model->saved_tab_groups().size() != group_ids_.size()) { + return false; + } + + // Expect that the model has the same groups in the same order as + // `group_ids_`. + for (size_t i = 0; i < group_ids_.size(); i++) { + if (model->saved_tab_groups()[i].saved_guid() != group_ids_[i]) { + return false; + } + } + + return true; +} + +void GroupOrderChecker::SavedTabGroupAddedFromSync(const base::Uuid& uuid) { + CheckExitCondition(); +} + +void GroupOrderChecker::SavedTabGroupRemovedFromSync( + const SavedTabGroup* removed_group) { + CheckExitCondition(); +} + +void GroupOrderChecker::SavedTabGroupUpdatedFromSync( + const base::Uuid& group_uuid, + const absl::optional<base::Uuid>& tab_uuid) { + CheckExitCondition(); +} + +// ======================= +// --- TabOrderChecker --- +// ======================= +TabOrderChecker::TabOrderChecker(SavedTabGroupKeyedService* service, + base::GUID group_id, + std::vector<base::GUID> tab_ids) + : group_id_(group_id), tab_ids_(tab_ids), service_(service) { + CHECK(service_); + service_->model()->AddObserver(this); +} + +TabOrderChecker::~TabOrderChecker() { + service_->model()->RemoveObserver(this); +} + +bool TabOrderChecker::IsExitConditionSatisfied(std::ostream* os) { + *os << "Waiting for saved tab ordering to be updated for group with id " + << group_id_.AsLowercaseString(); + + const SavedTabGroupModel* const model = service_->model(); + + // Expect that a group with the saved id exists. + const SavedTabGroup* const group = model->Get(group_id_); + if (!group) { + return false; + } + + if (group->saved_tabs().size() != tab_ids_.size()) { + return false; + } + + // Expect that the group has the same tabs in the same order as `tab_ids_`. + for (size_t i = 0; i < tab_ids_.size(); i++) { + if (group->saved_tabs()[i].saved_tab_guid() != tab_ids_[i]) { + return false; + } + } + + return true; +} + +void TabOrderChecker::SavedTabGroupAddedFromSync(const base::Uuid& uuid) { + CheckExitCondition(); +} + +void TabOrderChecker::SavedTabGroupUpdatedFromSync( + const base::Uuid& group_uuid, + const absl::optional<base::Uuid>& tab_uuid) { + CheckExitCondition(); +} } // namespace saved_tab_groups_helper
diff --git a/chrome/browser/sync/test/integration/saved_tab_groups_helper.h b/chrome/browser/sync/test/integration/saved_tab_groups_helper.h index 18b2506..f9c7f9e 100644 --- a/chrome/browser/sync/test/integration/saved_tab_groups_helper.h +++ b/chrome/browser/sync/test/integration/saved_tab_groups_helper.h
@@ -43,7 +43,7 @@ raw_ptr<SavedTabGroupKeyedService> const service_; }; -// Checks that a tab or group with a particular uuid does not exists in the +// Checks that a tab or group with a particular uuid does not exist in the // model. class SavedTabOrGroupDoesNotExistChecker : public StatusChangeChecker, public SavedTabGroupModelObserver { @@ -74,6 +74,116 @@ const base::Uuid uuid_; raw_ptr<SavedTabGroupKeyedService> const service_; }; + +// Checks that a matching group exists in the model. +class SavedTabGroupMatchesChecker : public StatusChangeChecker, + public SavedTabGroupModelObserver { + public: + // The caller must ensure that `service` is not null and will outlive this + // object. + SavedTabGroupMatchesChecker(SavedTabGroupKeyedService* service, + SavedTabGroup group); + SavedTabGroupMatchesChecker(const SavedTabGroupMatchesChecker&) = delete; + SavedTabGroupMatchesChecker& operator=(const SavedTabGroupMatchesChecker&) = + delete; + ~SavedTabGroupMatchesChecker() override; + + // StatusChangeChecker implementation. + bool IsExitConditionSatisfied(std::ostream* os) override; + + // SavedTabGroupModelObserver + void SavedTabGroupAddedFromSync(const base::Uuid& uuid) override; + void SavedTabGroupUpdatedFromSync( + const base::Uuid& group_uuid, + const absl::optional<base::Uuid>& tab_uuid = absl::nullopt) override; + + private: + const SavedTabGroup group_; + raw_ptr<SavedTabGroupKeyedService> const service_; +}; + +// Checks that a matching tab exists in the model. +class SavedTabMatchesChecker : public StatusChangeChecker, + public SavedTabGroupModelObserver { + public: + // The caller must ensure that `service` is not null and will outlive this + // object. + SavedTabMatchesChecker(SavedTabGroupKeyedService* service, + SavedTabGroupTab tab); + SavedTabMatchesChecker(const SavedTabMatchesChecker&) = delete; + SavedTabMatchesChecker& operator=(const SavedTabMatchesChecker&) = delete; + ~SavedTabMatchesChecker() override; + + // StatusChangeChecker implementation. + bool IsExitConditionSatisfied(std::ostream* os) override; + + // SavedTabGroupModelObserver + void SavedTabGroupAddedFromSync(const base::Uuid& uuid) override; + void SavedTabGroupUpdatedFromSync( + const base::Uuid& group_uuid, + const absl::optional<base::Uuid>& tab_uuid = absl::nullopt) override; + + private: + const SavedTabGroupTab tab_; + raw_ptr<SavedTabGroupKeyedService> const service_; +}; + +// Checks that the model contains saved groups in a certain order. +class GroupOrderChecker : public StatusChangeChecker, + public SavedTabGroupModelObserver { + public: + // The caller must ensure that `service` is not null and will outlive this + // object. + GroupOrderChecker(SavedTabGroupKeyedService* service, + std::vector<base::GUID> group_ids); + GroupOrderChecker(const GroupOrderChecker&) = delete; + GroupOrderChecker& operator=(const GroupOrderChecker&) = delete; + ~GroupOrderChecker() override; + + // StatusChangeChecker implementation. + bool IsExitConditionSatisfied(std::ostream* os) override; + + // SavedTabGroupModelObserver + void SavedTabGroupAddedFromSync(const base::Uuid& uuid) override; + void SavedTabGroupRemovedFromSync( + const SavedTabGroup* removed_group) override; + void SavedTabGroupUpdatedFromSync( + const base::Uuid& group_uuid, + const absl::optional<base::Uuid>& tab_uuid = absl::nullopt) override; + + private: + const std::vector<base::GUID> group_ids_; + raw_ptr<SavedTabGroupKeyedService> const service_; +}; + +// Checks that a saved group in the model contains tabs in a certain order. +class TabOrderChecker : public StatusChangeChecker, + public SavedTabGroupModelObserver { + public: + // The caller must ensure that `service` is not null and will outlive this + // object. + TabOrderChecker(SavedTabGroupKeyedService* service, + base::GUID group_id, + std::vector<base::GUID> tab_ids); + TabOrderChecker(const TabOrderChecker&) = delete; + TabOrderChecker& operator=(const TabOrderChecker&) = delete; + ~TabOrderChecker() override; + + // StatusChangeChecker implementation. + bool IsExitConditionSatisfied(std::ostream* os) override; + + // SavedTabGroupModelObserver + void SavedTabGroupAddedFromSync(const base::Uuid& uuid) override; + void SavedTabGroupUpdatedFromSync( + const base::Uuid& group_uuid, + const absl::optional<base::Uuid>& tab_uuid = absl::nullopt) override; + + private: + const base::GUID group_id_; + const std::vector<base::GUID> tab_ids_; + + raw_ptr<SavedTabGroupKeyedService> const service_; +}; } // namespace saved_tab_groups_helper #endif // CHROME_BROWSER_SYNC_TEST_INTEGRATION_SAVED_TAB_GROUPS_HELPER_H_
diff --git a/chrome/browser/sync/test/integration/single_client_saved_tab_groups_sync_test.cc b/chrome/browser/sync/test/integration/single_client_saved_tab_groups_sync_test.cc index d41d2eb..8d8bb6bf 100644 --- a/chrome/browser/sync/test/integration/single_client_saved_tab_groups_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_saved_tab_groups_sync_test.cc
@@ -297,5 +297,162 @@ .Wait()); } -// TODO(crbug/1445146): Implement remaining integration tests. +// Update the metadata of a saved group already in the model. +IN_PROC_BROWSER_TEST_F(SingleClientSavedTabGroupsSyncTest, + UpdateGroupMetadata) { + SavedTabGroup group1(u"Group 1", tab_groups::TabGroupColorId::kGrey, + /*urls=*/{}, + /*saved_guid=*/absl::nullopt, /*position=*/0); + + // Add a group with two tabs to sync. + AddDataToFakeServer(*group1.ToSpecifics()); + + ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; + ASSERT_TRUE( + GetSyncService(0)->GetActiveDataTypes().Has(syncer::SAVED_TAB_GROUP)); + + SavedTabGroupKeyedService* const service = + SavedTabGroupServiceFactory::GetForProfile(GetProfile(0)); + + // Verify they are added to the model. + ASSERT_TRUE(saved_tab_groups_helper::SavedTabOrGroupExistsChecker( + service, group1.saved_guid()) + .Wait()); + + // Update metadata for group1in the server. + group1.SetTitle(u"Updated Title"); + group1.SetColor(tab_groups::TabGroupColorId::kOrange); + AddDataToFakeServer(*group1.ToSpecifics()); + + // Verify the group's metadata is updated locally. + EXPECT_TRUE( + saved_tab_groups_helper::SavedTabGroupMatchesChecker(service, group1) + .Wait()); +} + +// Update the URL and title of a saved tab already in the model. +IN_PROC_BROWSER_TEST_F(SingleClientSavedTabGroupsSyncTest, UpdatedTabData) { + SavedTabGroup group1(u"Group 1", tab_groups::TabGroupColorId::kGrey, + /*urls=*/{}, + /*saved_guid=*/absl::nullopt, /*position=*/0); + SavedTabGroupTab tab1(GURL("about:blank"), u"about:blank", + group1.saved_guid()); + + // Add a group with a tab to sync. + AddDataToFakeServer(*group1.ToSpecifics()); + AddDataToFakeServer(*tab1.ToSpecifics()); + + ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; + ASSERT_TRUE( + GetSyncService(0)->GetActiveDataTypes().Has(syncer::SAVED_TAB_GROUP)); + + SavedTabGroupKeyedService* const service = + SavedTabGroupServiceFactory::GetForProfile(GetProfile(0)); + + // Verify they are added to the model. + ASSERT_TRUE(saved_tab_groups_helper::SavedTabOrGroupExistsChecker( + service, group1.saved_guid()) + .Wait()); + ASSERT_TRUE(saved_tab_groups_helper::SavedTabOrGroupExistsChecker( + service, tab1.saved_tab_guid()) + .Wait()); + + // Update url and title for tab1 in the server. + tab1.SetURL(GURL("https://new.url")); + tab1.SetTitle(u"Updated Title"); + AddDataToFakeServer(*tab1.ToSpecifics()); + + // Verify the tab is updated locally to match. + EXPECT_TRUE( + saved_tab_groups_helper::SavedTabMatchesChecker(service, tab1).Wait()); +} + +// Reorder groups already saved in the model. +IN_PROC_BROWSER_TEST_F(SingleClientSavedTabGroupsSyncTest, ReorderGroups) { + SavedTabGroup group1(u"Group 1", tab_groups::TabGroupColorId::kGrey, + /*urls=*/{}, + /*saved_guid=*/absl::nullopt, /*position=*/0); + SavedTabGroup group2(u"Group 2", tab_groups::TabGroupColorId::kOrange, + /*urls=*/{}, + /*saved_guid=*/absl::nullopt, /*position=*/1); + + // Add a group with a tab to sync. + AddDataToFakeServer(*group1.ToSpecifics()); + AddDataToFakeServer(*group2.ToSpecifics()); + + ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; + ASSERT_TRUE( + GetSyncService(0)->GetActiveDataTypes().Has(syncer::SAVED_TAB_GROUP)); + + SavedTabGroupKeyedService* const service = + SavedTabGroupServiceFactory::GetForProfile(GetProfile(0)); + + // Verify they are added to the model. + ASSERT_TRUE(saved_tab_groups_helper::SavedTabOrGroupExistsChecker( + service, group1.saved_guid()) + .Wait()); + ASSERT_TRUE(saved_tab_groups_helper::SavedTabOrGroupExistsChecker( + service, group2.saved_guid()) + .Wait()); + + // Update the positions of the groups in the server. + group1.SetPosition(1); + group2.SetPosition(0); + AddDataToFakeServer(*group1.ToSpecifics()); + AddDataToFakeServer(*group2.ToSpecifics()); + + // Verify the group positions are updated in the local model as well. + // TODO(tbergquist/dljames): Enable this check once ordering syncing is fixed. + // EXPECT_TRUE(saved_tab_groups_helper::GroupOrderChecker( + // service, {group2.saved_guid(), group1.saved_guid()}) + // .Wait()); +} + +// Reorder tabs in a group. +IN_PROC_BROWSER_TEST_F(SingleClientSavedTabGroupsSyncTest, ReorderTabs) { + SavedTabGroup group1(u"Group 1", tab_groups::TabGroupColorId::kGrey, {}); + SavedTabGroupTab tab1(GURL("about:blank"), u"about:blank", + group1.saved_guid(), nullptr, absl::nullopt, + absl::nullopt, /*position=*/0); + SavedTabGroupTab tab2(GURL("about:blank"), u"about:blank", + group1.saved_guid(), nullptr, absl::nullopt, + absl::nullopt, /*position=*/1); + + // Add a group with two tabs to sync. + AddDataToFakeServer(*group1.ToSpecifics()); + AddDataToFakeServer(*tab1.ToSpecifics()); + AddDataToFakeServer(*tab2.ToSpecifics()); + + ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; + ASSERT_TRUE( + GetSyncService(0)->GetActiveDataTypes().Has(syncer::SAVED_TAB_GROUP)); + + SavedTabGroupKeyedService* const service = + SavedTabGroupServiceFactory::GetForProfile(GetProfile(0)); + + // Verify they are added to the model. + ASSERT_TRUE(saved_tab_groups_helper::SavedTabOrGroupExistsChecker( + service, group1.saved_guid()) + .Wait()); + ASSERT_TRUE(saved_tab_groups_helper::SavedTabOrGroupExistsChecker( + service, tab1.saved_tab_guid()) + .Wait()); + ASSERT_TRUE(saved_tab_groups_helper::SavedTabOrGroupExistsChecker( + service, tab2.saved_tab_guid()) + .Wait()); + + // Reorder the tabs in group 1 on the server. + tab1.SetPosition(1); + tab2.SetPosition(0); + AddDataToFakeServer(*tab1.ToSpecifics()); + AddDataToFakeServer(*tab2.ToSpecifics()); + + // Verify the tab order was updated in the model. + // TODO(tbergquist/dljames): Enable this check once ordering syncing is fixed. + // EXPECT_TRUE(saved_tab_groups_helper::TabOrderChecker( + // service, group1.saved_guid(), + // {tab2.saved_tab_guid(), tab1.saved_tab_guid()}) + // .Wait()); +} + } // namespace
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index cc6c95b7..89e744c 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -5377,6 +5377,11 @@ "views/tabs/color_picker_view.h", "views/tabs/compound_tab_container.cc", "views/tabs/compound_tab_container.h", + "views/tabs/fade_label_view.cc", + "views/tabs/fade_label_view.h", + "views/tabs/fade_view.h", + "views/tabs/filename_elider.cc", + "views/tabs/filename_elider.h", "views/tabs/glow_hover_controller.cc", "views/tabs/glow_hover_controller.h", "views/tabs/new_tab_button.cc",
diff --git a/chrome/browser/ui/android/device_dialog/OWNERS b/chrome/browser/ui/android/device_dialog/OWNERS index ff41043..c82c4e3 100644 --- a/chrome/browser/ui/android/device_dialog/OWNERS +++ b/chrome/browser/ui/android/device_dialog/OWNERS
@@ -1 +1,3 @@ +chengweih@chromium.org +mattreynolds@chromium.org reillyg@chromium.org
diff --git a/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/FilterLayoutStateObserver.java b/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/FilterLayoutStateObserver.java index 32d66c3..3b8fe1db 100644 --- a/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/FilterLayoutStateObserver.java +++ b/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/FilterLayoutStateObserver.java
@@ -31,9 +31,9 @@ } @Override - public void onStartedShowing(int layoutType, boolean showToolbar) { + public void onStartedShowing(int layoutType) { if (layoutType != mType) return; - mObserver.onStartedShowing(layoutType, showToolbar); + mObserver.onStartedShowing(layoutType); } @Override @@ -43,9 +43,9 @@ } @Override - public void onStartedHiding(int layoutType, boolean showToolbar, boolean delayAnimation) { + public void onStartedHiding(int layoutType) { if (layoutType != mType) return; - mObserver.onStartedHiding(layoutType, showToolbar, delayAnimation); + mObserver.onStartedHiding(layoutType); } @Override
diff --git a/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/FilterLayoutStateObserverTest.java b/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/FilterLayoutStateObserverTest.java index 31d24147..fe6d8cf 100644 --- a/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/FilterLayoutStateObserverTest.java +++ b/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/FilterLayoutStateObserverTest.java
@@ -34,7 +34,7 @@ mBaseObserver = new LayoutStateObserver() { @Override - public void onStartedShowing(int layoutType, boolean showToolbar) { + public void onStartedShowing(int layoutType) { mStartedShowingCallbackHelper.notifyCalled(); } @@ -44,8 +44,7 @@ } @Override - public void onStartedHiding( - int layoutType, boolean showToolbar, boolean delayAnimation) { + public void onStartedHiding(int layoutType) { mStartedHidingCallbackHelper.notifyCalled(); } @@ -69,10 +68,10 @@ int initialCount = mStartedShowingCallbackHelper.getCallCount(); assertEquals("Event should not have triggered.", initialCount, mStartedShowingCallbackHelper.getCallCount()); - observer.onStartedShowing(LayoutType.TAB_SWITCHER, false); + observer.onStartedShowing(LayoutType.TAB_SWITCHER); assertEquals("Event should not have triggered with the specified layout.", initialCount, mStartedShowingCallbackHelper.getCallCount()); - observer.onStartedShowing(LayoutType.BROWSING, false); + observer.onStartedShowing(LayoutType.BROWSING); assertEquals("Event should have triggered with the specified layout.", initialCount + 1, mStartedShowingCallbackHelper.getCallCount());
diff --git a/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/LayoutStateProvider.java b/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/LayoutStateProvider.java index a4d417e..cf66b04 100644 --- a/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/LayoutStateProvider.java +++ b/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/LayoutStateProvider.java
@@ -13,13 +13,12 @@ * An observer that is notified when the {@link Layout} state changes. */ interface LayoutStateObserver { - // TODO(crbug.com/1108496): Reiterate to see whether the showToolbar param is needed. /** * Called when Layout starts showing. + * * @param layoutType LayoutType of the started showing Layout. - * @param showToolbar Whether or not to show the normal toolbar when animating into the */ - default void onStartedShowing(@LayoutType int layoutType, boolean showToolbar) {} + default void onStartedShowing(@LayoutType int layoutType) {} /** * Called when Layout finishes showing. @@ -32,12 +31,8 @@ /** * Called when Layout starts hiding. * @param layoutType LayoutType of the started hiding Layout. - * @param showToolbar Whether or not to show the normal toolbar when animating out of - * showing Layout. - * @param delayAnimation Whether or not to delay any related animations until after Layout */ - default void onStartedHiding( - @LayoutType int layoutType, boolean showToolbar, boolean delayAnimation) {} + default void onStartedHiding(@LayoutType int layoutType) {} /** * Called when Layout finishes hiding.
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 4180898..ddd5146 100644 --- a/chrome/browser/ui/android/omnibox/java/res/values/dimens.xml +++ b/chrome/browser/ui/android/omnibox/java/res/values/dimens.xml
@@ -74,6 +74,8 @@ <dimen name="omnibox_suggestion_list_non_active_top_small_margin">4dp</dimen> <dimen name="omnibox_suggestion_list_non_active_top_big_margin">12dp</dimen> <dimen name="omnibox_carousel_suggestion_padding">12dp</dimen> + <dimen name="omnibox_carousel_suggestion_padding_smaller">5dp</dimen> + <dimen name="omnibox_carousel_suggestion_padding_smallest">1dp</dimen> <dimen name="omnibox_carousel_suggestion_small_bottom_padding">4dp</dimen> <dimen name="omnibox_carousel_icon_rounding_radius">4dp</dimen> <dimen name="omnibox_carousel_start_padding_reduction">4dp</dimen>
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/styles/OmniboxResourceProvider.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/styles/OmniboxResourceProvider.java index e467ad9..63af05c 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/styles/OmniboxResourceProvider.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/styles/OmniboxResourceProvider.java
@@ -422,19 +422,15 @@ /** Get the top padding for the MV carousel. */ public static @Px int getCarouselTopPadding(Context context) { - if (OmniboxFeatures.shouldShowSmallerMargins()) { - return 0; + if (!OmniboxFeatures.shouldShowModernizeVisualUpdate(context)) { + return context.getResources().getDimensionPixelSize( + R.dimen.omnibox_carousel_suggestion_padding); } - int topPadding = context.getResources().getDimensionPixelSize( - R.dimen.omnibox_carousel_suggestion_padding); - - if (OmniboxFeatures.shouldShowModernizeVisualUpdate(context)) { - topPadding -= context.getResources().getDimensionPixelSize( - R.dimen.tile_view_icon_background_margin_top_modern); - } - - return topPadding; + return context.getResources().getDimensionPixelSize( + selectMarginDimen(R.dimen.omnibox_carousel_suggestion_padding_smaller, + R.dimen.omnibox_carousel_suggestion_padding_smallest, + R.dimen.omnibox_carousel_suggestion_padding_smaller)); } /** Get the bottom padding for the MV carousel. */
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/ActionChipsProcessor.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/ActionChipsProcessor.java index 5bb1769..4f263574 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/ActionChipsProcessor.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/ActionChipsProcessor.java
@@ -112,9 +112,7 @@ break; case OmniboxActionType.ACTION_IN_SUGGEST: - var actionType = OmniboxActionInSuggest.from(chip) - .actionInfo.getActionType() - .getNumber(); + var actionType = OmniboxActionInSuggest.from(chip).actionType; mActionInSuggestShownOrUsed.put(actionType, false); break; } @@ -143,7 +141,7 @@ return true; case OmniboxActionType.ACTION_IN_SUGGEST: - return OmniboxActionInSuggest.from(action).actionInfo.getActionType().getNumber() + return OmniboxActionInSuggest.from(action).actionType != EntityInfoProto.ActionInfo.ActionType.CALL_VALUE || mDialerAvailable; } @@ -162,8 +160,7 @@ break; case OmniboxActionType.ACTION_IN_SUGGEST: - var actionType = - OmniboxActionInSuggest.from(action).actionInfo.getActionType().getNumber(); + var actionType = OmniboxActionInSuggest.from(action).actionType; mActionInSuggestShownOrUsed.put(actionType, true); break; }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionViewBinder.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionViewBinder.java index f19fd107..694c44a 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionViewBinder.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionViewBinder.java
@@ -10,7 +10,6 @@ import androidx.annotation.NonNull; -import org.chromium.chrome.browser.omnibox.OmniboxFeatures; import org.chromium.chrome.browser.omnibox.R; import org.chromium.chrome.browser.omnibox.styles.OmniboxResourceProvider; import org.chromium.chrome.browser.omnibox.suggestions.SuggestionCommonProperties; @@ -41,14 +40,7 @@ } else if (key == BaseCarouselSuggestionViewProperties.SHOW_TITLE) { final boolean showTitle = model.get(BaseCarouselSuggestionViewProperties.SHOW_TITLE); final View headerView = view.getHeaderView(); - boolean modernizeVisualUpdate = - OmniboxFeatures.shouldShowModernizeVisualUpdate(view.getContext()); - int topPadding = view.getResources().getDimensionPixelSize( - R.dimen.omnibox_carousel_suggestion_padding); - if (modernizeVisualUpdate) { - topPadding -= view.getResources().getDimensionPixelSize( - R.dimen.tile_view_icon_background_margin_top_modern); - } + int topPadding = OmniboxResourceProvider.getCarouselTopPadding(view.getContext()); final int bottomPadding = OmniboxResourceProvider.getCarouselBottomPadding(view.getContext()); if (showTitle) {
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionViewBinderUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionViewBinderUnitTest.java index bfd5b82..b99fe90 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionViewBinderUnitTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionViewBinderUnitTest.java
@@ -55,7 +55,9 @@ @Config(manifest = Config.NONE) public class BaseCarouselSuggestionViewBinderUnitTest { static final int SUGGESTION_VERTICAL_PADDING = 123; + static final int SUGGESTION_SMALLER_VERTICAL_PADDING = 67; static final int SUGGESTION_SMALL_BOTTOM_PADDING = 31; + static final int SUGGESTION_SMALLEST_VERTICAL_PADDING = 17; public @Rule TestRule mFeatures = new Features.JUnitProcessor(); @@ -101,6 +103,12 @@ when(mResources.getDimensionPixelSize(eq(R.dimen.omnibox_carousel_suggestion_padding))) .thenReturn(SUGGESTION_VERTICAL_PADDING); + doReturn(SUGGESTION_SMALLER_VERTICAL_PADDING) + .when(mResources) + .getDimensionPixelSize(eq(R.dimen.omnibox_carousel_suggestion_padding_smaller)); + doReturn(SUGGESTION_SMALLEST_VERTICAL_PADDING) + .when(mResources) + .getDimensionPixelSize(eq(R.dimen.omnibox_carousel_suggestion_padding_smallest)); when(mResources.getDimensionPixelSize( eq(R.dimen.omnibox_carousel_suggestion_small_bottom_padding))) .thenReturn(SUGGESTION_SMALL_BOTTOM_PADDING); @@ -187,21 +195,32 @@ verify(mHeaderView, times(1)).setVisibility(eq(View.GONE)); verify(mHeaderView, times(2)).setVisibility(anyInt()); verify(mView, times(1)) - .setPaddingRelative(eq(0), eq(SUGGESTION_VERTICAL_PADDING), eq(0), + .setPaddingRelative(eq(0), eq(SUGGESTION_SMALLER_VERTICAL_PADDING), eq(0), eq(SUGGESTION_SMALL_BOTTOM_PADDING)); verify(mView, times(2)).setPaddingRelative(anyInt(), anyInt(), anyInt(), anyInt()); } @Test @Features.EnableFeatures({ChromeFeatureList.OMNIBOX_MODERNIZE_VISUAL_UPDATE}) - public void headerTitle_visibilityChangeAltersTopPadding_smallerBottomPadding() { + public void headerTitle_visibilityChangeAltersTopPadding_smallerMargins() { OmniboxFeatures.ENABLE_MODERNIZE_VISUAL_UPDATE_ON_TABLET.setForTesting(true); OmniboxFeatures.MODERNIZE_VISUAL_UPDATE_SMALLER_MARGINS.setForTesting(true); - mModel.set(BaseCarouselSuggestionViewProperties.SHOW_TITLE, true); - verify(mHeaderView, times(1)).setVisibility(eq(View.VISIBLE)); - verify(mHeaderView, times(1)).setVisibility(anyInt()); - verify(mView, times(1)).setPaddingRelative(eq(0), eq(0), eq(0), eq(0)); + mModel.set(BaseCarouselSuggestionViewProperties.SHOW_TITLE, false); + verify(mView, times(1)) + .setPaddingRelative(eq(0), eq(SUGGESTION_SMALLEST_VERTICAL_PADDING), eq(0), eq(0)); + } + + @Test + @Features.EnableFeatures({ChromeFeatureList.OMNIBOX_MODERNIZE_VISUAL_UPDATE}) + public void headerTitle_visibilityChangeAltersTopPadding_smallestMargins() { + OmniboxFeatures.ENABLE_MODERNIZE_VISUAL_UPDATE_ON_TABLET.setForTesting(true); + OmniboxFeatures.MODERNIZE_VISUAL_UPDATE_SMALLEST_MARGINS.setForTesting(true); + + mModel.set(BaseCarouselSuggestionViewProperties.SHOW_TITLE, false); + verify(mView, times(1)) + .setPaddingRelative(eq(0), eq(SUGGESTION_SMALLER_VERTICAL_PADDING), eq(0), + eq(SUGGESTION_SMALL_BOTTOM_PADDING)); } /**
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 b6939915f0..26ae778 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
@@ -577,6 +577,7 @@ <translation id="4188221736490993796">الترتيب من ي إلى أ</translation> <translation id="4195643157523330669">الفتح في علامة تبويب جديدة</translation> <translation id="4196597275619698563">إنشاء بطاقة</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{علامة تبويب واحدة على هذا الجهاز}zero{# علامة تبويب على هذا الجهاز}two{علامتا تبويب على هذا الجهاز}few{# علامات تبويب على هذا الجهاز}many{# علامة تبويب على هذا الجهاز}other{# علامة تبويب على هذا الجهاز}}</translation> <translation id="4198423547019359126">ما من مواقع تنزيل متاحة</translation> <translation id="4202218894997543208">المواضيع التي حظرتها</translation> <translation id="4214315110991671325">إذا سمحت بملفات تعريف الارتباط، قد يستخدمها Chrome للتحميل المُسبق.</translation> @@ -591,6 +592,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />البيانات المستخدَمة:<ph name="END_BOLD" /> سجلّ تصفُّحك، بالإضافة إلى سجلّ بالمواقع الإلكترونية التي زرتها باستخدام Chrome على هذا الجهاز</translation> <translation id="4269820728363426813">نسخ عنوان الرابط</translation> <translation id="4283102315569707115">هل تريد طلب عرض النسخة المتوافقة مع أجهزة الكمبيوتر المكتبي من المواقع الإلكترونية تلقائيًا؟</translation> +<translation id="4285846616383034558">ملفات تعريف الارتباط وذاكرة التخزين المؤقّت والبيانات الأخرى للمواقع الإلكترونية</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />تفعيل قفل الشاشة في إعدادات Android<ph name="END_LINK" /></translation> <translation id="4296252229500326964">علامة تبويب للتصفّح المتخفي</translation> <translation id="4298388696830689168">المواقع المرتبطة</translation> @@ -681,6 +683,7 @@ <translation id="4763480195061959176">فيديو</translation> <translation id="4766313118839197559">يتم حفظ كلمات المرور في تطبيق "مدير كلمات المرور" على هذا الجهاز.</translation> <translation id="4766678251456904326">إضافة حساب إلى الجهاز</translation> +<translation id="4767947714785277816">سنطلق ميزة جديدة اسمها "قياس أداء الإعلانات" ضِمن ميزات الخصوصية في عرض الإعلانات. يشارك Chrome معلومات محدودة جدًا مع المواقع الإلكترونية والتطبيقات، مثل وقت عرض الإعلان لك، للمساعدة في قياس أداء الإعلانات.</translation> <translation id="4769095993849849966">الاسم الجديد للملف</translation> <translation id="4778653490315793244">ما من محتوى متوفّر حتى الآن</translation> <translation id="4787736314074622408">هل تريد حذف "<ph name="ITEM_TITLE" />"؟</translation> @@ -916,6 +919,7 @@ <translation id="6011308810877101166">تحسين اقتراحات البحث</translation> <translation id="6026538407078977628">التوسيع إلى وضع ملء الشاشة</translation> <translation id="6030719887161080597">إدارة المعلومات التي تستخدمها المواقع الإلكترونية لقياس أداء الإعلانات</translation> +<translation id="6034146297924778597">سيتم حذف بيانات السجلّ التي تعود إلى آخر 15 دقيقة:</translation> <translation id="6039379616847168523">الانتقال السريع إلى علامة التبويب التالية</translation> <translation id="6040143037577758943">إغلاق</translation> <translation id="604124094241169006">تلقائي</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb index a29150d..7736c04 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">Z-dən A-ya sıralayın</translation> <translation id="4195643157523330669">Yeni tabda açın</translation> <translation id="4196597275619698563">Kart yaradın</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{Bu cihazda 1 tab}other{Bu cihazda # tab}}</translation> <translation id="4198423547019359126">Əlçatan endirmə məkanı yoxdur</translation> <translation id="4202218894997543208">Blok etdiyiniz mövzular</translation> <translation id="4214315110991671325">Kukilərə icazə versəniz, Chrome onları əvvəlcədən yükləmək üçün istifadə edə bilər.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Hansı data istifadə olunur:<ph name="END_BOLD" /> Baxış tarixçəniz, bu cihazda Chrome istifadə edərək ziyarət etdiyiniz saytların qeydi.</translation> <translation id="4269820728363426813">Link ünvanını kopyalayın</translation> <translation id="4283102315569707115">Defolt olaraq masaüstü saytlar tələb olunsun?</translation> +<translation id="4285846616383034558">Kukilər, keş və digər sayt datası</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Android ayarlarında ekran kilidini aktiv edin<ph name="END_LINK" /></translation> <translation id="4296252229500326964">Yeni Incognito tabı</translation> <translation id="4298388696830689168">Əlaqədar saytlar</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">video</translation> <translation id="4766313118839197559">Parollar bu cihazda Parol Menecerində saxlanılır</translation> <translation id="4766678251456904326">Cihaza hesab əlavə edin</translation> +<translation id="4767947714785277816">"Reklam dəyərləndirməsi" adlı yeni reklam məxfiliyi funksiyasını işə salırıq. Reklam performansını dəyərləndirmək üçün Chrome reklamın göstərildiyi vaxt kimi məhdud məlumatları sayt və tətbiqlər arasında paylaşır.</translation> <translation id="4769095993849849966">Yeni fayl adı</translation> <translation id="4778653490315793244">Göstəriləsi heç nə yoxdur</translation> <translation id="4787736314074622408"><ph name="ITEM_TITLE" /> faylını silmək istəyirsiniz?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">Axtarış təkliflərini təkmilləşdirin</translation> <translation id="6026538407078977628">Tam ekrana genişləndirin</translation> <translation id="6030719887161080597">Reklam performansını ölçmək üçün saytların istifadə etdiyi məlumatları idarə edin</translation> +<translation id="6034146297924778597">Son 15 dəqiqəyə aid tarixçə silinəcək:</translation> <translation id="6039379616847168523">Növbəti panelə keşin</translation> <translation id="6040143037577758943">Qapat</translation> <translation id="604124094241169006">Avtomatik</translation> @@ -1117,6 +1121,7 @@ <translation id="7029809446516969842">Parollar</translation> <translation id="7030304022046916278">URL'ləri yoxlamaq üçün onları Təhlükəsiz Baxışa göndərir</translation> <translation id="7030585293819777123">Son tapşırığa davam edilsin?</translation> +<translation id="7035701931849773472">Digər seçimlər</translation> <translation id="7037830628447527439">Google Hesabınızla Chrome'a daxil olun</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Şəkil təsvirləri əldə edilsin?</translation> @@ -1339,6 +1344,7 @@ <translation id="8110024788458304985">Chrome funksiyalarını və performansını təkmilləşdirməyə yardım edin</translation> <translation id="8110087112193408731">Digital Sağlamlıqda Chrome fəaliyyəti göstərilsin?</translation> <translation id="8118117428362942925">Köməyə ehtiyacınız varsa, valideyninizə müraciət edin (<ph name="PARENT_NAME" />)</translation> +<translation id="8124758083429256800">Chrome və Chrome <ph name="ERROR_DESCRIPTION" /> üçün yadda saxlanmış parol siyahıları versiya 121-dən sonra birləşdiriləcək. Hər iki tətbiqdə yadda saxlanmış parolları avtomatik doldura biləcəksiniz.</translation> <translation id="8127542551745560481">Əsas səhifəni redaktə edin</translation> <translation id="8130309322784422030">Saxladığınız giriş məlumatları köhnəlmiş ola bilər</translation> <translation id="813082847718468539">Sayt məlumatına baxın</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 2b176bf..a986ec2 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
@@ -196,6 +196,7 @@ <translation id="2100273922101894616">Аўтаматычны ўваход</translation> <translation id="2100314319871056947">Паспрабуйце абагуліць тэкст меншымі кавалкамі</translation> <translation id="2111511281910874386">Перайдзіце на старонку</translation> +<translation id="2119609734654412418">Вашы закладкі знаходзяцца тут</translation> <translation id="2122601567107267586">Не ўдалося адкрыць праграму</translation> <translation id="2132122640199389833">Выдаліць усе звязаныя прылады</translation> <translation id="213279576345780926">Закрыта ўкладка <ph name="TAB_TITLE" /></translation> @@ -574,6 +575,7 @@ <translation id="4188221736490993796">Па алфавіце (ад Я да А)</translation> <translation id="4195643157523330669">Адкрыць у новай укладцы</translation> <translation id="4196597275619698563">Стварыць картку</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{1 укладка на гэтай прыладзе}one{# укладка на гэтай прыладзе}few{# укладкі на гэтай прыладзе}many{# укладак на гэтай прыладзе}other{# укладкі на гэтай прыладзе}}</translation> <translation id="4198423547019359126">Няма месца для спампоўкі</translation> <translation id="4202218894997543208">Заблакіраваныя вамі тэмы</translation> <translation id="4214315110991671325">Калі вы дазволіце прымяняць файлы cookie, Chrome зможа выкарыстоўваць іх для перадзагрузкі.</translation> @@ -588,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Якія даныя выкарыстоўваюцца:<ph name="END_BOLD" /> гісторыя прагляду сайтаў – пералік сайтаў, якія вы наведалі праз Chrome на гэтай прыладзе.</translation> <translation id="4269820728363426813">Капіраваць спасылку</translation> <translation id="4283102315569707115">Запытваць сайты для камп'ютараў стандартна?</translation> +<translation id="4285846616383034558">Файлы cookie, кэш і іншыя даныя сайтаў</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Уключыць блакіроўку экрана ў наладах Android<ph name="END_LINK" /></translation> <translation id="4296252229500326964">Новая ўкладка інкогніта</translation> <translation id="4298388696830689168">Звязаныя сайты</translation> @@ -598,6 +601,7 @@ <translation id="433213510553688132">Выконваецца падпіска...</translation> <translation id="4335835283689002019">"Бяспечны прагляд" выключаны</translation> <translation id="4351244548802238354">Закрыць дыялогавае акно</translation> +<translation id="4355272626458588338">Каб мець магчымасць вярнуцца да важнай для вас старонкі пазней, можна дадаць закладку</translation> <translation id="4369735607080757018">Для ацэнкі эфектыўнасці рэкламы сайты абагульваюць адзін з адным даныя пэўных тыпаў (напрыклад, пра час сутак, калі вам паказвалася пэўная рэкламная аб'ява).</translation> <translation id="4378154925671717803">Тэлефон</translation> <translation id="438319986296050901">Абагуліць толькі картку</translation> @@ -677,6 +681,7 @@ <translation id="4763480195061959176">відэа</translation> <translation id="4766313118839197559">Паролі захоўваюцца ў Менеджары пароляў на гэтай прыладзе.</translation> <translation id="4766678251456904326">Дадаць уліковы запіс на прыладу</translation> +<translation id="4767947714785277816">Мы запускаем новую функцыю захавання прыватнасці ў рэкламе, якая называецца "Вымярэнне эфектыўнасці рэкламы". Для ацэнкі эфектыўнасці рэкламы сайты і праграмы могуць атрымліваць ад Chrome толькі вельмі абмежаваны аб'ём інфармацыі (напрыклад, звесткі пра тое, калі вам была паказана рэкламная аб'ява).</translation> <translation id="4769095993849849966">Новая назва файла</translation> <translation id="4778653490315793244">Няма даступнага для прагляду змесціва</translation> <translation id="4787736314074622408">Выдаліць файл "<ph name="ITEM_TITLE" />"?</translation> @@ -912,6 +917,7 @@ <translation id="6011308810877101166">Паляпшаць прапановы пошуку</translation> <translation id="6026538407078977628">Разгарнуць на поўны экран</translation> <translation id="6030719887161080597">Кіруйце інфармацыяй, якую выкарыстоўваюць сайты для вымярэння эфектыўнасці аб'явы</translation> +<translation id="6034146297924778597">Гісторыя за апошнія 15 хвілін будзе выдалена:</translation> <translation id="6039379616847168523">Перайсці на наступную ўкладку</translation> <translation id="6040143037577758943">Закрыць</translation> <translation id="604124094241169006">Аўтаматычна</translation> @@ -950,6 +956,7 @@ <translation id="6232535412751077445">Калі функцыя "Не адсочваць" уключана, пры праглядзе старонак у інтэрнэце браўзер будзе адпраўляць адпаведны запыт. Сайты могуць апрацоўваць і інтэрпрэтаваць гэты запыт па-рознаму. Напрыклад, некаторыя вэб-сайты могуць пачаць паказ неперсаналізаванай рэкламы. Многія сайты працягнуць збіраць і выкарыстоўваць даныя аб вашых дзеяннях у браўзеры, напрыклад для павышэння бяспекі, паказу змесціва, рэкламы і рэкамендацый або генерацыі статыстыкі для справаздач.</translation> +<translation id="6255794742848779505">Мы змяняем працэдуру захоўвання пароляў на гэтай прыладзе</translation> <translation id="6264376385120300461">Усё роўна спампаваць</translation> <translation id="6277522088822131679">Узнікла праблема з друкам старонкі. Паўтарыце спробу.</translation> <translation id="6277722725779679269">Абнавіць функцыю "Адсочванне цаны" не ўдалося</translation> @@ -1116,6 +1123,7 @@ <translation id="7029809446516969842">Паролі</translation> <translation id="7030304022046916278">Адпраўляе URL-адрасы на праверку ў Бяспечны прагляд</translation> <translation id="7030585293819777123">Узнавіць выкананне вашай апошняй задачы?</translation> +<translation id="7035701931849773472">Іншыя параметры</translation> <translation id="7037830628447527439">Увайдзіце ў Chrome праз свой Уліковы запіс Google</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Атрымліваць апісанні відарысаў?</translation> @@ -1338,6 +1346,7 @@ <translation id="8110024788458304985">Дапамагаць паляпшаць функцыі і прадукцыйнасць Chrome</translation> <translation id="8110087112193408731">Паказваць у службе лічбавага камфорту вашы дзеянні ў Chrome?</translation> <translation id="8118117428362942925">Калі табе патрабуецца дапамога, звярніся да аднаго з бацькоў (<ph name="PARENT_NAME" />)</translation> +<translation id="8124758083429256800">Вашы спісы захаваных пароляў для Chrome і Chrome <ph name="ERROR_DESCRIPTION" /> аб'яднаюцца пасля версіі 121. Вы зможаце выкарыстоўваць аўтазапаўненне для захаваных пароляў у абедзвюх праграмах.</translation> <translation id="8127542551745560481">Змяніць галоўную старонку</translation> <translation id="8130309322784422030">Уліковыя даныя могуць быць устарэлымі</translation> <translation id="813082847718468539">Прагляд звестак пра сайт</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb index fd92cc0..c347a5e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb
@@ -577,6 +577,7 @@ <translation id="4188221736490993796">Z থেকে A অনুসারে সাজান</translation> <translation id="4195643157523330669">নতুন ট্যাবে খুলুন</translation> <translation id="4196597275619698563">কার্ড তৈরি করুন</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{এই ডিভাইসে ১টি ট্যাব}one{এই ডিভাইসে #টি ডিভাইস}other{এই ডিভাইসে #টি ডিভাইস}}</translation> <translation id="4198423547019359126">ডাউনলোড করার জন্য লোকেশন উপলভ্য নেই</translation> <translation id="4202218894997543208">যে বিষয়গুলি আপনি ব্লক করেছেন</translation> <translation id="4214315110991671325">আপনি কুকি ব্যবহার করার অনুমতি দিলে, প্রিলোড করার জন্য Chrome সেটি ব্যবহার করতে পারে।</translation> @@ -591,6 +592,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />কোন ডেটা ব্যবহার করা হয়:<ph name="END_BOLD" /> আপনার ব্রাউজিং ইতিহাস, এই ডিভাইসে Chrome ব্যবহার করে আপনি যে সাইটগুলি ভিজিট করেছেন তার একটি রেকর্ড।</translation> <translation id="4269820728363426813">লিঙ্ক অ্যাড্রেস কপি করুন</translation> <translation id="4283102315569707115">ডিফল্ট হিসেবে ডেস্কটপ সাইট দেখানোর অনুরোধ করবেন?</translation> +<translation id="4285846616383034558">কুকি, ক্যাশে ও অন্যান্য সাইট ডেটা</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Android সেটিংসে স্ক্রিন লক চালু করুন<ph name="END_LINK" /></translation> <translation id="4296252229500326964">নতুন ছদ্মবেশী ট্যাব</translation> <translation id="4298388696830689168">লিঙ্ক করা সাইট</translation> @@ -681,6 +683,7 @@ <translation id="4763480195061959176">ভিডিও</translation> <translation id="4766313118839197559">এই ডিভাইসের 'পাসওয়ার্ড ম্যানেজারে' পাসওয়ার্ড সেভ করা হয়</translation> <translation id="4766678251456904326">ডিভাইসে অ্যাকাউন্ট যোগ করুন</translation> +<translation id="4767947714785277816">আমরা বিজ্ঞাপন পরিমাপ নামের নতুন বিজ্ঞাপন সম্পর্কিত গোপনীয়তা ফিচার চালু করছি। বিজ্ঞাপনের পারফর্ম্যান্স পরিমাপ করার জন্য সাহায্য করতে Chrome নানাবিধ সাইট ও অ্যাপের মধ্যে শুধুমাত্র খুব সীমিত তথ্য শেয়ার করে, যেমন কোনও বিজ্ঞাপন আপনাকে কখন দেখানো হয়েছিল।</translation> <translation id="4769095993849849966">নতুন ফাইলের নাম</translation> <translation id="4778653490315793244">এখনও দেখানোর মতো কিছুই নেই</translation> <translation id="4787736314074622408">আপনি <ph name="ITEM_TITLE" /> মুছে ফেলতে চান?</translation> @@ -916,6 +919,7 @@ <translation id="6011308810877101166">সার্চ সাজেশন উন্নত করুন</translation> <translation id="6026538407078977628">'ফুল-স্ক্রিন' মোডে পরিবর্তন করুন</translation> <translation id="6030719887161080597">বিজ্ঞাপন সংক্রান্ত পারফর্ম্যান্স পরিমাপ করতে সাইটের মাধ্যমে ব্যবহার করা তথ্য ম্যানেজ করুন</translation> +<translation id="6034146297924778597">শেষ ১৫ মিনিটের ইতিহাস মুছে দেওয়া হবে:</translation> <translation id="6039379616847168523">পরবর্তী ট্যাবে চলে যান</translation> <translation id="6040143037577758943">বন্ধ</translation> <translation id="604124094241169006">স্বয়ংক্রিয়</translation> @@ -1121,6 +1125,7 @@ <translation id="7029809446516969842">পাসওয়ার্ড</translation> <translation id="7030304022046916278">URL চেক করতে Safe Browsing-এ পাঠায়</translation> <translation id="7030585293819777123">আপনার শেষ টাস্কটি আবার শুরু করবেন?</translation> +<translation id="7035701931849773472">অন্যান্য বিকল্প</translation> <translation id="7037830628447527439">আপনার Google অ্যাকাউন্ট ব্যবহার করে Chrome-এ সাইন-ইন করুন</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">ছবির বিবরণ পেতে চান?</translation> @@ -1343,6 +1348,7 @@ <translation id="8110024788458304985">Chrome-এর ফিচার ও পারফর্ম্যান্স আরও উন্নত করে তুলতে সাহায্য করুন</translation> <translation id="8110087112193408731">ডিজিটাল ওয়েলবিং-এ আপনার Chrome অ্যাক্টিভিটি দেখতে চান?</translation> <translation id="8118117428362942925">সাহায্যের প্রয়োজন হলে, অভিভাবককে জিজ্ঞাসা করো (<ph name="PARENT_NAME" />)</translation> +<translation id="8124758083429256800">Chrome ও Chrome <ph name="ERROR_DESCRIPTION" />-এর জন্য সেভ করা পাসওয়ার্ড ভার্সন ১২১-এর পরে মার্জ করা হবে। আপনি দুটি অ্যাপেই নিজের সব সেভ করা পাসওয়ার্ড অটোফিল করতে পারবেন।</translation> <translation id="8127542551745560481">হোমপেজ এডিট করুন</translation> <translation id="8130309322784422030">আপনার সেভ করা সাইন-ইন সংক্রান্ত তথ্য হয়ত পুরনো হয়ে গেছে</translation> <translation id="813082847718468539">সাইটের তথ্য দর্শন করুন</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 4190eb42..4e0261e 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
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">Poredaj od Ž do A</translation> <translation id="4195643157523330669">Otvori u novoj kartici</translation> <translation id="4196597275619698563">Kreiraj karticu</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{1 kartica na uređaju}one{# kartica na uređaju}few{# kartice na uređaju}other{# kartica na uređaju}}</translation> <translation id="4198423547019359126">Nema dostupnih lokacija za preuzimanje</translation> <translation id="4202218894997543208">Teme koje ste blokirali</translation> <translation id="4214315110991671325">Ako dozvolite kolačiće, Chrome ih može koristiti za predučitavanje.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Koji podaci se koriste:<ph name="END_BOLD" /> vaša historija pregledanja, zapisi o web lokacijama koje ste posjetili koristeći Chrome na ovom uređaju.</translation> <translation id="4269820728363426813">Kopiraj adresu linka</translation> <translation id="4283102315569707115">Zatražiti web lokacije za računar prema zadanim postavkama?</translation> +<translation id="4285846616383034558">Kolačići, keš memorija i drugi podaci web lokacija</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Uključite zaključavanje ekrana u postavkama Androida<ph name="END_LINK" /></translation> <translation id="4296252229500326964">Nova anonimna kartica</translation> <translation id="4298388696830689168">Povezane web lokacije</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">videozapis</translation> <translation id="4766313118839197559">Lozinke se pohranjuju u Upravitelju lozinki na ovom uređaju.</translation> <translation id="4766678251456904326">Dodajte račun na uređaj</translation> +<translation id="4767947714785277816">Pokrećemo novu funkciju privatnosti pri izloženosti oglasima koja se naziva mjerenje oglasa. Da pomogne web lokacijama da izmjere performanse oglasa, Chrome dijeli samo veoma ograničene informacije među web lokacijama i aplikacijama, npr., kada vam se prikaže oglas.</translation> <translation id="4769095993849849966">Novi naziv fajla</translation> <translation id="4778653490315793244">Još uvijek nema ništa za prikaz</translation> <translation id="4787736314074622408">Želite li izbrisati fajl <ph name="ITEM_TITLE" />?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">Poboljšanje prijedloga za pretraživanje</translation> <translation id="6026538407078977628">Proširivanje preko cijelog ekrana</translation> <translation id="6030719887161080597">Upravljajte informacijama koje web lokacije koriste za mjerenje performansi oglasa</translation> +<translation id="6034146297924778597">Izbrisat će se historija iz posljednjih 15 minuta:</translation> <translation id="6039379616847168523">Pređite na sljedeću karticu</translation> <translation id="6040143037577758943">Zatvori</translation> <translation id="604124094241169006">Automatski</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 a422b67..79b7f43 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
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">Ordena de la Z a la A</translation> <translation id="4195643157523330669">Obre en una pestanya nova</translation> <translation id="4196597275619698563">Crea una targeta</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{1 pestanya en aquest dispositiu}other{# pestanyes en aquest dispositiu}}</translation> <translation id="4198423547019359126">No hi ha cap ubicació de baixada disponible</translation> <translation id="4202218894997543208">Temes que has bloquejat</translation> <translation id="4214315110991671325">Si permets les galetes, Chrome pot utilitzar-les per a la precàrrega.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Quines dades s'utilitzen<ph name="END_BOLD" />: el teu historial de navegació, que és un registre dels llocs web que has visitat amb Chrome en aquest dispositiu.</translation> <translation id="4269820728363426813">Copia l'adreça de l'enllaç</translation> <translation id="4283102315569707115">Vols sol·licitar els llocs web per a ordinadors de manera predeterminada?</translation> +<translation id="4285846616383034558">Galetes, memòria cau i altres dades dels llocs web</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Activa el bloqueig de pantalla a la configuració d'Android<ph name="END_LINK" /></translation> <translation id="4296252229500326964">Pestanya d'incògnit nova</translation> <translation id="4298388696830689168">Llocs web enllaçats</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">vídeo</translation> <translation id="4766313118839197559">Les contrasenyes es desen al gestor de contrasenyes en aquest dispositiu.</translation> <translation id="4766678251456904326">Afegeix un compte al dispositiu</translation> +<translation id="4767947714785277816">Estem llançant una nova funció de privadesa d'anuncis anomenada "mesurament d'anuncis". Chrome només comparteix informació molt limitada entre llocs web i aplicacions, com ara quan se t'ha mostrat un anunci, per ajudar a mesurar el rendiment dels anuncis.</translation> <translation id="4769095993849849966">Nom de fitxer nou</translation> <translation id="4778653490315793244">Encara no hi ha res per mostrar</translation> <translation id="4787736314074622408">Vols suprimir <ph name="ITEM_TITLE" />?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">Millora els suggeriments de cerca</translation> <translation id="6026538407078977628">Desplega en pantalla completa</translation> <translation id="6030719887161080597">Gestiona la informació que utilitzen els llocs web per mesurar el rendiment dels anuncis</translation> +<translation id="6034146297924778597">Se suprimirà l'historial dels 15 darrers minuts:</translation> <translation id="6039379616847168523">Ves a la pestanya següent</translation> <translation id="6040143037577758943">Tanca</translation> <translation id="604124094241169006">Automàtic</translation> @@ -1119,6 +1123,7 @@ <translation id="7029809446516969842">Contrasenyes</translation> <translation id="7030304022046916278">Envia els URL a Navegació segura perquè els comprovi</translation> <translation id="7030585293819777123">Vols reprendre la darrera tasca?</translation> +<translation id="7035701931849773472">Altres opcions</translation> <translation id="7037830628447527439">Inicia la sessió a Chrome amb el teu Compte de Google</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Vols obtenir descripcions de les imatges?</translation> @@ -1341,6 +1346,7 @@ <translation id="8110024788458304985">Ajuda a millorar les funcions i el rendiment de Chrome</translation> <translation id="8110087112193408731">Vols veure l'activitat de Chrome a Benestar digital?</translation> <translation id="8118117428362942925">Si necessites ajuda, demana-la al teu pare o mare (<ph name="PARENT_NAME" />)</translation> +<translation id="8124758083429256800">Les teves llistes de contrasenyes desades per a Chrome i Chrome <ph name="ERROR_DESCRIPTION" /> es combinaran a partir de la versió 121. Podràs emplenar automàticament totes les contrasenyes desades en les dues aplicacions.</translation> <translation id="8127542551745560481">Edita la pàgina d'inici</translation> <translation id="8130309322784422030">És possible que la informació d'inici de sessió emmagatzemada no estigui actualitzada</translation> <translation id="813082847718468539">Mostra la informació del lloc web</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb index 7c33aa4..6b93b69f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">Seřadit od Z do A</translation> <translation id="4195643157523330669">Otevřít na nové kartě</translation> <translation id="4196597275619698563">Vytvořit kartu</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{1 karta na tomto zařízení}few{# karty na tomto zařízení}many{# karty na tomto zařízení}other{# karet na tomto zařízení}}</translation> <translation id="4198423547019359126">Nejsou k dispozici žádná umístění stažených souborů</translation> <translation id="4202218894997543208">Témata, která jste zablokovali</translation> <translation id="4214315110991671325">Pokud máte povolené soubory cookie, může je Chrome používat k předběžnému načítání.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Jaké údaje používáme:<ph name="END_BOLD" /> Vaši historii prohlížení, což je seznam webů, které jste navštívili v Chromu na tomto zařízení.</translation> <translation id="4269820728363426813">Zkopírovat adresu odkazu</translation> <translation id="4283102315569707115">Požadovat ve výchozím nastavení weby pro počítače?</translation> +<translation id="4285846616383034558">Soubory cookie, mezipaměť a další data webů</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Zapněte v nastavení systému Android zámek obrazovky<ph name="END_LINK" /></translation> <translation id="4296252229500326964">Nová anonymní karta</translation> <translation id="4298388696830689168">Propojené weby</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">video</translation> <translation id="4766313118839197559">Hesla se ukládají pouze do Správce hesel na tomto zařízení</translation> <translation id="4766678251456904326">Přidat účet do zařízení</translation> +<translation id="4767947714785277816">Spouštíme novou funkci ochrany soukromí v reklamách nazvanou „měření reklam“. Chrome mezi weby a aplikacemi sdílí jen velmi omezené informace – například kdy se vám zobrazila reklama, aby bylo možné měřit výkon reklam.</translation> <translation id="4769095993849849966">Název nového souboru</translation> <translation id="4778653490315793244">Zatím tu nic není</translation> <translation id="4787736314074622408">Opravdu chcete smazat položku <ph name="ITEM_TITLE" />?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">Vylepšovat návrhy ve vyhledávání</translation> <translation id="6026538407078977628">Rozbalit na celou obrazovku</translation> <translation id="6030719887161080597">Spravovat informace, pomocí nichž weby měří výkon reklam</translation> +<translation id="6034146297924778597">Následující data z posledních 15 minut budou smazána:</translation> <translation id="6039379616847168523">Přejít na další kartu</translation> <translation id="6040143037577758943">Zavřít</translation> <translation id="604124094241169006">Automaticky</translation> @@ -1119,6 +1123,7 @@ <translation id="7029809446516969842">Hesla</translation> <translation id="7030304022046916278">Odesílá adresy URL ke kontrole ve funkci Bezpečné prohlížení</translation> <translation id="7030585293819777123">Pokračovat v posledním úkolu?</translation> +<translation id="7035701931849773472">Další možnosti</translation> <translation id="7037830628447527439">Přihlaste se do Chromu pomocí svého účtu Google</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Zobrazovat popisy obrázků?</translation> @@ -1341,6 +1346,7 @@ <translation id="8110024788458304985">Pomozte zlepšovat funkce a výkon Chromu</translation> <translation id="8110087112193408731">Zobrazovat vaši aktivitu v Chromu v digitální rovnováze?</translation> <translation id="8118117428362942925">Pokud potřebuješ pomoc, požádej rodiče (<ph name="PARENT_NAME" />)</translation> +<translation id="8124758083429256800">Vaše seznamy uložených hesel pro Chrome a Chrome <ph name="ERROR_DESCRIPTION" /> budou po verzi 121 sloučeny. V obou aplikacích budete moci automaticky vyplňovat všechna uložená hesla.</translation> <translation id="8127542551745560481">Upravit domovskou stránku</translation> <translation id="8130309322784422030">Uložené přihlašovací údaje mohou být zastaralé</translation> <translation id="813082847718468539">Zobrazit informace o stránkách</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb index a57fda3..2268be6 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">Trefnu yn ôl Z i A</translation> <translation id="4195643157523330669">Agor mewn tab newydd</translation> <translation id="4196597275619698563">Creu cerdyn</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{1 tab ar y ddyfais hon}zero{# tab ar y ddyfais hon}two{# dab ar y ddyfais hon}few{# thab ar y ddyfais hon}many{# thab ar y ddyfais hon}other{# tab ar y ddyfais hon}}</translation> <translation id="4198423547019359126">Nid oes unrhyw leoliadau lawrlwytho ar gael</translation> <translation id="4202218894997543208">Pynciau rydych wedi'u rhwystro</translation> <translation id="4214315110991671325">Os ydych yn caniatáu cwcis, gall Chrome eu defnyddio ar gyfer rhaglwytho.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Pa ddata a ddefnyddir:<ph name="END_BOLD" /> Eich hanes pori, cofnod o wefannau rydych wedi ymweld â nhw drwy ddefnyddio Chrome ar y ddyfais hon.</translation> <translation id="4269820728363426813">Copïo cyfeiriad y ddolen</translation> <translation id="4283102315569707115">Gofyn am wefannau bwrdd gwaith yn ddiofyn?</translation> +<translation id="4285846616383034558">Cwcis, storfa, a data gwefan eraill</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Trowch glo sgrîn ymlaen yn y gosodiadau Android<ph name="END_LINK" /></translation> <translation id="4296252229500326964">Tab Anhysbys newydd</translation> <translation id="4298388696830689168">Gwefannau cysylltiedig</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">fideo</translation> <translation id="4766313118839197559">Mae cyfrineiriau'n cael eu cadw i'r Rheolwr Cyfrineiriau ar y ddyfais hon.</translation> <translation id="4766678251456904326">Ychwanegu cyfrif at y ddyfais</translation> +<translation id="4767947714785277816">Rydym yn lansio nodwedd preifatrwydd hysbyseb newydd o'r enw mesur hysbysebion. Mae Chrome yn rhannu gwybodaeth gyfyngedig iawn ymhlith gwefannau ac apiau, megis pan ddangoswyd hysbyseb i chi, i helpu i fesur perfformiad hysbysebion.</translation> <translation id="4769095993849849966">Enw ffeil newydd</translation> <translation id="4778653490315793244">Nid oes unrhyw beth i'w ddangos eto</translation> <translation id="4787736314074622408">Ydych chi eisiau dileu <ph name="ITEM_TITLE" />?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">Gwella awgrymiadau chwilio</translation> <translation id="6026538407078977628">Ehangu i sgrîn lawn</translation> <translation id="6030719887161080597">Rheoli'r wybodaeth a ddefnyddir gan wefannau i fesur perfformiad hysbysebion</translation> +<translation id="6034146297924778597">Bydd hanes o'r 15 munud diwethaf yn cael ei ddileu:</translation> <translation id="6039379616847168523">Neidio i'r tab nesaf</translation> <translation id="6040143037577758943">Cau</translation> <translation id="604124094241169006">Awtomatig</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb index 27d02e7..8795c7a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
@@ -1123,6 +1123,7 @@ <translation id="7029809446516969842">Adgangskoder</translation> <translation id="7030304022046916278">Webadresser sendes til tjek i Beskyttet browsing</translation> <translation id="7030585293819777123">Vil du genoptage din seneste opgave?</translation> +<translation id="7035701931849773472">Andre valgmuligheder</translation> <translation id="7037830628447527439">Log ind på Chrome med din Google-konto</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Vil du have billedbeskrivelser?</translation> @@ -1345,6 +1346,7 @@ <translation id="8110024788458304985">Vær med til at forbedre funktioner og ydeevne i Chrome</translation> <translation id="8110087112193408731">Vil du se din Chrome-aktivitet i Digital balance?</translation> <translation id="8118117428362942925">Spørg din forælder (<ph name="PARENT_NAME" />), hvis du har brug for hjælp</translation> +<translation id="8124758083429256800">Dine lister over gemte adgangskoder til Chrome og Chrome <ph name="ERROR_DESCRIPTION" /> flettes efter version 121. Herefter kan du udfylde alle dine gemte adgangskoder automatisk i begge apps.</translation> <translation id="8127542551745560481">Rediger startside</translation> <translation id="8130309322784422030">Dine gemte loginoplysninger kan være forældede</translation> <translation id="813082847718468539">Se websiteoplysninger</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb index 40eaa60..8526dc7 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb
@@ -111,7 +111,7 @@ <translation id="1514552811327923157">Privacy Sandbox-Aufforderung vollständig geöffnet</translation> <translation id="1521774566618522728">Heute aktiv</translation> <translation id="1544826120773021464">Wenn du dein Google-Konto verwalten möchtest, tippe auf die Schaltfläche "Konto verwalten"</translation> -<translation id="1549000191223877751">Zu anderem Fenster wechseln</translation> +<translation id="1549000191223877751">In anderes Fenster schieben</translation> <translation id="1553358976309200471">Chrome aktualisieren</translation> <translation id="1554532453982918912">Hilf dabei, Chrome für andere Nutzer wie dich zu verbessern</translation> <translation id="1558391695376153246">Inkognitotabs schließen</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb index b7c469e..0880761 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">Sort by Z to A</translation> <translation id="4195643157523330669">Open in new tab</translation> <translation id="4196597275619698563">Create card</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{1 tab on this device}other{# tabs on this device}}</translation> <translation id="4198423547019359126">No available download locations</translation> <translation id="4202218894997543208">Topics that you blocked</translation> <translation id="4214315110991671325">If you allow cookies, Chrome may use them for preloading.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />What data is used:<ph name="END_BOLD" /> Your browsing history, a record of sites that you’ve visited using Chrome on this device.</translation> <translation id="4269820728363426813">Copy link address</translation> <translation id="4283102315569707115">Request desktop sites by default?</translation> +<translation id="4285846616383034558">Cookies, cache and other site data</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Turn on screen lock in Android settings<ph name="END_LINK" /></translation> <translation id="4296252229500326964">New Incognito tab</translation> <translation id="4298388696830689168">Linked sites</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">video</translation> <translation id="4766313118839197559">Passwords are saved to Password Manager on this device</translation> <translation id="4766678251456904326">Add account to device</translation> +<translation id="4767947714785277816">We're launching a new ads privacy feature called ads measurement. Chrome shares only very limited information among sites and apps, such as when an ad was shown to you, to help measure the performance of ads.</translation> <translation id="4769095993849849966">New file name</translation> <translation id="4778653490315793244">Nothing to show yet</translation> <translation id="4787736314074622408">Do you want to delete <ph name="ITEM_TITLE" />?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">Improve search suggestions</translation> <translation id="6026538407078977628">Expand to full screen</translation> <translation id="6030719887161080597">Manage info used by sites to measure ad performance</translation> +<translation id="6034146297924778597">History from the last 15 minutes will be deleted:</translation> <translation id="6039379616847168523">Jump to the next tab</translation> <translation id="6040143037577758943">Close</translation> <translation id="604124094241169006">Automatic</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 5d571d91ee..90ef4b7 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
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">Ordenar de la Z a la A</translation> <translation id="4195643157523330669">Abrir en una pestaña nueva</translation> <translation id="4196597275619698563">Crear tarjeta</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{1 pestaña en este dispositivo}other{# pestañas en este dispositivo}}</translation> <translation id="4198423547019359126">No hay ubicaciones de descarga disponibles</translation> <translation id="4202218894997543208">Temas que bloqueaste</translation> <translation id="4214315110991671325">Si permites las cookies, Chrome puede usarlas para la precarga.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Qué información se usa:<ph name="END_BOLD" /> Tu historial de navegación, un registro de los sitios que visitaste con Chrome en este dispositivo.</translation> <translation id="4269820728363426813">Copiar dirección del vínculo</translation> <translation id="4283102315569707115">¿Deseas solicitar sitios de escritorio de forma predeterminada?</translation> +<translation id="4285846616383034558">Cookies, caché y otros datos de sitios</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Activa el bloqueo de pantalla en la configuración de Android<ph name="END_LINK" />.</translation> <translation id="4296252229500326964">Nueva pestaña de incógnito</translation> <translation id="4298388696830689168">Sitios vinculados</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">video</translation> <translation id="4766313118839197559">Las contraseñas se guardan en el Administrador de contraseñas en este dispositivo</translation> <translation id="4766678251456904326">Agregar una cuenta al dispositivo</translation> +<translation id="4767947714785277816">Lanzamos una nueva función de privacidad en los anuncios llamada medición de anuncios. Chrome solo comparte información muy limitada entre los sitios y las apps, como cuándo se te mostró un anuncio, para ayudar a medir el rendimiento de los anuncios.</translation> <translation id="4769095993849849966">Nuevo nombre de archivo</translation> <translation id="4778653490315793244">Aún no hay nada que mostrar</translation> <translation id="4787736314074622408">¿Quieres borrar <ph name="ITEM_TITLE" />?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">Mejorar las sugerencias de búsqueda</translation> <translation id="6026538407078977628">Expandir a pantalla completa</translation> <translation id="6030719887161080597">Administra la información que usan los sitios para medir el rendimiento de los anuncios</translation> +<translation id="6034146297924778597">Se borrará el siguiente historial de los últimos 15 minutos:</translation> <translation id="6039379616847168523">Ir a la pestaña siguiente</translation> <translation id="6040143037577758943">Cerrar</translation> <translation id="604124094241169006">Automático</translation> @@ -1119,6 +1123,7 @@ <translation id="7029809446516969842">Contraseñas</translation> <translation id="7030304022046916278">Envía las URL a la Navegación segura para revisarlas.</translation> <translation id="7030585293819777123">¿Quieres reanudar tu última tarea?</translation> +<translation id="7035701931849773472">Otras opciones</translation> <translation id="7037830628447527439">Accede a Chrome con tu Cuenta de Google</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">¿Deseas obtener la descripción de las imágenes?</translation> @@ -1341,6 +1346,7 @@ <translation id="8110024788458304985">Ayudar a mejorar las funciones y el rendimiento de Chrome</translation> <translation id="8110087112193408731">¿Quieres que se muestre tu actividad de Chrome en Bienestar digital?</translation> <translation id="8118117428362942925">Si necesitas ayuda, pídele a tu madre o padre (<ph name="PARENT_NAME" />)</translation> +<translation id="8124758083429256800">Tus listas de contraseñas guardadas para Chrome y Chrome <ph name="ERROR_DESCRIPTION" /> se combinarán después de la versión 121. Podrás autocompletar todas las contraseñas guardadas en ambas apps.</translation> <translation id="8127542551745560481">Editar la página principal</translation> <translation id="8130309322784422030">Es posible que la información de acceso almacenada esté desactualizada</translation> <translation id="813082847718468539">Consulta la información del sitio</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 456fe7fd..b3a579e 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
@@ -1123,6 +1123,7 @@ <translation id="7029809446516969842">Contraseñas</translation> <translation id="7030304022046916278">Envía URLs a Navegación segura para comprobarlas.</translation> <translation id="7030585293819777123">¿Reanudar tu última tarea?</translation> +<translation id="7035701931849773472">Otras opciones</translation> <translation id="7037830628447527439">Inicia sesión en Chrome con tu cuenta de Google</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">¿Obtener descripciones de imágenes?</translation> @@ -1345,6 +1346,7 @@ <translation id="8110024788458304985">Ayudar a mejorar las funciones y el rendimiento de Chrome</translation> <translation id="8110087112193408731">¿Mostrar tu actividad de Chrome en Bienestar digital?</translation> <translation id="8118117428362942925">Si necesitas ayuda, pídesela a tu padre o madre (<ph name="PARENT_NAME" />)</translation> +<translation id="8124758083429256800">Tus listas de contraseñas guardadas en Chrome y Chrome <ph name="ERROR_DESCRIPTION" /> se combinarán a partir de la versión 121. Podrás autocompletar todas tus contraseñas guardadas en ambas aplicaciones.</translation> <translation id="8127542551745560481">Editar página principal</translation> <translation id="8130309322784422030">Es posible que la información de inicio de sesión almacenada esté obsoleta</translation> <translation id="813082847718468539">Ver información del sitio</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 914f28ca..8d4466c 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
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">Ordenatu Ztik Ara</translation> <translation id="4195643157523330669">Ireki fitxa berri batean</translation> <translation id="4196597275619698563">Sortu txartel bat</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{Gailu honetako fitxa bat}other{Gailu honetako # fitxa}}</translation> <translation id="4198423547019359126">Ez dago deskarga-kokapenik eskuragarri</translation> <translation id="4202218894997543208">Blokeatu dituzun gaiak</translation> <translation id="4214315110991671325">Cookieak onartzen badituzu, baliteke Chrome-k haiek erabiltzea orriak aurrez kargatzeko.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Zein datu erabiltzen dira?<ph name="END_BOLD" /> Zure arakatze-historia eta gailu hau erabili bitartean Chrome-ren bidez bisitatutako webguneen erregistro bat.</translation> <translation id="4269820728363426813">Kopiatu estekaren helbidea</translation> <translation id="4283102315569707115">Modu lehenetsian ordenagailuetarako webguneak eskatu nahi dituzu?</translation> +<translation id="4285846616383034558">Cookieak, cachea eta webguneetako beste datu batzuk</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Aktibatu pantailaren blokeoa Android-en ezarpenetan<ph name="END_LINK" /></translation> <translation id="4296252229500326964">Sortu ezkutuko moduko fitxa bat</translation> <translation id="4298388696830689168">Estekatutako webguneak</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">video</translation> <translation id="4766313118839197559">Pasahitzak gailu honetan soilik gordetzen dira, Pasahitz-kudeatzailea zerbitzuan</translation> <translation id="4766678251456904326">Gehitu kontu bat gailuan</translation> +<translation id="4767947714785277816">Iragarkietarako pribatutasun-eginbide berri bat kaleratu dugu: iragarkien neurketa. Iragarkien errendimendua neurtzen laguntzeko informazio oso mugatua soilik partekatzen du Chrome-k webguneen eta aplikazioen artean; adibidez, noiz erakutsi dizuten iragarki bat.</translation> <translation id="4769095993849849966">Fitxategiaren izen berria</translation> <translation id="4778653490315793244">Oraindik ez dago ezer erakusteko</translation> <translation id="4787736314074622408"><ph name="ITEM_TITLE" /> ezabatu nahi duzu?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">Hobetu bilaketa-iradokizunak</translation> <translation id="6026538407078977628">Zabaldu pantaila osoan ikusteko</translation> <translation id="6030719887161080597">Kudeatu webguneek iragarkien errendimendua neurtzeko erabiltzen duten informazioa</translation> +<translation id="6034146297924778597">Azken 15 minutuetako historia ezabatuko da:</translation> <translation id="6039379616847168523">Saltatu hurrengo fitxara</translation> <translation id="6040143037577758943">Itxi</translation> <translation id="604124094241169006">Automatikoa</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb index f8dedc7..26a7371 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">ترتیب براساس ی تا الف</translation> <translation id="4195643157523330669">باز کردن در برگهٔ جدید</translation> <translation id="4196597275619698563">ایجاد کارت</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{یک برگه در این دستگاه}one{# برگه در این دستگاه}other{# برگه در این دستگاه}}</translation> <translation id="4198423547019359126">مکانی برای بارگیری دردسترس نیست</translation> <translation id="4202218894997543208">موضوعهایی که مسدود کردهاید</translation> <translation id="4214315110991671325">اگر کوکیها را مجاز کنید، ممکن است Chrome از آنها برای پیشبارگذاری استفاده کند.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />انواع دادهای که استفاده میشود:<ph name="END_BOLD" /> سابقه مرور شما، سابقه سایتهایی که بااستفاده از Chrome در این دستگاه از آنها بازدید کردهاید.</translation> <translation id="4269820728363426813">کپی نشانی پیوند</translation> <translation id="4283102315569707115">بهطور پیشفرض از سایتهای ویژه رایانه درخواست شود؟</translation> +<translation id="4285846616383034558">کوکیها، حافظه نهان، و دیگر دادههای سایت</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />روشن کردن قفل صفحه در تنظیمات Android<ph name="END_LINK" /></translation> <translation id="4296252229500326964">برگه ناشناس جدید</translation> <translation id="4298388696830689168">سایتهای مرتبط</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">ویدئو</translation> <translation id="4766313118839197559">گذرواژهها در «مدیر گذرواژه» در این دستگاه ذخیره میشوند</translation> <translation id="4766678251456904326">افزودن حساب به دستگاه</translation> +<translation id="4767947714785277816">درحال راهاندازی ویژگی حریم خصوصی آگهی جدیدی به نام سنجش آگهی هستیم. Chrome فقط اطلاعات بسیار محدودی را بین سایتها و برنامهها همرسانی میکند (مثلاً زمان نمایش آگهی به شما) تا به اندازهگیری عملکرد آگهیها کمک کند.</translation> <translation id="4769095993849849966">نام جدید فایل</translation> <translation id="4778653490315793244">هنوز موردی برای نشاندادن وجود ندارد</translation> <translation id="4787736314074622408">میخواهید <ph name="ITEM_TITLE" /> را حذف کنید؟</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">بهبود پیشنهادهای جستجو</translation> <translation id="6026538407078977628">گسترده کردن بهحالت تمامصفحه</translation> <translation id="6030719887161080597">مدیریت اطلاعات مورداستفاده سایتها برای سنجش عملکرد آگهی</translation> +<translation id="6034146297924778597">سابقه ۱۵ دقیقه آخر حذف خواهد شد:</translation> <translation id="6039379616847168523">رفتن به برگه بعدی</translation> <translation id="6040143037577758943">بستن</translation> <translation id="604124094241169006">خودکار</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb index 6dfd5922..fef8ed04 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">Lajittele Z:sta A:han</translation> <translation id="4195643157523330669">Avaa uudelle välilehdelle</translation> <translation id="4196597275619698563">Luo kortti</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{1 välilehti tällä laitteella}other{# välilehteä tällä laitteella}}</translation> <translation id="4198423547019359126">Tallennussijainteja ei ole saatavilla</translation> <translation id="4202218894997543208">Estämäsi aiheet</translation> <translation id="4214315110991671325">Jos sallit evästeet, Chrome voi käyttää niitä esilataamiseen.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Mitä dataa käytetään:<ph name="END_BOLD" /> Selaushistoriaasi ja listaa sivuista, joilla olet käynyt Chromella tällä laitteella</translation> <translation id="4269820728363426813">Kopioi linkin osoite</translation> <translation id="4283102315569707115">Haluatko oletuksena pyytää tietokonesivustoja?</translation> +<translation id="4285846616383034558">Evästeet, välimuisti ja muu sivustodata</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Laita näytön lukitus päälle Android-asetuksista<ph name="END_LINK" /></translation> <translation id="4296252229500326964">Uusi incognito-välilehti</translation> <translation id="4298388696830689168">Linkitetyt sivustot</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">video</translation> <translation id="4766313118839197559">Salasanat tallennetaan Google Salasanoihin tällä laitteella</translation> <translation id="4766678251456904326">Lisää tili laitteelle</translation> +<translation id="4767947714785277816">Julkaisemme uuden yksityisyyteen liittyvän mainosominaisuuden, jota kutsutaan mainosmittaukseksi. Chrome jakaa vain hyvin rajallisia tietoja sivustojen ja sovellusten välillä (esim. kun mainos on näytetty sinulle), jotta mainosten tuloksia voidaan mitata.</translation> <translation id="4769095993849849966">Uusi tiedostonimi</translation> <translation id="4778653490315793244">Ei vielä näytettävää</translation> <translation id="4787736314074622408">Poistetaanko <ph name="ITEM_TITLE" />?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">Paranna hakuehdotuksia</translation> <translation id="6026538407078977628">Laajenna koko näytölle</translation> <translation id="6030719887161080597">Ylläpidä tietoja, joita sivustot käyttävät mainostulosten mittaamiseen</translation> +<translation id="6034146297924778597">15 viime minuutin historia poistetaan:</translation> <translation id="6039379616847168523">Siirry seuraavalle välilehdelle</translation> <translation id="6040143037577758943">Sulje</translation> <translation id="604124094241169006">Automaattinen</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb index ea471c84..7544800 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb
@@ -574,6 +574,7 @@ <translation id="4188221736490993796">Trier de Z à A</translation> <translation id="4195643157523330669">Ouvrir dans un nouvel onglet</translation> <translation id="4196597275619698563">Créer une carte</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{Un onglet sur cet appareil}one{# onglets sur cet appareil}other{# onglets sur cet appareil}}</translation> <translation id="4198423547019359126">Aucun dossier de téléchargement n'est disponible</translation> <translation id="4202218894997543208">Les sujets que vous avez bloqués</translation> <translation id="4214315110991671325">Si vous autorisez les témoins, Chrome peut les utiliser pour procéder au préchargement.</translation> @@ -588,6 +589,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Quelles données sont utilisées :<ph name="END_BOLD" /> votre historique de navigation et un enregistrement des sites que vous avez visités à l'aide de Chrome sur cet appareil.</translation> <translation id="4269820728363426813">Copier l'adresse du lien</translation> <translation id="4283102315569707115">Demander des sites pour ordinateurs par défaut?</translation> +<translation id="4285846616383034558">Témoins, cache et autres données relatives aux sites</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Activez le verrouillage d'écran dans les paramètres Android<ph name="END_LINK" /></translation> <translation id="4296252229500326964">Nouvel onglet navig. privée</translation> <translation id="4298388696830689168">Sites associés</translation> @@ -678,6 +680,7 @@ <translation id="4763480195061959176">Vidéo</translation> <translation id="4766313118839197559">Les mots de passe sont enregistrés dans le gestionnaire de mots de passe sur cet appareil</translation> <translation id="4766678251456904326">Ajouter un compte à l'appareil</translation> +<translation id="4767947714785277816">Nous lançons une nouvelle fonctionnalité de confidentialité des annonces appelée mesure des annonces. Chrome ne partage que des informations très limitées entre les sites et les applications, telles que si une annonce vous a été présentée, pour aider les sites à mesurer les performances des annonces.</translation> <translation id="4769095993849849966">Nouveau nom de fichier</translation> <translation id="4778653490315793244">Rien à montrer pour le moment</translation> <translation id="4787736314074622408">Voulez-vous supprimer <ph name="ITEM_TITLE" />?</translation> @@ -912,6 +915,7 @@ <translation id="6011308810877101166">Améliorer les suggestions de recherche</translation> <translation id="6026538407078977628">Ouvrir la fenêtre en plein écran</translation> <translation id="6030719887161080597">Gérer les informations utilisées par les sites pour mesurer les performances des annonces</translation> +<translation id="6034146297924778597">L'historique des 15 dernières minutes sera supprimé :</translation> <translation id="6039379616847168523">Accéder à l'onglet suivant</translation> <translation id="6040143037577758943">Fermer</translation> <translation id="604124094241169006">Automatique</translation> @@ -1117,6 +1121,7 @@ <translation id="7029809446516969842">Mots de passe</translation> <translation id="7030304022046916278">Il envoie des URL à la navigation sécurisée pour les vérifier</translation> <translation id="7030585293819777123">Reprendre votre dernière tâche?</translation> +<translation id="7035701931849773472">Autres options</translation> <translation id="7037830628447527439">Connectez-vous à Chrome au moyen de votre compte Google</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Obtenir les descriptions d'images?</translation> @@ -1339,6 +1344,7 @@ <translation id="8110024788458304985">Contribuer à améliorer les fonctionnalités et les performances de Chrome</translation> <translation id="8110087112193408731">Afficher votre activité Chrome dans Bien-être numérique?</translation> <translation id="8118117428362942925">Si tu as besoin d'aide, demande à ton parent (<ph name="PARENT_NAME" />)</translation> +<translation id="8124758083429256800">Vos listes de mots de passe enregistrés pour Chrome et Chrome <ph name="ERROR_DESCRIPTION" /> fusionneront après la version 121. Vous pourrez remplir automatiquement tous vos mots de passe enregistrés sur les deux applications.</translation> <translation id="8127542551745560481">Modifier la page d'accueil</translation> <translation id="8130309322784422030">Vos données de connexion enregistrées peuvent être obsolètes</translation> <translation id="813082847718468539">Afficher l'information sur le site</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb index fec99fe..563abd3 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">Trier de Z à A</translation> <translation id="4195643157523330669">Ouvrir dans un nouvel onglet</translation> <translation id="4196597275619698563">Créer une fiche</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{1 onglet sur cet appareil}one{# onglet sur cet appareil}other{# onglets sur cet appareil}}</translation> <translation id="4198423547019359126">Aucun emplacement de téléchargements disponible</translation> <translation id="4202218894997543208">Thèmes que vous avez bloqués</translation> <translation id="4214315110991671325">Si vous autorisez les cookies, Chrome peut les utiliser pour le préchargement.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Quelles sont les données utilisées<ph name="END_BOLD" /> : votre historique de navigation, qui liste tous les sites que vous avez consultés dans Chrome sur cet appareil.</translation> <translation id="4269820728363426813">Copier l'adresse du lien</translation> <translation id="4283102315569707115">Demander les versions pour ordinateur par défaut ?</translation> +<translation id="4285846616383034558">Cookies, cache et autres données des sites</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Activez le verrouillage de l'écran dans les paramètres Android<ph name="END_LINK" /></translation> <translation id="4296252229500326964">Nouvel onglet nav. privée</translation> <translation id="4298388696830689168">Sites associés</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">vidéo</translation> <translation id="4766313118839197559">Les mots de passe sont enregistrés dans le Gestionnaire de mots de passe sur cet appareil</translation> <translation id="4766678251456904326">Ajouter un compte à l'appareil</translation> +<translation id="4767947714785277816">Nous lançons une nouvelle fonctionnalité de confidentialité des annonces : la mesure des annonces. Chrome ne partage que des informations très limitées entre les sites et les applis, comme le moment où une annonce vous a été présentée, afin d'aider à mesurer les performances des annonces.</translation> <translation id="4769095993849849966">Nouveau nom de fichier</translation> <translation id="4778653490315793244">Rien à afficher pour le moment</translation> <translation id="4787736314074622408">Voulez-vous supprimer <ph name="ITEM_TITLE" /> ?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">Améliorer les suggestions de recherche</translation> <translation id="6026538407078977628">Afficher en plein écran</translation> <translation id="6030719887161080597">Gérer les informations utilisées par les sites pour mesurer les performances des annonces</translation> +<translation id="6034146297924778597">L'historique des 15 dernières minutes sera supprimé :</translation> <translation id="6039379616847168523">Accéder à l'onglet suivant</translation> <translation id="6040143037577758943">Fermer</translation> <translation id="604124094241169006">Automatique</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb index 11b6882..fe95989d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">Ordenar do Z ao A</translation> <translation id="4195643157523330669">Abrir en pestana nova</translation> <translation id="4196597275619698563">Crear tarxeta</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{1 pestana neste dispositivo}other{# pestanas neste dispositivo}}</translation> <translation id="4198423547019359126">Non hai localizacións de descarga dispoñibles</translation> <translation id="4202218894997543208">Temas que bloqueaches</translation> <translation id="4214315110991671325">Se permites o uso de cookies, Chrome poderá utilizalas para as precargas.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Que datos se usan?<ph name="END_BOLD" /> O teu historial de navegación e un rexistro dos sitios que visitases usando Chrome neste dispositivo.</translation> <translation id="4269820728363426813">Copiar enderezo da ligazón</translation> <translation id="4283102315569707115">Queres solicitar sitios para ordenadores de forma predeterminada?</translation> +<translation id="4285846616383034558">Cookies, memoria caché e outros datos dos sitios</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Activa o bloqueo de pantalla na configuración de Android<ph name="END_LINK" /></translation> <translation id="4296252229500326964">Nova pestana de incógnito</translation> <translation id="4298388696830689168">Sitios vinculados</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">vídeo</translation> <translation id="4766313118839197559">Os contrasinais gárdanse no xestor de contrasinais neste dispositivo</translation> <translation id="4766678251456904326">Engadir conta ao dispositivo</translation> +<translation id="4767947714785277816">Imos lanzar unha nova función de privacidade nos anuncios chamada Medición de anuncios. Chrome só comparte información moi limitada entre os sitios e as aplicacións (como, por exemplo, cando se che mostrou un anuncio) co fin de axudar aos sitios a medir o rendemento dos anuncios.</translation> <translation id="4769095993849849966">Nome novo do ficheiro</translation> <translation id="4778653490315793244">Aínda non hai contido</translation> <translation id="4787736314074622408">Queres eliminar <ph name="ITEM_TITLE" />?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">Mellorar as suxestións de busca</translation> <translation id="6026538407078977628">Ampliar a pantalla completa</translation> <translation id="6030719887161080597">Xestiona a información que usan os sitios para medir o rendemento publicitario</translation> +<translation id="6034146297924778597">O historial dos últimos 15 minutos eliminarase:</translation> <translation id="6039379616847168523">Saltar á seguinte pestana</translation> <translation id="6040143037577758943">Pechar</translation> <translation id="604124094241169006">Automático</translation> @@ -1119,6 +1123,7 @@ <translation id="7029809446516969842">Contrasinais</translation> <translation id="7030304022046916278">Envía enderezos URL á función Navegación segura para comprobalos</translation> <translation id="7030585293819777123">Queres retomar a última tarefa?</translation> +<translation id="7035701931849773472">Outras opcións</translation> <translation id="7037830628447527439">Inicia sesión en Chrome coa túa Conta de Google</translation> <translation id="7038956721828960940">chrome_imaxe_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Queres obter descricións de imaxes?</translation> @@ -1341,6 +1346,7 @@ <translation id="8110024788458304985">Axudar a mellorar o rendemento e as funcións de Chrome</translation> <translation id="8110087112193408731">Queres mostrar a túa actividade de Chrome en Benestar dixital?</translation> <translation id="8118117428362942925">Se necesitas axuda, pídella ao teu pai ou á túa nai (<ph name="PARENT_NAME" />)</translation> +<translation id="8124758083429256800">As túas listas de contrasinais gardados de Chrome e Chrome <ph name="ERROR_DESCRIPTION" /> combinaranse despois da versión 121. Poderás autocompletar os contrasinais gardados nas dúas aplicacións.</translation> <translation id="8127542551745560481">Editar páxina de inicio</translation> <translation id="8130309322784422030">A información de inicio de sesión que gardaches podería estar desactualizada</translation> <translation id="813082847718468539">Consulta a información do sitio</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 f3da759..379f00cd 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
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">Zથી A અનુસાર સૉર્ટ કરો</translation> <translation id="4195643157523330669">નવા ટૅબમાં ખોલો</translation> <translation id="4196597275619698563">કાર્ડ બનાવો</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{આ ડિવાઇસ પર 1 ટૅબ}one{આ ડિવાઇસ પર # ટૅબ}other{આ ડિવાઇસ પર # ટૅબ}}</translation> <translation id="4198423547019359126">કોઈ ડાઉનલોડ સ્થાનો ઉપલબ્ધ નથી</translation> <translation id="4202218894997543208">તમે બ્લૉક કરેલા વિષયો</translation> <translation id="4214315110991671325">જો તમે કુકીને મંજૂરી આપો, તો Chrome પહેલેથી લોડ કરવા માટે તેમનો ઉપયોગ કરી શકે છે.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />કયા ડેટાનો ઉપયોગ કરવામાં આવે છે:<ph name="END_BOLD" /> તમારો બ્રાઉઝિંગ ઇતિહાસ, જે આ ડિવાઇસ પર તમે Chrome વડે મુલાકાત લીધેલી સાઇટનો રેકોર્ડ છે.</translation> <translation id="4269820728363426813">લિંક સરનામું કૉપિ કરો</translation> <translation id="4283102315569707115">ડિફૉલ્ટ તરીકે ડેસ્કટૉપ સાઇટની વિનંતી કરીએ?</translation> +<translation id="4285846616383034558">કુકી, કૅશ મેમરી અને સાઇટનો અન્ય ડેટા</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Android સેટિંગમાં સ્ક્રીન લૉકની સુવિધા ચાલુ કરો<ph name="END_LINK" /></translation> <translation id="4296252229500326964">નવી છૂપી ટૅબ</translation> <translation id="4298388696830689168">લિંક કરેલી સાઇટ</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">વીડિયો</translation> <translation id="4766313118839197559">પાસવર્ડ આ ડિવાઇસના Password Managerમાં સાચવવામાં આવે છે</translation> <translation id="4766678251456904326">ડિવાઇસમાં એકાઉન્ટ ઉમેરો</translation> +<translation id="4767947714785277816">અમે જાહેરાતની માપણી નામક નવી જાહેરાત સંબંધિત પ્રાઇવસી સુવિધા લૉન્ચ કરી રહ્યાં છીએ. Chrome સાઇટ અને ઍપ સાથે માત્ર ખૂબ જ મર્યાદિત માહિતી શેર કરે છે, જેમ કે જાહેરાતના પર્ફોર્મન્સની માપણી કરવામાં સહાય કરવા માટે જ્યારે તમને કોઈ જાહેરાત બતાવવામાં આવી હોય.</translation> <translation id="4769095993849849966">ફાઇલનું નવું નામ</translation> <translation id="4778653490315793244">હજી સુધી બતાવવા માટે કંઈ નથી</translation> <translation id="4787736314074622408">શું તમે <ph name="ITEM_TITLE" /> ડિલીટ કરવા માગો છો?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">શોધ સંબંધિત સૂચનો બહેતર બનાવો</translation> <translation id="6026538407078977628">પૂર્ણ સ્ક્રીન જેટલું મોટું કરો</translation> <translation id="6030719887161080597">જાહેરાતના પર્ફોર્મન્સની માપણી કરવા માટે સાઇટ દ્વારા ઉપયોગમાં લેવાતી માહિતીને મેનેજ કરો</translation> +<translation id="6034146297924778597">નીચેનો છેલ્લી 15 મિનિટનો ઇતિહાસ ડિલીટ કરવામાં આવશે:</translation> <translation id="6039379616847168523">આગલા ટૅબ પર જાઓ</translation> <translation id="6040143037577758943">બંધ કરો</translation> <translation id="604124094241169006">સ્વચલિત</translation> @@ -1119,6 +1123,7 @@ <translation id="7029809446516969842">પાસવર્ડ</translation> <translation id="7030304022046916278">URLs ચેક કરવા માટે તેમને Safe Browsing પર મોકલે છે</translation> <translation id="7030585293819777123">શું તમારું છેલ્લું કાર્ય ફરી શરૂ કરીએ?</translation> +<translation id="7035701931849773472">અન્ય વિકલ્પો</translation> <translation id="7037830628447527439">તમારા Google એકાઉન્ટ વડે Chromeમાં સાઇન ઇન કરો</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">છબીના વર્ણનો મેળવીએ?</translation> @@ -1341,6 +1346,7 @@ <translation id="8110024788458304985">Chromeની સુવિધાઓ અને કાર્યપ્રદર્શનને સુધારવામાં સહાય કરો</translation> <translation id="8110087112193408731">શું તમારી Chromeની પ્રવૃત્તિ ડિજિટલ લાઇફસ્ટાઇલમાં બતાવીએ?</translation> <translation id="8118117428362942925">જો તમને સહાયની કોઈ જરૂર હોય, તો માતાપિતા (<ph name="PARENT_NAME" />)ને પૂછો</translation> +<translation id="8124758083429256800">તમારા Chrome અને Chrome <ph name="ERROR_DESCRIPTION" /> માટે સાચવેલા પાસવર્ડની સૂચિ વર્ઝન 121 પછી મર્જ થઈ જશે. તમે બન્ને ઍપ પર તમારા બધા સાચવેલા પાસવર્ડ ઑટોમૅટિક રીતે ભરી શકશો.</translation> <translation id="8127542551745560481">હોમપેજમાં ફેરફાર કરો</translation> <translation id="8130309322784422030">તમારી સ્ટોર કરેલી સાઇન ઇનની માહિતી જૂની હોઈ શકે છે</translation> <translation id="813082847718468539">સ્થાન માહિતી જુઓ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb index 72c3990..6c32c76 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">Z से A के क्रम से लगाएं</translation> <translation id="4195643157523330669">नए टैब में खोलें</translation> <translation id="4196597275619698563">कार्ड बनाएं</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{इस डिवाइस पर 1 टैब}one{इस डिवाइस पर # टैब}other{इस डिवाइस पर # टैब}}</translation> <translation id="4198423547019359126">डाउनलोड करने की कोई जगह उपलब्ध नहीं है</translation> <translation id="4202218894997543208">वे विषय जिन्हें आपने ब्लॉक किया है</translation> <translation id="4214315110991671325">कुकी को अनुमति देने पर, Chrome उनका इस्तेमाल पेजों को पहले से लोड करने के लिए कर सकता है.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />किस डेटा का इस्तेमाल किया जाता है:<ph name="END_BOLD" /> आपका ब्राउज़िंग इतिहास, जिसमें इस डिवाइस पर Chrome का इस्तेमाल करके देखी गई साइटों का रिकॉर्ड होता है.</translation> <translation id="4269820728363426813">लिंक पते को कॉपी करें</translation> <translation id="4283102315569707115">डिफ़ॉल्ट रूप से, डेस्कटॉप साइटें लोड करने का विकल्प चुनना है?</translation> +<translation id="4285846616383034558">कुकी, कैश मेमोरी, और अन्य साइट डेटा</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Android सेटिंग में, स्क्रीन लॉक चालू करें<ph name="END_LINK" /></translation> <translation id="4296252229500326964">नया गुप्त टैब</translation> <translation id="4298388696830689168">लिंक की हुई साइटें</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">वीडियो</translation> <translation id="4766313118839197559">पासवर्ड, इस डिवाइस पर Password Manager में सेव किए गए हैं</translation> <translation id="4766678251456904326">डिवाइस पर खाता जोड़ें</translation> +<translation id="4767947714785277816">हम विज्ञापन देखने वाले की निजता बनाए रखने से जुड़ी एक नई सुविधा लॉन्च कर रहे हैं. इसका नाम है, विज्ञापन की परफ़ॉर्मेंस का आकलन. Chrome, साइटों और ऐप्लिकेशन से सिर्फ़ कुछ ही जानकारी शेयर करता है. जैसे, आपको कोई विज्ञापन कब दिखाया गया, ताकि विज्ञापनों की परफ़ॉर्मेंस का आकलन किया जा सके.</translation> <translation id="4769095993849849966">नई फ़ाइल का नाम</translation> <translation id="4778653490315793244">फ़िलहाल, कोई कॉन्टेंट मौजूद नहीं है</translation> <translation id="4787736314074622408">क्या आपको <ph name="ITEM_TITLE" /> मिटाना है?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">खोज से जुड़े सुझावों को बेहतर बनाएं</translation> <translation id="6026538407078977628">बड़ा करके फ़ुल स्क्रीन पर दिखाएं</translation> <translation id="6030719887161080597">विज्ञापन की परफ़ॉर्मेंस मापने के लिए, साइटों की इस्तेमाल की गई जानकारी मैनेज करें</translation> +<translation id="6034146297924778597">पिछले 15 मिनटों का इतिहास मिटा दिया जाएगा:</translation> <translation id="6039379616847168523">सीधे अगले टैब पर जाएं</translation> <translation id="6040143037577758943">बंद करें</translation> <translation id="604124094241169006">स्वचालित</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 556568f..63cfc32 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
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">Poredaj od Ž do A</translation> <translation id="4195643157523330669">Otvori na novoj kartici</translation> <translation id="4196597275619698563">Izradi karticu</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{1 kartica na ovom uređaju}one{# kartica na ovom uređaju}few{# kartice na ovom uređaju}other{# kartica na ovom uređaju}}</translation> <translation id="4198423547019359126">Lokacije preuzimanja nisu dostupne</translation> <translation id="4202218894997543208">Teme koje ste blokirali</translation> <translation id="4214315110991671325">Ako dopustite kolačiće, Chrome ih može koristiti za predučitavanje.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Koji se podaci upotrebljavaju<ph name="END_BOLD" />: vaša povijest pregledavanja, zapisnik web-lokacija koje ste posjetili u Chromeu na ovom uređaju.</translation> <translation id="4269820728363426813">Kopiraj adresu veze</translation> <translation id="4283102315569707115">Želite li prema zadanim postavkama tražiti web-lokacije za stolna računala?</translation> +<translation id="4285846616383034558">Kolačići, predmemorija i ostali podaci web-lokacije</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Uključite zaključavanje zaslona u postavkama Androida<ph name="END_LINK" /></translation> <translation id="4296252229500326964">Nova anonimna kartica</translation> <translation id="4298388696830689168">Povezane web-lokacije</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">videozapis</translation> <translation id="4766313118839197559">Zaporke se spremaju u Upravitelj zaporki na ovom uređaju</translation> <translation id="4766678251456904326">Dodajte račun uređaju</translation> +<translation id="4767947714785277816">Predstavljamo novu značajku zaštite privatnosti u online oglašavanju pod nazivom mjerenje oglasa. Chrome dijeli samo vrlo ograničene informacije među web-lokacijama i aplikacijama, kao što je vrijeme prikazivanja oglasa, radi mjerenja izvedbe oglasa.</translation> <translation id="4769095993849849966">Novi naziv datoteke</translation> <translation id="4778653490315793244">Još nema ničega</translation> <translation id="4787736314074622408">Želite li izbrisati <ph name="ITEM_TITLE" />?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">Poboljšaj prijedloge za pretraživanje</translation> <translation id="6026538407078977628">Proširi na cijeli zaslon</translation> <translation id="6030719887161080597">Upravljanje podacima koje web-lokacije koriste za mjerenje izvedbe oglasa</translation> +<translation id="6034146297924778597">Izbrisat će se povijest za posljednjih 15 minuta:</translation> <translation id="6039379616847168523">Preskakanje na sljedeću karticu</translation> <translation id="6040143037577758943">Zatvori</translation> <translation id="604124094241169006">Automatski</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb index 035e8b6..91030b26 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb
@@ -17,6 +17,7 @@ <translation id="1100066534610197918">Megnyitás új lapon, csoportban</translation> <translation id="1103142993930332957">Segíteni szeretne a Chrome fejlesztésében?</translation> <translation id="1105960400813249514">Képernyőrögzítés</translation> +<translation id="1108214977745280468">Oldalstatisztikák mutatása</translation> <translation id="1108938384783527433">Előzmények szinkronizálása</translation> <translation id="1110914759170138831">Kiemelés lerövidítve</translation> <translation id="1111673857033749125">A más eszközökön mentett könyvjelzők itt jelennek meg.</translation> @@ -66,6 +67,7 @@ <translation id="1303507811548703290"><ph name="DOMAIN" /> – A(z) <ph name="DEVICE_NAME" /> eszközről</translation> <translation id="1311657260431405215">Ez a QR-kód nem URL: <ph name="QRCODEVALUE" /></translation> <translation id="1316212908214730110">chrome_stylized_highlight_</translation> +<translation id="131655401280401879">Mentett adatai törlődnek, ha később eltávolítja a profilzárolást.</translation> <translation id="1320912611264252795">A könyvjelzőmentési folyamat teljes magasságban van megnyitva</translation> <translation id="1327257854815634930">Megnyitotta a navigációs előzményeket</translation> <translation id="1331212799747679585">A Chrome frissítése nem lehetséges. További lehetőségek</translation> @@ -180,6 +182,7 @@ <translation id="1995884366040846621">A folytatáshoz a(z) <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> megosztja az Ön nevét, e-mail-címét és profilképét ezzel a webhellyel. Olvassa el a webhely <ph name="BEGIN_LINK1" />adatvédelmi irányelveit<ph name="END_LINK1" />.</translation> <translation id="200114059308480249">Használni szeretné a környező szöveget is a Google Kereső használatakor?</translation> <translation id="2009341475524975924">A hirdetés teljesítményének méréséhez bizonyos típusú adatokat megoszthatunk a webhelyekkel, például hogy milyen napszakban jelent meg Önnek az adott hirdetés.</translation> +<translation id="201060170519281460">A profilzárolásnak köszönhetően adatai (például a szinkronizált jelszavak, a fizetések és egyebek) biztonságban lesznek az autójában is.</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# fájl}other{# fájl}}</translation> <translation id="2021896219286479412">Teljes képernyős oldal vezérlői</translation> <translation id="2038563949887743358">Kapcsolja be az Asztali webhely kérése funkciót</translation> @@ -257,6 +260,7 @@ <translation id="250020030759455918">Láthatja a(z) <ph name="SITE_NAME" /> bejelentkezési állapotát, a böngészőadatokat és a webhelyadatokat a Chrome-ban</translation> <translation id="2510106555128151389">A(z) <ph name="WEBAPK_NAME" /> telepítése…</translation> <translation id="2513403576141822879">A <ph name="BEGIN_LINK" />Szinkronizálás és Google<ph name="END_LINK" /> részben további beállításokat talál az adatvédelemre, biztonságra és adatgyűjtésre vonatkozóan</translation> +<translation id="2517113738956581680">Teljes méretű munkalap</translation> <translation id="2517472476991765520">Szkennelés</translation> <translation id="2523184218357549926">A felkeresett oldalak URL-címének elküldése a Google-nak</translation> <translation id="2527209463677295330">Hasznosabb találatokat kaphat, ha nagyobb részt jelöl ki az oldal szövegéből</translation> @@ -281,6 +285,7 @@ A privát állapottokenek nagyobb fokú adatvédelmet biztosítanak az interneten, és nem alkalmasak arra, hogy felfedjék az Ön személyazonosságát.</translation> <translation id="2581165646603367611">Ezzel törli a cookie-kat, a gyorsítótárat, valamint a webhelyek összes olyan adatát, amelyről a Chrome úgy véli, hogy nem fontos.</translation> <translation id="2587052924345400782">Rendelkezésre áll új verzió</translation> +<translation id="2589302627584222634">Profilzárolás létrehozása</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">Jelentkezzen be a beállításai kezeléséhez</translation> <translation id="260403163289591229">Követve</translation> @@ -542,6 +547,7 @@ <translation id="4035877632587724847">Tiltás</translation> <translation id="4036177530563778041">Egyszerűen folytathatja ott, ahol abbahagyta</translation> <translation id="4042941173059740150">Folytassa a(z) <ph name="SITE_ETLD_PLUS_ONE" /> használatát a következővel: <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /></translation> +<translation id="4044708993631234325">Alsó lap</translation> <translation id="4045764304651014138">Használati adatok</translation> <translation id="405399507749852140">Értesítést kaphat, ha valamelyik webhelyen csökken az ár</translation> <translation id="4056223980640387499">Szépia</translation> @@ -846,6 +852,7 @@ <translation id="564667659802381754">Adatvédelmi útmutató <ph name="BEGIN_NEW" />Új<ph name="END_NEW" /></translation> <translation id="5648166631817621825">Az elmúlt 7 napból</translation> <translation id="5655963694829536461">Keresés a letöltések között</translation> +<translation id="5657871969392618475">Az adatait profilzárolás védi</translation> <translation id="5659593005791499971">E-mail</translation> <translation id="5665379678064389456">Esemény létrehozása a(z) <ph name="APP_NAME" /> alkalmazásban</translation> <translation id="5683547024293500885">A Chrome nem tud frissítéseket keresni</translation> @@ -909,6 +916,7 @@ <translation id="5964869237734432770">Képleírások leállítása</translation> <translation id="5966233851250124270">A Chrome megjegyzi a választását</translation> <translation id="5979084224081478209">Jelszavak ellenőrzése</translation> +<translation id="5985186846584605773">Hozzon létre profilzárolást az autóhoz</translation> <translation id="5995726099713306770">Ismét letölti az oldalt?</translation> <translation id="6000066717592683814">A Google megtartása</translation> <translation id="6000203700195075278">Újrakövetés</translation> @@ -1137,6 +1145,7 @@ <translation id="7088681679121566888">A Chrome naprakész</translation> <translation id="7105047059074518658">Jelentkezzen be, hogy egyszerűbben böngészhessen eszközökön átnyúlóan</translation> <translation id="7106762743910369165">Böngészőjét a szervezete kezeli.</translation> +<translation id="7116420572655804716">Ha az autóban szinkronizálni szeretné az adatait, és meg szeretné őrizni a biztonságukat, profilzárolást kell létrehoznia a biztonsági beállításokban. Minden alkalommal meg kell adnia egy kódot vagy jelszót, amikor beül az autóba.</translation> <translation id="7116588989735740310">A más eszközökön felkeresett webhelyekhez való visszatéréshez szinkronizálja lapjait és előzményeit.</translation> <translation id="7130504491556983216">Az érdeklődési köröket tartalmazó lista itt jelenik majd meg az interneten való böngészés folyományaként</translation> <translation id="7138678301420049075">Egyéb</translation> @@ -1358,6 +1367,7 @@ <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Saját eszközök<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8200772114523450471">Folytatás</translation> <translation id="8209050860603202033">Kép megnyitása</translation> +<translation id="8215740705341534369">Oldalsó lap</translation> <translation id="8218622182176210845">Fiók kezelése</translation> <translation id="8221401890884589479">Önnek lehetősége van a nem kívánt webhelyek letiltására. A Chrome emellett automatikusan törli a listáról a 30 napnál régebbi webhelyeket. <ph name="BEGIN_LINK" />További információ<ph name="END_LINK" />.</translation> <translation id="8223642481677794647">A hírcsatornakártya menüje</translation> @@ -1560,6 +1570,7 @@ <translation id="932327136139879170">Főoldal</translation> <translation id="938850635132480979">Hiba: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Összetett jelszó megadása</translation> +<translation id="950679278154734362">Ha az autóban szinkronizálni szeretné az adatait, és meg szeretné őrizni a biztonságukat, profilzárolást kell létrehoznia. Minden alkalommal meg kell adnia egy kódot vagy jelszót, amikor beül az autóba.</translation> <translation id="95817756606698420">A Chrome igénybe veheti a <ph name="BEGIN_BOLD" />Sogou<ph name="END_BOLD" /> keresőszolgáltatást, hogy Kínában kereshessen. Ezt a <ph name="BEGIN_LINK" />Beállításokban<ph name="END_LINK" /> módosíthatja.</translation> <translation id="962979164594783469">Alkalmazás telepítése</translation> <translation id="96681097142096641">Megtekinti az egyszerűsített oldalt?</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb index db7d531..2380573 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb
@@ -1123,6 +1123,7 @@ <translation id="7029809446516969842">Գաղտնաբառեր</translation> <translation id="7030304022046916278">Ուղարկում է URL-ները Ապահով դիտարկմանը՝ դրանք ստուգելու համար։</translation> <translation id="7030585293819777123">Վերսկսե՞լ ձեր վերջին առաջադրանքը</translation> +<translation id="7035701931849773472">Այլ տարբերակներ</translation> <translation id="7037830628447527439">Մուտք գործեք Chrome ձեր Google հաշվով</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Ուզո՞ւմ եք ստանալ պատկերների նկարագրություններ</translation> @@ -1345,6 +1346,7 @@ <translation id="8110024788458304985">Օգնել բարելավել Chrome-ի գործառույթներն ու աշխատանքը</translation> <translation id="8110087112193408731">Ցուցադրե՞լ Chrome-ի պատմությունը Թվային բարեկեցության մեջ</translation> <translation id="8118117428362942925">Եթե օգնության կարիք ունենաս, դիմիր ծնողիդ (<ph name="PARENT_NAME" />)</translation> +<translation id="8124758083429256800">Պահված գաղտնաբառերի ձեր ցանկերը Chrome-ի և Chrome <ph name="ERROR_DESCRIPTION" />-ի համար կմիավորվեն տարբերակ 121-ի թողարկումից հետո։ Դուք կկարողանաք ինքնալրացնել ձեր բոլոր գաղտնաբառերը երկու հավելվածներում։</translation> <translation id="8127542551745560481">Փոփոխել գլխավոր էջը</translation> <translation id="8130309322784422030">Հնարավոր է՝ մուտքի պահված տվյալները հնացել են</translation> <translation id="813082847718468539">Դիտել կայքի տեղեկությունները</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb index f61d507..847b4b6 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">Urutkan menurut Z ke A</translation> <translation id="4195643157523330669">Buka di tab baru</translation> <translation id="4196597275619698563">Buat kartu</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{1 tab di perangkat ini}other{# tab di perangkat ini}}</translation> <translation id="4198423547019359126">Tidak tersedia lokasi download</translation> <translation id="4202218894997543208">Topik yang Anda blokir</translation> <translation id="4214315110991671325">Jika Anda mengizinkan cookie, Chrome dapat menggunakan cookie tersebut untuk melakukan pramuat.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Data yang digunakan:<ph name="END_BOLD" /> Histori penjelajahan Anda, catatan situs yang telah Anda buka menggunakan Chrome di perangkat ini.</translation> <translation id="4269820728363426813">Salin URL</translation> <translation id="4283102315569707115">Minta situs desktop secara default?</translation> +<translation id="4285846616383034558">Cookie, cache, dan data situs lainnya</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Aktifkan kunci layar di setelan Android<ph name="END_LINK" /></translation> <translation id="4296252229500326964">Tab Samaran baru</translation> <translation id="4298388696830689168">Situs tertaut</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">video</translation> <translation id="4766313118839197559">Sandi disimpan ke Pengelola Sandi di perangkat ini</translation> <translation id="4766678251456904326">Tambahkan akun ke perangkat</translation> +<translation id="4767947714785277816">Kami meluncurkan fitur privasi iklan baru yang disebut pengukuran iklan. Chrome hanya membagikan informasi yang sangat terbatas di antara situs dan aplikasi, seperti kapan iklan ditampilkan kepada Anda, untuk membantu mengukur performa iklan.</translation> <translation id="4769095993849849966">Nama file baru</translation> <translation id="4778653490315793244">Belum ada yang dapat ditampilkan</translation> <translation id="4787736314074622408">Ingin menghapus <ph name="ITEM_TITLE" />?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">Tingkatkan saran penelusuran</translation> <translation id="6026538407078977628">Luaskan ke layar penuh</translation> <translation id="6030719887161080597">Mengelola info yang digunakan situs untuk mengukur performa iklan</translation> +<translation id="6034146297924778597">Histori dari 15 menit terakhir akan dihapus:</translation> <translation id="6039379616847168523">Beralih ke tab berikutnya</translation> <translation id="6040143037577758943">Tutup</translation> <translation id="604124094241169006">Otomatis</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 547e09cb..405b4f1 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
@@ -574,6 +574,7 @@ <translation id="4188221736490993796">מיון בסדר אלפביתי יורד</translation> <translation id="4195643157523330669">פתיחה בכרטיסייה חדשה</translation> <translation id="4196597275619698563">ליצירת כרטיס</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{כרטיסייה אחת במכשיר הזה}one{# כרטיסיות במכשיר הזה}two{# כרטיסיות במכשיר הזה}other{# כרטיסיות במכשיר הזה}}</translation> <translation id="4198423547019359126">אין מיקומים זמינים להורדה</translation> <translation id="4202218894997543208">נושאים שחסמת</translation> <translation id="4214315110991671325">אם מאפשרים שימוש בקובצי Cookie, יכול להיות שמערכת Chrome תשתמש בהם בטעינה מראש.</translation> @@ -588,6 +589,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />באילו נתונים נעשה שימוש:<ph name="END_BOLD" /> היסטוריית הגלישה – תיעוד האתרים שביקרת בהם באמצעות Chrome במכשיר הזה.</translation> <translation id="4269820728363426813">העתקת כתובת של קישור</translation> <translation id="4283102315569707115">לבקש אתרים שמותאמים למחשב כברירת מחדל?</translation> +<translation id="4285846616383034558">קובצי cookie, מטמון ונתונים נוספים מאתרים</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />להפעלת נעילת המסך בהגדרות Android<ph name="END_LINK" /></translation> <translation id="4296252229500326964">כרטיסייה פרטית חדשה</translation> <translation id="4298388696830689168">אתרים מקושרים</translation> @@ -678,6 +680,7 @@ <translation id="4763480195061959176">סרטוני וידאו</translation> <translation id="4766313118839197559">סיסמאות נשמרות במנהל הסיסמאות במכשיר הזה</translation> <translation id="4766678251456904326">הוספת חשבון למכשיר</translation> +<translation id="4767947714785277816">אנחנו משיקים תכונה חדשה לשמירה על פרטיות בפרסום שנקראת 'מדידת ביצועים של מודעות'. Chrome משתף מידע מוגבל מאוד בין אתרים ואפליקציות, למשל מתי הוצגה לך מודעה, כדי לעזור במדידת הביצועים של המודעות.</translation> <translation id="4769095993849849966">שם הקובץ החדש</translation> <translation id="4778653490315793244">עדיין אין פריטים להצגה</translation> <translation id="4787736314074622408">רוצה למחוק את <ph name="ITEM_TITLE" />?</translation> @@ -912,6 +915,7 @@ <translation id="6011308810877101166">שיפור של ההצעות לחיפוש</translation> <translation id="6026538407078977628">הרחבה למסך מלא</translation> <translation id="6030719887161080597">ניהול המידע שמשמש אתרים למדידת ביצועי מודעות</translation> +<translation id="6034146297924778597">ההיסטוריה מ-15 הדקות האחרונות תימחק:</translation> <translation id="6039379616847168523">מעבר לכרטיסייה הבאה</translation> <translation id="6040143037577758943">סגירה</translation> <translation id="604124094241169006">אוטומטי</translation> @@ -1117,6 +1121,7 @@ <translation id="7029809446516969842">סיסמאות</translation> <translation id="7030304022046916278">שליחת כתובות URL לבדיקה על ידי 'גלישה בטוחה'</translation> <translation id="7030585293819777123">להמשיך במשימה האחרונה?</translation> +<translation id="7035701931849773472">אפשרויות אחרות</translation> <translation id="7037830628447527439">אפשר להיכנס לחשבון Google ב-Chrome</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">רוצה לקבל תיאורי תמונות?</translation> @@ -1339,6 +1344,7 @@ <translation id="8110024788458304985">עזרה בשיפור התכונות והביצועים של Chrome</translation> <translation id="8110087112193408731">להציג את הפעילות שלך ב-Chrome ב'שימוש חכם בדיגיטל'?</translation> <translation id="8118117428362942925">אם צריך עזרה, אפשר לבקש עזרה מהורה (<ph name="PARENT_NAME" />)</translation> +<translation id="8124758083429256800">אחרי גרסה 121, ימוזגו הרשימות של הסיסמאות השמורות שלך ב-Chrome וב-Chrome <ph name="ERROR_DESCRIPTION" />. תהיה לך אפשרות למלא באופן אוטומטי את כל הסיסמאות השמורות בשתי האפליקציות האלו.</translation> <translation id="8127542551745560481">עריכת דף הבית</translation> <translation id="8130309322784422030">יכול להיות שהפרטים שנשמרו לכניסה לחשבון לא עדכניים</translation> <translation id="813082847718468539">הצגת נתוני אתר</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 b58a1061d..0f8a149 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
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">Я–А бойынша сұрыптау</translation> <translation id="4195643157523330669">Жаңа қойындыда ашу</translation> <translation id="4196597275619698563">Карта жасау</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{Бұл құрылғыда 1 қойынды}other{Бұл құрылғыда # қойынды}}</translation> <translation id="4198423547019359126">Жүктеп алуға пайдалануға болатын орындар жоқ</translation> <translation id="4202218894997543208">Сіз бөгеген тақырыптар</translation> <translation id="4214315110991671325">Егер cookie файлдарына рұқсат берсеңіз, Chrome оларды алдын ала жүктеу үшін пайдалануы мүмкін.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Қандай дерек пайдаланылады:<ph name="END_BOLD" /> браузерді қолдану тарихы, осы құрылғыда Chrome көмегімен кірген сайттардың жазбасы.</translation> <translation id="4269820728363426813">Сілтеме мекенжайын көшіру</translation> <translation id="4283102315569707115">Әдепкісінше компьютерге арналған сайттар сұралсын ба?</translation> +<translation id="4285846616383034558">Cookie файлдары, кэш және басқа сайт деректері</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Android параметрлерінен экран құлпын қосыңыз.<ph name="END_LINK" /></translation> <translation id="4296252229500326964">Жаңа инкогнито қойындысы</translation> <translation id="4298388696830689168">Байланыстырылған сайттар</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">бейне</translation> <translation id="4766313118839197559">Құпия сөздер осы құрылғыдағы Құпия сөз менеджеріне сақталады.</translation> <translation id="4766678251456904326">Құрылғыға аккаунт енгізу</translation> +<translation id="4767947714785277816">Жарнама көрсеткіштерін өлшеу деп аталатын жаңа жарнамадағы құпиялық функциясын іске қосып жатырмыз. Chrome браузері жарнамалар өнімділігін өлшеуге көмектесу үшін сайттар мен қолданбалар арасында (мысалы, сізге жарнама көрсетілген кезде) өте шектеулі ақпаратты ғана бөліседі.</translation> <translation id="4769095993849849966">Жаңа файл аты</translation> <translation id="4778653490315793244">Әзірге транзакциялар жоқ</translation> <translation id="4787736314074622408"><ph name="ITEM_TITLE" /> элементін жойғыңыз келе ме?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">Іздеу ұсыныстарын жақсарту</translation> <translation id="6026538407078977628">Толық экранға жаю</translation> <translation id="6030719887161080597">Жарнаманың өнімділігін өлшеу үшін сайттар пайдаланатын ақпаратты басқару</translation> +<translation id="6034146297924778597">Соңғы 15 минуттағы тарих жойылады:</translation> <translation id="6039379616847168523">Келесі қойындыға өту</translation> <translation id="6040143037577758943">Жабу</translation> <translation id="604124094241169006">Автоматты</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb index fd5cb83a..12ab1713 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb
@@ -17,6 +17,7 @@ <translation id="1100066534610197918">បើកនៅក្នុងផ្ទាំងថ្មីនៅក្នុងក្រុម</translation> <translation id="1103142993930332957">ជួយកែលម្អ Chrome ដែរទេ?</translation> <translation id="1105960400813249514">ការថតអេក្រង់</translation> +<translation id="1108214977745280468">មើលស្ថិតិទំព័រ</translation> <translation id="1108938384783527433">សមកាលកម្មប្រវត្តិ</translation> <translation id="1110914759170138831">ការរំលេចត្រូវបានកាត់ឱ្យខ្លី</translation> <translation id="1111673857033749125">ចំណាំដែលបានរក្សាទុកនៅលើឧបករណ៍ផ្សេងទៀតរបស់អ្នកនឹងបង្ហាញនៅទីនេះ</translation> @@ -66,6 +67,7 @@ <translation id="1303507811548703290"><ph name="DOMAIN" />៖ បានផ្ញើពី <ph name="DEVICE_NAME" /></translation> <translation id="1311657260431405215">កូដ QR នេះមិនមែនជា URL ទេ៖ <ph name="QRCODEVALUE" /></translation> <translation id="1316212908214730110">chrome_stylized_highlight_</translation> +<translation id="131655401280401879">ព័ត៌មានដែលអ្នកបានរក្សាទុកនឹងត្រូវបានលុប ប្រសិនបើអ្នកដកការចាក់សោកម្រងព័ត៌មានចេញនៅពេលក្រោយ។</translation> <translation id="1320912611264252795">ថតលំហូរនៃការរក្សាទុកចំណាំបានបើកពេញអេក្រង់</translation> <translation id="1327257854815634930">បានបើកប្រវត្តិរុករក</translation> <translation id="1331212799747679585">Chrome មិនអាចដំឡើងជំនាន់បានទេ។ ជម្រើសច្រើនទៀត</translation> @@ -180,6 +182,7 @@ <translation id="1995884366040846621">ដើម្បីបន្ត <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> នឹងចែករំលែកឈ្មោះ អាសយដ្ឋានអ៊ីមែល និងរូបភាពកម្រងព័ត៌មានរបស់អ្នកជាមួយគេហទំព័រនេះ។ សូមមើល<ph name="BEGIN_LINK1" />គោលការណ៍ឯកជនភាព<ph name="END_LINK1" />របស់គេហទំព័រនេះ។</translation> <translation id="200114059308480249">រួមបញ្ចូលអក្សរដែលនៅជុំវិញនៅក្នុងការស្វែងរកនៅលើ Google ឬ?</translation> <translation id="2009341475524975924">ដើម្បីវាស់ស្ទង់លទ្ធផលប្រតិបត្តិការនៃការផ្សាយពាណិជ្ជកម្ម ប្រភេទទិន្នន័យមួយចំនួនតូចអាចត្រូវបានចែករំលែករវាងគេហទំព័រនានា ដូចជាពេលវេលាប្រចាំថ្ងៃដែលការផ្សាយពាណិជ្ជកម្មត្រូវបានបង្ហាញដល់អ្នកជាដើម។</translation> +<translation id="201060170519281460">ការចាក់សោកម្រងព័ត៌មានរបស់អ្នករក្សាសុវត្ថិភាពព័ត៌មានរបស់អ្នកនៅក្នុងរថយន្ត រួមទាំងការបង់ប្រាក់ ពាក្យសម្ងាត់ដែលបានធ្វើសមកាលកម្ម និងអ្វីៗជាច្រើនទៀត។</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{ឯកសារ #}other{ឯកសារ #}}</translation> <translation id="2021896219286479412">ការគ្រប់គ្រងទំព័រពេញអេក្រង់</translation> <translation id="2038563949887743358">បើកសំណើគេហទំព័រសម្រាប់កុំព្យូទ័រ</translation> @@ -257,6 +260,7 @@ <translation id="250020030759455918">អ្នកនឹងមើលឃើញស្ថានភាពចូល <ph name="SITE_NAME" />, ទិន្នន័យរុករក និងទិន្នន័យគេហទំព័ររបស់អ្នកនៅក្នុង Chrome</translation> <translation id="2510106555128151389">កំពុងដំឡើង <ph name="WEBAPK_NAME" />...</translation> <translation id="2513403576141822879">សម្រាប់ការកំណត់ច្រើនទៀតពាក់ព័ន្ធនឹងឯកជនភាព សុវត្ថិភាព និងការប្រមូលទិន្នន័យ សូមមើល<ph name="BEGIN_LINK" />សមកាលកម្ម និងសេវាកម្ម Google<ph name="END_LINK" /></translation> +<translation id="2517113738956581680">សន្លឹកទំហំពេញ</translation> <translation id="2517472476991765520">ស្កេន</translation> <translation id="2523184218357549926">ផ្ញើ URL នៃទំព័រដែលអ្នកចូលមើលទៅ Google</translation> <translation id="2527209463677295330">តាមរយៈការរួមបញ្ចូលអត្ថបទរបស់ទំព័របន្ថែម អ្នកអាចមើលឃើញលទ្ធផលប្រសើរជាងមុន</translation> @@ -281,6 +285,7 @@ ថូខិនស្ថានភាពឯកជនកែលម្អឯកជនភាពនៅលើបណ្ដាញ និងមិនអាចត្រូវបានប្រើ ដើម្បីឱ្យដឹងថាអ្នកជានរណានោះទេ។</translation> <translation id="2581165646603367611">វានឹងជម្រះខុកឃី ឃ្លាំងសម្ងាត់ និងទិន្នន័យផ្សេងទៀតនៃគេហទំព័រដែល Chrome គិតថាមិនសំខាន់។</translation> <translation id="2587052924345400782">មានផ្តល់ជូនកំណែថ្មី</translation> +<translation id="2589302627584222634">បង្កើតការចាក់សោកម្រងព័ត៌មាន</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">ចូលគណនីដើម្បីគ្រប់គ្រងចំណូលចិត្តរបស់អ្នក</translation> <translation id="260403163289591229">កំពុងតាមដាន</translation> @@ -542,6 +547,7 @@ <translation id="4035877632587724847">មិនអនុញ្ញាត</translation> <translation id="4036177530563778041">ងាយស្រួលបន្តពីចំណុចដែលអ្នកបានចាកចេញ</translation> <translation id="4042941173059740150">បន្តទៅកាន់ <ph name="SITE_ETLD_PLUS_ONE" /> ដោយប្រើ <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /></translation> +<translation id="4044708993631234325">សន្លឹកខាងក្រោម</translation> <translation id="4045764304651014138">ទិន្នន័យប្រើប្រាស់</translation> <translation id="405399507749852140">ទទួលបានការជូនដំណឹង ប្រសិនបើមានការធ្លាក់ថ្លៃនៅលើគេហទំព័រណាមួយ</translation> <translation id="4056223980640387499">Sepia</translation> @@ -846,6 +852,7 @@ <translation id="564667659802381754">ការណែនាំអំពីឯកជនភាព<ph name="BEGIN_NEW" />ថ្មី<ph name="END_NEW" /></translation> <translation id="5648166631817621825">7 ថ្ងៃមុន</translation> <translation id="5655963694829536461">ស្វែងរកការទាញយករបស់អ្នក</translation> +<translation id="5657871969392618475">ព័ត៌មានរបស់អ្នកត្រូវបានរក្សាសុវត្ថិភាពដោយការចាក់សោកម្រងព័ត៌មាន</translation> <translation id="5659593005791499971">អ៊ីម៉េល</translation> <translation id="5665379678064389456">បង្កើតព្រឹត្តិការណ៍នៅក្នុង <ph name="APP_NAME" /></translation> <translation id="5683547024293500885">Chrome មិនអាចពិនិត្យរកកំណែថ្មីបានទេ</translation> @@ -909,6 +916,7 @@ <translation id="5964869237734432770">ឈប់យកការពណ៌នាអំពីរូបភាព</translation> <translation id="5966233851250124270">Chrome នឹងចងចាំជម្រើសរបស់អ្នក</translation> <translation id="5979084224081478209">ពិនិត្យពាក្យសម្ងាត់</translation> +<translation id="5985186846584605773">បង្កើតការចាក់សោកម្រងព័ត៌មានសម្រាប់រថយន្តរបស់អ្នក</translation> <translation id="5995726099713306770">ទាញយកទំព័រម្ដងទៀត?</translation> <translation id="6000066717592683814">រក្សា Google ដដែល</translation> <translation id="6000203700195075278">តាមដានឡើងវិញ</translation> @@ -1137,6 +1145,7 @@ <translation id="7088681679121566888">Chrome ជាកំណែថ្មីហើយ</translation> <translation id="7105047059074518658">ចូលគណនី ដើម្បីរុករកនៅលើឧបករណ៍បានកាន់តែងាយស្រួល</translation> <translation id="7106762743910369165">កម្មវិធីរុករកតាមអ៊ីនធឺណិតរបស់អ្នកស្ថិតក្រោមការគ្រប់គ្រងរបស់ស្ថាប័នអ្នក</translation> +<translation id="7116420572655804716">ដើម្បីធ្វើសមកាលកម្មព័ត៌មានរបស់អ្នក និងរក្សាសុវត្ថិភាពទិន្នន័យរបស់អ្នកនៅក្នុងរថយន្ត អ្នកត្រូវតែបង្កើតការចាក់សោកម្រងព័ត៌មាននៅក្នុងការកំណត់សុវត្ថិភាពរបស់អ្នក។ អ្នកនឹងប្រើកូដ ឬពាក្យសម្ងាត់ រាល់ពេលដែលអ្នកចូលរថយន្ត។</translation> <translation id="7116588989735740310">ដើម្បីត្រឡប់ទៅកាន់គេហទំព័រដែលអ្នកបានចូលមើលនៅលើឧបករណ៍ផ្សេង សូមធ្វើសមកាលកម្មផ្ទាំង និងប្រវត្តិរបស់អ្នក</translation> <translation id="7130504491556983216">បញ្ជីចំណាប់អារម្មណ៍នឹងបង្ហាញនៅទីនេះ នៅពេលដែលអ្នករុករកលើបណ្ដាញ</translation> <translation id="7138678301420049075">ផ្សេងទៀត</translation> @@ -1358,6 +1367,7 @@ <translation id="8193953846147532858"><ph name="BEGIN_LINK" />ឧបករណ៍របស់អ្នក<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8200772114523450471">បន្ត</translation> <translation id="8209050860603202033">បើករូបភាព</translation> +<translation id="8215740705341534369">សន្លឹកចំហៀង</translation> <translation id="8218622182176210845">គ្រប់គ្រងគណនីរបស់អ្នក</translation> <translation id="8221401890884589479">អ្នកអាចទប់ស្កាត់គេហទំព័រដែលអ្នកមិនចង់បាន។ Chrome ក៏លុបគេហទំព័រដែលចាស់ជាង 30 ថ្ងៃចេញពីបញ្ជីដោយស្វ័យប្រវត្តិផងដែរ។ <ph name="BEGIN_LINK" />ស្វែងយល់បន្ថែម<ph name="END_LINK" /></translation> <translation id="8223642481677794647">ម៉ឺនុយកាតព័ត៌មាន</translation> @@ -1560,6 +1570,7 @@ <translation id="932327136139879170">ទំព័រដើម</translation> <translation id="938850635132480979">កំហុស៖ <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">បញ្ចូលឃ្លាសម្ងាត់</translation> +<translation id="950679278154734362">ដើម្បីធ្វើសមកាលកម្មព័ត៌មានរបស់អ្នក និងរក្សាសុវត្ថិភាពទិន្នន័យរបស់អ្នកនៅក្នុងរថយន្ត អ្នកត្រូវតែបង្កើតការចាក់សោកម្រងព័ត៌មាន។ អ្នកនឹងប្រើកូដ ឬពាក្យសម្ងាត់ រាល់ពេលដែលអ្នកចូលរថយន្ត។</translation> <translation id="95817756606698420">Chrome អាចប្រើ <ph name="BEGIN_BOLD" />Sogou<ph name="END_BOLD" /> សម្រាប់ការស្វែងរកនៅក្នុងប្រទេសចិន។ អ្នកអាចផ្លាស់ប្តូរវាបាននៅក្នុង <ph name="BEGIN_LINK" />ការកំណត់<ph name="END_LINK" />។</translation> <translation id="962979164594783469">ដំឡើងកម្មវិធីនេះ</translation> <translation id="96681097142096641">មើលទំព័រសាមញ្ញឬ?</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb index 6356df3..2eed88f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
@@ -1115,6 +1115,7 @@ <translation id="7029809446516969842">Сырсөздөр</translation> <translation id="7030304022046916278">URL даректерин текшерүү үчүн Коопсуз серептөөгө жөнөтөт</translation> <translation id="7030585293819777123">Акыркы жасалчу ишиңизди улантасызбы?</translation> +<translation id="7035701931849773472">Башка параметрлер</translation> <translation id="7037830628447527439">Chrome'го Google аккаунтуңуз менен кириңиз</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Сүрөттүн сүрөттөмөлөрүн аласызбы?</translation> @@ -1337,6 +1338,7 @@ <translation id="8110024788458304985">Chrome функцияларын жана майнаптуулугун өркүндөтүүгө жардам бериңиз</translation> <translation id="8110087112193408731">Chrome'ду колдонуу дайын-даректериңиз Санариптик бакубаттык кызматында көрсөтүлсүнбү?</translation> <translation id="8118117428362942925">Жардам керек болсо, ата-энеңе кайрыл (<ph name="PARENT_NAME" />)</translation> +<translation id="8124758083429256800">Chrome жана Chrome <ph name="ERROR_DESCRIPTION" /> cерепчисинде сакталган сырсөздөрүңүздүн тизмеси 121-версиясы чыккандан кийин бириктирилет. Сакталган сырсөздөрүңүздүн баарын эки колдонмодо тең автотолтуруу функциясы менен колдоно аласыз.</translation> <translation id="8127542551745560481">Башкы бетти түзөтүү</translation> <translation id="8130309322784422030">Сакталган кирүү маалыматынын мөөнөтү өтүп кеткен окшойт</translation> <translation id="813082847718468539">Сайттын маалыматын карап көрүү</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 7eaa5fa..b634186 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
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">Kārtot no Z līdz A</translation> <translation id="4195643157523330669">Atvērt jaunā cilnē</translation> <translation id="4196597275619698563">Izveidot kartīti</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{Viena cilne šajā ierīcē.}zero{# ciļņu šajā ierīcē.}one{# cilne šajā ierīcē.}other{# cilnes šajā ierīcē.}}</translation> <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> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Kādi dati tiek izmantoti:<ph name="END_BOLD" /> jūsu pārlūkošanas vēsture, kurā tiek reģistrētas vietnes, ko šajā ierīcē apmeklējat ar pārlūku Chrome.</translation> <translation id="4269820728363426813">Kopēt saites adresi</translation> <translation id="4283102315569707115">Vai pēc noklusējuma pieprasīt vietnes datoriem?</translation> +<translation id="4285846616383034558">Sīkfaili, kešatmiņa un citi vietņu dati.</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Ieslēgt ekrāna bloķēšanu Android iestatījumos<ph name="END_LINK" /></translation> <translation id="4296252229500326964">Jauna inkognito cilne</translation> <translation id="4298388696830689168">Saistītās vietnes</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">video</translation> <translation id="4766313118839197559">Paroles tiek saglabātas Paroļu pārvaldniekā šajā ierīcē</translation> <translation id="4766678251456904326">Pievienot kontu ierīcei</translation> +<translation id="4767947714785277816">Tiek izlaista jauna reklāmu konfidencialitātes funkcija, ko dēvē par reklāmu novērtēšanu. Lai palīdzētu novērtēt reklāmu veiktspēju, Chrome starp dažādām vietnēm un lietotnēm kopīgo tikai ļoti ierobežotu informāciju, piemēram, par laiku, kad noteikta reklāma tika jums parādīta.</translation> <translation id="4769095993849849966">Jaunais faila nosaukums</translation> <translation id="4778653490315793244">Vēl nav nekāda satura</translation> <translation id="4787736314074622408">Vai vēlaties dzēst failu <ph name="ITEM_TITLE" />?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">Uzlabot meklēšanas ieteikumus</translation> <translation id="6026538407078977628">Izvērst pilnekrāna režīmā</translation> <translation id="6030719887161080597">Pārvaldiet informāciju, ko izmanto vietnes, lai novērtētu reklāmu veiktspēju.</translation> +<translation id="6034146297924778597">Tiks dzēsti tālāk norādītie pēdējo 15 minūšu laikā uzkrātie vēstures dati.</translation> <translation id="6039379616847168523">Pāriet uz nākamo cilni</translation> <translation id="6040143037577758943">Aizvērt</translation> <translation id="604124094241169006">Automātiski</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 79ba8ea..6c7badc 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
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">Подредување од Ш до А</translation> <translation id="4195643157523330669">Отвори во нова картичка</translation> <translation id="4196597275619698563">Создај картичка</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{1 картичка на уредов}one{# картичка на уредов}other{# картички на уредов}}</translation> <translation id="4198423547019359126">Нема достапни локации за преземање</translation> <translation id="4202218894997543208">Теми што сте ги блокирале</translation> <translation id="4214315110991671325">Ако ги дозволите колачињата, Chrome може да ги користи за вчитување однапред.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Кои податоци се користат:<ph name="END_BOLD" /> вашата историја на прелистувањето, евиденцијата на сајтовите што сте ги посетиле со Chrome на овој уред.</translation> <translation id="4269820728363426813">Копирај ја адресата на линкот</translation> <translation id="4283102315569707115">Да се бараат сајтови за компјутер стандардно?</translation> +<translation id="4285846616383034558">Колачиња, кеш и други податоци од сајтовите</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Вклучете го заклучувањето на екранот во поставките за Android<ph name="END_LINK" /></translation> <translation id="4296252229500326964">Нова картичка „Инкогнито“</translation> <translation id="4298388696830689168">Поврзани сајтови</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">видео</translation> <translation id="4766313118839197559">Лозинките се зачувани во „Управникот со лозинки“ на уредов</translation> <translation id="4766678251456904326">Додајте сметка на уредов</translation> +<translation id="4767947714785277816">Воведуваме нова функција за приватност за реклами наречена „Мерење реклами“. Chrome споделува само многу ограничени податоци меѓу сајтовите и апликациите, на пр., кога ви била прикажана дадена реклама за да помогне да се мери изведбата на рекламите.</translation> <translation id="4769095993849849966">Ново име на датотека</translation> <translation id="4778653490315793244">Сѐ уште нема што да се прикаже</translation> <translation id="4787736314074622408">Сакате да се избрише <ph name="ITEM_TITLE" />?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">Подобрување на предлозите за пребарување</translation> <translation id="6026538407078977628">Прошири на цел екран</translation> <translation id="6030719887161080597">Управувајте со податоците што ги користат сајтовите за мерење на перформансите на рекламите</translation> +<translation id="6034146297924778597">Ќе се избрише историјата од минатите 15 минути:</translation> <translation id="6039379616847168523">Скокнете на следната картичка</translation> <translation id="6040143037577758943">Затвори</translation> <translation id="604124094241169006">Автоматски</translation> @@ -1119,6 +1123,7 @@ <translation id="7029809446516969842">Лозинки</translation> <translation id="7030304022046916278">Испраќа URL-адреси во „Безбедно прелистување“ за да се проверат</translation> <translation id="7030585293819777123">Сакате да продолжите со последната задача?</translation> +<translation id="7035701931849773472">Други опции</translation> <translation id="7037830628447527439">Најавете се на Chrome со вашата сметка на Google</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Сакате ли да добивате описи на слики?</translation> @@ -1341,6 +1346,7 @@ <translation id="8110024788458304985">Помогнете да се подобрат функциите и изведбата на Chrome</translation> <translation id="8110087112193408731">Да се прикажува вашата активност на Chrome во „Дигитална благосостојба“?</translation> <translation id="8118117428362942925">Ако ти треба помош, прашај го родителот (<ph name="PARENT_NAME" />)</translation> +<translation id="8124758083429256800">Вашите списоци на зачувани лозинки за Chrome и Chrome <ph name="ERROR_DESCRIPTION" /> ќе се спојат по верзијата 121. Ќе може автоматски да ги пополнувате сите зачувани лозинки во двете апликации.</translation> <translation id="8127542551745560481">Изменете ја почетната страница</translation> <translation id="8130309322784422030">Вашите складирани податоци за најавување можеби се застарени</translation> <translation id="813082847718468539">Прикажи информации за локација</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 2617a60..595012f 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
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">റ മുതൽ അ വരെയുള്ള ക്രമം</translation> <translation id="4195643157523330669">പുതിയ ടാബില് തുറക്കുക</translation> <translation id="4196597275619698563">കാർഡ് സൃഷ്ടിക്കുക</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{ഈ ഉപകരണത്തിലെ ഒരു ടാബ്}other{ഈ ഉപകരണത്തിലെ # ടാബ്}}</translation> <translation id="4198423547019359126">ലഭ്യമായ ഡൗൺലോഡ് ലൊക്കേഷനുകളൊന്നും ഇല്ല</translation> <translation id="4202218894997543208">നിങ്ങൾ ബ്ലോക്ക് ചെയ്ത വിഷയങ്ങൾ</translation> <translation id="4214315110991671325">നിങ്ങൾ കുക്കികൾ അനുവദിച്ചാൽ, മുൻകൂട്ടി ലോഡ് ചെയ്യുന്നതിന് Chrome അവ ഉപയോഗിച്ചേക്കാം.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />എന്തൊക്കെ ഡാറ്റ ഉപയോഗിക്കുന്നു:<ph name="END_BOLD" /> ഈ ഉപകരണത്തിൽ Chrome ഉപയോഗിച്ച് നിങ്ങൾ സന്ദർശിച്ച സൈറ്റുകളുടെ റെക്കോർഡ് ആയ നിങ്ങളുടെ ബ്രൗസിംഗ് ചരിത്രം.</translation> <translation id="4269820728363426813">ലിങ്ക് വിലാസം പകർത്തുക</translation> <translation id="4283102315569707115">ഡെസ്ക്ടോപ്പ് സൈറ്റുകൾ ഡിഫോൾട്ടായി അഭ്യർത്ഥിക്കണോ?</translation> +<translation id="4285846616383034558">കുക്കികൾ, കാഷെ, മറ്റ് സൈറ്റ് ഡാറ്റ എന്നിവ</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Android ക്രമീകരണത്തിൽ സ്ക്രീൻ ലോക്ക് ഓണാക്കുക<ph name="END_LINK" /></translation> <translation id="4296252229500326964">പുതിയ അദൃശ്യ ടാബ്</translation> <translation id="4298388696830689168">ലിങ്ക് ചെയ്ത സൈറ്റുകൾ</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">വീഡിയോ</translation> <translation id="4766313118839197559">നിങ്ങളുടെ ഈ ഉപകരണത്തിലെ Password Manager-ൽ പാസ്വേഡുകൾ സംരക്ഷിക്കുന്നു</translation> <translation id="4766678251456904326">ഉപകരണത്തിലേക്ക് ഒരു അക്കൗണ്ട് ചേർക്കുക</translation> +<translation id="4767947714785277816">പരസ്യ മെഷർമെന്റ് എന്ന പരസ്യ സ്വകാര്യതയുമായി ബന്ധപ്പെട്ട പുതിയ ഫീച്ചർ ഞങ്ങൾ ലോഞ്ച് ചെയ്യുന്നു. പരസ്യങ്ങളുടെ പ്രകടനം അളക്കാൻ സഹായിക്കുന്നതിന്, എപ്പോഴാണ് പരസ്യം നിങ്ങളെ കാണിച്ചത് എന്നതുപോലുള്ള, വളരെ പരിമിതമായ വിവരങ്ങൾ മാത്രമേ Chrome സൈറ്റുകൾക്കും ആപ്പുകൾക്കും ഇടയിൽ പങ്കിടുന്നുള്ളൂ.</translation> <translation id="4769095993849849966">ഫയലിന്റെ പുതിയ പേര്</translation> <translation id="4778653490315793244">കാണിക്കാൻ ഇതുവരെയൊന്നുമില്ല</translation> <translation id="4787736314074622408">നിങ്ങൾക്ക് <ph name="ITEM_TITLE" /> ഇല്ലാതാക്കണോ?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">തിരയൽ നിർദ്ദേശങ്ങൾ മെച്ചപ്പെടുത്തുക</translation> <translation id="6026538407078977628">പൂർണ്ണസ്ക്രീനിലേക്ക് വികസിപ്പിക്കുക</translation> <translation id="6030719887161080597">പരസ്യ പ്രകടനം അളക്കാൻ സൈറ്റുകൾ ഉപയോഗിക്കുന്ന വിവരങ്ങൾ മാനേജ് ചെയ്യുക</translation> +<translation id="6034146297924778597">കഴിഞ്ഞ 15 മിനിറ്റിലെ ഇനിപ്പറയുന്ന ചരിത്രം ഇല്ലാതാക്കും:</translation> <translation id="6039379616847168523">അടുത്ത ടാബിലേക്ക് പോകുക</translation> <translation id="6040143037577758943">അടയ്ക്കുക</translation> <translation id="604124094241169006">സ്വയമേവ</translation> @@ -1119,6 +1123,7 @@ <translation id="7029809446516969842">പാസ്വേഡുകള്</translation> <translation id="7030304022046916278">URL-കൾ പരിശോധിക്കുന്നതിന് അവ സുരക്ഷിത ബ്രൗസിംഗിലേക്ക് അയയ്ക്കുന്നു</translation> <translation id="7030585293819777123">നിങ്ങളുടെ അവസാനത്തെ ടാസ്ക് പുനരാരംഭിക്കണോ?</translation> +<translation id="7035701931849773472">മറ്റ് ഓപ്ഷനുകൾ</translation> <translation id="7037830628447527439">നിങ്ങളുടെ Google അക്കൗണ്ട് ഉപയോഗിച്ച് Chrome-ൽ സൈൻ ഇൻ ചെയ്യുക</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">ചിത്ര വിവരണങ്ങൾ നേടണോ?</translation> @@ -1341,6 +1346,7 @@ <translation id="8110024788458304985">Chrome-ന്റെ ഫീച്ചറുകളും പ്രകടനവും മെച്ചപ്പെടുത്താൻ സഹായിക്കുക</translation> <translation id="8110087112193408731">ഡിജിറ്റൽ ആരോഗ്യത്തിൽ നിങ്ങളുടെ Chrome ആക്റ്റിവിറ്റി കാണിക്കണോ?</translation> <translation id="8118117428362942925">നിങ്ങൾക്ക് സഹായം ആവശ്യമുണ്ടെങ്കിൽ രക്ഷിതാവിനോട് ചോദിക്കുക (<ph name="PARENT_NAME" />)</translation> +<translation id="8124758083429256800">Chrome, Chrome <ph name="ERROR_DESCRIPTION" /> എന്നിവയിൽ സംരക്ഷിച്ച പാസ്വേഡുകളുടെ ലിസ്റ്റ്, പതിപ്പ് 121-ന് ശേഷമുള്ളവയിലേക്ക് അപ്ഡേറ്റ് ആയിക്കഴിയുമ്പോൾ ലയിപ്പിക്കും. രണ്ട് ആപ്പുകളിലും നിങ്ങൾ സംരക്ഷിച്ച എല്ലാ പാസ്വേഡുകളും സ്വയമേവ പൂരിപ്പിക്കാനാകും.</translation> <translation id="8127542551745560481">ഹോംപേജ് എഡിറ്റ് ചെയ്യുക</translation> <translation id="8130309322784422030">സംഭരിച്ചിരിക്കുന്ന സൈൻ ഇൻ വിവരങ്ങൾ കാലഹരണപ്പെട്ടതാകാം</translation> <translation id="813082847718468539">സൈറ്റ് വിവരങ്ങള് കാണുക</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb index 55f20e5..0885df5 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">А-аас Я руу эрэмбэлэх</translation> <translation id="4195643157523330669">Шинэ таб дээр нээх</translation> <translation id="4196597275619698563">Карт үүсгэх</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{Энэ төхөөрөмжийн 1 таб}other{Энэ төхөөрөмжийн # таб}}</translation> <translation id="4198423547019359126">Татах боломжтой байршил алга</translation> <translation id="4202218894997543208">Таны блоклосон сэдвүүд</translation> <translation id="4214315110991671325">Та күүкиг зөвшөөрсөн тохиолдолд тэдгээрийг Chrome урьдчилан ачаалахад ашиглаж магадгүй.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Ямар өгөгдлийг ашигладаг вэ?:<ph name="END_BOLD" /> Таны хөтчийн түүх буюу энэ төхөөрөмж дээр Chrome-г ашиглан зочилсон сайтуудын бүртгэл.</translation> <translation id="4269820728363426813">Холбоосын хаягийг хуулах</translation> <translation id="4283102315569707115">Өгөгдмөлөөр компьютерын сайтын хүсэлт тавих уу?</translation> +<translation id="4285846616383034558">Күүки, завсрын санах ой болон сайтын бусад өгөгдөл</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Android-н тохиргоонд дэлгэцийн түгжээг асаана уу<ph name="END_LINK" /></translation> <translation id="4296252229500326964">Шинэ Нууцлалтай таб</translation> <translation id="4298388696830689168">Холбоотой сайтууд</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">видео</translation> <translation id="4766313118839197559">Нууц үгнүүдийг энэ төхөөрөмж дээр Нууц үгний менежерт хадгалдаг.</translation> <translation id="4766678251456904326">Төхөөрөмжид бүртгэл нэмэх</translation> +<translation id="4767947714785277816">Бид зарын хэмжилт нэртэй зарын нууцлалын шинэ онцлогийг эхлүүлж байна. Chrome зарын гүйцэтгэлийг хэмжихэд туслахын тулд зарыг танд хэзээ харуулсан зэрэг зөвхөн маш хязгаарлагдмал мэдээллийг сайт болон аппуудтай хуваалцана.</translation> <translation id="4769095993849849966">Файлын шинэ нэр</translation> <translation id="4778653490315793244">Одоогоор харуулах зүйл алга</translation> <translation id="4787736314074622408">Та <ph name="ITEM_TITLE" />-г устгахыг хүсэж байна уу?</translation> @@ -913,6 +916,7 @@ <translation id="6011308810877101166">Хайлтын зөвлөмжийг сайжруулах</translation> <translation id="6026538407078977628">Бүтэн дэлгэц рүү дэлгэх</translation> <translation id="6030719887161080597">Сайтуудын зарын гүйцэтгэлийг хэмжихдээ ашигладаг мэдээллийг удирдах</translation> +<translation id="6034146297924778597">Сүүлийн 15 минутын түүхийг устгана:</translation> <translation id="6039379616847168523">Дараагийн табад очих</translation> <translation id="6040143037577758943">Хаах</translation> <translation id="604124094241169006">Автомат</translation> @@ -1118,6 +1122,7 @@ <translation id="7029809446516969842">Нууц үг</translation> <translation id="7030304022046916278">URL-г шалгуулахаар Аюулгүй үзэх рүү илгээнэ</translation> <translation id="7030585293819777123">Сүүлийн ажлаа үргэлжлүүлэх үү?</translation> +<translation id="7035701931849773472">Бусад сонголт</translation> <translation id="7037830628447527439">Chrome-д Google Бүртгэлээрээ нэвтэрнэ үү</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Зургийн тайлбар авах уу?</translation> @@ -1340,6 +1345,7 @@ <translation id="8110024788458304985">Chrome-н онцлогууд болон гүйцэтгэлийг сайжруулахад туслах</translation> <translation id="8110087112193408731">Chrome-н үйл ажиллагаагаа Дижитал хэрэглээнд харуулах уу?</translation> <translation id="8118117428362942925">Хэрэв танд тусламж хэрэгтэй бол эцэг эхээсээ (<ph name="PARENT_NAME" />) хүснэ үү</translation> +<translation id="8124758083429256800">Таны Chrome-д хадгалсан нууц үгнүүдийн жагсаалт болон Chrome <ph name="ERROR_DESCRIPTION" />-г 121-р хувилбарын дараа нэгтгэнэ. Та хоёр аппад хоёуланд нь хадгалсан бүх нууц үгээ автоматаар бөглөх боломжтой болно.</translation> <translation id="8127542551745560481">Нүүр хуудсыг засах</translation> <translation id="8130309322784422030">Таны хадгалсан нэвтрэх мэдээлэл хуучирсан байж болзошгүй</translation> <translation id="813082847718468539">Сайтын мэдээллийг үзэх</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb index d3f668c..6e58eae4 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">Z မှ A သို့ စီရန်</translation> <translation id="4195643157523330669">တဘ်အသစ်တွင် ဖွင့်ရန်</translation> <translation id="4196597275619698563">ကတ်ပြုလုပ်ရန်</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{ဤစက်ပေါ်ရှိ တဘ် ၁ ခု}other{ဤစက်ပေါ်ရှိ တဘ် # ခု}}</translation> <translation id="4198423547019359126">ဒေါင်းလုဒ်တည်နေရာ မရှိပါ</translation> <translation id="4202218894997543208">သင်ပိတ်ထားသည့် အကြောင်းအရာ</translation> <translation id="4214315110991671325">သင်သည် ကွတ်ကီးများကို ခွင့်ပြုပါက Chrome က ကြိုဖွင့်ခြင်းအတွက် ၎င်းတို့ကို သုံးနိုင်ပါသည်။</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />အသုံးပြုသည့် ဒေတာ-<ph name="END_BOLD" /> ဤစက်တွင် Chrome အသုံးပြု၍ သင်ဝင်ကြည့်ထားသော ဝဘ်ဆိုက်မှတ်တမ်းတစ်ခုဖြစ်သည့် သင်၏ ကြည့်ရှုခြင်းမှတ်တမ်း။</translation> <translation id="4269820728363426813">လင့် လိပ်စာ ကူးယူရန်</translation> <translation id="4283102315569707115">ဒက်စ်တော့ဝဘ်ဆိုက်များကို မူရင်းသတ်မှတ်ချက်အနေဖြင့် တောင်းဆိုမလား။</translation> +<translation id="4285846616383034558">ကွတ်ကီး၊ ကက်ရှ်နှင့် အခြား ဝဘ်ဆိုက်ဒေတာများ</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Android ဆက်တင်များတွင် ဖန်သားပြင်လော့ခ်ဖွင့်ရန်<ph name="END_LINK" /></translation> <translation id="4296252229500326964">ရုပ်ဖျက်တဘ် အသစ်</translation> <translation id="4298388696830689168">လင့်ခ်ချိတ်ထားသော ဝဘ်ဆိုက်များ</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">ဗီဒီယို</translation> <translation id="4766313118839197559">စကားဝှက်များကို ဤစက်ရှိ ‘စကားဝှက်မန်နေဂျာ’ တွင် သိမ်းသည်</translation> <translation id="4766678251456904326">စက်သို့ အကောင့်ထည့်ရန်</translation> +<translation id="4767947714785277816">ကြော်ငြာတိုင်းတာခြင်းဟု ခေါ်သည့် ကြော်ငြာဆိုင်ရာ အချက်အလက်လုံခြုံမှု အင်္ဂါရပ်အသစ်ကို စတင်နေပါသည်။ ကြော်ငြာစွမ်းဆောင်ရည် တိုင်းတာရာတွင် ကူညီရန် သင့်ထံ ကြော်ငြာပြသောအခါကဲ့သို့ ဝဘ်ဆိုက်များနှင့် အက်ပ်အကြားရှိ အချက်အလက်အနည်းငယ်မျှကိုသာ Chrome က မျှဝေသည်။</translation> <translation id="4769095993849849966">ဖိုင်အမည်အသစ်</translation> <translation id="4778653490315793244">ပြစရာ မရှိသေးပါ</translation> <translation id="4787736314074622408"><ph name="ITEM_TITLE" /> ကို ဖျက်လိုပါသလား။</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">ရှာဖွေမှု အကြံပြုချက်များ မွမ်းမံရန်</translation> <translation id="6026538407078977628">ဖန်သားပြင်အပြည့် ချဲ့ရန်</translation> <translation id="6030719887161080597">ကြော်ငြာစွမ်းဆောင်ရည်ကို တိုင်းတာရန်အတွက် ဝဘ်ဆိုက်များမှ သုံးသော အချက်အလက်ကို စီမံရန်</translation> +<translation id="6034146297924778597">ပြီးခဲ့သော ၁၅ မိနစ်မှ မှတ်တမ်းကို ဖျက်မည်-</translation> <translation id="6039379616847168523">နောက်တဘ်သို့ သွားရန်</translation> <translation id="6040143037577758943">ပိတ်ရန်</translation> <translation id="604124094241169006">အလိုအလျောက်</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb index 4e50953..696edc9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb
@@ -1122,6 +1122,7 @@ <translation id="7029809446516969842">पासवर्डहरू</translation> <translation id="7030304022046916278">यो सुविधाले URL सुरक्षित छ कि छैन भनी जाँच गर्नका निम्ति URL हरू Safe Browsing मा पठाउँछ</translation> <translation id="7030585293819777123">तपाईंको पछिल्लो कार्य सुचारु गर्ने हो?</translation> +<translation id="7035701931849773472">अन्य विकल्पहरू</translation> <translation id="7037830628447527439">आफ्नो Google खाता प्रयोग गरी Chrome मा साइन इन गर्नुहोस्</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">फोटोका विवरणहरू प्राप्त गर्न चाहनुहुन्छ?</translation> @@ -1344,6 +1345,7 @@ <translation id="8110024788458304985">Chrome का सुविधाको गुणस्तर र यसको पर्फर्मेन्स सुधार्न मद्दत गर्नुहोस्</translation> <translation id="8110087112193408731">तपाईंले Chrome मा गर्नुभएका क्रियाकलाप डिजिटल वेलबिइङमा देखाउने हो?</translation> <translation id="8118117428362942925">मद्दत चाहिएका खण्डमा आफ्ना अभिभावक (<ph name="PARENT_NAME" />) लाई अनुरोध गर्नुहोस्</translation> +<translation id="8124758083429256800">Chrome र Chrome <ph name="ERROR_DESCRIPTION" /> मा तपाईंका सेभ गरिएका पासवर्डका सूचीहरू संस्करण १२१ देखि मर्ज हुने छन्। तपाईं आफ्ना सेभ गरिएका सबै पासवर्डहरू दुवै एपमा स्वतः भर्न सक्नु हुने छ।</translation> <translation id="8127542551745560481">गृहपृष्ठ सम्पदान गर्नुहोस्</translation> <translation id="8130309322784422030">तपाईंले भण्डारण गर्नुभएको युजरनेम र पासवर्ड पुरानो हुन सक्छ</translation> <translation id="813082847718468539">साइट जानकारी हेर्नुहोस्</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb index 604616e..21cc24c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
@@ -1123,6 +1123,7 @@ <translation id="7029809446516969842">Wachtwoorden</translation> <translation id="7030304022046916278">Stuurt URL's naar Safe Browsing om deze te checken</translation> <translation id="7030585293819777123">Doorgaan met je laatste taak?</translation> +<translation id="7035701931849773472">Andere opties</translation> <translation id="7037830628447527439">Log in bij Chrome met je Google-account</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Afbeeldingsbeschrijvingen ophalen?</translation> @@ -1345,6 +1346,7 @@ <translation id="8110024788458304985">Help de functies en prestaties van Chrome te verbeteren</translation> <translation id="8110087112193408731">Chrome-activiteit in Digitaal welzijn bekijken?</translation> <translation id="8118117428362942925">Vraag zo nodig je ouder (<ph name="PARENT_NAME" />) om hulp</translation> +<translation id="8124758083429256800">Je lijsten met opgeslagen wachtwoorden voor Chrome en Chrome <ph name="ERROR_DESCRIPTION" /> worden samengevoegd na versie 121. Je kunt al je opgeslagen wachtwoorden dan automatisch invullen in beide apps.</translation> <translation id="8127542551745560481">Homepage bewerken</translation> <translation id="8130309322784422030">Je opgeslagen inloggegevens zijn misschien verouderd</translation> <translation id="813082847718468539">Sitegegevens bekijken</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb index a8fc6ef..dfd2697 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
@@ -17,6 +17,7 @@ <translation id="1100066534610197918">Åpne i en ny fane i en gruppe</translation> <translation id="1103142993930332957">Vil du bidra til å gjøre Chrome bedre?</translation> <translation id="1105960400813249514">Skjermdump</translation> +<translation id="1108214977745280468">Se sidestatistikk</translation> <translation id="1108938384783527433">Loggsynkronisering</translation> <translation id="1110914759170138831">Markeringen ble forkortet</translation> <translation id="1111673857033749125">Bokmerker som er lagret på de andre enhetene dine, vises her.</translation> @@ -66,6 +67,7 @@ <translation id="1303507811548703290"><ph name="DOMAIN" /> – sendt fra <ph name="DEVICE_NAME" /></translation> <translation id="1311657260431405215">Denne QR-koden er ikke noen nettadresse: <ph name="QRCODEVALUE" /></translation> <translation id="1316212908214730110">chrome_stylized_highlight_</translation> +<translation id="131655401280401879">Den lagrede informasjonen din slettes hvis du fjerner profillåsen senere.</translation> <translation id="1320912611264252795">Mapper med flyt for lagring av bokmerke er åpnet i full høyde</translation> <translation id="1327257854815634930">Navigasjonsloggen er åpnet</translation> <translation id="1331212799747679585">Kan ikke oppdatere Chrome. Flere alternativer</translation> @@ -180,6 +182,7 @@ <translation id="1995884366040846621">For at du skal kunne fortsette, må <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> dele navnet ditt, e-postadressen din og profilbildet ditt med dette nettstedet. Se nettstedets <ph name="BEGIN_LINK1" />personvernregler<ph name="END_LINK1" />.</translation> <translation id="200114059308480249">Vil du inkludere omliggende tekst i Google-søk?</translation> <translation id="2009341475524975924">For å måle resultatene for en annonse kan begrensede typer data deles mellom nettsteder, for eksempel klokkeslettet da du ble vist en annonse.</translation> +<translation id="201060170519281460">Profillåsen holder informasjonen din sikker i bilen, inkludert synkroniserte passord, betalinger med mer.</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# fil}other{# filer}}</translation> <translation id="2021896219286479412">Navigering i full skjerm</translation> <translation id="2038563949887743358">Slå på Bruk skrivebordsversjon</translation> @@ -257,6 +260,7 @@ <translation id="250020030759455918">Du kommer til å se påloggingsstatus, nettlesingsdata og nettstedsdata for <ph name="SITE_NAME" /> i Chrome</translation> <translation id="2510106555128151389">Installerer <ph name="WEBAPK_NAME" /> …</translation> <translation id="2513403576141822879">Se <ph name="BEGIN_LINK" />Synkronisering og Google tjenester<ph name="END_LINK" /> for flere innstillinger knyttet til personvern, sikkerhet og datainnsamling.</translation> +<translation id="2517113738956581680">Felt i full størrelse</translation> <translation id="2517472476991765520">Skann</translation> <translation id="2523184218357549926">Sender Google nettadressene til sider du besøker</translation> <translation id="2527209463677295330">Hvis du inkluderer mer av teksten på siden, kan det hende du får bedre resultater</translation> @@ -281,6 +285,7 @@ Med private tilstandstokener får du bedre personvern på nettet, og de kan ikke brukes til å finne ut hvem du er.</translation> <translation id="2581165646603367611">Dette sletter informasjonskapsler, buffere og annen data fra nettsteder Chrome ikke tror er viktige.</translation> <translation id="2587052924345400782">En nyere versjon er tilgjengelig</translation> +<translation id="2589302627584222634">Opprett en profillås</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">Logg på for å administrere preferansene dine</translation> <translation id="260403163289591229">Følger</translation> @@ -542,6 +547,7 @@ <translation id="4035877632587724847">Ikke tillat</translation> <translation id="4036177530563778041">Du kan enkelt fortsette der du slapp</translation> <translation id="4042941173059740150">Fortsett til <ph name="SITE_ETLD_PLUS_ONE" /> med <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /></translation> +<translation id="4044708993631234325">Felt nederst</translation> <translation id="4045764304651014138">Bruksdata</translation> <translation id="405399507749852140">Få varsler hvis prisen settes ned på noe nettsted</translation> <translation id="4056223980640387499">Sepia</translation> @@ -846,6 +852,7 @@ <translation id="564667659802381754">Personvernveiledning <ph name="BEGIN_NEW" />Nyhet<ph name="END_NEW" /></translation> <translation id="5648166631817621825">Siste 7 dager</translation> <translation id="5655963694829536461">Søk i nedlastingene dine</translation> +<translation id="5657871969392618475">Informasjonen din er sikret med en profillås</translation> <translation id="5659593005791499971">E-post</translation> <translation id="5665379678064389456">Opprett en aktivitet i <ph name="APP_NAME" /></translation> <translation id="5683547024293500885">Chrome kan ikke se etter oppdateringer</translation> @@ -909,6 +916,7 @@ <translation id="5964869237734432770">Stopp bildebeskrivelser</translation> <translation id="5966233851250124270">Chrome husker valget ditt</translation> <translation id="5979084224081478209">Kontroller passordene</translation> +<translation id="5985186846584605773">Opprett en profillås for bilen din</translation> <translation id="5995726099713306770">Vil du laste ned siden på nytt?</translation> <translation id="6000066717592683814">Behold Google</translation> <translation id="6000203700195075278">Følg på nytt</translation> @@ -1137,6 +1145,7 @@ <translation id="7088681679121566888">Chrome er oppdatert</translation> <translation id="7105047059074518658">Logg på for å surfe lettere på flere enheter</translation> <translation id="7106762743910369165">Nettleseren administreres av organisasjonen din</translation> +<translation id="7116420572655804716">For å synkronisere informasjonen din og holde dataene dine sikre i bilen må du opprette en profillås i sikkerhetsinnstillingene. Du bruker en kode eller et passord hver gang du setter deg inn i bilen.</translation> <translation id="7116588989735740310">Synkroniser fanene og loggen din for å gå tilbake til nettsteder du har besøkt på andre enheter</translation> <translation id="7130504491556983216">En liste over interesser vises her mens du surfer på nettet</translation> <translation id="7138678301420049075">Annet</translation> @@ -1358,6 +1367,7 @@ <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Enhetene dine<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8200772114523450471">Fortsett</translation> <translation id="8209050860603202033">Åpne bildet</translation> +<translation id="8215740705341534369">Sidefelt</translation> <translation id="8218622182176210845">Administrer kontoen din</translation> <translation id="8221401890884589479">Du kan blokkere nettsteder du ikke vil ha. Dessuten sletter Chrome automatisk nettsteder som er eldre enn 30 dager, fra listen. <ph name="BEGIN_LINK" />Finn ut mer<ph name="END_LINK" /></translation> <translation id="8223642481677794647">Feedkortmeny</translation> @@ -1560,6 +1570,7 @@ <translation id="932327136139879170">Gå til startsiden</translation> <translation id="938850635132480979">Feil: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Angi en passordfrase</translation> +<translation id="950679278154734362">For å synkronisere informasjonen din og holde dataene dine sikre i bilen må du opprette en profillås. Du bruker en kode eller et passord hver gang du setter deg inn i bilen.</translation> <translation id="95817756606698420">Chrome kan bruke <ph name="BEGIN_BOLD" />Sogou<ph name="END_BOLD" /> for søk i Kina. Du kan endre dette i <ph name="BEGIN_LINK" />Innstillinger<ph name="END_LINK" />.</translation> <translation id="962979164594783469">Installer denne appen</translation> <translation id="96681097142096641">Vil du se den forenklede siden?</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 4a39e05..4b946b9 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
@@ -1119,6 +1119,7 @@ <translation id="7029809446516969842">ପାସୱାର୍ଡଗୁଡିକ</translation> <translation id="7030304022046916278">URLଗୁଡ଼ିକ ଯାଞ୍ଚ କରିବା ପାଇଁ ସେଗୁଡ଼ିକୁ ସୁରକ୍ଷିତ ବ୍ରାଉଜିଂକୁ ପଠାଏ</translation> <translation id="7030585293819777123">ଆପଣଙ୍କ ପୂର୍ବବର୍ତ୍ତୀ ଟାସ୍କ ପୁଣି ଆରମ୍ଭ କରିବେ?</translation> +<translation id="7035701931849773472">ଅନ୍ୟ ବିକଳ୍ପଗୁଡ଼ିକ</translation> <translation id="7037830628447527439">ଆପଣଙ୍କ Google ଆକାଉଣ୍ଟ ମାଧ୍ୟମରେ Chromeରେ ସାଇନ ଇନ କରନ୍ତୁ</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">ଛବିର ବର୍ଣ୍ଣନା ପାଇବାକୁ ଚାହାଁନ୍ତି କି?</translation> @@ -1341,6 +1342,7 @@ <translation id="8110024788458304985">Chromeର ଫିଚର ଏବଂ ପରଫରମାନ୍ସକୁ ଉନ୍ନତ କରିବାରେ ସାହାଯ୍ୟ କରନ୍ତୁ</translation> <translation id="8110087112193408731">ଡିଜିଟାଲ୍ ୱେଲ୍ବିଂରେ ଆପଣଙ୍କର Chrome କାର୍ଯ୍ୟକଳାପ ଦେଖାଇବେ?</translation> <translation id="8118117428362942925">ଯଦି ତୁମେ ସହାୟତା ଆବଶ୍ୟକ କର, ତେବେ ତୁମ ବାପାମା (<ph name="PARENT_NAME" />)ଙ୍କୁ କୁହ</translation> +<translation id="8124758083429256800">Chrome ଏବଂ Chrome <ph name="ERROR_DESCRIPTION" /> ପାଇଁ ଆପଣଙ୍କ ସେଭ କରାଯାଇଥିବା ପାସୱାର୍ଡଗୁଡ଼ିକର ତାଲିକା ଭର୍ସନ 121 ପରେ ମର୍ଜ ହେବ। ଆପଣ ଆପଣଙ୍କର ସମସ୍ତ ସେଭ କରାଯାଇଥିବା ପାସୱାର୍ଡକୁ ଉଭୟ ଆପ୍ସରେ ଅଟୋଫିଲ କରିବାକୁ ସକ୍ଷମ ହେବେ।</translation> <translation id="8127542551745560481">ମୂଳପୃଷ୍ଠାକୁ ସମ୍ପାଦନ କରନ୍ତୁ</translation> <translation id="8130309322784422030">ଆପଣ ଷ୍ଟୋର୍ କରିଥିବା ସାଇନ୍-ଇନ୍ ସୂଚନା ପୁରୁଣା ହୋଇଥାଇପାରେ</translation> <translation id="813082847718468539">ସାଇଟ୍ର ସୂଚନା ଦେଖନ୍ତୁ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb index dd54357..34644884 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">Z-A ਮੁਤਾਬਕ ਕ੍ਰਮ-ਬੱਧ ਕਰੋ</translation> <translation id="4195643157523330669">ਨਵੀਂ ਟੈਬ ਵਿੱਚ ਖੋਲ੍ਹੋ</translation> <translation id="4196597275619698563">ਕਾਰਡ ਬਣਾਓ</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{ਇਸ ਡੀਵਾਈਸ 'ਤੇ 1 ਟੈਬ}one{ਇਸ ਡੀਵਾਈਸ 'ਤੇ # ਟੈਬ}other{ਇਸ ਡੀਵਾਈਸ 'ਤੇ # ਟੈਬਾਂ}}</translation> <translation id="4198423547019359126">ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਕੋਈ ਟਿਕਾਣਾ ਉਪਲਬਧ ਨਹੀਂ ਹੈ</translation> <translation id="4202218894997543208">ਤੁਹਾਡੇ ਵੱਲੋਂ ਬਲਾਕ ਕੀਤੇ ਗਏ ਵਿਸ਼ੇ</translation> <translation id="4214315110991671325">ਜੇ ਤੁਸੀਂ ਕੁਕੀਜ਼ ਦੀ ਆਗਿਆ ਦਿੰਦੇ ਹੋ, ਤਾਂ Chrome ਉਨ੍ਹਾਂ ਨੂੰ ਪ੍ਰੀਲੋਡ ਕਰਨ ਲਈ ਵਰਤ ਸਕਦਾ ਹੈ।</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />ਕਿਹੜਾ ਡਾਟਾ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ:<ph name="END_BOLD" /> ਤੁਹਾਡਾ ਬ੍ਰਾਊਜ਼ਿੰਗ ਇਤਿਹਾਸ, ਇਸ ਡੀਵਾਈਸ 'ਤੇ ਉਨ੍ਹਾਂ ਸਾਈਟਾਂ ਦਾ ਰਿਕਾਰਡ ਜਿਨ੍ਹਾਂ 'ਤੇ ਤੁਸੀਂ Chrome ਦੀ ਵਰਤੋਂ ਨਾਲ ਗਏ ਹੋ।</translation> <translation id="4269820728363426813">ਲਿੰਕ ਪਤਾ ਕਾਪੀ ਕਰੋ</translation> <translation id="4283102315569707115">ਕੀ ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਤੌਰ 'ਤੇ ਡੈਸਕਟਾਪ ਸਾਈਟਾਂ ਦੀ ਬੇਨਤੀ ਕਰਨੀ ਹੈ?</translation> +<translation id="4285846616383034558">ਕੁਕੀਜ਼, ਕੈਸ਼ੇ ਅਤੇ ਹੋਰ ਸਾਈਟ ਡਾਟਾ</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Android ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਸਕ੍ਰੀਨ ਲਾਕ ਚਾਲੂ ਕਰੋ<ph name="END_LINK" /></translation> <translation id="4296252229500326964">ਨਵੀਂ ਇਨਕੋਗਨਿਟੋ ਟੈਬ</translation> <translation id="4298388696830689168">ਲਿੰਕ ਕੀਤੀਆਂ ਸਾਈਟਾਂ</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">ਵੀਡਿਓ</translation> <translation id="4766313118839197559">ਪਾਸਵਰਡ ਇਸ ਡੀਵਾਈਸ ਦੇ ਪਾਸਵਰਡ ਪ੍ਰਬੰਧਕ ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤੇ ਗਏ ਹਨ</translation> <translation id="4766678251456904326">ਡੀਵਾਈਸ ਵਿੱਚ ਖਾਤਾ ਸ਼ਾਮਲ ਕਰੋ</translation> +<translation id="4767947714785277816">ਅਸੀਂ ਵਿਗਿਆਪਨ ਪਰਦੇਦਾਰੀ ਸੰਬੰਧੀ ਨਵੀਂ ਵਿਸ਼ੇਸ਼ਤਾ ਲਾਂਚ ਕਰ ਰਹੇ ਹਾਂ ਜਿਨ੍ਹਾਂ ਨੂੰ ਵਿਗਿਆਪਨ ਮਾਪ ਕਹਿੰਦੇ ਹਨ। Chrome ਸਾਈਟਾਂ ਅਤੇ ਐਪਾਂ ਵਿਚਕਾਰ ਬਹੁਤ ਹੀ ਸੀਮਤ ਜਾਣਕਾਰੀ ਨੂੰ ਸਾਂਝਾ ਕਰਦਾ ਹੈ, ਜਿਵੇਂ ਕਿ ਜਦੋਂ ਤੁਹਾਨੂੰ ਕੋਈ ਵਿਗਿਆਪਨ ਦਿਖਾਇਆ ਗਿਆ ਸੀ, ਤਾਂ ਜੋ ਵਿਗਿਆਪਨਾਂ ਦੀ ਕਾਰਗੁਜ਼ਾਰੀ ਦਾ ਮੁਲਾਂਕਣ ਕਰਨ ਵਿੱਚ ਮਦਦ ਕੀਤੀ ਜਾ ਸਕੇ।</translation> <translation id="4769095993849849966">ਨਵਾਂ ਫ਼ਾਈਲ ਨਾਮ</translation> <translation id="4778653490315793244">ਹਾਲੇ ਦਿਖਾਉਣ ਲਈ ਕੁਝ ਨਹੀਂ ਹੈ</translation> <translation id="4787736314074622408">ਕੀ ਤੁਸੀਂ <ph name="ITEM_TITLE" /> ਨੂੰ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">ਖੋਜ ਸੁਝਾਵਾਂ ਨੂੰ ਬਿਹਤਰ ਬਣਾਓ</translation> <translation id="6026538407078977628">ਪੂਰੀ-ਸਕ੍ਰੀਨ 'ਤੇ ਵਿਸਤਾਰ ਕਰੋ</translation> <translation id="6030719887161080597">ਵਿਗਿਆਪਨ ਦੀ ਕਾਰਗੁਜ਼ਾਰੀ ਨੂੰ ਮਾਪਣ ਲਈ ਸਾਈਟ ਵੱਲੋਂ ਵਰਤੀ ਗਈ ਜਾਣਕਾਰੀ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ</translation> +<translation id="6034146297924778597">ਪਿਛਲੇ 15 ਮਿੰਟਾਂ ਵਾਲਾ ਇਤਿਹਾਸ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ:</translation> <translation id="6039379616847168523">ਅਗਲੀ ਟੈਬ 'ਤੇ ਜਾਓ</translation> <translation id="6040143037577758943">ਬੰਦ ਕਰੋ</translation> <translation id="604124094241169006">ਆਟੋਮੈਟਿਕ</translation> @@ -1119,6 +1123,7 @@ <translation id="7029809446516969842">ਪਾਸਵਰਡ</translation> <translation id="7030304022046916278">URL ਦੀ ਜਾਂਚ ਕਰਨ ਲਈ ਇਹ ਸੁਰੱਖਿਅਤ ਬ੍ਰਾਊਜ਼ਿੰਗ ਨੂੰ ਭੇਜੇ ਜਾਂਦੇ ਹਨ</translation> <translation id="7030585293819777123">ਕੀ ਤੁਹਾਡੇ ਪਿਛਲੇ ਕਾਰਜ ਨੂੰ ਮੁੜ-ਚਾਲੂ ਕਰਨਾ ਹੈ?</translation> +<translation id="7035701931849773472">ਹੋਰ ਵਿਕਲਪ</translation> <translation id="7037830628447527439">ਆਪਣੇ Google ਖਾਤੇ ਨਾਲ Chrome ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰੋ</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">ਕੀ ਚਿੱਤਰ ਵਰਣਨ ਪ੍ਰਾਪਤ ਕਰਨੇ ਹਨ?</translation> @@ -1341,6 +1346,7 @@ <translation id="8110024788458304985">Chrome ਦੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਅਤੇ ਕਾਰਗੁਜ਼ਾਰੀ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਵਿੱਚ ਮਦਦ ਕਰੋ</translation> <translation id="8110087112193408731">ਕੀ ਤੁਸੀਂ ਡਿਜੀਟਲ ਜੀਵਨਸ਼ੈਲੀ ਵਿੱਚ ਆਪਣੀ Chrome ਸਰਗਰਮੀ ਦਿਖਾਉਣੀ ਹੈ?</translation> <translation id="8118117428362942925">ਜੇ ਤੁਹਾਨੂੰ ਮਦਦ ਦੀ ਲੋੜ ਹੈ, ਤਾਂ ਆਪਣੇ ਮਾਂ-ਪਿਓ (<ph name="PARENT_NAME" />) ਨੂੰ ਕਹੋ</translation> +<translation id="8124758083429256800">Chrome ਅਤੇ Chrome <ph name="ERROR_DESCRIPTION" /> ਲਈ ਤੁਹਾਡੇ ਰੱਖਿਅਤ ਕੀਤੇ ਪਾਸਵਰਡਾਂ ਦੀਆਂ ਸੂਚੀਆਂ ਨੂੰ ਵਰਜਨ 121 ਤੋਂ ਬਾਅਦ ਮਿਲਾ ਦਿੱਤਾ ਜਾਵੇਗਾ। ਤੁਸੀਂ ਦੋਵਾਂ ਐਪਾਂ 'ਤੇ ਆਪਣੇ ਸਾਰੇ ਰੱਖਿਅਤ ਕੀਤੇ ਪਾਸਵਰਡਾਂ ਨੂੰ ਆਟੋਫਿਲ ਕਰ ਸਕੋਗੇ।</translation> <translation id="8127542551745560481">ਹੋਮਪੇਜ ਦਾ ਸੰਪਾਦਨ ਕਰੋ</translation> <translation id="8130309322784422030">ਤੁਹਾਡੇ ਵੱਲੋਂ ਸਟੋਰ ਕੀਤੀ ਸਾਈਨ-ਇਨ ਜਾਣਕਾਰੀ ਸ਼ਾਇਦ ਪੁਰਾਣੀ ਹੋਵੇ</translation> <translation id="813082847718468539">ਸਾਈਟ ਜਾਣਕਾਰੀ ਦੇਖੋ</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 3a5932ba..5fa5dba7 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
@@ -17,6 +17,7 @@ <translation id="1100066534610197918">Deschide în filă nouă în grup</translation> <translation id="1103142993930332957">Ajuți la îmbunătățirea Chrome?</translation> <translation id="1105960400813249514">Captură de ecran</translation> +<translation id="1108214977745280468">Vezi statisticile privind paginile</translation> <translation id="1108938384783527433">Sincronizarea istoricului</translation> <translation id="1110914759170138831">Evidențierea a fost scurtată</translation> <translation id="1111673857033749125">Marcajele salvate pe alte dispozitive vor apărea aici.</translation> @@ -66,6 +67,7 @@ <translation id="1303507811548703290"><ph name="DOMAIN" /> – Trimis de la <ph name="DEVICE_NAME" /></translation> <translation id="1311657260431405215">Acest cod QR nu este o adresă URL: <ph name="QRCODEVALUE" /></translation> <translation id="1316212908214730110">evidențiere_stilizată_chrome</translation> +<translation id="131655401280401879">Informațiile salvate vor fi șterse dacă elimini mai târziu blocarea profilului.</translation> <translation id="1320912611264252795">Fluxul de salvare a marcajului în folder deschis la înălțimea completă</translation> <translation id="1327257854815634930">Istoricul de navigare este deschis</translation> <translation id="1331212799747679585">Chrome nu se poate actualiza. Mai multe opțiuni</translation> @@ -180,6 +182,7 @@ <translation id="1995884366040846621">Pentru a continua, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> va permite accesul site-ului la numele, adresa de e-mail și fotografia ta de profil. Consultă <ph name="BEGIN_LINK1" />politica de confidențialitate<ph name="END_LINK1" /> a site-ului.</translation> <translation id="200114059308480249">Incluzi text din jur în căutările de pe Google?</translation> <translation id="2009341475524975924">Pentru a măsura performanța unui anunț, se pot trimite tipuri de date limitate între site-uri, cum ar fi ora la care ți-a fost afișat un anunț.</translation> +<translation id="201060170519281460">Blocarea profilului îți menține informațiile în siguranță în mașină, inclusiv parolele sincronizate, plățile și multe altele.</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{Un fișier}few{# fișiere}other{# de fișiere}}</translation> <translation id="2021896219286479412">Comenzi site în ecran complet</translation> <translation id="2038563949887743358">Activează opțiunea Versiune site pentru desktop</translation> @@ -257,6 +260,7 @@ <translation id="250020030759455918">Vei vedea starea de conectare la <ph name="SITE_NAME" />, datele de navigare și datele privind site-ul în Chrome</translation> <translation id="2510106555128151389">Se instalează <ph name="WEBAPK_NAME" />...</translation> <translation id="2513403576141822879">Pentru mai multe setări privind confidențialitatea, securitatea și colectarea datelor, consultă <ph name="BEGIN_LINK" />Sincronizare și servicii Google<ph name="END_LINK" /></translation> +<translation id="2517113738956581680">Foaie de dimensiune completă</translation> <translation id="2517472476991765520">Scanează</translation> <translation id="2523184218357549926">Trimite la Google adresele URL ale paginilor pe care le accesezi</translation> <translation id="2527209463677295330">Dacă incluzi mai mult din textul paginii, ai putea vedea rezultate mai bune</translation> @@ -281,6 +285,7 @@ Indicativele de stare private îmbunătățesc confidențialitatea pe web și nu pot fi folosite pentru a afla cine ești.</translation> <translation id="2581165646603367611">Astfel, vor fi șterse cookie-urile, memoria cache și alte date ale site-urilor pe care Chrome nu le consideră importante.</translation> <translation id="2587052924345400782">Este disponibilă o versiune mai nouă</translation> +<translation id="2589302627584222634">Creează o blocare a profilului</translation> <translation id="2593272815202181319">Un singur spațiu</translation> <translation id="2603212228005142861">Conectează-te pentru a-ți gestiona preferințele</translation> <translation id="260403163289591229">Urmărești</translation> @@ -542,6 +547,7 @@ <translation id="4035877632587724847">Nu permite</translation> <translation id="4036177530563778041">Continuă cu ușurință de unde ai rămas</translation> <translation id="4042941173059740150">Continuă la <ph name="SITE_ETLD_PLUS_ONE" /> cu <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /></translation> +<translation id="4044708993631234325">Foaia din partea de jos</translation> <translation id="4045764304651014138">Date de utilizare</translation> <translation id="405399507749852140">Primește alerte dacă prețul scade pe orice site</translation> <translation id="4056223980640387499">Sepia</translation> @@ -846,6 +852,7 @@ <translation id="564667659802381754">Ghid privind confidențialitatea <ph name="BEGIN_NEW" />Nou<ph name="END_NEW" /></translation> <translation id="5648166631817621825">Ultimele 7 zile</translation> <translation id="5655963694829536461">Caută în descărcări</translation> +<translation id="5657871969392618475">Informațiile tale sunt securizate cu o blocare a profilului</translation> <translation id="5659593005791499971">Adresă de e-mail</translation> <translation id="5665379678064389456">Creează un eveniment în <ph name="APP_NAME" /></translation> <translation id="5683547024293500885">Chrome nu poate căuta actualizări</translation> @@ -909,6 +916,7 @@ <translation id="5964869237734432770">Nu genera descrieri imagine</translation> <translation id="5966233851250124270">Chrome îți va memora alegerea</translation> <translation id="5979084224081478209">Verifică parolele</translation> +<translation id="5985186846584605773">Creează o blocare a profilului pentru mașină</translation> <translation id="5995726099713306770">Descarci pagina din nou?</translation> <translation id="6000066717592683814">Păstrează Google</translation> <translation id="6000203700195075278">Urmărește din nou</translation> @@ -1137,6 +1145,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="7116420572655804716">Pentru a sincroniza informațiile și a păstra datele în siguranță în mașină, trebuie să creezi o blocare pentru profil în setările de securitate. Vei folosi un cod sau o parolă de fiecare dată când intri în mașină.</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> @@ -1358,6 +1367,7 @@ <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Dispozitivele tale<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8200772114523450471">Reia</translation> <translation id="8209050860603202033">Deschideți imaginea</translation> +<translation id="8215740705341534369">Foaie laterală</translation> <translation id="8218622182176210845">Gestionează contul</translation> <translation id="8221401890884589479">Poți să blochezi site-urile pe care nu le dorești. În plus, Chrome șterge automat site-urile din listă mai vechi de 30 de zile. <ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /></translation> <translation id="8223642481677794647">Meniul cardului din feed</translation> @@ -1560,6 +1570,7 @@ <translation id="932327136139879170">Pagina de pornire</translation> <translation id="938850635132480979">Eroare: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Introdu expresia de acces</translation> +<translation id="950679278154734362">Pentru a sincroniza informațiile și a păstra datele în siguranță în mașină, trebuie să creezi o blocare a profilului. Vei folosi un cod sau o parolă de fiecare dată când intri în mașină.</translation> <translation id="95817756606698420">Chrome poate să folosească <ph name="BEGIN_BOLD" />Sogou<ph name="END_BOLD" /> pentru căutare în China. Poți să schimbi acest lucru din <ph name="BEGIN_LINK" />Setări<ph name="END_LINK" />.</translation> <translation id="962979164594783469">Instalează aplicația</translation> <translation id="96681097142096641">Vrei să afișezi pagina simplificată?</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 7851e8f..6161dcd 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
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">По алфавиту (от Я до А)</translation> <translation id="4195643157523330669">Открыть в новой вкладке</translation> <translation id="4196597275619698563">Создать карточку</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{1 вкладка на этом устройстве}one{# вкладка на этом устройстве}few{# вкладки на этом устройстве}many{# вкладок на этом устройстве}other{# вкладки на этом устройстве}}</translation> <translation id="4198423547019359126">Нет доступных мест для скачивания</translation> <translation id="4202218894997543208">Заблокированные темы</translation> <translation id="4214315110991671325">Если вы разрешили использование файлов cookie, Chrome может применять их для предзагрузки.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Какие данные используются.<ph name="END_BOLD" /> История вашего браузера – список сайтов, которые вы открывали в браузере Chrome на этом устройстве.</translation> <translation id="4269820728363426813">Копировать адрес ссылки</translation> <translation id="4283102315569707115">Запрашивать полные версии сайтов по умолчанию?</translation> +<translation id="4285846616383034558">Файлы cookie, кеш и другие данные сайтов</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Включить блокировку экрана в настройках Android<ph name="END_LINK" /></translation> <translation id="4296252229500326964">Новая вкладка инкогнито</translation> <translation id="4298388696830689168">Связанные сайты</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">видео</translation> <translation id="4766313118839197559">Пароли сохранены в Менеджере паролей на этом устройстве.</translation> <translation id="4766678251456904326">Добавить аккаунт на устройство</translation> +<translation id="4767947714785277816">Мы запускаем новую функцию конфиденциальности в рекламе. Теперь для оценки эффективности рекламы сайты и приложения будут получать от Chrome только определенные данные, например сведения о времени, когда вам была показана реклама.</translation> <translation id="4769095993849849966">Новое название файла</translation> <translation id="4778653490315793244">Контент отсутствует</translation> <translation id="4787736314074622408">Удалить файл "<ph name="ITEM_TITLE" />"?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">Улучшать подсказки при поиске</translation> <translation id="6026538407078977628">Перейти в полноэкранный режим</translation> <translation id="6030719887161080597">Управление информацией, которая помогает оценивать эффективность рекламы на сайтах</translation> +<translation id="6034146297924778597">Указанные ниже сведения будут удалены.</translation> <translation id="6039379616847168523">Перейти к следующей вкладке</translation> <translation id="6040143037577758943">Закрыть</translation> <translation id="604124094241169006">Автоматически</translation> @@ -1119,6 +1123,7 @@ <translation id="7029809446516969842">Пароли</translation> <translation id="7030304022046916278">Обеспечивает отправку URL на проверку по критериям Безопасного просмотра.</translation> <translation id="7030585293819777123">Восстановить последний сеанс?</translation> +<translation id="7035701931849773472">Другие варианты</translation> <translation id="7037830628447527439">Войдите в Chrome, используя аккаунт Google</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Генерировать описания изображений?</translation> @@ -1341,6 +1346,7 @@ <translation id="8110024788458304985">Помогать повышать производительность и улучшать функции Chrome</translation> <translation id="8110087112193408731">Показать данные о ваших действиях в Chrome в сервисе "Цифровое благополучие"?</translation> <translation id="8118117428362942925">Если тебе нужна помощь, обратись к родителю (<ph name="PARENT_NAME" />)</translation> +<translation id="8124758083429256800">Ваши списки сохраненных паролей для Chrome и Chrome <ph name="ERROR_DESCRIPTION" /> будут объединены после выхода версии 121. Вы сможете вставлять сохраненные пароли в обоих приложениях с помощью функции автозаполнения.</translation> <translation id="8127542551745560481">Изменить главную страницу</translation> <translation id="8130309322784422030">Сохраненные учетные данные могли устареть.</translation> <translation id="813082847718468539">Сведения о сайте</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb index 274a620d..81cbb29 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">Z සිට A දක්වා වර්ග කරන්න</translation> <translation id="4195643157523330669">නව ටැබයක විවෘත කරන්න</translation> <translation id="4196597275619698563">කාඩ්පත තනන්න</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{මෙම උපාංගයෙහි 1 පටිත්තක්}one{මෙම උපාංගයෙහි පටිති #ක්}other{මෙම උපාංගයෙහි පටිති #ක්}}</translation> <translation id="4198423547019359126">බාගැනීම් ස්ථාන කිසිවක් නැත</translation> <translation id="4202218894997543208">ඔබ අවහිර කළ මාතෘකා</translation> <translation id="4214315110991671325">ඔබ කුකිවලට ඉඩ දුනහොත්, Chrome ඒවා පූර්ව පූරණය සඳහා භාවිත කළ හැකිය.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />භාවිත කරන දත්ත මොනවාද:<ph name="END_BOLD" /> ඔබගේ බ්රවුස් කිරීමේ ඉතිහාසය, මෙම උපාංගයේ Chrome භාවිතයෙන් ඔබ පිවිසි අඩවිවල වාර්තාවක්.</translation> <translation id="4269820728363426813">ලින්ක් ලිපිනය පිටපත් කරන්න</translation> <translation id="4283102315569707115">පෙරනිමියෙන් ඩෙස්ක්ටොප් අඩවි ඉල්ලන්න ද?</translation> +<translation id="4285846616383034558">කුකීස්, කෑෂය, සහ අනෙකුත් අඩවි දත්ත</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Android සැකසීම් තුළ තිර අගුල ක්රියාත්මක කරන්න<ph name="END_LINK" /></translation> <translation id="4296252229500326964">නව අප්රකට ටැබය</translation> <translation id="4298388696830689168">සබැඳි කළ වෙබ් අඩවි</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">වීඩියෝ</translation> <translation id="4766313118839197559">මුරපද මෙම උපාංගයේ මුරපද කළමනාකරු තුළ සුරැකේ</translation> <translation id="4766678251456904326">උපාංගයට ගිණුමක් එක් කරන්න</translation> +<translation id="4767947714785277816">අපි දැන්වීම් මැනීම නමින් නව දැන්වීම් පෞද්ගලිකත්ව විශේෂාංගයක් දියත් කරන්නෙමු. දැන් Chrome දැන්වීම්වල කාර්ය සාධනය මැනීමට උදවු කිරීම සඳහා, ඔබට දැන්වීමක් පෙන්වූ විට වැනි, ඉතා සීමිත තොරතුරු පමණක් අඩවි සහ යෙදුම් අතර බෙදා ගනී.</translation> <translation id="4769095993849849966">නව ගොනුවේ නම</translation> <translation id="4778653490315793244">තවම පෙන්වීමට කිසිවක් නැත</translation> <translation id="4787736314074622408">ඔබට <ph name="ITEM_TITLE" /> මැකීමට අවශ්ය ද?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">සෙවීම් යෝජනා වැඩි දියුණු කරන්න</translation> <translation id="6026538407078977628">පූර්ණ තිරයට දිග හරින්න</translation> <translation id="6030719887161080597">දැන්වීම් කාර්ය සාධනය මැනීමට අඩවි විසින් භාවිතා කරන තතු කළමනාකරණය කරන්න</translation> +<translation id="6034146297924778597">පසුගිය විනාඩි 15 ඉතිහාසය මකනු ඇත:</translation> <translation id="6039379616847168523">ඊළඟ ටැබය වෙත පනින්න</translation> <translation id="6040143037577758943">වසන්න</translation> <translation id="604124094241169006">ස්වයංක්රීය</translation> @@ -1119,6 +1123,7 @@ <translation id="7029809446516969842">මුරපද</translation> <translation id="7030304022046916278">URL පරීක්ෂා කිරීමට ඒවා ආරක්ෂිත බ්රවුස් කිරීම වෙත යවයි</translation> <translation id="7030585293819777123">ඔබේ අවසන් කාර්යය නැවත පටන් ගන්න ද?</translation> +<translation id="7035701931849773472">වෙනත් විකල්ප</translation> <translation id="7037830628447527439">ඔබගේ Google ගිණුම සමගින් Chrome වෙත පුරන්න</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">රූප විස්තර ලබා ගන්නද?</translation> @@ -1341,6 +1346,7 @@ <translation id="8110024788458304985">Chrome හි විශේෂාංග සහ කාර්යසාධනය වැඩි දියුණු කිරීමට උදවු වන්න</translation> <translation id="8110087112193408731">ඩිජිටල් සුවතාව තුළ ඔබේ Chrome ක්රියාකාරකම් පෙන්වන්න ද?</translation> <translation id="8118117428362942925">ඔබට උදව් අවශ්ය නම්, ඔබේ දෙමාපියන්ගෙන් විමසන්න (<ph name="PARENT_NAME" />)</translation> +<translation id="8124758083429256800">Chrome සහ Chrome <ph name="ERROR_DESCRIPTION" /> සඳහා ඔබේ සුරකින ලද මුරපද ලැයිස්තුව 121 අනුවාදයෙන් පසුව ඒකාබද්ධ වනු ඇත. ඔබට යෙදුම් දෙකෙහිම ඔබේ සුරකින ලද මුරපද සියල්ල ස්වයංව පිරවීමට හැකි වනු ඇත.</translation> <translation id="8127542551745560481">මුල් පිටුව සංස්කරණ කරන්න</translation> <translation id="8130309322784422030">ඔබගේ ගබඩා කළ පිරීමේ තතු කල් ඉකුත්ව තිබිය හැකිය</translation> <translation id="813082847718468539">අඩවි තොරතුරු පෙන්වන්න</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb index 1589f984b..99f3c3f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb
@@ -17,6 +17,7 @@ <translation id="1100066534610197918">Otvoriť v skupine na novej karte</translation> <translation id="1103142993930332957">Chcete pomôcť zlepšiť Chrome?</translation> <translation id="1105960400813249514">Snímanie obrazovky</translation> +<translation id="1108214977745280468">Zobraziť štatistiky stránky</translation> <translation id="1108938384783527433">Synchronizácia histórie</translation> <translation id="1110914759170138831">Fakt bol skrátený</translation> <translation id="1111673857033749125">Tu sa zobrazia záložky, ktoré ste uložili na iných zariadeniach.</translation> @@ -66,6 +67,7 @@ <translation id="1303507811548703290"><ph name="DOMAIN" /> – odoslané zo zariadenia <ph name="DEVICE_NAME" /></translation> <translation id="1311657260431405215">Tento QR kód nie je webová adresa: <ph name="QRCODEVALUE" /></translation> <translation id="1316212908214730110">chrome_stylized_highlight_</translation> +<translation id="131655401280401879">Ak neskôr zámku profilu odstránite, vaše uložené informácie sa vymažú.</translation> <translation id="1320912611264252795">Priečinky s postupom uloženia záložky sú otvorené na úplnú výšku</translation> <translation id="1327257854815634930">História navigácie je otvorená</translation> <translation id="1331212799747679585">Chrome sa nedá aktualizovať. Ďalšie možnosti</translation> @@ -180,6 +182,7 @@ <translation id="1995884366040846621">Ak chcete pokračovať, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> bude s týmto webom zdieľať vaše meno, e‑mailovú adresu a profilovú fotku. Pozrite si <ph name="BEGIN_LINK1" />pravidlá ochrany súkromia<ph name="END_LINK1" /> tohto webu.</translation> <translation id="200114059308480249">Chcete zahŕňať okolitý text vo vyhľadávaniach na Googli?</translation> <translation id="2009341475524975924">Na účely merania výkonnosti reklamy môžu weby medzi sebou zdieľať obmedzené typy údajov, napríklad čas dňa, kedy sa vám určitá reklama zobrazila.</translation> +<translation id="201060170519281460">Zámka profilu uchováva informácie v aute (vrátane synchronizovaných hesiel, platieb a ďalších) zabezpečené.</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# súbor}few{# súbory}many{# Files}other{# súborov}}</translation> <translation id="2021896219286479412">Ovládanie webu na celú obrazovku</translation> <translation id="2038563949887743358">Zapnutie žiadosti o verziu stránok pre počítače</translation> @@ -257,6 +260,7 @@ <translation id="250020030759455918">Zobrazí sa váš stav prihlásenia na webe <ph name="SITE_NAME" />, dáta prehliadania a údaje webu v Chrome</translation> <translation id="2510106555128151389">Inštaluje sa <ph name="WEBAPK_NAME" />...</translation> <translation id="2513403576141822879">Ďalšie nastavenia týkajúce sa ochrany súkromia, zabezpečenia a zhromažďovania dát nájdete v časti <ph name="BEGIN_LINK" />Synchronizácia a služby Googlu<ph name="END_LINK" /></translation> +<translation id="2517113738956581680">Hárok v plnej veľkosti</translation> <translation id="2517472476991765520">Skenovať</translation> <translation id="2523184218357549926">Odosiela Googlu webové adresy navštívených stránok</translation> <translation id="2527209463677295330">Ak zahrniete viac textu stránky, môžu sa vám zobraziť lepšie výsledky</translation> @@ -281,6 +285,7 @@ Tokeny súkromného stavu zlepšujú ochranu súkromia na internete a nedá sa podľa nich zistiť vaša totožnosť.</translation> <translation id="2581165646603367611">Táto akcia vymaže súbory cookie, vyrovnávaciu pamäť a ďalšie údaje webov, ktoré Chrome nepovažuje za dôležité.</translation> <translation id="2587052924345400782">Je dostupná novšia verzia</translation> +<translation id="2589302627584222634">Vytvoriť zámku profilu</translation> <translation id="2593272815202181319">Neproporcionálne</translation> <translation id="2603212228005142861">Ak chcete spravovať predvoľby, prihláste sa</translation> <translation id="260403163289591229">Sledovaný</translation> @@ -542,6 +547,7 @@ <translation id="4035877632587724847">Nepovoliť</translation> <translation id="4036177530563778041">Jednoducho pokračujte tam, kde ste prestali</translation> <translation id="4042941173059740150">Pokračujte na webe <ph name="SITE_ETLD_PLUS_ONE" /> poskytovateľa <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /></translation> +<translation id="4044708993631234325">Dolný hárok</translation> <translation id="4045764304651014138">Údaje o používaní</translation> <translation id="405399507749852140">Dostávajte upozornenia, keď cena na ľubovoľnom webe poklesne</translation> <translation id="4056223980640387499">Sépia</translation> @@ -846,6 +852,7 @@ <translation id="564667659802381754">Sprievodca ochranou súkromia <ph name="BEGIN_NEW" />Novinka<ph name="END_NEW" /></translation> <translation id="5648166631817621825">Posledných 7 dní</translation> <translation id="5655963694829536461">Prehľadať stiahnuté</translation> +<translation id="5657871969392618475">Vaše informácie sú zabezpečené zámkou profilu</translation> <translation id="5659593005791499971">E-mail</translation> <translation id="5665379678064389456">Vytvorte udalosť v aplikácii <ph name="APP_NAME" /></translation> <translation id="5683547024293500885">Chrome nemôže skontrolovať dostupnosť aktualizácií</translation> @@ -909,6 +916,7 @@ <translation id="5964869237734432770">Zastaviť popisy obrázkov</translation> <translation id="5966233851250124270">Chrome si vašu voľbu zapamätá</translation> <translation id="5979084224081478209">Skontrolovať heslá</translation> +<translation id="5985186846584605773">Vytvorte si pre auto zámku profilu</translation> <translation id="5995726099713306770">Chcete stránku znova stiahnuť?</translation> <translation id="6000066717592683814">Ponechať Google</translation> <translation id="6000203700195075278">Znova sledovať</translation> @@ -1137,6 +1145,7 @@ <translation id="7088681679121566888">Chrome je aktuálny</translation> <translation id="7105047059074518658">Prihláste sa, aby ste mohli v zariadeniach prehliadať obsah jednoduchšie</translation> <translation id="7106762743910369165">Prehliadač je spravovaný vašou organizáciou</translation> +<translation id="7116420572655804716">Ak chcete synchronizovať informácie a zabezpečiť údaje v aute, musíte v nastaveniach zabezpečenia vytvoriť zámku profilu. Kód alebo heslo budete používať pri každom nastupovaní do auta.</translation> <translation id="7116588989735740310">Ak sa chcete vrátiť na weby navštívené v iných zariadeniach, synchronizujte si karty aj históriu</translation> <translation id="7130504491556983216">Tu sa bude pri prehliadaní internetu zobrazovať zoznam záujmov</translation> <translation id="7138678301420049075">Ostatné</translation> @@ -1358,6 +1367,7 @@ <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Vaše zariadenia<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8200772114523450471">Pokračovať</translation> <translation id="8209050860603202033">Otvoriť obrázok</translation> +<translation id="8215740705341534369">Bočný hárok</translation> <translation id="8218622182176210845">Spravujte svoj účet</translation> <translation id="8221401890884589479">Nechcené weby môžete blokovať. Chrome okrem toho automaticky odstraňuje zo zoznamu weby, ktoré sú staršie ako 30 dní. <ph name="BEGIN_LINK" />Ďalšie informácie<ph name="END_LINK" /></translation> <translation id="8223642481677794647">Ponuka karty feedu</translation> @@ -1560,6 +1570,7 @@ <translation id="932327136139879170">Domov</translation> <translation id="938850635132480979">Chyba: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Zadať prístupovú frázu</translation> +<translation id="950679278154734362">Ak chcete synchronizovať informácie a zabezpečiť údaje v aute, musíte vytvoriť zámku profilu. Kód alebo heslo budete používať pri každom nastupovaní do auta.</translation> <translation id="95817756606698420">Chrome môže použiť <ph name="BEGIN_BOLD" />Sogou<ph name="END_BOLD" /> na vyhľadávanie v Číne. Táto možnosť sa dá zmeniť v <ph name="BEGIN_LINK" />Nastaveniach<ph name="END_LINK" />.</translation> <translation id="962979164594783469">Inštalovať túto aplikáciu</translation> <translation id="96681097142096641">Chcete zobraziť zjednodušenú stránku?</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 702b3da..835f6a24 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
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">Razvrsti od Ž do A</translation> <translation id="4195643157523330669">Odpri v novem zavihku</translation> <translation id="4196597275619698563">Ustvari kartico</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{1 zavihek v tej napravi}one{# zavihek v tej napravi}two{# zavihka v tej napravi}few{# zavihki v tej napravi}other{# zavihkov v tej napravi}}</translation> <translation id="4198423547019359126">Ni razpoložljivih mest za prenos</translation> <translation id="4202218894997543208">Teme, ki ste jih blokirali</translation> <translation id="4214315110991671325">Če omogočite piškotke, jih bo Chrome morda uporabil za vnaprejšnje nalaganje.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Kateri podatki se uporabljajo:<ph name="END_BOLD" /> Zgodovina brskanja, evidenca spletnih mest, ki ste jih obiskali s Chromom v tej napravi.</translation> <translation id="4269820728363426813">Kopiraj naslov povezave</translation> <translation id="4283102315569707115">Želite privzeto zahtevati namizna spletna mesta?</translation> +<translation id="4285846616383034558">Piškotki, predpomnilnik in drugi podatki spletnega mesta</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Vklop zaklepanja zaslona v nastavitvah za Android<ph name="END_LINK" /></translation> <translation id="4296252229500326964">Nov anonimni zavihek</translation> <translation id="4298388696830689168">Povezana spletna mesta</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">video</translation> <translation id="4766313118839197559">Gesla so shranjena v Upravitelju gesel v tej napravi.</translation> <translation id="4766678251456904326">Dodajte račun v napravo</translation> +<translation id="4767947714785277816">Uvajamo novo funkcijo za zasebnost pri oglaševanju, ki se imenuje merjenje oglasov. Chrome deli samo zelo omejene podatke s spletnimi mesti in aplikacijami, na primer takrat, ko vam je bil prikazan oglas, da bi pomagal meriti uspešnost oglasov.</translation> <translation id="4769095993849849966">Novo ime datoteke</translation> <translation id="4778653490315793244">Ničesar ni za prikaz</translation> <translation id="4787736314074622408">Ali želite izbrisati »<ph name="ITEM_TITLE" />«?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">Izboljšanje predlogov za iskanje</translation> <translation id="6026538407078977628">Razširitev na celozaslonski prikaz</translation> <translation id="6030719887161080597">Upravljanje podatkov, ki jih spletna mesta uporabljajo za merjenje uspešnosti oglasov</translation> +<translation id="6034146297924778597">Zgodovina zadnjih 15 minut bo izbrisana:</translation> <translation id="6039379616847168523">Premik na naslednji zavihek</translation> <translation id="6040143037577758943">Zapri</translation> <translation id="604124094241169006">Samodejno</translation> @@ -1119,6 +1123,7 @@ <translation id="7029809446516969842">Gesla</translation> <translation id="7030304022046916278">Pošlje URL-je Varnemu brskanju, da jih ta preveri.</translation> <translation id="7030585293819777123">Ali želite nadaljevati zadnje opravilo?</translation> +<translation id="7035701931849773472">Druge možnosti</translation> <translation id="7037830628447527439">Prijavite se v Chrome z računom Google.</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Želite pridobiti opise slik?</translation> @@ -1341,6 +1346,7 @@ <translation id="8110024788458304985">Pomagajte izboljšati Chromove funkcije in njegovo delovanje</translation> <translation id="8110087112193408731">Ali želite svojo dejavnost v Chromu prikazati v Digitalni dobrobiti?</translation> <translation id="8118117428362942925">Če potrebuješ pomoč, se obrni na starša (<ph name="PARENT_NAME" />).</translation> +<translation id="8124758083429256800">Seznami shranjenih gesel za Chrome in Chrome <ph name="ERROR_DESCRIPTION" /> združili po različici 121 združeni. Polja boste lahko samodejno izpolnjevali z vsemi shranjenimi gesli v obeh aplikacijah.</translation> <translation id="8127542551745560481">Urejanje domače strani</translation> <translation id="8130309322784422030">Shranjeni podatki za prijavo so morda zastareli.</translation> <translation id="813082847718468539">Ogled podatkov o mestu</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 44f05f8c..6caf729 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
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">Rendit nga Zh-ja në A</translation> <translation id="4195643157523330669">Hape në një skedë të re</translation> <translation id="4196597275619698563">Krijo kartën</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{1 skedë në këtë pajisje}other{# skeda në këtë pajisje}}</translation> <translation id="4198423547019359126">Nuk ka vendndodhje shkarkimi</translation> <translation id="4202218894997543208">Temat që ke bllokuar</translation> <translation id="4214315110991671325">Nëse lejon kukit, Chrome mund t'i përdorë ato për ngarkimin paraprak.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Çfarë të dhënash përdoren:<ph name="END_BOLD" /> Historiku yt i shfletimit, regjistri i sajteve që ke vizituar duke përdorur Chrome në këtë pajisje.</translation> <translation id="4269820728363426813">Kopjo adresën e lidhjes</translation> <translation id="4283102315569707115">Të kërkohen si parazgjedhje sajtet për desktop?</translation> +<translation id="4285846616383034558">Kukit, memoria specifike dhe të dhëna të tjera të sajteve</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Aktivizo kyçjen e ekranit te cilësimet e Android<ph name="END_LINK" /></translation> <translation id="4296252229500326964">Skedë e re "e fshehtë"</translation> <translation id="4298388696830689168">Sajtet e lidhura</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">video</translation> <translation id="4766313118839197559">Fjalëkalimet ruhen në "Menaxherin e fjalëkalimeve" në këtë pajisje</translation> <translation id="4766678251456904326">Shto llogari në pajisje</translation> +<translation id="4767947714785277816">Ne po prezantojmë një veçori të re të privatësisë së reklamave që quajtur matja e reklamave. Chrome ndan vetëm informacione shumë të kufizuara mes sajteve dhe aplikacioneve, si p.sh. kur të është shfaqur një reklamë, për të ndihmuar në matjen e performancës së reklamave.</translation> <translation id="4769095993849849966">Emri i ri i skedarit</translation> <translation id="4778653490315793244">Nuk shfaqet ende asgjë</translation> <translation id="4787736314074622408">Dëshiron të fshish <ph name="ITEM_TITLE" />?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">Përmirëso sugjerimet për kërkimin</translation> <translation id="6026538407078977628">Zgjero në ekranin e plotë</translation> <translation id="6030719887161080597">Menaxho informacionet e përdorura nga sajtet për të matur performancën e reklamave</translation> +<translation id="6034146297924778597">Historiku nga 15 minutat e fundit do të fshihet:</translation> <translation id="6039379616847168523">Kalo te skeda tjetër</translation> <translation id="6040143037577758943">Mbyll</translation> <translation id="604124094241169006">Automatike</translation> @@ -1119,6 +1123,7 @@ <translation id="7029809446516969842">Fjalëkalimet</translation> <translation id="7030304022046916278">I dërgon URL-të te "Shfletimi i sigurt" për t'i kontrolluar</translation> <translation id="7030585293819777123">Të vazhdohet detyra jote e fundit?</translation> +<translation id="7035701931849773472">Opsione të tjera…</translation> <translation id="7037830628447527439">Identifikohu në Chrome me "Llogarinë tënde të Google"</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Të merren përshkrimet e imazheve?</translation> @@ -1341,6 +1346,7 @@ <translation id="8110024788458304985">Ndihmo në përmirësimin e veçorive dhe të cilësisë së funksionimit të Chrome</translation> <translation id="8110087112193408731">Dëshiron të shfaqësh aktivitetin tënd të Chrome te "Mirëqenia dixhitale"?</translation> <translation id="8118117428362942925">Nëse ke nevojë për ndihmë, pyet prindin tënd (<ph name="PARENT_NAME" />)</translation> +<translation id="8124758083429256800">Listat e tua me fjalëkalimet e ruajtura për Chrome dhe Chrome <ph name="ERROR_DESCRIPTION" /> do të shkrihen pas versionit 121. Do të mund të plotësosh automatikisht të gjitha fjalëkalimet e ruajtura në të dyja aplikacionet.</translation> <translation id="8127542551745560481">Modifiko faqen bazë</translation> <translation id="8130309322784422030">Informacionet e tua të ruajtura të identifikimit mund të jenë të papërditësuara</translation> <translation id="813082847718468539">Shiko informacionin rreth faqes</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 f4ff503..e52eeb0 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
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">Panga kialfabeti Z hadi A</translation> <translation id="4195643157523330669">Fungua katika kichupo kipya</translation> <translation id="4196597275619698563">Weka kadi</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{Kichupo 1 kwenye kifaa hiki}other{Vichupo # kwenye kifaa hiki}}</translation> <translation id="4198423547019359126">Hakuna maeneno ya upakuaji</translation> <translation id="4202218894997543208">Mada ulizozuia</translation> <translation id="4214315110991671325">Ukiruhusu vidakuzi, huenda Chrome ikavitumia wakati wa kupakia mapema.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Data gani inatumiwa:<ph name="END_BOLD" /> Historia yako ya kuvinjari, kumbukumbu ya tovuti ulizozitembelea ukitumia Chrome kwenye kifaa hiki.</translation> <translation id="4269820728363426813">Nakili anwani ya kiungo</translation> <translation id="4283102315569707115">Je, ungependa kuomba tovuti za kompyuta ya mezani kwa chaguomsingi?</translation> +<translation id="4285846616383034558">Vidakuzi, akiba na data nyingine ya tovuti</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Washa kipengele cha kufunga skrini katika mipangilio ya Android<ph name="END_LINK" /></translation> <translation id="4296252229500326964">Kichupo fiche kipya</translation> <translation id="4298388696830689168">Tovuti ambazo zimeunganishwa</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">video</translation> <translation id="4766313118839197559">Manenosiri huhifadhiwa kwenye Kidhibiti cha Manenosiri katika kifaa hiki</translation> <translation id="4766678251456904326">Ongeza akaunti kwenye kifaa</translation> +<translation id="4767947714785277816">Tunazindua kipengele kipya cha faragha ya matangazo kinachoitwa upimaji wa matangazo. Chrome hushiriki maelezo machache tu miongoni mwa tovuti na programu, kama vile wakati ulipoonyeshwa tangazo, ili kusaidia kupima utendaji wa matangazo.</translation> <translation id="4769095993849849966">Jina jipya la faili</translation> <translation id="4778653490315793244">Bado hakuna picha za kuonyesha</translation> <translation id="4787736314074622408">Ungependa kufuta <ph name="ITEM_TITLE" />?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">Boresha mapendekezo ya utafutaji</translation> <translation id="6026538407078977628">Panua ili ionyeshe skrini nzima</translation> <translation id="6030719887161080597">Dhibiti maelezo yanayotumiwa na tovuti kupima utendaji wa matangazo</translation> +<translation id="6034146297924778597">Historia ya dakika 15 zilizopita itafutwa:</translation> <translation id="6039379616847168523">Nenda kwenye kichupo kinachofuata</translation> <translation id="6040143037577758943">Funga</translation> <translation id="604124094241169006">Otomatiki</translation> @@ -1119,6 +1123,7 @@ <translation id="7029809446516969842">Manenosiri</translation> <translation id="7030304022046916278">Hutuma URL kwenye kipengele cha Kuvinjari Salama ili zikaguliwe</translation> <translation id="7030585293819777123">Ungependa kuendelea na jukumu lako la mara ya mwisho?</translation> +<translation id="7035701931849773472">Chaguo zingine</translation> <translation id="7037830628447527439">Ingia kwenye Chrome ukitumia Akaunti yako ya Google</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Ungependa kupata maelezo ya picha?</translation> @@ -1341,6 +1346,7 @@ <translation id="8110024788458304985">Tusaidie kuboresha utendaji na vipengele vya Chrome</translation> <translation id="8110087112193408731">Ungependa kuonyesha shughuli zako za Chrome katika mpango wa Nidhamu Dijitali?</translation> <translation id="8118117428362942925">Ukihitaji usaidizi, mwombe mzazi wako (<ph name="PARENT_NAME" />)</translation> +<translation id="8124758083429256800">Orodha zako za manenosiri yaliyohifadhiwa kwa ajili ya Chrome na Chrome <ph name="ERROR_DESCRIPTION" /> zitaunganishwa baada ya toleo la 121. Utaweza kujaza kiotomatiki manenosiri yako yote uliyohifadhi kwenye programu zote mbili.</translation> <translation id="8127542551745560481">Badilisha ukurasa wa kwanza</translation> <translation id="8130309322784422030">Huenda maelezo yako ya kuingia katika akaunti yaliyohifadhiwa yamepitwa na wakati</translation> <translation id="813082847718468539">Angalia maelezo ya tovuti</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 1553f13..281cd84 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
@@ -574,6 +574,7 @@ <translation id="4188221736490993796">ஃ - அ வரை வரிசைப்படுத்து</translation> <translation id="4195643157523330669">புதிய தாவலில் திற</translation> <translation id="4196597275619698563">கார்டை உருவாக்கு</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{இந்தச் சாதனத்தில் உள்ள 1 பக்கம்}other{இந்தச் சாதனத்தில் உள்ள # பக்கங்கள்}}</translation> <translation id="4198423547019359126">பதிவிறக்க இருப்பிடம் எதுவும் இல்லை</translation> <translation id="4202218894997543208">நீங்கள் தடுத்துள்ள தலைப்புகள்</translation> <translation id="4214315110991671325">குக்கீகளை அனுமதித்தால் பக்கங்களை முன்கூட்டியே ஏற்றுவதற்கு Chrome அவற்றைப் பயன்படுத்தக்கூடும்.</translation> @@ -588,6 +589,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />எந்தெந்தத் தரவு பயன்படுத்தப்படுகின்றது?<ph name="END_BOLD" /> நீங்கள் இதுவரை இணையத்தில் பார்த்தவை மற்றும் Chrome மூலம் நீங்கள் இந்தச் சாதனத்தில் பார்த்த தளங்களின் பதிவு.</translation> <translation id="4269820728363426813">இணைப்பு முகவரியை நகலெடு</translation> <translation id="4283102315569707115">இயல்பாக டெஸ்க்டாப் தளங்களுக்குக் கோரிக்கை விடுக்கவா?</translation> +<translation id="4285846616383034558">குக்கீகள், தற்காலிகச் சேமிப்பு மற்றும் பிற தளத் தரவு</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Android அமைப்புகளில் திரைப் பூட்டு அம்சத்தை இயக்கவும்<ph name="END_LINK" /></translation> <translation id="4296252229500326964">புதிய மறைநிலைத் தாவல்</translation> <translation id="4298388696830689168">இணைக்கப்பட்டுள்ள தளங்கள்</translation> @@ -678,6 +680,7 @@ <translation id="4763480195061959176">வீடியோ</translation> <translation id="4766313118839197559">இந்தச் சாதனத்தில் உள்ள Password Managerரில் கடவுச்சொற்கள் சேமிக்கப்படுகின்றன</translation> <translation id="4766678251456904326">சாதனத்தில் கணக்கைச் சேர்</translation> +<translation id="4767947714785277816">விளம்பரம் தொடர்பான புதிய தனியுரிமை அம்சமான 'விளம்பர தொடர்பான அளவீடு' என்பதை அறிமுகப்படுத்துகிறோம். தளங்களிலும் ஆப்ஸிலும் Chrome மிகக் குறைவான தகவல்களையே பகிர்ந்துகொள்கிறது. (எ.கா. விளம்பரங்களின் செயல்திறனை அளவிட உதவுவதற்காக உங்களுக்கு விளம்பரம் எப்போது காட்டப்பட்டது எனும் விவரம்).</translation> <translation id="4769095993849849966">ஃபைலின் புதிய பெயர்</translation> <translation id="4778653490315793244">காட்டுவதற்கு இதுவரை எதுவும் இல்லை</translation> <translation id="4787736314074622408"><ph name="ITEM_TITLE" /> ஃபைலை நீக்க வேண்டுமா?</translation> @@ -912,6 +915,7 @@ <translation id="6011308810877101166">தேடல் பரிந்துரைகளை மேம்படுத்து</translation> <translation id="6026538407078977628">முழுத்திரைக்கு மாறும்</translation> <translation id="6030719887161080597">விளம்பரச் செயல்திறனை அளவிட தளங்களால் பயன்படுத்தப்பட்ட தகவலை நிர்வகிக்கலாம்</translation> +<translation id="6034146297924778597">கடந்த 15 நிமிடத்தில் பார்த்தவை நீக்கப்படும்:</translation> <translation id="6039379616847168523">அடுத்த தாவலுக்குச் செல்லும்</translation> <translation id="6040143037577758943">மூடு</translation> <translation id="604124094241169006">தானியங்கு</translation> @@ -1117,6 +1121,7 @@ <translation id="7029809446516969842">கடவுச்சொற்கள்</translation> <translation id="7030304022046916278">சரிபார்ப்புக்காக URLகளைப் பாதுகாப்பு உலாவலுக்கு அனுப்பும்</translation> <translation id="7030585293819777123">கடைசிப் பணியை மீண்டும் தொடங்கவா?</translation> +<translation id="7035701931849773472">பிற விருப்பங்கள்</translation> <translation id="7037830628447527439">உங்கள் Google கணக்கைப் பயன்படுத்தி Chromeமில் உள்நுழையவும்</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">பட விளக்கங்களைப் பெற வேண்டுமா?</translation> @@ -1339,6 +1344,7 @@ <translation id="8110024788458304985">Chromeமின் அம்சங்களையும் செயல்திறனையும் மேம்படுத்த உதவுதல்</translation> <translation id="8110087112193408731">உங்கள் Chrome செயல்பாட்டை டிஜிட்டல் வெல்பீயிங்கில் காட்டவா?</translation> <translation id="8118117428362942925">உங்களுக்கு உதவி தேவைப்பட்டால் பெற்றோரிடம் (<ph name="PARENT_NAME" />) கேளுங்கள்</translation> +<translation id="8124758083429256800">121வது பதிப்பிற்குப் பின் Chrome, Chrome <ph name="ERROR_DESCRIPTION" /> ஆகியவற்றில் நீங்கள் சேமித்துள்ள கடவுச்சொற்களின் பட்டியல் ஒன்றிணைக்கப்படும். நீங்கள் சேமித்துள்ள கடவுச்சொற்களை இரண்டு ஆப்ஸிலும் தன்னிரப்ப முடியும்.</translation> <translation id="8127542551745560481">முகப்புப்பக்கத்தைத் திருத்து</translation> <translation id="8130309322784422030">சேமிக்கப்பட்ட உங்களின் உள்நுழைவுத் தகவல் பழையதாக இருக்கக்கூடும்</translation> <translation id="813082847718468539">தள விவரங்களைக் காண்க</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb index 61db5d7..b1c7722 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">Z నుండి Aకు సార్ట్ చేయి</translation> <translation id="4195643157523330669">కొత్త ట్యాబ్లో తెరువు</translation> <translation id="4196597275619698563">కార్డ్ను క్రియేట్ చేయండి</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{ఈ పరికరంలో 1 ట్యాబ్}other{ఈ పరికరంలో # ట్యాబ్లు}}</translation> <translation id="4198423547019359126">డౌన్లోడ్ స్థానాలు అందుబాటులో లేవు</translation> <translation id="4202218894997543208">మీరు బ్లాక్ చేసిన టాపిక్లు</translation> <translation id="4214315110991671325">మీరు కుక్కీలను అనుమతిస్తే, Chrome వాటిని ప్రీ - లోడింగ్ కోసం ఉపయోగించవచ్చు.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />ఏ డేటాను ఉపయోగిస్తారు:<ph name="END_BOLD" /> మీ బ్రౌజింగ్ హిస్టరీ, ఈ పరికరంలో Chromeను ఉపయోగించి మీరు సందర్శించిన సైట్ల రికార్డ్.</translation> <translation id="4269820728363426813">లింక్ అడ్రస్ను కాపీ చేయండి</translation> <translation id="4283102315569707115">ఆటోమేటిక్గా డెస్క్టాప్ సైట్లను రిక్వెస్ట్ చేయాలా?</translation> +<translation id="4285846616383034558">కుక్కీలు, కాష్, ఇతర సైట్ డేటా</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Android సెట్టింగ్లలో స్క్రీన్ లాక్ను ఆన్ చేయండి<ph name="END_LINK" /></translation> <translation id="4296252229500326964">కొత్త అజ్ఞాత ట్యాబ్</translation> <translation id="4298388696830689168">లింక్ చేసిన సైట్లు</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">వీడియో</translation> <translation id="4766313118839197559">పాస్వర్డ్లు ఈ పరికరంలోని పాస్వర్డ్ మేనేజర్లో సేవ్ చేయబడతాయి</translation> <translation id="4766678251456904326">పరికరానికి మరొక ఖాతాను జోడించండి</translation> +<translation id="4767947714785277816">మేము యాడ్ల విషయంలో, యాడ్ మెజర్మెంట్ అనే కొత్త గోప్యతా ఫీచర్ను లాంచ్ చేస్తున్నాము. Chrome సైట్లు, యాప్ల మధ్య చాలా పరిమిత సమాచారాన్ని మాత్రమే షేర్ చేస్తుంది, అంటే మీకు యాడ్ చూపబడినప్పుడు, యాడ్ల పనితీరును కొలవడానికి సహాయం చేస్తుంది.</translation> <translation id="4769095993849849966">కొత్త ఫైల్ పేరు</translation> <translation id="4778653490315793244">ఇప్పటికైతే చూపడానికి ఏమీ లేవు</translation> <translation id="4787736314074622408">మీరు <ph name="ITEM_TITLE" />ను తొలగించాలనుకుంటున్నారా?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">సెర్చ్ సూచనలను మెరుగుపరుస్తుంది</translation> <translation id="6026538407078977628">ఫుల్ స్క్రీన్కు విస్తరింపజేయండి</translation> <translation id="6030719887161080597">యాడ్ పనితీరును అంచనా వేయడానికి సైట్లు ఉపయోగించే సమాచారాన్ని మేనేజ్ చేయండి</translation> +<translation id="6034146297924778597">చివరి 15 నిమిషాలలోని హిస్టరీని తొలగించడం జరుగుతుంది:</translation> <translation id="6039379616847168523">తదుపరి ట్యాబ్కు వెళ్లండి</translation> <translation id="6040143037577758943">మూసివేయి</translation> <translation id="604124094241169006">ఆటోమేటిక్గా</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb index f58a91b7..79100ee1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
@@ -17,6 +17,7 @@ <translation id="1100066534610197918">เปิดในแท็บใหม่ในกลุ่ม</translation> <translation id="1103142993930332957">หากต้องการช่วยปรับปรุง Chrome</translation> <translation id="1105960400813249514">จับภาพหน้าจอ</translation> +<translation id="1108214977745280468">ดูข้อมูลเชิงลึกของหน้า</translation> <translation id="1108938384783527433">ซิงค์ประวัติการเข้าชม</translation> <translation id="1110914759170138831">มีการตัดไฮไลต์ให้สั้นลง</translation> <translation id="1111673857033749125">บุ๊กมาร์กที่บันทึกไว้ในอุปกรณ์เครื่องอื่นๆ ของคุณจะปรากฏที่นี่</translation> @@ -66,6 +67,7 @@ <translation id="1303507811548703290"><ph name="DOMAIN" /> - ส่งจาก <ph name="DEVICE_NAME" /></translation> <translation id="1311657260431405215">คิวอาร์โค้ดนี้ไม่ใช่ URL: <ph name="QRCODEVALUE" /></translation> <translation id="1316212908214730110">chrome_stylized_highlight_</translation> +<translation id="131655401280401879">ระบบจะลบข้อมูลที่บันทึกไว้หากคุณนำการล็อกโปรไฟล์ออกในภายหลัง</translation> <translation id="1320912611264252795">ขั้นตอนการบันทึกบุ๊กมาร์กเปิดอยู่ที่ระดับเต็มความสูง</translation> <translation id="1327257854815634930">ประวัติการนำทางเปิดอยู่</translation> <translation id="1331212799747679585">อัปเดต Chrome ไม่ได้ ตัวเลือกอื่นๆ</translation> @@ -180,6 +182,7 @@ <translation id="1995884366040846621">หากต้องการดำเนินการต่อ <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> จะแชร์ชื่อ อีเมล และรูปโปรไฟล์ของคุณกับเว็บไซต์นี้ โปรดอ่าน<ph name="BEGIN_LINK1" />นโยบายความเป็นส่วนตัว<ph name="END_LINK1" />ของเว็บไซต์</translation> <translation id="200114059308480249">รวมข้อความที่อยู่โดยรอบในการค้นหาบน Google ไหม</translation> <translation id="2009341475524975924">ระบบสามารถแชร์ข้อมูลบางประเภทระหว่างเว็บไซต์เพื่อวัดประสิทธิภาพของโฆษณา เช่น ช่วงเวลาของวันที่มีการแสดงโฆษณาแก่คุณ</translation> +<translation id="201060170519281460">การล็อกโปรไฟล์ช่วยรักษาข้อมูลในรถให้ปลอดภัย ซึ่งข้อมูลนี้รวมถึงรหัสผ่านที่ซิงค์ การชำระเงิน และอื่นๆ</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# ไฟล์}other{# ไฟล์}}</translation> <translation id="2021896219286479412">ส่วนควบคุมเว็บไซต์แบบเต็มหน้าจอ</translation> <translation id="2038563949887743358">เปิดการขอเว็บไซต์เดสก์ท็อป</translation> @@ -257,6 +260,7 @@ <translation id="250020030759455918">คุณจะเห็นสถานะการลงชื่อเข้าใช้ ข้อมูลการท่องเว็บ และข้อมูลเว็บไซต์ของ <ph name="SITE_NAME" /> ใน Chrome</translation> <translation id="2510106555128151389">กำลังติดตั้ง <ph name="WEBAPK_NAME" />...</translation> <translation id="2513403576141822879">ดูการตั้งค่าเพิ่มเติมเกี่ยวกับความเป็นส่วนตัว ความปลอดภัย และการรวบรวมข้อมูลได้ที่<ph name="BEGIN_LINK" />การซิงค์และบริการต่างๆ ของ Google<ph name="END_LINK" /></translation> +<translation id="2517113738956581680">ชีตขนาดเต็ม</translation> <translation id="2517472476991765520">สแกน</translation> <translation id="2523184218357549926">ส่ง URL ของหน้าที่คุณเข้าชมไปยัง Google</translation> <translation id="2527209463677295330">คุณอาจเห็นผลการค้นหาที่ดีขึ้นเมื่อรวมข้อความของหน้ามากขึ้น</translation> @@ -281,6 +285,7 @@ โทเค็นสถานะส่วนตัวเพิ่มความเป็นส่วนตัวบนเว็บและไม่สามารถใช้เพื่อค้นหาว่าคุณคือใคร</translation> <translation id="2581165646603367611">การดำเนินการนี้จะล้างคุกกี้ แคช และข้อมูลอื่นๆ ของเว็บไซต์ที่ Chrome คิดว่าไม่สำคัญ</translation> <translation id="2587052924345400782">มีเวอร์ชันใหม่กว่าให้ใช้งาน</translation> +<translation id="2589302627584222634">สร้างการล็อกโปรไฟล์</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">ลงชื่อเข้าใช้เพื่อจัดการค่ากำหนด</translation> <translation id="260403163289591229">กำลังติดตาม</translation> @@ -542,6 +547,7 @@ <translation id="4035877632587724847">ไม่อนุญาต</translation> <translation id="4036177530563778041">ดำเนินการต่อจากครั้งล่าสุดได้ง่ายๆ</translation> <translation id="4042941173059740150">ใช้ <ph name="SITE_ETLD_PLUS_ONE" /> ด้วย <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ต่อไป</translation> +<translation id="4044708993631234325">Bottom Sheet</translation> <translation id="4045764304651014138">ข้อมูลการใช้งาน</translation> <translation id="405399507749852140">รับการแจ้งเตือนหากราคาลดลงในเว็บไซต์ใดก็ตาม</translation> <translation id="4056223980640387499">ซีเปีย</translation> @@ -846,6 +852,7 @@ <translation id="564667659802381754">คู่มือความเป็นส่วนตัว<ph name="BEGIN_NEW" />ใหม่<ph name="END_NEW" /></translation> <translation id="5648166631817621825">7 วันที่แล้ว</translation> <translation id="5655963694829536461">ค้นหาการดาวน์โหลด</translation> +<translation id="5657871969392618475">ข้อมูลของคุณได้รับการปกป้องด้วยการล็อกโปรไฟล์</translation> <translation id="5659593005791499971">อีเมล</translation> <translation id="5665379678064389456">สร้างกิจกรรมใน <ph name="APP_NAME" /></translation> <translation id="5683547024293500885">Chrome ตรวจหาอัปเดตไม่ได้</translation> @@ -909,6 +916,7 @@ <translation id="5964869237734432770">หยุดรับคำอธิบายรูปภาพ</translation> <translation id="5966233851250124270">Chrome จะจดจำตัวเลือกของคุณ</translation> <translation id="5979084224081478209">ตรวจสอบรหัสผ่าน</translation> +<translation id="5985186846584605773">สร้างการล็อกโปรไฟล์สำหรับรถ</translation> <translation id="5995726099713306770">ดาวน์โหลดหน้าเว็บอีกครั้งใช่ไหม</translation> <translation id="6000066717592683814">ใช้ Google ต่อ</translation> <translation id="6000203700195075278">ติดตามอีกครั้ง</translation> @@ -1137,6 +1145,7 @@ <translation id="7088681679121566888">Chrome เป็นเวอร์ชันล่าสุดแล้ว</translation> <translation id="7105047059074518658">ลงชื่อเข้าใช้เพื่อให้ท่องเว็บได้ง่ายขึ้นในอุปกรณ์ต่างๆ</translation> <translation id="7106762743910369165">เบราว์เซอร์ได้รับการจัดการโดยองค์กรของคุณ</translation> +<translation id="7116420572655804716">หากต้องการซิงค์ข้อมูลและรักษาข้อมูลในรถให้ปลอดภัย คุณต้องสร้างการล็อกโปรไฟล์ในการตั้งค่าความปลอดภัย จากนั้นจะต้องใช้รหัสหรือรหัสผ่านทุกครั้งที่ขึ้นรถ</translation> <translation id="7116588989735740310">ซิงค์แท็บและประวัติการเข้าชมเพื่อดูเว็บไซต์ที่เคยเข้าชมในอุปกรณ์อื่นอีกครั้ง</translation> <translation id="7130504491556983216">รายการความสนใจจะปรากฏที่นี่เมื่อคุณท่องเว็บ</translation> <translation id="7138678301420049075">อื่นๆ</translation> @@ -1358,6 +1367,7 @@ <translation id="8193953846147532858"><ph name="BEGIN_LINK" />อุปกรณ์ของคุณ<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8200772114523450471">ทำต่อ</translation> <translation id="8209050860603202033">เปิดรูปภาพ</translation> +<translation id="8215740705341534369">ชีตด้านข้าง</translation> <translation id="8218622182176210845">จัดการบัญชีของคุณ</translation> <translation id="8221401890884589479">คุณบล็อกเว็บไซต์ที่ไม่ต้องการได้ นอกจากนี้ Chrome จะลบข้อมูลเว็บไซต์ที่นานเกิน 30 วันออกจากรายการโดยอัตโนมัติ <ph name="BEGIN_LINK" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK" /></translation> <translation id="8223642481677794647">เมนูของการ์ดฟีด</translation> @@ -1560,6 +1570,7 @@ <translation id="932327136139879170">หน้าแรก</translation> <translation id="938850635132480979">ข้อผิดพลาด: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">ป้อนข้อความรหัสผ่าน</translation> +<translation id="950679278154734362">หากต้องการซิงค์ข้อมูลและรักษาข้อมูลในรถให้ปลอดภัย คุณต้องสร้างการล็อกโปรไฟล์ จากนั้นจะต้องใช้รหัสหรือรหัสผ่านทุกครั้งที่ขึ้นรถ</translation> <translation id="95817756606698420">Chrome สามารถใช้ <ph name="BEGIN_BOLD" />Sogou<ph name="END_BOLD" /> สำหรับการค้นหาในประเทศจีน คุณสามารถเปลี่ยนเครื่องมือค้นหาเริ่มต้นนี้ได้ใน<ph name="BEGIN_LINK" />การตั้งค่า<ph name="END_LINK" /></translation> <translation id="962979164594783469">ติดตั้งแอปนี้</translation> <translation id="96681097142096641">ดูหน้าเว็บในโหมดผู้อ่านไหม</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb index d566226..d16bbd1d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">Z'den A'ya sırala</translation> <translation id="4195643157523330669">Yeni sekmede aç</translation> <translation id="4196597275619698563">Kart oluştur</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{Bu cihazda 1 sekme}other{Bu cihazda # sekme var}}</translation> <translation id="4198423547019359126">Kullanılabilir indirme yeri yok</translation> <translation id="4202218894997543208">Engellediğiniz konular</translation> <translation id="4214315110991671325">Çerezlere izin verirseniz Chrome bunları önceden yükleme işlemi için kullanabilir.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Kullanılan veriler:<ph name="END_BOLD" /> Tarama geçmişiniz ve bu cihazda Chrome'u kullanarak ziyaret ettiğiniz sitelerin kaydı.</translation> <translation id="4269820728363426813">Bağlantı adresini kopyala</translation> <translation id="4283102315569707115">Varsayılan olarak masaüstü siteleri istensin mi?</translation> +<translation id="4285846616383034558">Çerezler, önbellek ve diğer site verileri</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Android ayarlarında ekran kilidini açın<ph name="END_LINK" /></translation> <translation id="4296252229500326964">Yeni Gizli sekme</translation> <translation id="4298388696830689168">Bağlantılı siteler</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">video</translation> <translation id="4766313118839197559">Şifreler bu cihazda Şifre Yöneticisi'ne kaydedilir</translation> <translation id="4766678251456904326">Cihaza hesap ekleyin</translation> +<translation id="4767947714785277816">Reklam ölçümü adı verilen yeni bir reklam gizliliği özelliğini kullanıma sunuyoruz. Chrome sitelerin gösterdikleri reklamların performansını ölçmesine yardımcı olmak için siteler ve uygulamalar arasında çok sınırlı bilgi (ör. bir reklamın size gösterildiği saat) paylaşır.</translation> <translation id="4769095993849849966">Yeni dosya adı</translation> <translation id="4778653490315793244">Henüz gösterilecek bir şey yok</translation> <translation id="4787736314074622408"><ph name="ITEM_TITLE" /> adlı dosyayı silmek istiyor musunuz?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">Arama önerilerini iyileştir</translation> <translation id="6026538407078977628">Tam ekrana genişlet</translation> <translation id="6030719887161080597">Reklam performansını ölçmek için sitelerin kullandığı bilgileri yönetin</translation> +<translation id="6034146297924778597">Son 15 dakikalık geçmiş silinecek:</translation> <translation id="6039379616847168523">Sonraki sekmeye gider</translation> <translation id="6040143037577758943">Kapat</translation> <translation id="604124094241169006">Otomatik</translation> @@ -1119,6 +1123,7 @@ <translation id="7029809446516969842">Şifreler</translation> <translation id="7030304022046916278">URL'leri kontrol etmek için Güvenli Tarama'ya gönderir</translation> <translation id="7030585293819777123">Son göreviniz devam ettirilsin mi?</translation> +<translation id="7035701931849773472">Diğer seçenekler</translation> <translation id="7037830628447527439">Chrome'da Google Hesabınızla oturum açın</translation> <translation id="7038956721828960940">chrome_resim_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Resim açıklaması almak istiyor musunuz?</translation> @@ -1341,6 +1346,7 @@ <translation id="8110024788458304985">Chrome\U2019un özelliklerini ve performansını iyileştirmeye yardımcı olun</translation> <translation id="8110087112193408731">Chrome etkinliğiniz Dijital Denge'de gösterilsin mi?</translation> <translation id="8118117428362942925">Yardıma ihtiyacınız olursa ebeveyninize (<ph name="PARENT_NAME" />) sorun</translation> +<translation id="8124758083429256800">Chrome ve Chrome <ph name="ERROR_DESCRIPTION" /> için kayıtlı şifre listeleriniz 121 sürümünden sonra birleştirilecektir. Kayıtlı tüm şifrelerinizi her iki uygulamada da otomatik olarak doldurabilirsiniz.</translation> <translation id="8127542551745560481">Ana sayfayı düzenle</translation> <translation id="8130309322784422030">Kayıtlı oturum açma bilgileriniz güncel olmayabilir</translation> <translation id="813082847718468539">Site bilgilerini görüntüle</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 06b7517..4f8c20c 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
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">Сортувати від Я до А</translation> <translation id="4195643157523330669">Відкрити в новій вкладці</translation> <translation id="4196597275619698563">Створити картку</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{1 вкладка на цьому пристрої}one{# вкладка на цьому пристрої}few{# вкладки на цьому пристрої}many{# вкладок на цьому пристрої}other{# вкладки на цьому пристрої}}</translation> <translation id="4198423547019359126">Немає доступних місць для завантаження</translation> <translation id="4202218894997543208">Теми, які ви заблокували</translation> <translation id="4214315110991671325">Якщо ви дозволите файли cookie, Chrome може використовувати їх для попереднього завантаження.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Які дані використовуються<ph name="END_BOLD" />. Ваша історія веб-перегляду – перелік сайтів, які ви відвідали через Chrome на цьому пристрої.</translation> <translation id="4269820728363426813">Копіювати адресу посилання</translation> <translation id="4283102315569707115">Запитувати версію сайту для комп’ютера за умовчанням?</translation> +<translation id="4285846616383034558">Файли cookie, кеш і інші дані сайтів</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Увімкніть блокування екрана в налаштуваннях Android<ph name="END_LINK" /></translation> <translation id="4296252229500326964">Нова анонімна вкладка</translation> <translation id="4298388696830689168">Зв’язані сайти</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">відео</translation> <translation id="4766313118839197559">Паролі збережено в Менеджері паролів на цьому пристрої</translation> <translation id="4766678251456904326">Додати обліковий запис на пристрій</translation> +<translation id="4767947714785277816">Ми запускаємо нову функцію конфіденційності в рекламі – вимірювання ефективності реклами. Веб-переглядач Chrome надає сайтам і додаткам доступ лише до певних типів даних (наприклад, інформацію про те, коли вам показувалось оголошення), на основі яких вимірюється ефективність реклами.</translation> <translation id="4769095993849849966">Нова назва файлу</translation> <translation id="4778653490315793244">Немає контенту</translation> <translation id="4787736314074622408">Видалити файл "<ph name="ITEM_TITLE" />"?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">Покращувати підказки в пошуку</translation> <translation id="6026538407078977628">Розгорнути на весь екран</translation> <translation id="6030719887161080597">Керуйте інформацією, яку сайти використовують для вимірювання ефективності оголошень</translation> +<translation id="6034146297924778597">Історію за останні 15 хвилин буде видалено.</translation> <translation id="6039379616847168523">Перейти до наступної вкладки</translation> <translation id="6040143037577758943">Закрити</translation> <translation id="604124094241169006">Автоматично</translation> @@ -1119,6 +1123,7 @@ <translation id="7029809446516969842">Паролі</translation> <translation id="7030304022046916278">Надсилає URL-адреси в Безпечний перегляд на перевірку</translation> <translation id="7030585293819777123">Відновити вкладку з останнім завданням?</translation> +<translation id="7035701931849773472">Інші варіанти</translation> <translation id="7037830628447527439">Увійдіть у Chrome через обліковий запис Google</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Отримувати описи зображень?</translation> @@ -1341,6 +1346,7 @@ <translation id="8110024788458304985">Допомагати покращувати ефективність і функції Chrome</translation> <translation id="8110087112193408731">Показувати активність у Chrome у Цифровому добробуті?</translation> <translation id="8118117428362942925">Якщо тобі потрібна допомога, звернися до батька або матері (<ph name="PARENT_NAME" />)</translation> +<translation id="8124758083429256800">Ваші списки збережених паролів для Chrome і Chrome <ph name="ERROR_DESCRIPTION" /> об’єднаються після версії 121. Ви зможете автоматично вводити всі збережені паролі в обох додатках.</translation> <translation id="8127542551745560481">Змінити головну сторінку</translation> <translation id="8130309322784422030">Збережені дані для входу, імовірно, застаріли</translation> <translation id="813082847718468539">Перегляд інформації про сайт</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 8482492..41aeb7ef 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
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">Teskari alifbo tartibida saralash</translation> <translation id="4195643157523330669">Yangi varaqda ochish</translation> <translation id="4196597275619698563">Karta yaratish</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{Bu qurilmada 1 ta varaq}other{Bu qurilmada # ta varaq}}</translation> <translation id="4198423547019359126">Yuklab olish uchun bo‘sh joy mavjud emas</translation> <translation id="4202218894997543208">Bloklangan mavzular</translation> <translation id="4214315110991671325">Cookie fayllarga ruxsat bersangiz, Chrome oldindan yuklashda ulardan foydalanishi mumkin.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Qanday maʼlumotlar ishlatilishi:<ph name="END_BOLD" /> Bu qurilmada Chrome orqali siz kirgan saytlar tarixidagi qaydlar.</translation> <translation id="4269820728363426813">Havola manzilini nusxalash</translation> <translation id="4283102315569707115">Standart holatda saytning kompyuter versiyasini ochish soʻralsinmi?</translation> +<translation id="4285846616383034558">Cookie fayllar, kesh va boshqa sayt maʼlumotlari</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Android sozlamalari orqali ekran qulfini yoqing<ph name="END_LINK" /></translation> <translation id="4296252229500326964">Yangi Inkognito varaq</translation> <translation id="4298388696830689168">Aloqador saytlar</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">video</translation> <translation id="4766313118839197559">Parollar shu qurilmadagi Parollar menejeriga saqlanadi.</translation> <translation id="4766678251456904326">Qurilmaga hisob kiritish</translation> +<translation id="4767947714785277816">Biz reklamada yangi maxfiylik funksiyasini ishga tushiryapmiz. Chrome reklama unumdorligini hisoblashda saytlarga yordam berish uchun reklama qachon koʻrsatilgani kabi cheklangan axborotni sayt va ilovalarga ulashadi.</translation> <translation id="4769095993849849966">Yangi fayl nomi</translation> <translation id="4778653490315793244">Hech narsa topilmadi</translation> <translation id="4787736314074622408"><ph name="ITEM_TITLE" /> oʻchirib tashlansinmi?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">Qidiruv takliflarini yaxshilash</translation> <translation id="6026538407078977628">Butun ekranda ochish</translation> <translation id="6030719887161080597">Reklama unumdorligini hisoblash uchun saytlar ishlatadigan maʼlumotlarni boshqarish</translation> +<translation id="6034146297924778597">Oxirgi 15 daqiqalik quyidagi maʼlumotlar oʻchib ketadi:</translation> <translation id="6039379616847168523">Keyingi varaqqa o‘tish</translation> <translation id="6040143037577758943">Yopish</translation> <translation id="604124094241169006">Avtomatik</translation> @@ -1119,6 +1123,7 @@ <translation id="7029809446516969842">Parollar</translation> <translation id="7030304022046916278">URL manzillarni Saytlarni xavfsiz kezish tizimi tekshiruviga yuboradi</translation> <translation id="7030585293819777123">Oxirgi vazifa davom etirilsinmi?</translation> +<translation id="7035701931849773472">Boshqa variantlar</translation> <translation id="7037830628447527439">Chrome brauzeriga Google hisobingiz bilan kiring</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Rasm tavsiflari chiqsinmi?</translation> @@ -1341,6 +1346,7 @@ <translation id="8110024788458304985">Chrome OS funksiyalari va unumdorligini yaxshilashga yordam bering</translation> <translation id="8110087112193408731">Raqamli muvozanat xizmatida Chrome amallari chiqsinmi?</translation> <translation id="8118117428362942925">Ota-onangizdan (<ph name="PARENT_NAME" />) yordam oling</translation> +<translation id="8124758083429256800">Chrome va Chrome <ph name="ERROR_DESCRIPTION" /> uchun saqlangan parollar roʻyxatlari 121-versiyadan soʻng birlashtiriladi. Avtomatik kiritish funksiyasidan foydalangan holda saqlangan parollarni har ikki ilovaga ham kiritish mumkin.</translation> <translation id="8127542551745560481">Bosh sahifani oʻzgartirish</translation> <translation id="8130309322784422030">Kirishga oid saqlangan axborotingiz eskirgan</translation> <translation id="813082847718468539">Sayt haqidagi ma’lumotlar</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb index a7a1047..845e4c1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">Sắp xếp từ Z đến A</translation> <translation id="4195643157523330669">Mở trong thẻ mới</translation> <translation id="4196597275619698563">Tạo thẻ</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{1 thẻ trên thiết bị này}other{# thẻ trên thiết bị này}}</translation> <translation id="4198423547019359126">Không có vị trí tải xuống</translation> <translation id="4202218894997543208">Chủ đề bạn đã chặn</translation> <translation id="4214315110991671325">Nếu bạn cho phép cookie thì Chrome có thể dùng các cookie này để tải trước.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Loại dữ liệu nào được sử dụng:<ph name="END_BOLD" /> Nhật ký duyệt web của bạn, một bản ghi các trang web bạn từng truy cập bằng Chrome trên thiết bị này.</translation> <translation id="4269820728363426813">Sao chép địa chỉ liên kết</translation> <translation id="4283102315569707115">Yêu cầu trang web dành cho máy tính theo mặc định?</translation> +<translation id="4285846616383034558">Cookie, bộ nhớ đệm và dữ liệu trang web khác</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Bật phương thức khóa màn hình trong phần cài đặt Android<ph name="END_LINK" /></translation> <translation id="4296252229500326964">Thẻ ẩn danh mới</translation> <translation id="4298388696830689168">Các trang web liên kết</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">video</translation> <translation id="4766313118839197559">Lưu mật khẩu vào Trình quản lý mật khẩu trên thiết bị này</translation> <translation id="4766678251456904326">Thêm tài khoản vào thiết bị</translation> +<translation id="4767947714785277816">Chúng tôi sắp ra mắt tính năng mới về quyền riêng tư trong quảng cáo có tên là đo lường quảng cáo. Chrome chỉ chia sẻ một số ít thông tin giữa các trang web và ứng dụng, chẳng hạn như thời điểm quảng cáo hiển thị với bạn, nhằm hỗ trợ đo lường hiệu suất của quảng cáo.</translation> <translation id="4769095993849849966">Tên tệp mới</translation> <translation id="4778653490315793244">Chưa có nội dung nào để hiển thị</translation> <translation id="4787736314074622408">Bạn có muốn xoá <ph name="ITEM_TITLE" /> không?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">Cải thiện cụm từ tìm kiếm được đề xuất</translation> <translation id="6026538407078977628">Mở chế độ toàn màn hình</translation> <translation id="6030719887161080597">Quản lý thông tin mà các trang web sử dụng để đo lường hiệu suất quảng cáo</translation> +<translation id="6034146297924778597">Chúng tôi sẽ xoá nhật ký trong 15 phút vừa qua:</translation> <translation id="6039379616847168523">Chuyển sang thẻ tiếp theo</translation> <translation id="6040143037577758943">Đóng</translation> <translation id="604124094241169006">Tự động</translation> @@ -1119,6 +1123,7 @@ <translation id="7029809446516969842">Mật khẩu</translation> <translation id="7030304022046916278">Gửi URL để tính năng Duyệt web an toàn kiểm tra</translation> <translation id="7030585293819777123">Tiếp tục việc lần trước bạn làm?</translation> +<translation id="7035701931849773472">Tuỳ chọn khác</translation> <translation id="7037830628447527439">Đăng nhập vào Chrome bằng Tài khoản Google</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">Tải nội dung mô tả hình ảnh?</translation> @@ -1341,6 +1346,7 @@ <translation id="8110024788458304985">Giúp cải thiện hiệu suất và các tính năng của Chrome</translation> <translation id="8110087112193408731">Bạn có muốn hiển thị hoạt động của mình trên Chrome trong Digital Wellbeing không?</translation> <translation id="8118117428362942925">Nếu bạn cần trợ giúp, hãy hỏi cha mẹ (<ph name="PARENT_NAME" />)</translation> +<translation id="8124758083429256800">Danh sách mật khẩu bạn đã lưu cho Chrome và Chrome <ph name="ERROR_DESCRIPTION" /> sẽ hợp nhất sau phiên bản 121. Bạn có thể chọn tự động điền tất cả mật khẩu đã lưu trên cả hai ứng dụng.</translation> <translation id="8127542551745560481">Chỉnh sửa trang chủ</translation> <translation id="8130309322784422030">Thông tin đăng nhập bạn lưu lần trước có thể đã cũ</translation> <translation id="813082847718468539">Xem thông tin trang web</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 0d6b367..0e8746b 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
@@ -1123,6 +1123,7 @@ <translation id="7029809446516969842">密码</translation> <translation id="7030304022046916278">会将网址发送给“安全浏览”功能进行检查</translation> <translation id="7030585293819777123">继续您的上一项任务?</translation> +<translation id="7035701931849773472">其他选项</translation> <translation id="7037830628447527439">使用您的 Google 帐号登录 Chrome</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">获取图片说明?</translation> @@ -1345,6 +1346,7 @@ <translation id="8110024788458304985">帮助改进 Chrome 的功能和性能</translation> <translation id="8110087112193408731">在“数字健康”应用中显示您的 Chrome 活动记录?</translation> <translation id="8118117428362942925">如需帮助,请找家长(<ph name="PARENT_NAME" />)帮忙</translation> +<translation id="8124758083429256800">您在 Chrome 和 Chrome <ph name="ERROR_DESCRIPTION" />中的已存密码列表将在 121 版之后合并。您将能自动填充这两个应用内的所有已存密码。</translation> <translation id="8127542551745560481">修改主页</translation> <translation id="8130309322784422030">您存储的登录信息可能已过期</translation> <translation id="813082847718468539">查看网站信息</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 6e5ec0c..d7851a5f 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
@@ -575,7 +575,7 @@ <translation id="4188221736490993796">由 Z 到 A 排序</translation> <translation id="4195643157523330669">在新分頁中開啟</translation> <translation id="4196597275619698563">建立資訊卡</translation> -<translation id="4197828496439691735">{NUM_TABS,plural, =1{這部裝置上的 1 個分頁}other{這部裝置上的 # 個分頁}}</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{此裝置上的 1 個分頁}other{此裝置上的 # 個分頁}}</translation> <translation id="4198423547019359126">沒有可用的下載位置</translation> <translation id="4202218894997543208">您已封鎖的主題</translation> <translation id="4214315110991671325">如果您允許 Cookie,Chrome 可能會使用 Cookie 預先載入網頁。</translation> @@ -681,7 +681,7 @@ <translation id="4763480195061959176">影片</translation> <translation id="4766313118839197559">密碼會儲存至此裝置上的「密碼管理工具」。</translation> <translation id="4766678251456904326">將帳戶新增至裝置</translation> -<translation id="4767947714785277816">我們即將推出名為「廣告評估」的全新廣告隱私權功能。Chrome 只會在網站和應用程式之間分享相當有限的資訊 (例如向使用者放送廣告的時段),協助評估廣告成效。</translation> +<translation id="4767947714785277816">我們即將推出名為「廣告成效評估」的全新廣告私隱功能。Chrome 只會在網站和應用程式間分享非常有限的資料 (例如向使用者放送廣告的時段),以協助評估廣告成效。</translation> <translation id="4769095993849849966">新檔案名稱</translation> <translation id="4778653490315793244">未有可以顯示內容</translation> <translation id="4787736314074622408">係咪想刪除 <ph name="ITEM_TITLE" />?</translation> @@ -917,7 +917,7 @@ <translation id="6011308810877101166">改善搜尋建議</translation> <translation id="6026538407078977628">展開去全螢幕</translation> <translation id="6030719887161080597">管理網站用來評估廣告成效的資料</translation> -<translation id="6034146297924778597">系統將刪除過去 15 分鐘的歷史記錄:</translation> +<translation id="6034146297924778597">系統將刪除過去 15 分鐘的記錄:</translation> <translation id="6039379616847168523">跳至下一個分頁</translation> <translation id="6040143037577758943">關閉</translation> <translation id="604124094241169006">自動</translation> @@ -1123,6 +1123,7 @@ <translation id="7029809446516969842">密碼</translation> <translation id="7030304022046916278">將網址傳送至「安全瀏覽」功能檢查</translation> <translation id="7030585293819777123">要繼續執行最後一項工作嗎?</translation> +<translation id="7035701931849773472">其他選項</translation> <translation id="7037830628447527439">使用 Google 帳戶登入 Chrome</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">要取得圖片說明嗎?</translation> @@ -1345,6 +1346,7 @@ <translation id="8110024788458304985">協助改善 Chrome\u2019s 的功能和效能</translation> <translation id="8110087112193408731">要在「健康數碼生活」中顯示您的 Chrome 活動記錄嗎?</translation> <translation id="8118117428362942925">如需協助,請找家長 (<ph name="PARENT_NAME" />) 幫忙</translation> +<translation id="8124758083429256800">Chrome 和 Chrome <ph name="ERROR_DESCRIPTION" /> 的已儲存密碼清單會在版本 121 後合併。在兩個應用程式中都可自動填入所有已儲存的密碼。</translation> <translation id="8127542551745560481">編輯首頁</translation> <translation id="8130309322784422030">您儲存的登入資料可能已過期</translation> <translation id="813082847718468539">檢視網站資料</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 6511d6a3..cfdc3334 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
@@ -1122,6 +1122,7 @@ <translation id="7029809446516969842">密碼</translation> <translation id="7030304022046916278">系統會將網址傳送給安全瀏覽功能進行檢查</translation> <translation id="7030585293819777123">要繼續執行最後一項工作嗎?</translation> +<translation id="7035701931849773472">其他選項</translation> <translation id="7037830628447527439">使用 Google 帳戶登入 Chrome</translation> <translation id="7038956721828960940">chrome_image_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="7054588988317389591">要取得圖片說明嗎?</translation> @@ -1344,6 +1345,7 @@ <translation id="8110024788458304985">協助改善 Chrome 的功能與效能</translation> <translation id="8110087112193408731">要在數位健康中顯示你的 Chrome 活動記錄嗎?</translation> <translation id="8118117428362942925">如需協助,請找家長 (<ph name="PARENT_NAME" />) 幫忙</translation> +<translation id="8124758083429256800">Chrome 和 Chrome <ph name="ERROR_DESCRIPTION" /> 的已儲存密碼清單會在 121 版後合併。在兩個應用程式中都可以自動填入所有已儲存的密碼。</translation> <translation id="8127542551745560481">編輯首頁</translation> <translation id="8130309322784422030">你儲存的登入資訊可能已過時</translation> <translation id="813082847718468539">查看網站資訊</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb index 4a0908c18..652382ba 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">Hlunga ngo-Z ukuya ku-A</translation> <translation id="4195643157523330669">Vula kuthebhu entsha</translation> <translation id="4196597275619698563">Dala ikhadi</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{Ithebhu e-1 kule divayisi}one{Amathebhu angu-# kule divayisi}other{Amathebhu angu-# kule divayisi}}</translation> <translation id="4198423547019359126">Azikho izindawo ezitholakalayo zokulanda</translation> <translation id="4202218894997543208">Izihloko ozivimbile</translation> <translation id="4214315110991671325">Uma uvumela amakhukhi, i-Chrome ingase iwasebenzisele ukulayisha kusengaphambili.</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Iyiphi idatha esetshenziswayo:<ph name="END_BOLD" /> Umlando wakho wokubhrawuza, irekhodi lamasayithi owavakashele usebenzisa i-Chrome kule divayisi.</translation> <translation id="4269820728363426813">Kopisha ikheli lesixhumanisi</translation> <translation id="4283102315569707115">Cela amasayithi edeskithophu ngokuzenzakalela?</translation> +<translation id="4285846616383034558">Amakhukhi, inqolobane, nenye idatha yesayithi</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Vula ukukhiya isikrini kumasethingi we-Android<ph name="END_LINK" /></translation> <translation id="4296252229500326964">Ithebhu entsha ye-Incognito</translation> <translation id="4298388696830689168">Amasayithi axhunyiwe</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">ividiyo</translation> <translation id="4766313118839197559">Amaphasiwedi alondolozwa Kwisiphathi Sephasiwedi kule divayisi</translation> <translation id="4766678251456904326">Engeza i-akhawunti kudivayisi</translation> +<translation id="4767947714785277816">Sethula isakhi esisha sobumfihlo besikhangiso esibizwa ngokuthi yisilinganiso sesikhangiso. I-Chrome yabelana ngolwazi olulinganiselwe kuphela phakathi kwamasayithi nama-app, njengalapho owaboniswa khona isikhangiso, ukuze usize amasayithi alinganise ukusebenza kwezikhangiso.</translation> <translation id="4769095993849849966">Igama lefayela elisha</translation> <translation id="4778653490315793244">Akukho okuzoboniswa okwamanje</translation> <translation id="4787736314074622408">Ingabe ufuna ukusula i-<ph name="ITEM_TITLE" />?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">Thuthukisa iziphakamiso zokusesha</translation> <translation id="6026538407078977628">Nwebela kusikrini esigcwele</translation> <translation id="6030719887161080597">Phatha ulwazi olusetshenziswa amasayithi ukukala ukusebenza kwesikhangiso</translation> +<translation id="6034146297924778597">Umlando wemizuzu eyi-15 uzosulwa:</translation> <translation id="6039379616847168523">Yeqela kuthebhu elandelayo</translation> <translation id="6040143037577758943">Vala</translation> <translation id="604124094241169006">Okuzenzakalelayo</translation>
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomControlsMediator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomControlsMediator.java index d597463..dada9f8 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomControlsMediator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomControlsMediator.java
@@ -137,7 +137,7 @@ // LayoutStateObserver @Override - public void onStartedShowing(@LayoutType int layoutType, boolean showToolbar) { + public void onStartedShowing(@LayoutType int layoutType) { mIsInSwipeLayout = layoutType == LayoutType.TOOLBAR_SWIPE; updateAndroidViewVisibility(); }
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinator.java index c287c9f..c7869e3 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinator.java
@@ -105,7 +105,7 @@ private boolean mHighlightedNewTabPageButton; @Override - public void onStartedShowing(@LayoutType int layoutType, boolean showToolbar) { + public void onStartedShowing(@LayoutType int layoutType) { if (layoutType == LayoutType.TAB_SWITCHER && mIphBeingShown) { mSetNewTabButtonHighlightCallback.onResult(true); mHighlightedNewTabPageButton = true; @@ -113,8 +113,7 @@ } @Override - public void onStartedHiding( - @LayoutType int layoutType, boolean showToolbar, boolean delayAnimation) { + public void onStartedHiding(@LayoutType int layoutType) { if (layoutType == LayoutType.TAB_SWITCHER && mHighlightedNewTabPageButton) { mSetNewTabButtonHighlightCallback.onResult(false); mHighlightedNewTabPageButton = false;
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinatorTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinatorTest.java index f77baef..40e9fc0 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinatorTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinatorTest.java
@@ -114,7 +114,7 @@ private void showOverviewMode() { mOverviewOpen = true; for (LayoutStateProvider.LayoutStateObserver observer : mLayoutStateObserverSet) { - observer.onStartedShowing(LayoutType.TAB_SWITCHER, /*showToolbar*/ false); + observer.onStartedShowing(LayoutType.TAB_SWITCHER /*showToolbar*/); } for (LayoutStateProvider.LayoutStateObserver observer : mLayoutStateObserverSet) { observer.onFinishedShowing(LayoutType.TAB_SWITCHER); @@ -124,8 +124,7 @@ private void hideOverviewMode() { mOverviewOpen = false; for (LayoutStateProvider.LayoutStateObserver observer : mLayoutStateObserverSet) { - observer.onStartedHiding( - LayoutType.TAB_SWITCHER, /*showToolbar*/ false, /*delayAnimation*/ false); + observer.onStartedHiding(LayoutType.TAB_SWITCHER); } for (LayoutStateProvider.LayoutStateObserver observer : mLayoutStateObserverSet) { observer.onFinishedHiding(LayoutType.TAB_SWITCHER);
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java index 749048e..c954f4e 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java
@@ -615,8 +615,7 @@ * finished (which can be detected by a call to * {@link #onTabSwitcherTransitionFinished()}). */ - void setTabSwitcherMode(boolean inTabSwitcherMode, boolean showToolbar, boolean delayAnimation, - MenuButtonCoordinator menuButtonCoordinator) {} + void setTabSwitcherMode(boolean inTabSwitcherMode) {} /** * Gives inheriting classes the chance to update their state when the TabSwitcher transition has
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java index 2e15d38..0a54c72 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java
@@ -1791,8 +1791,7 @@ } @Override - public void setTabSwitcherMode(boolean inTabSwitcherMode, boolean showToolbar, - boolean delayAnimation, MenuButtonCoordinator menuButtonCoordinator) { + public void setTabSwitcherMode(boolean inTabSwitcherMode) { // This method is only used for grid tab switcher with the start surface disabled. When // start surface is enabled, omnibox state is updated in onStartSurfaceStateChanged(), which // is always called before setTabSwitcherMode(), so skip here.
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java index 73bbab7e..ac497a8f 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java
@@ -561,8 +561,7 @@ } @Override - void setTabSwitcherMode(boolean inTabSwitcherMode, boolean showToolbar, boolean delayAnimation, - MenuButtonCoordinator menuButtonCoordinator) { + void setTabSwitcherMode(boolean inTabSwitcherMode) { mIsInTabSwitcherMode = inTabSwitcherMode; mSwitcherButton.setClickable(!inTabSwitcherMode); int importantForAccessibility = inTabSwitcherMode
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTabletUnitTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTabletUnitTest.java index 18c7013..ea75451 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTabletUnitTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTabletUnitTest.java
@@ -218,7 +218,7 @@ assertEquals("Initial Toolbar visibility is not as expected", View.VISIBLE, mToolbarTablet.getVisibility()); // Call - mToolbarTablet.setTabSwitcherMode(false, false, false, mMenuButtonCoordinator); + mToolbarTablet.setTabSwitcherMode(false); assertEquals("Toolbar visibility is not as expected", View.VISIBLE, mToolbarTablet.getVisibility()); verify(mLocationBar).setUrlBarFocusable(true); @@ -229,7 +229,7 @@ assertEquals("Initial Toolbar visibility is not as expected", View.VISIBLE, mToolbarTablet.getVisibility()); // Call - mToolbarTablet.setTabSwitcherMode(true, false, false, mMenuButtonCoordinator); + mToolbarTablet.setTabSwitcherMode(true); assertEquals("Toolbar visibility is not as expected", View.VISIBLE, mToolbarTablet.getVisibility()); verify(mLocationBar).setUrlBarFocusable(false); @@ -309,8 +309,7 @@ @Test @EnableFeatures(ChromeFeatureList.SUPPRESS_TOOLBAR_CAPTURES) public void testIsReadyForTextureCapture_InTabSwitcher() { - mToolbarTablet.setTabSwitcherMode(/*inTabSwitcherMode*/ true, /*showToolbar*/ true, - /*delayAnimation*/ false, /*menuButtonCoordinator*/ null); + mToolbarTablet.setTabSwitcherMode(/*inTabSwitcherMode*/ true); CaptureReadinessResult result = mToolbarTablet.isReadyForTextureCapture(); Assert.assertFalse(result.isReady); Assert.assertEquals(TopToolbarBlockCaptureReason.TAB_SWITCHER_MODE, result.blockReason);
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java index 4973e97..3d07754 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java
@@ -582,15 +582,9 @@ /** * Gives inheriting classes the chance to show or hide the TabSwitcher mode of this toolbar. * @param inTabSwitcherMode Whether or not TabSwitcher mode should be shown or hidden. - * @param showToolbar Whether or not to show the normal toolbar while animating. - * @param delayAnimation Whether or not to delay the animation until after the transition has - * finished (which can be detected by a call to - * {@link #onTabSwitcherTransitionFinished()}). */ - public void setTabSwitcherMode( - boolean inTabSwitcherMode, boolean showToolbar, boolean delayAnimation) { - mToolbarLayout.setTabSwitcherMode( - inTabSwitcherMode, showToolbar, delayAnimation, mMenuButtonCoordinator); + public void setTabSwitcherMode(boolean inTabSwitcherMode) { + mToolbarLayout.setTabSwitcherMode(inTabSwitcherMode); if (mTabSwitcherModeCoordinator != null) { mTabSwitcherModeCoordinator.setTabSwitcherMode(inTabSwitcherMode); } else if (mStartSurfaceToolbarCoordinator != null) {
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator.java index 31d0c45..9ebb163 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator.java
@@ -94,7 +94,7 @@ mSceneChangeObserver = new LayoutStateObserver() { @Override - public void onStartedShowing(@LayoutType int layoutType, boolean showToolbar) { + public void onStartedShowing(@LayoutType int layoutType) { mIsOnValidLayout = (layoutType & layoutsToShowOn) > 0; updateVisibility(); }
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediatorTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediatorTest.java index db152c5..f3bc08e 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediatorTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediatorTest.java
@@ -116,7 +116,7 @@ verify(mLayoutStateProvider).addObserver(mLayoutObserverCaptor.capture()); - mLayoutObserverCaptor.getValue().onStartedShowing(LayoutType.BROWSING, true); + mLayoutObserverCaptor.getValue().onStartedShowing(LayoutType.BROWSING); } /** Set the tab that will be returned by the supplier and trigger the observer event. */
diff --git a/chrome/browser/ui/ash/clipboard_history_browsertest.cc b/chrome/browser/ui/ash/clipboard_history_browsertest.cc index a5f0d31d..71b70fd 100644 --- a/chrome/browser/ui/ash/clipboard_history_browsertest.cc +++ b/chrome/browser/ui/ash/clipboard_history_browsertest.cc
@@ -1503,6 +1503,55 @@ EXPECT_TRUE(textfield_->GetText().empty()); } +// Verifies that clicking the clipboard history's menu does nothing and that tab +// and arrow key traversal pass over the footer. +IN_PROC_BROWSER_TEST_F(ClipboardHistoryTextfieldBrowserTest, + FooterNotInteractive) { + // Write some things to the clipboard. + SetClipboardText("A"); + SetClipboardText("B"); + + // Show the clipboard history menu via the Ctrl+V long-press shortcut so that + // the menu's educational footer shows. + EXPECT_TRUE(GetClipboardHistoryController()->ShowMenu( + gfx::Rect(), ui::MenuSourceType::MENU_SOURCE_NONE, + crosapi::mojom::ClipboardHistoryControllerShowSource:: + kControlVLongpress)); + EXPECT_TRUE(GetClipboardHistoryController()->IsMenuShowing()); + + // Verify that the menu has two clipboard history items and a third item (the + // footer). + const auto* menu = GetClipboardHistoryController()->context_menu_for_test(); + EXPECT_EQ(menu->GetMenuItemsCount(), 2u); + ASSERT_EQ(menu->GetModelForTest()->GetItemCount(), 3u); + + // Verify that clicking on the footer does nothing. + EXPECT_TRUE(textfield_->GetText().empty()); + const auto* footer = menu->GetMenuItemViewAtForTest(/*index=*/2); + GetEventGenerator()->MoveMouseTo(footer->GetBoundsInScreen().CenterPoint()); + GetEventGenerator()->ClickLeftButton(); + EXPECT_TRUE(textfield_->GetText().empty()); + + // Verify that traversing over the menu with arrow keys skips the footer. + const auto* item1 = menu->GetMenuItemViewAtForTest(/*index=*/0); + const auto* item2 = menu->GetMenuItemViewAtForTest(/*index=*/1); + PressAndRelease(ui::VKEY_DOWN); + EXPECT_TRUE(item1->IsSelected()); + PressAndRelease(ui::VKEY_DOWN); + EXPECT_TRUE(item2->IsSelected()); + PressAndRelease(ui::VKEY_DOWN); + EXPECT_TRUE(item1->IsSelected()); + + // Verify that traversing over the menu with the Tab key (two presses at a + // time for each item's main button and delete button) skips the footer. + PressAndRelease(ui::VKEY_TAB); + PressAndRelease(ui::VKEY_TAB); + EXPECT_TRUE(item2->IsSelected()); + PressAndRelease(ui::VKEY_TAB); + PressAndRelease(ui::VKEY_TAB); + EXPECT_TRUE(item1->IsSelected()); +} + class FakeDataTransferPolicyController : public ui::DataTransferPolicyController { public:
diff --git a/chrome/browser/ui/ash/desks/desks_client.cc b/chrome/browser/ui/ash/desks/desks_client.cc index 2dbe139..7b8c7ab 100644 --- a/chrome/browser/ui/ash/desks/desks_client.cc +++ b/chrome/browser/ui/ash/desks/desks_client.cc
@@ -644,9 +644,9 @@ return; } - // Copy the index of the newly created desk to the saved desk. This ensures + // Copy the uuid of the newly created desk to the saved desk. This ensures // that apps appear on the right desk even if the user switches to another. - saved_desk->SetDeskIndex(desks_controller_->GetDeskIndex(new_desk)); + saved_desk->SetDeskUuid(new_desk->uuid()); const auto saved_desk_type = saved_desk->type(); const auto uuid = saved_desk->uuid();
diff --git a/chrome/browser/ui/tab_helpers.cc b/chrome/browser/ui/tab_helpers.cc index 7331286..78dc13c 100644 --- a/chrome/browser/ui/tab_helpers.cc +++ b/chrome/browser/ui/tab_helpers.cc
@@ -13,6 +13,7 @@ #include "base/trace_event/trace_event.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" +#include "chrome/browser/3pcd_heuristics/opener_heuristic_tab_helper.h" #include "chrome/browser/bookmarks/bookmark_model_factory.h" #include "chrome/browser/breadcrumbs/breadcrumb_manager_tab_helper.h" #include "chrome/browser/browser_process.h" @@ -371,6 +372,7 @@ MixedContentSettingsTabHelper::CreateForWebContents(web_contents); NavigationMetricsRecorder::CreateForWebContents(web_contents); NavigationPredictorPreconnectClient::CreateForWebContents(web_contents); + OpenerHeuristicTabHelper::CreateForWebContents(web_contents); if (optimization_guide::features::IsOptimizationHintsEnabled()) OptimizationGuideWebContentsObserver::CreateForWebContents(web_contents); optimization_guide::PageContentAnnotationsService*
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc index d2240ded..f218f1e 100644 --- a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc +++ b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc
@@ -894,7 +894,8 @@ // to Google Payments. IN_PROC_BROWSER_TEST_F( SaveCardBubbleViewsFullFormBrowserTestWithAutofillUpstream, - Upload_ClickingSaveClosesBubble) { + // TODO(crbug.com/1447107): Flaky on multiple platforms. + DISABLED_Upload_ClickingSaveClosesBubble) { // Start sync. ASSERT_TRUE(SetupSync()); @@ -1497,7 +1498,8 @@ // detected. IN_PROC_BROWSER_TEST_F( SaveCardBubbleViewsFullFormBrowserTestWithAutofillUpstream, - Logic_ShouldAttemptToOfferToSaveIfNameNotFound) { + // TODO(crbug.com/1447107): Flaky on multiple platforms. + DISABLED_Logic_ShouldAttemptToOfferToSaveIfNameNotFound) { // Start sync. ASSERT_TRUE(SetupSync()); @@ -1698,7 +1700,8 @@ // but month is missing. IN_PROC_BROWSER_TEST_F( SaveCardBubbleViewsFullFormBrowserTestWithAutofillUpstream, - Upload_SubmittingFormWithMissingExpirationDateMonthAndWithValidYear) { + // TODO(crbug.com/1447107): Flaky on multiple platforms. + DISABLED_Upload_SubmittingFormWithMissingExpirationDateMonthAndWithValidYear) { SetUpForEditableExpirationDate(); // Submit the form with a year value, but not a month value. FillFormWithExpirationYearOnly(test::NextYear()); @@ -1717,7 +1720,8 @@ // detected but year is missing. IN_PROC_BROWSER_TEST_F( SaveCardBubbleViewsFullFormBrowserTestWithAutofillUpstream, - Upload_SubmittingFormWithMissingExpirationDateYearAndWithMonth) { + // TODO(crbug.com/1447107): Flaky on multiple platforms. + DISABLED_Upload_SubmittingFormWithMissingExpirationDateYearAndWithMonth) { SetUpForEditableExpirationDate(); // Submit the form with a month value, but not a year value. FillFormWithExpirationMonthOnly("12");
diff --git a/chrome/browser/ui/views/desktop_capture/share_this_tab_dialog_views.cc b/chrome/browser/ui/views/desktop_capture/share_this_tab_dialog_views.cc index a3adf507c..d7da182 100644 --- a/chrome/browser/ui/views/desktop_capture/share_this_tab_dialog_views.cc +++ b/chrome/browser/ui/views/desktop_capture/share_this_tab_dialog_views.cc
@@ -156,8 +156,8 @@ CreateDialogWidget(this, params.context, nullptr)->Show(); } - source_view_->SetBorder( - views::CreateThemedSolidBorder(1, kColorShareThisTabSourceViewBorder)); + source_view_->SetBorder(views::CreateThemedRoundedRectBorder( + 1, 2, kColorShareThisTabSourceViewBorder)); SetButtonLabel(ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_SHARE_THIS_TAB_DIALOG_ALLOW)); @@ -232,8 +232,9 @@ void ShareThisTabDialogView::SetupAudioToggle() { View* audio_toggle_container = AddChildView(std::make_unique<views::View>()); - audio_toggle_container->SetBackground(views::CreateThemedSolidBackground( - kColorShareThisTabAudioToggleBackground)); + audio_toggle_container->SetBackground( + views::CreateThemedRoundedRectBackground( + kColorShareThisTabAudioToggleBackground, 4)); views::ImageView* audio_icon_view = audio_toggle_container->AddChildView( std::make_unique<views::ImageView>()); @@ -276,7 +277,7 @@ if (ShouldAutoAccept()) { Accept(); } else if (ShouldAutoReject()) { - Cancel(); + CancelDialog(); } }
diff --git a/chrome/browser/ui/views/desktop_capture/share_this_tab_source_view.cc b/chrome/browser/ui/views/desktop_capture/share_this_tab_source_view.cc index df336df..724fd03 100644 --- a/chrome/browser/ui/views/desktop_capture/share_this_tab_source_view.cc +++ b/chrome/browser/ui/views/desktop_capture/share_this_tab_source_view.cc
@@ -75,19 +75,14 @@ {base::MayBlock(), base::TaskPriority::USER_VISIBLE})) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); CHECK(web_contents_); - View* throbber_container = AddChildView(std::make_unique<views::View>()); - views::BoxLayout* throbber_layout = - throbber_container->SetLayoutManager(std::make_unique<views::BoxLayout>( - views::BoxLayout::Orientation::kHorizontal)); - throbber_layout->set_main_axis_alignment( - views::BoxLayout::MainAxisAlignment::kCenter); - throbber_layout->set_cross_axis_alignment( - views::BoxLayout::CrossAxisAlignment::kCenter); - // TODO(crbug.com/1428878): Use distances from LayoutProvider - throbber_container->SetBoundsRect(kPreviewRect); - throbber_container->SetCanProcessEventsWithinSubtree(false); - throbber_ = - throbber_container->AddChildView(std::make_unique<views::Throbber>()); + + constexpr int kThrobberRadius = 14; + constexpr gfx::Rect kThrobberRect( + kPadding + kPreviewWidth / 2 - kThrobberRadius, + kPadding + kPreviewHeight / 2 - kThrobberRadius, 2 * kThrobberRadius, + 2 * kThrobberRadius); + throbber_ = AddChildView(std::make_unique<views::Throbber>()); + throbber_->SetBoundsRect(kThrobberRect); throbber_->Start(); image_view_ = AddChildView(std::make_unique<views::ImageView>());
diff --git a/chrome/browser/ui/views/download/bubble/download_bubble_browsertest.cc b/chrome/browser/ui/views/download/bubble/download_bubble_browsertest.cc index 12b72f7..83b0142 100644 --- a/chrome/browser/ui/views/download/bubble/download_bubble_browsertest.cc +++ b/chrome/browser/ui/views/download/bubble/download_bubble_browsertest.cc
@@ -58,7 +58,14 @@ // Download bubble does not exist in Ash. #if !BUILDFLAG(IS_CHROMEOS_ASH) -IN_PROC_BROWSER_TEST_F(DownloadBubbleTest, IPHWithNoInteraction) { + +// TODO(crbug.com/1447009): fix flakiness and re-enable. +#if defined(ADDRESS_SANITIZER) +#define MAYBE_IPHWithNoInteraction DISABLED_IPHWithNoInteraction +#else +#define MAYBE_IPHWithNoInteraction IPHWithNoInteraction +#endif +IN_PROC_BROWSER_TEST_F(DownloadBubbleTest, MAYBE_IPHWithNoInteraction) { BrowserView* const browser_view = BrowserView::GetBrowserViewForBrowser(browser()); ASSERT_TRUE(user_education::test::WaitForFeatureEngagementReady(
diff --git a/chrome/browser/ui/views/download/bubble/download_bubble_row_list_view.cc b/chrome/browser/ui/views/download/bubble/download_bubble_row_list_view.cc index 1f88324..79caa96 100644 --- a/chrome/browser/ui/views/download/bubble/download_bubble_row_list_view.cc +++ b/chrome/browser/ui/views/download/bubble/download_bubble_row_list_view.cc
@@ -46,11 +46,12 @@ auto row_list_view = std::make_unique<DownloadBubbleRowListView>(is_partial_view, browser); for (DownloadUIModel::DownloadUIModelPtr& model : rows) { - // raw pointer is safe as the toolbar owns the bubble, which owns an - // individual row view. + // raw pointer for `row_list_view` is safe as the toolbar owns the bubble, + // which owns an individual row view. Note we need to copy rather than move + // the WeakPtrs so that each row view gets a valid pointer. row_list_view->AddChildView(std::make_unique<DownloadBubbleRowView>( - std::move(model), row_list_view.get(), std::move(bubble_controller), - std::move(navigation_handler), browser, fixed_width)); + std::move(model), row_list_view.get(), bubble_controller, + navigation_handler, browser, fixed_width)); } auto scroll_view = std::make_unique<views::ScrollView>();
diff --git a/chrome/browser/ui/views/frame/immersive_mode_controller_mac.mm b/chrome/browser/ui/views/frame/immersive_mode_controller_mac.mm index 7777c90..1b48e12c 100644 --- a/chrome/browser/ui/views/frame/immersive_mode_controller_mac.mm +++ b/chrome/browser/ui/views/frame/immersive_mode_controller_mac.mm
@@ -442,18 +442,6 @@ browser_view->frame()->GetFrameView()) ->GetTopInset(false); - // TODO(https://crbug.com/1414521): The |tab_overlay_widget()| draws - // underneath the traffic lights via an NSTitlebarViewController with - // NSLayoutAttributeTrailing layout. In order to propagate all mouse and - // keyboard events from AppKit back to Views the |tab_overlay_widget()| - // needs to be placed at the same location on screen as the - // NSTitlebarViewController. 0,0 is the correct location for the input to - // line up with the view, however this causes mouse actions to not make it - // to the traffic lights. For now the |tab_overlay_widget()| has been - // ordered behind the AppKit fullscreen window which hosts the traffic - // lights. This allows for interaction with the traffic lights and tab strip - // but child widgets of |tab_overlay_widget()| appear underneath the - // toolbar. Find a solution. browser_view->tab_overlay_widget()->SetBounds( gfx::Rect(0, 0, browser_view->top_container()->size().width(), tab_widget_height_));
diff --git a/chrome/browser/ui/views/intent_picker_bubble_view_browsertest.cc b/chrome/browser/ui/views/intent_picker_bubble_view_browsertest.cc index 19e27f90..4cacba4 100644 --- a/chrome/browser/ui/views/intent_picker_bubble_view_browsertest.cc +++ b/chrome/browser/ui/views/intent_picker_bubble_view_browsertest.cc
@@ -146,8 +146,16 @@ #if !BUILDFLAG(IS_CHROMEOS_LACROS) // Tests that clicking a link from a tabbed browser to within the scope of an // installed app shows the intent picker icon in Omnibox. +// TODO(crbug.com/1427908): Flaky on Mac. +#if BUILDFLAG(IS_MAC) +#define MAYBE_NavigationToInScopeLinkShowsIntentPicker \ + DISABLED_NavigationToInScopeLinkShowsIntentPicker +#else +#define MAYBE_NavigationToInScopeLinkShowsIntentPicker \ + NavigationToInScopeLinkShowsIntentPicker +#endif IN_PROC_BROWSER_TEST_P(IntentPickerIconBrowserTest, - NavigationToInScopeLinkShowsIntentPicker) { + MAYBE_NavigationToInScopeLinkShowsIntentPicker) { InstallTestWebApp(); const GURL in_scope_url =
diff --git a/chrome/browser/ui/views/location_bar/intent_chip_button_browsertest.cc b/chrome/browser/ui/views/location_bar/intent_chip_button_browsertest.cc index ab65c042..90e5e03 100644 --- a/chrome/browser/ui/views/location_bar/intent_chip_button_browsertest.cc +++ b/chrome/browser/ui/views/location_bar/intent_chip_button_browsertest.cc
@@ -300,14 +300,9 @@ ASSERT_TRUE(IntentPickerBubbleView::intent_picker_bubble()); } -// TODO(crbug.com/1427908): Flaky on Linux CFI. -#if BUILDFLAG(CFI_ICALL_CHECK) && BUILDFLAG(IS_LINUX) -#define MAYBE_ShowsIntentChipCollapsed DISABLED_ShowsIntentChipCollapsed -#else -#define MAYBE_ShowsIntentChipCollapsed ShowsIntentChipCollapsed -#endif +// TODO(crbug.com/1427908): Flaky on many platforms. IN_PROC_BROWSER_TEST_F(IntentChipButtonSkipIntentPickerBrowserTest, - MAYBE_ShowsIntentChipCollapsed) { + DISABLED_ShowsIntentChipCollapsed) { const GURL in_scope_url = https_server().GetURL(GetAppUrlHost(), GetInScopeUrlPath()); const GURL out_of_scope_url =
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_button_view.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_button_view.cc index 5fea811..8780183 100644 --- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_button_view.cc +++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_button_view.cc
@@ -23,8 +23,6 @@ icon_size); ConfigureInkDropForToolbar(this); views::InstallCircleHighlightPathGenerator(this); - SetBorder(views::CreateEmptyBorder( - gfx::Insets::VH(kInternalInsets / 2, kInternalInsets / 2))); SetTooltipText(tooltip); }
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_font_combobox.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_font_combobox.cc index 711e403..1e9a4b4b 100644 --- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_font_combobox.cc +++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_font_combobox.cc
@@ -45,6 +45,7 @@ SetBorderColorId(ui::kColorSidePanelComboboxBorder); SetMenuModel(std::move(new_model)); SetFocusBehavior(FocusBehavior::ALWAYS); + SetEventHighlighting(true); } void ReadAnythingFontCombobox::GetAccessibleNodeData(
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.cc index 82dbe69..cfa469f 100644 --- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.cc +++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.cc
@@ -200,11 +200,13 @@ letter_spacing_button_->SetBackground( views::CreateThemedSolidBackground(background_color_id)); - decrease_text_size_button_->UpdateIcon( - kTextDecreaseIcon, kIconSize, foreground_color_id, focus_ring_color_id); + decrease_text_size_button_->UpdateIcon(kTextDecreaseIcon, kFontSizeIconSize, + foreground_color_id, + focus_ring_color_id); - increase_text_size_button_->UpdateIcon( - kTextIncreaseIcon, kIconSize, foreground_color_id, focus_ring_color_id); + increase_text_size_button_->UpdateIcon(kTextIncreaseIcon, kFontSizeIconSize, + foreground_color_id, + focus_ring_color_id); colors_button_->SetIcon(kPaletteIcon, kIconSize, foreground_color_id, focus_ring_color_id);
diff --git a/chrome/browser/ui/views/tabs/fade_label_view.cc b/chrome/browser/ui/views/tabs/fade_label_view.cc new file mode 100644 index 0000000..2520738 --- /dev/null +++ b/chrome/browser/ui/views/tabs/fade_label_view.cc
@@ -0,0 +1,80 @@ +// 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/tabs/fade_label_view.h" + +#include "chrome/browser/ui/views/tabs/filename_elider.h" +#include "ui/gfx/canvas.h" + +namespace { +template <typename T> +std::unique_ptr<T> CreateLabel(int context) { + return std::make_unique<T>(std::u16string(), context, + views::style::STYLE_PRIMARY); +} +} // namespace + +// FadeLabel +// ---------------------------------------------------------- + +void FadeLabel::SetData(const FadeLabelViewData& data) { + data_ = data; + std::u16string text = data.text; + absl::optional<bool> is_filename = data.is_filename; + SetElideBehavior(is_filename ? gfx::NO_ELIDE : gfx::ELIDE_TAIL); + if (is_filename) { + text = TruncateFilenameToTwoLines(text); + } + SetText(text); +} + +void FadeLabel::SetFade(double percent) { + percent = std::min(1.0, percent); + const SkAlpha alpha = base::saturated_cast<SkAlpha>( + std::numeric_limits<SkAlpha>::max() * (1.0 - percent)); + SetBackgroundColor(SkColorSetA(GetBackgroundColor(), alpha)); + SetEnabledColor(SkColorSetA(GetEnabledColor(), alpha)); +} + +void FadeLabel::SetPaintBackground(bool paint_background) { + paint_background_ = paint_background; +} + +void FadeLabel::OnPaintBackground(gfx::Canvas* canvas) { + if (paint_background_) { + canvas->DrawColor(GetBackgroundColor()); + } else { + views::Label::OnPaintBackground(canvas); + } +} + +// Returns a version of the text that's middle-elided on two lines. +std::u16string FadeLabel::TruncateFilenameToTwoLines( + const std::u16string& text) const { + FilenameElider elider(CreateRenderText()); + gfx::Rect text_rect = GetContentsBounds(); + text_rect.Inset(-gfx::ShadowValue::GetMargin(GetShadows())); + return elider.Elide(text, text_rect); +} + +// FadeLabelView: +// ---------------------------------------------------------- + +FadeLabelView::FadeLabelView(int context, int num_lines) + : FadeView<FadeLabel, FadeLabel, FadeLabelViewData>( + CreateLabel<FadeLabel>(context), + CreateLabel<FadeLabel>(context)) { + if (num_lines > 1) { + primary_view_->SetMultiLine(true); + fade_out_view_->SetMultiLine(true); + primary_view_->SetMaxLines(num_lines); + fade_out_view_->SetMaxLines(num_lines); + } + + fade_out_view_->SetPaintBackground(true); +} + +std::u16string FadeLabelView::GetText() { + return primary_view_->GetText(); +}
diff --git a/chrome/browser/ui/views/tabs/fade_label_view.h b/chrome/browser/ui/views/tabs/fade_label_view.h new file mode 100644 index 0000000..5434158 --- /dev/null +++ b/chrome/browser/ui/views/tabs/fade_label_view.h
@@ -0,0 +1,61 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_VIEWS_TABS_FADE_LABEL_VIEW_H_ +#define CHROME_BROWSER_UI_VIEWS_TABS_FADE_LABEL_VIEW_H_ + +#include "chrome/browser/ui/views/tabs/fade_view.h" +#include "ui/views/accessibility/view_accessibility.h" +#include "ui/views/controls/label.h" + +struct FadeLabelViewData { + std::u16string text; + bool is_filename; +}; + +// Label that is able to fade when used in conjunction with FadeView +class FadeLabel : public FadeWrapper<views::Label, FadeLabelViewData> { + public: + template <typename... Args> + explicit FadeLabel(Args&&... args) + : FadeWrapper<views::Label, FadeLabelViewData>( + std::forward<Args>(args)...) { + SetHorizontalAlignment(gfx::ALIGN_LEFT); + SetVerticalAlignment(gfx::ALIGN_TOP); + } + + ~FadeLabel() override = default; + + // FadeWrapper: + void SetData(const FadeLabelViewData& data) override; + void SetFade(double percent) override; + + // Renders the label's background in a solid color so that the label can be + // placed in front of a nother label and animate a fade out + void SetPaintBackground(bool paint_background); + + // views::Label: + void OnPaintBackground(gfx::Canvas* canvas) override; + + private: + // Returns a version of the text that's middle-elided on two lines. + std::u16string TruncateFilenameToTwoLines(const std::u16string& text) const; + + bool paint_background_ = false; +}; + +// This view overlays and fades out an old version of the text of a label, +// while displaying the new text underneath. It is used to fade out the old +// value of the title and domain labels on the hover card when the tab switches +// or the tab title changes. +class FadeLabelView : public FadeView<FadeLabel, FadeLabel, FadeLabelViewData> { + public: + FadeLabelView(int context, int num_lines); + + ~FadeLabelView() override = default; + + std::u16string GetText(); +}; + +#endif // CHROME_BROWSER_UI_VIEWS_TABS_FADE_LABEL_VIEW_H_
diff --git a/chrome/browser/ui/views/tabs/fade_view.h b/chrome/browser/ui/views/tabs/fade_view.h new file mode 100644 index 0000000..3d68d8b --- /dev/null +++ b/chrome/browser/ui/views/tabs/fade_view.h
@@ -0,0 +1,87 @@ +// 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_TABS_FADE_VIEW_H_ +#define CHROME_BROWSER_UI_VIEWS_TABS_FADE_VIEW_H_ + +#include "ui/color/color_provider.h" +#include "ui/gfx/animation/tween.h" +#include "ui/views/background.h" +#include "ui/views/layout/fill_layout.h" +#include "ui/views/layout/flex_layout_types.h" +#include "ui/views/view.h" +#include "ui/views/view_class_properties.h" + +// Adapts any view `T` so that the view can fade when used by a FadeView +template <typename T, typename V> +class FadeWrapper : public T { + public: + template <typename... Args> + explicit FadeWrapper(Args&&... args) : T(std::forward<Args>(args)...) {} + + virtual void SetData(const V& data) = 0; + const V& GetData() { return data_; } + + // Sets the fade of this FadeWrapper's fade as |percent| in the range [0, 1] + virtual void SetFade(double percent) = 0; + + protected: + V data_; +}; + +// Cross fades any view so that view `U` is the old view that would be faded +// away. This allows view `T` to fade in for the user to ensure a smooth +// transition from the view with the old data `U` to the updated data in `T` +template <typename T, typename U, typename V> +class FadeView : public views::View { + public: + FadeView(std::unique_ptr<T> primary_view, std::unique_ptr<U> fade_out_view) { + SetLayoutManager(std::make_unique<views::FillLayout>()); + primary_view_ = AddChildView(std::move(primary_view)); + fade_out_view_ = AddChildView(std::move(fade_out_view)); + } + + ~FadeView() override = default; + + void SetData(const V& data) { + fade_out_view_->SetData(primary_view_->GetData()); + primary_view_->SetData(data); + } + + // Sets the fade-out of the `fade_out_view_` as |percent| in the range [0, 1]. + // Since FadeView is designed to mask new view with the old and then fade + // away, the higher the percentage the less opaque the view. + void SetFade(double percent) { + percent_ = percent; + fade_out_view_->SetFade(percent); + if (percent == 1.0) { + fade_out_view_->SetData(V()); + } + } + + gfx::Size GetMinimumSize() const override { + return primary_view_->GetMinimumSize(); + } + + gfx::Size CalculatePreferredSize() const override { + return primary_view_->CalculatePreferredSize(); + } + + int GetHeightForWidth(int width) const override { + return primary_view_->GetHeightForWidth(width); + } + + gfx::Size GetMaximumSize() const override { + return gfx::Tween::SizeValueBetween(percent_, + fade_out_view_->GetPreferredSize(), + primary_view_->GetPreferredSize()); + } + + protected: + raw_ptr<T> primary_view_ = nullptr; + raw_ptr<U> fade_out_view_ = nullptr; + double percent_ = 1.0; +}; + +#endif // CHROME_BROWSER_UI_VIEWS_TABS_FADE_VIEW_H_
diff --git a/chrome/browser/ui/views/tabs/filename_elider.cc b/chrome/browser/ui/views/tabs/filename_elider.cc new file mode 100644 index 0000000..59a1d7b8 --- /dev/null +++ b/chrome/browser/ui/views/tabs/filename_elider.cc
@@ -0,0 +1,245 @@ +// 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/tabs/filename_elider.h" + +#include "base/i18n/break_iterator.h" +#include "base/i18n/char_iterator.h" +#include "base/strings/string_util.h" +#include "ui/gfx/selection_model.h" +#include "ui/gfx/text_elider.h" +#include "ui/gfx/text_utils.h" + +FilenameElider::FilenameElider(std::unique_ptr<gfx::RenderText> render_text) + : render_text_(std::move(render_text)) {} + +FilenameElider::~FilenameElider() = default; + +std::u16string FilenameElider::Elide(const std::u16string& text, + const gfx::Rect& display_rect) const { + render_text_->SetText(text); + return ElideImpl(GetLineLengths(display_rect)); +} + +// static +std::u16string::size_type FilenameElider::FindImageDimensions( + const std::u16string& text) { + // We don't have regexes in Chrome, but we can still do a rough evaluation of + // the line to see if it ends with the expected pattern: + // + // title[ (width×height)] + // + // We'll look for the open parenthesis, then the rest of the size. Note that + // we don't have to worry about graphemes or combining characters because any + // character that's not of the expected type means there is no dimension. + + // Find the start of the extension. + const auto paren_pos = text.find_last_of(u'('); + if (paren_pos == 0 || paren_pos == std::u16string::npos || + text[paren_pos - 1] != u' ') { + return std::u16string::npos; + } + + // Fast forward to the unicode character following the paren. + base::i18n::UTF16CharIterator it( + base::StringPiece16(text).substr(paren_pos + 1)); + + // Look for the image width. + if (!base::IsAsciiDigit(it.get())) { + return std::u16string::npos; + } + while (it.Advance() && base::IsAsciiDigit(it.get())) { + // empty loop + } + + // Look for the × character and the height. + constexpr char16_t kMultiplicationSymbol = u'\u00D7'; + if (it.end() || it.get() != kMultiplicationSymbol || !it.Advance() || + !base::IsAsciiDigit(it.get())) { + return std::u16string::npos; + } + while (it.Advance() && base::IsAsciiDigit(it.get())) { + // empty loop + } + + // Look for the closing parenthesis and make sure we've hit the end of the + // string. + if (it.end() || it.get() != u')') { + return std::u16string::npos; + } + it.Advance(); + return it.end() ? paren_pos : std::u16string::npos; +} + +FilenameElider::LineLengths FilenameElider::GetLineLengths( + const gfx::Rect& display_rect) const { + const std::u16string text = render_text_->text(); + render_text_->SetMaxLines(0); + render_text_->SetMultiline(false); + render_text_->SetWhitespaceElision(true); + render_text_->SetDisplayRect(display_rect); + + // Set our temporary RenderText to the unelided text and elide the start of + // the string to give us a guess at where the second line of the label + // should start. + render_text_->SetElideBehavior(gfx::ElideBehavior::ELIDE_HEAD); + const std::u16string tentative_second_line = render_text_->GetDisplayText(); + + // If there is no elision, then the text will fit on a single line and + // there's nothing to do. + if (tentative_second_line == text) { + return LineLengths(text.length(), text.length()); + } + + // If there's not enough space to display even a single character, there is + // also nothing to do; the result needs to be empty. + if (tentative_second_line.empty()) { + return LineLengths(0, 0); + } + + LineLengths result; + + // Since we truncated, expect the string to start with ellipsis, then + // calculate the length of the string sans ellipsis. + DCHECK_EQ(gfx::kEllipsisUTF16[0], tentative_second_line[0]); + + // TODO(crbug.com/1239317): Elision is still a little flaky, so we'll make + // sure we didn't stop in the middle of a grapheme. The +1 is to move past + // the ellipsis which is not part of the original string. + size_t pos = text.length() - tentative_second_line.length() + 1; + if (!render_text_->IsGraphemeBoundary(pos)) { + pos = render_text_->IndexOfAdjacentGrapheme(pos, gfx::CURSOR_FORWARD); + } + result.second = text.length() - pos; + + // Calculate the first line by aggressively truncating the text. This may + // cut the string somewhere other than a word boundary, but for very long + // filenames, it's probably best to fit as much of the name on the card as + // possible, even if we sacrifice a small amount of readability. + render_text_->SetElideBehavior(gfx::ElideBehavior::TRUNCATE); + result.first = render_text_->GetDisplayText().length(); + + // TOOD(crbug.com/1239317) Handle the case where we ended up in the middle + // of a grapheme. + if (!render_text_->IsGraphemeBoundary(result.first)) { + result.first = render_text_->IndexOfAdjacentGrapheme(result.first, + gfx::CURSOR_BACKWARD); + } + + return result; +} + +std::u16string FilenameElider::ElideImpl( + FilenameElider::LineLengths line_lengths) const { + const std::u16string& text = render_text_->text(); + + // Validate the inputs. All of these are base assumptions. + DCHECK_LE(line_lengths.first, text.length()); + DCHECK_LE(line_lengths.second, text.length()); + DCHECK(render_text_->IsGraphemeBoundary(line_lengths.first)); + DCHECK(render_text_->IsGraphemeBoundary(text.length() - line_lengths.second)); + + // If the entire text fits on a single line, use it as-is. + if (line_lengths.first == text.length() || + line_lengths.second == text.length()) { + return text; + } + + // If no characters will fit on one of the lines, return an empty string. + if (line_lengths.first == 0 || line_lengths.second == 0) { + return std::u16string(); + } + + // Let's figure out where to actually start the second line. Strings that + // are too long for one line but fit on two lines tend to create some + // overlap between the first and second line, so take the maximum of the + // second line cut and the end of the first line. + const size_t second_line_cut = text.length() - line_lengths.second; + size_t cut_point = std::max(second_line_cut, line_lengths.first); + + // We got the whole line if the cut point is the character immediately + // after the first line cuts off (otherwise we've truncated and need to + // show an ellipsis in the final string). + const bool is_whole_string = (cut_point == line_lengths.first); + + // If there is some flexibility in where we make our cut point (that is, the + // potential first and second lines overlap), there are a few specific places + // we preferentially want to separate the lines. + bool adjusted_cut_point = false; + if (is_whole_string && cut_point >= second_line_cut) { + // First, if there are image dimensions, preferentially put those on the + // second line. + const auto paren_pos = FindImageDimensions(text); + if (paren_pos != std::u16string::npos && paren_pos >= second_line_cut && + paren_pos <= cut_point) { + cut_point = paren_pos; + adjusted_cut_point = true; + } + + // Second, we can break at the start of the file extension. + if (!adjusted_cut_point) { + const size_t dot_pos = text.find_last_of(u'.'); + if (dot_pos != std::u16string::npos && dot_pos >= second_line_cut && + dot_pos <= cut_point) { + cut_point = dot_pos; + adjusted_cut_point = true; + } + } + } + + // TODO(dfried): possibly handle the case where we chop a section with bidi + // delimiters out or split it between lines. + + // If we didn't put the extension on its own line, eliminate whitespace + // from the start of the second line (it looks weird). + if (!adjusted_cut_point) { + cut_point = + gfx::FindValidBoundaryAfter(text, cut_point, /*trim_whitespace =*/true); + } + + // Reassemble the string. Start with the first line up to `cut_point` or the + // end of the line, whichever comes sooner. + std::u16string result = + text.substr(0, std::min(line_lengths.first, cut_point)); + result.push_back(u'\n'); + + // If we're starting the second line with a file extension hint that the + // directionality of the text might change by using an FSI mark. Allowing + // the renderer to re-infer RTL-ness produces much better results in text + // rendering when an RTL filename has an ASCII extension. + // + // TODO(dfried): Currently we do put an FSI before an ellipsis; this + // results in the ellipsis being placed with the text that immediately + // follows it (making the point of elision more obvious). If the text + // following the cut is LTR it goes on the left, and if the text is RTL it + // goes on the right. Reconsider if/how we should set text direction + // following an ellipsis: + // - No FSI would cause the ellipsis to align with the preceding rather + // than the following text. It would provide a bit more visual continuity + // between lines, but might be confusing as to where the text picks back + // up (as the next character might be on the opposite side of the line). + // - We could preserve elided directionality markers, but they could end up + // aligning the ellipsis with text that is not present at all on the + // label. + // - We could also force direction to match the start of the first line for + // consistency but that could result in an ellipsis that matches neither + // the preceding nor following text. + // + // TODO(dfried): move these declarations to rtl.h alongside e.g. + // base::i18n::kRightToLeftMark + constexpr char16_t kFirstStrongIsolateMark = u'\u2068'; + constexpr char16_t kPopDirectionalIsolateMark = u'\u2069'; + if (adjusted_cut_point || !is_whole_string) { + result += kFirstStrongIsolateMark; + } + if (!is_whole_string) { + result.push_back(gfx::kEllipsisUTF16[0]); + } + result.append(text.substr(cut_point)); + // If we added an FSI, we should bracket it with a PDI. + if (adjusted_cut_point || !is_whole_string) { + result += kPopDirectionalIsolateMark; + } + return result; +}
diff --git a/chrome/browser/ui/views/tabs/filename_elider.h b/chrome/browser/ui/views/tabs/filename_elider.h new file mode 100644 index 0000000..cb21674 --- /dev/null +++ b/chrome/browser/ui/views/tabs/filename_elider.h
@@ -0,0 +1,82 @@ +// 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_TABS_FILENAME_ELIDER_H_ +#define CHROME_BROWSER_UI_VIEWS_TABS_FILENAME_ELIDER_H_ + +#include <string> + +#include "ui/gfx/geometry/rect.h" +#include "ui/gfx/render_text.h" + +// Helper class used to elide local filenames with a RenderText object that +// is provided with the correct setup and formatting. +class FilenameElider { + public: + using LineLengths = std::pair<size_t, size_t>; + + explicit FilenameElider(std::unique_ptr<gfx::RenderText> render_text); + ~FilenameElider(); + + // Returns the elided text. Equivalent to: + // Elide(GetLineLengths(display_rect)) + // See those methods for a detailed description. + std::u16string Elide(const std::u16string& text, + const gfx::Rect& display_rect) const; + + // Returns the start of the image dimensions as typically formatted by + // Chrome in page titles, as a hint at how to potentially elide or split + // the title. Expects something in the format "title (width×height)". + // Returns std::u16string::npos if this pattern isn't found, otherwise + // returns the index of the opening parenthesis in the string. + // + // If the result isn't npos, then the character previous to the open paren + // character is guaranteed to be whitespace. + static std::u16string::size_type FindImageDimensions( + const std::u16string& text); + + private: + friend class TabHoverCardBubbleViewFilenameEliderTest; + + // Given the current text and a rectangle to display text in, returns the + // maximum length in characters of the first and second lines. + // + // The first value is the number of characters from the beginning of the + // text that will fit on the line. The second value is the number of + // characters from the end of the text that will fit on a line, minus + // enough space to insert an ellipsis. + // + // Note that the sum of the two values may be greater than the length of + // the text. Both segments are guaranteed to end at grapheme boundaries. + LineLengths GetLineLengths(const gfx::Rect& display_rect) const; + + // Returns a string formatted for two-line elision given the last string + // passed to SetText() and the maximum extent of the first and second + // lines. The resulting string will either be the original text (if it fits + // on one line) or the first line, followed by a newline, an ellipsis, and + // the second line. The cut points passed in must be at grapheme + // boundaries. + // + // If the two lines overlap (that is, if the line lengths sum to more than + // the length of the original text), an optimum breakpoint will be chosen + // to insert the newline: + // * If possible, the extension (and if it's an image, the image + // dimensions) will be placed alone on the second line. + // * Otherwise, as many characters as possible will be placed on the first + // line. + // TODO(dfried): consider optimizing to break at natural breaks: spaces, + // punctuation, etc. + // + // Note that if the extension is isolated on the second line or an ellipsis + // is inserted, the second line will be marked as a bidirectional isolate, + // so that its direction is determined by the leading text on the line + // rather than whatever is "left over" from the first line. We find this + // produces a much more visually appealing and less confusing result than + // inheriting the preceding directionality. + std::u16string ElideImpl(LineLengths line_lengths) const; + + std::unique_ptr<gfx::RenderText> render_text_; +}; + +#endif // CHROME_BROWSER_UI_VIEWS_TABS_FILENAME_ELIDER_H_
diff --git a/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc b/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc index d5826ad..4d3e7cf 100644 --- a/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc +++ b/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc
@@ -11,13 +11,10 @@ #include <string> #include "base/containers/lru_cache.h" -#include "base/i18n/break_iterator.h" -#include "base/i18n/char_iterator.h" #include "base/memory/raw_ptr.h" #include "base/metrics/field_trial_params.h" #include "base/metrics/histogram_macros.h" #include "base/strings/string_piece.h" -#include "base/strings/string_util.h" #include "build/build_config.h" #include "chrome/app/vector_icons/vector_icons.h" #include "chrome/browser/ui/color/chrome_color_id.h" @@ -26,6 +23,8 @@ #include "chrome/browser/ui/thumbnails/thumbnail_image.h" #include "chrome/browser/ui/ui_features.h" #include "chrome/browser/ui/views/chrome_typography.h" +#include "chrome/browser/ui/views/tabs/fade_label_view.h" +#include "chrome/browser/ui/views/tabs/filename_elider.h" #include "chrome/browser/ui/views/tabs/tab.h" #include "chrome/browser/ui/views/tabs/tab_hover_card_controller.h" #include "chrome/browser/ui/views/tabs/tab_style_views.h" @@ -46,10 +45,7 @@ #include "ui/gfx/geometry/rounded_corners_f.h" #include "ui/gfx/image/image_skia.h" #include "ui/gfx/paint_vector_icon.h" -#include "ui/gfx/selection_model.h" #include "ui/gfx/text_constants.h" -#include "ui/gfx/text_elider.h" -#include "ui/gfx/text_utils.h" #include "ui/resources/grit/ui_resources.h" #include "ui/views/accessibility/view_accessibility.h" #include "ui/views/background.h" @@ -122,368 +118,8 @@ 0); return use_alternate_format != 0; } - -// Label that renders its background in a solid color. Placed in front of a -// normal label either by being later in the draw order or on a layer, it can -// be used to animate a fade-out. -class SolidLabel : public views::Label { - public: - METADATA_HEADER(SolidLabel); - using Label::Label; - SolidLabel() = default; - ~SolidLabel() override = default; - - protected: - // views::Label: - void OnPaintBackground(gfx::Canvas* canvas) override { - canvas->DrawColor(GetBackgroundColor()); - } -}; - -BEGIN_METADATA(SolidLabel, views::Label) -END_METADATA - -// Label that exposes the CreateRenderText() method, so that we can use -// TabHoverCardBubbleView::FilenameElider to do a two-line elision of -// filenames. -class RenderTextFactoryLabel : public views::Label { - public: - using Label::CreateRenderText; - using Label::Label; -}; - } // namespace -// TabHoverCardBubbleView::FilenameElider: -// ---------------------------------------------------------- - -TabHoverCardBubbleView::FilenameElider::FilenameElider( - std::unique_ptr<gfx::RenderText> render_text) - : render_text_(std::move(render_text)) {} - -TabHoverCardBubbleView::FilenameElider::~FilenameElider() = default; - -std::u16string TabHoverCardBubbleView::FilenameElider::Elide( - const std::u16string& text, - const gfx::Rect& display_rect) const { - render_text_->SetText(text); - return ElideImpl(GetLineLengths(display_rect)); -} - -// static -std::u16string::size_type -TabHoverCardBubbleView::FilenameElider::FindImageDimensions( - const std::u16string& text) { - // We don't have regexes in Chrome, but we can still do a rough evaluation of - // the line to see if it ends with the expected pattern: - // - // title[ (width×height)] - // - // We'll look for the open parenthesis, then the rest of the size. Note that - // we don't have to worry about graphemes or combining characters because any - // character that's not of the expected type means there is no dimension. - - // Find the start of the extension. - const auto paren_pos = text.find_last_of(u'('); - if (paren_pos == 0 || paren_pos == std::u16string::npos || - text[paren_pos - 1] != u' ') { - return std::u16string::npos; - } - - // Fast forward to the unicode character following the paren. - base::i18n::UTF16CharIterator it( - base::StringPiece16(text).substr(paren_pos + 1)); - - // Look for the image width. - if (!base::IsAsciiDigit(it.get())) { - return std::u16string::npos; - } - while (it.Advance() && base::IsAsciiDigit(it.get())) { - // empty loop - } - - // Look for the × character and the height. - constexpr char16_t kMultiplicationSymbol = u'\u00D7'; - if (it.end() || it.get() != kMultiplicationSymbol || !it.Advance() || - !base::IsAsciiDigit(it.get())) { - return std::u16string::npos; - } - while (it.Advance() && base::IsAsciiDigit(it.get())) { - // empty loop - } - - // Look for the closing parenthesis and make sure we've hit the end of the - // string. - if (it.end() || it.get() != u')') - return std::u16string::npos; - it.Advance(); - return it.end() ? paren_pos : std::u16string::npos; -} - -TabHoverCardBubbleView::FilenameElider::LineLengths -TabHoverCardBubbleView::FilenameElider::GetLineLengths( - const gfx::Rect& display_rect) const { - const std::u16string text = render_text_->text(); - render_text_->SetMaxLines(0); - render_text_->SetMultiline(false); - render_text_->SetWhitespaceElision(true); - render_text_->SetDisplayRect(display_rect); - - // Set our temporary RenderText to the unelided text and elide the start of - // the string to give us a guess at where the second line of the label - // should start. - render_text_->SetElideBehavior(gfx::ElideBehavior::ELIDE_HEAD); - const std::u16string tentative_second_line = render_text_->GetDisplayText(); - - // If there is no elision, then the text will fit on a single line and - // there's nothing to do. - if (tentative_second_line == text) - return LineLengths(text.length(), text.length()); - - // If there's not enough space to display even a single character, there is - // also nothing to do; the result needs to be empty. - if (tentative_second_line.empty()) - return LineLengths(0, 0); - - LineLengths result; - - // Since we truncated, expect the string to start with ellipsis, then - // calculate the length of the string sans ellipsis. - DCHECK_EQ(gfx::kEllipsisUTF16[0], tentative_second_line[0]); - - // TODO(crbug.com/1239317): Elision is still a little flaky, so we'll make - // sure we didn't stop in the middle of a grapheme. The +1 is to move past - // the ellipsis which is not part of the original string. - size_t pos = text.length() - tentative_second_line.length() + 1; - if (!render_text_->IsGraphemeBoundary(pos)) - pos = render_text_->IndexOfAdjacentGrapheme(pos, gfx::CURSOR_FORWARD); - result.second = text.length() - pos; - - // Calculate the first line by aggressively truncating the text. This may - // cut the string somewhere other than a word boundary, but for very long - // filenames, it's probably best to fit as much of the name on the card as - // possible, even if we sacrifice a small amount of readability. - render_text_->SetElideBehavior(gfx::ElideBehavior::TRUNCATE); - result.first = render_text_->GetDisplayText().length(); - - // TOOD(crbug.com/1239317) Handle the case where we ended up in the middle - // of a grapheme. - if (!render_text_->IsGraphemeBoundary(result.first)) { - result.first = render_text_->IndexOfAdjacentGrapheme(result.first, - gfx::CURSOR_BACKWARD); - } - - return result; -} - -std::u16string TabHoverCardBubbleView::FilenameElider::ElideImpl( - TabHoverCardBubbleView::FilenameElider::LineLengths line_lengths) const { - const std::u16string& text = render_text_->text(); - - // Validate the inputs. All of these are base assumptions. - DCHECK_LE(line_lengths.first, text.length()); - DCHECK_LE(line_lengths.second, text.length()); - DCHECK(render_text_->IsGraphemeBoundary(line_lengths.first)); - DCHECK(render_text_->IsGraphemeBoundary(text.length() - line_lengths.second)); - - // If the entire text fits on a single line, use it as-is. - if (line_lengths.first == text.length() || - line_lengths.second == text.length()) { - return text; - } - - // If no characters will fit on one of the lines, return an empty string. - if (line_lengths.first == 0 || line_lengths.second == 0) - return std::u16string(); - - // Let's figure out where to actually start the second line. Strings that - // are too long for one line but fit on two lines tend to create some - // overlap between the first and second line, so take the maximum of the - // second line cut and the end of the first line. - const size_t second_line_cut = text.length() - line_lengths.second; - size_t cut_point = std::max(second_line_cut, line_lengths.first); - - // We got the whole line if the cut point is the character immediately - // after the first line cuts off (otherwise we've truncated and need to - // show an ellipsis in the final string). - const bool is_whole_string = (cut_point == line_lengths.first); - - // If there is some flexibility in where we make our cut point (that is, the - // potential first and second lines overlap), there are a few specific places - // we preferentially want to separate the lines. - bool adjusted_cut_point = false; - if (is_whole_string && cut_point >= second_line_cut) { - // First, if there are image dimensions, preferentially put those on the - // second line. - const auto paren_pos = FindImageDimensions(text); - if (paren_pos != std::u16string::npos && paren_pos >= second_line_cut && - paren_pos <= cut_point) { - cut_point = paren_pos; - adjusted_cut_point = true; - } - - // Second, we can break at the start of the file extension. - if (!adjusted_cut_point) { - const size_t dot_pos = text.find_last_of(u'.'); - if (dot_pos != std::u16string::npos && dot_pos >= second_line_cut && - dot_pos <= cut_point) { - cut_point = dot_pos; - adjusted_cut_point = true; - } - } - } - - // TODO(dfried): possibly handle the case where we chop a section with bidi - // delimiters out or split it between lines. - - // If we didn't put the extension on its own line, eliminate whitespace - // from the start of the second line (it looks weird). - if (!adjusted_cut_point) { - cut_point = - gfx::FindValidBoundaryAfter(text, cut_point, /*trim_whitespace =*/true); - } - - // Reassemble the string. Start with the first line up to `cut_point` or the - // end of the line, whichever comes sooner. - std::u16string result = - text.substr(0, std::min(line_lengths.first, cut_point)); - result.push_back(u'\n'); - - // If we're starting the second line with a file extension hint that the - // directionality of the text might change by using an FSI mark. Allowing - // the renderer to re-infer RTL-ness produces much better results in text - // rendering when an RTL filename has an ASCII extension. - // - // TODO(dfried): Currently we do put an FSI before an ellipsis; this - // results in the ellipsis being placed with the text that immediately - // follows it (making the point of elision more obvious). If the text - // following the cut is LTR it goes on the left, and if the text is RTL it - // goes on the right. Reconsider if/how we should set text direction - // following an ellipsis: - // - No FSI would cause the ellipsis to align with the preceding rather - // than the following text. It would provide a bit more visual continuity - // between lines, but might be confusing as to where the text picks back - // up (as the next character might be on the opposite side of the line). - // - We could preserve elided directionality markers, but they could end up - // aligning the ellipsis with text that is not present at all on the - // label. - // - We could also force direction to match the start of the first line for - // consistency but that could result in an ellipsis that matches neither - // the preceding nor following text. - // - // TODO(dfried): move these declarations to rtl.h alongside e.g. - // base::i18n::kRightToLeftMark - constexpr char16_t kFirstStrongIsolateMark = u'\u2068'; - constexpr char16_t kPopDirectionalIsolateMark = u'\u2069'; - if (adjusted_cut_point || !is_whole_string) - result += kFirstStrongIsolateMark; - if (!is_whole_string) - result.push_back(gfx::kEllipsisUTF16[0]); - result.append(text.substr(cut_point)); - // If we added an FSI, we should bracket it with a PDI. - if (adjusted_cut_point || !is_whole_string) - result += kPopDirectionalIsolateMark; - return result; -} - -// TabHoverCardBubbleView::FadeLabel: -// ---------------------------------------------------------- - -// This view overlays and fades out an old version of the text of a label, -// while displaying the new text underneath. It is used to fade out the old -// value of the title and domain labels on the hover card when the tab switches -// or the tab title changes. -class TabHoverCardBubbleView::FadeLabel : public views::View { - public: - FadeLabel(int context, int num_lines) { - primary_label_ = AddChildView(std::make_unique<RenderTextFactoryLabel>( - std::u16string(), context, views::style::STYLE_PRIMARY)); - primary_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); - primary_label_->SetVerticalAlignment(gfx::ALIGN_TOP); - primary_label_->SetMultiLine(num_lines > 1); - if (num_lines > 1) - primary_label_->SetMaxLines(num_lines); - - label_fading_out_ = AddChildView(std::make_unique<SolidLabel>( - std::u16string(), context, views::style::STYLE_PRIMARY)); - label_fading_out_->SetHorizontalAlignment(gfx::ALIGN_LEFT); - label_fading_out_->SetVerticalAlignment(gfx::ALIGN_TOP); - label_fading_out_->SetMultiLine(num_lines > 1); - if (num_lines > 1) - label_fading_out_->SetMaxLines(num_lines); - label_fading_out_->GetViewAccessibility().OverrideIsIgnored(true); - - SetLayoutManager(std::make_unique<views::FillLayout>()); - } - - ~FadeLabel() override = default; - - void SetText(std::u16string text, absl::optional<bool> is_filename) { - if (was_filename_.has_value()) - SetMultilineParams(label_fading_out_, was_filename_.value()); - label_fading_out_->SetText(primary_label_->GetText()); - if (is_filename.has_value()) - SetMultilineParams(primary_label_, is_filename.value()); - was_filename_ = is_filename; - primary_label_->SetText(text); - } - - // Sets the fade-out of the label as |percent| in the range [0, 1]. Since - // FadeLabel is designed to mask new text with the old and then fade away, the - // higher the percentage the less opaque the label. - void SetFade(double percent) { - percent_ = std::min(1.0, percent); - if (percent_ == 1.0) - label_fading_out_->SetText(std::u16string()); - const SkAlpha alpha = base::saturated_cast<SkAlpha>( - std::numeric_limits<SkAlpha>::max() * (1.0 - percent_)); - label_fading_out_->SetBackgroundColor( - SkColorSetA(label_fading_out_->GetBackgroundColor(), alpha)); - label_fading_out_->SetEnabledColor( - SkColorSetA(label_fading_out_->GetEnabledColor(), alpha)); - } - - std::u16string GetText() const { return primary_label_->GetText(); } - - // Returns a version of the text that's middle-elided on two lines. - std::u16string TruncateFilenameToTwoLines(const std::u16string& text) const { - FilenameElider elider(primary_label_->CreateRenderText()); - gfx::Rect text_rect = primary_label_->GetContentsBounds(); - text_rect.Inset(-gfx::ShadowValue::GetMargin(primary_label_->GetShadows())); - return elider.Elide(text, text_rect); - } - - protected: - // views::View: - gfx::Size GetMaximumSize() const override { - return gfx::Tween::SizeValueBetween(percent_, - label_fading_out_->GetPreferredSize(), - primary_label_->GetPreferredSize()); - } - - gfx::Size CalculatePreferredSize() const override { - return primary_label_->GetPreferredSize(); - } - - gfx::Size GetMinimumSize() const override { - return primary_label_->GetMinimumSize(); - } - - int GetHeightForWidth(int width) const override { - return primary_label_->GetHeightForWidth(width); - } - - private: - static void SetMultilineParams(views::Label* label, bool is_filename) { - label->SetElideBehavior(is_filename ? gfx::NO_ELIDE : gfx::ELIDE_TAIL); - } - - raw_ptr<RenderTextFactoryLabel> primary_label_; - raw_ptr<SolidLabel> label_fading_out_; - absl::optional<bool> was_filename_; - double percent_ = 1.0; -}; - // TabHoverCardBubbleView::ThumbnailView: // ---------------------------------------------------------- @@ -759,10 +395,10 @@ // navigating through the tab strip. set_focus_traversable_from_anchor_view(false); - title_label_ = AddChildView(std::make_unique<FadeLabel>( + title_label_ = AddChildView(std::make_unique<FadeLabelView>( CONTEXT_TAB_HOVER_CARD_TITLE, kHoverCardTitleMaxLines)); - domain_label_ = AddChildView( - std::make_unique<FadeLabel>(views::style::CONTEXT_DIALOG_BODY_TEXT, 1)); + domain_label_ = AddChildView(std::make_unique<FadeLabelView>( + views::style::CONTEXT_DIALOG_BODY_TEXT, 1)); if (TabHoverCardController::AreHoverCardImagesEnabled()) { if (UseAlternateHoverCardFormat()) { @@ -878,7 +514,6 @@ bool is_filename = false; if (domain_url.SchemeIsFile()) { is_filename = true; - title = title_label_->TruncateFilenameToTwoLines(title); domain = l10n_util::GetStringUTF16(IDS_HOVER_CARD_FILE_URL_SOURCE); } else { if (domain_url.SchemeIsBlob()) { @@ -904,12 +539,12 @@ // to middle-elide. if (FilenameElider::FindImageDimensions(title) != std::u16string::npos) { is_filename = true; - title = title_label_->TruncateFilenameToTwoLines(title); } } } - title_label_->SetText(title, is_filename); - domain_label_->SetText(domain, absl::nullopt); + + title_label_->SetData({title, is_filename}); + domain_label_->SetData({domain, false}); const bool alternate_layout = UseAlternateHoverCardFormat(); if (alert_state_ != old_alert_state) {
diff --git a/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.h b/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.h index 36e4106..564ac3b 100644 --- a/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.h +++ b/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.h
@@ -29,12 +29,11 @@ namespace gfx { class ImageSkia; -class Rect; -class RenderText; } class Tab; class TabStyle; +class FadeLabelView; // Dialog that displays an informational hover card containing page information. class TabHoverCardBubbleView : public views::BubbleDialogDelegateView { @@ -42,75 +41,6 @@ static constexpr base::TimeDelta kHoverCardSlideDuration = base::Milliseconds(200); - // Helper class used to elide local filenames with a RenderText object that - // is provided with the correct setup and formatting. - class FilenameElider { - public: - using LineLengths = std::pair<size_t, size_t>; - - explicit FilenameElider(std::unique_ptr<gfx::RenderText> render_text); - ~FilenameElider(); - - // Returns the elided text. Equivalent to: - // Elide(GetLineLengths(display_rect)) - // See those methods for a detailed description. - std::u16string Elide(const std::u16string& text, - const gfx::Rect& display_rect) const; - - // Returns the start of the image dimensions as typically formatted by - // Chrome in page titles, as a hint at how to potentially elide or split - // the title. Expects something in the format "title (width×height)". - // Returns std::u16string::npos if this pattern isn't found, otherwise - // returns the index of the opening parenthesis in the string. - // - // If the result isn't npos, then the character previous to the open paren - // character is guaranteed to be whitespace. - static std::u16string::size_type FindImageDimensions( - const std::u16string& text); - - private: - friend class TabHoverCardBubbleViewFilenameEliderTest; - - // Given the current text and a rectangle to display text in, returns the - // maximum length in characters of the first and second lines. - // - // The first value is the number of characters from the beginning of the - // text that will fit on the line. The second value is the number of - // characters from the end of the text that will fit on a line, minus - // enough space to insert an ellipsis. - // - // Note that the sum of the two values may be greater than the length of - // the text. Both segments are guaranteed to end at grapheme boundaries. - LineLengths GetLineLengths(const gfx::Rect& display_rect) const; - - // Returns a string formatted for two-line elision given the last string - // passed to SetText() and the maximum extent of the first and second - // lines. The resulting string will either be the original text (if it fits - // on one line) or the first line, followed by a newline, an ellipsis, and - // the second line. The cut points passed in must be at grapheme - // boundaries. - // - // If the two lines overlap (that is, if the line lengths sum to more than - // the length of the original text), an optimum breakpoint will be chosen - // to insert the newline: - // * If possible, the extension (and if it's an image, the image - // dimensions) will be placed alone on the second line. - // * Otherwise, as many characters as possible will be placed on the first - // line. - // TODO(dfried): consider optimizing to break at natural breaks: spaces, - // punctuation, etc. - // - // Note that if the extension is isolated on the second line or an ellipsis - // is inserted, the second line will be marked as a bidirectional isolate, - // so that its direction is determined by the leading text on the line - // rather than whatever is "left over" from the first line. We find this - // produces a much more visually appealing and less confusing result than - // inheriting the preceding directionality. - std::u16string ElideImpl(LineLengths line_lengths) const; - - std::unique_ptr<gfx::RenderText> render_text_; - }; - METADATA_HEADER(TabHoverCardBubbleView); DECLARE_CLASS_ELEMENT_IDENTIFIER_VALUE(kHoverCardBubbleElementId); explicit TabHoverCardBubbleView(Tab* tab); @@ -141,14 +71,13 @@ static absl::optional<double> GetPreviewImageCrossfadeStart(); private: - class FadeLabel; class ThumbnailView; // views::BubbleDialogDelegateView: gfx::Size CalculatePreferredSize() const override; - raw_ptr<FadeLabel> title_label_ = nullptr; - raw_ptr<FadeLabel> domain_label_ = nullptr; + raw_ptr<FadeLabelView> title_label_ = nullptr; + raw_ptr<FadeLabelView> domain_label_ = nullptr; raw_ptr<ThumbnailView> thumbnail_view_ = nullptr; absl::optional<TabAlertState> alert_state_; const raw_ptr<const TabStyle> tab_style_;
diff --git a/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view_unittest.cc b/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view_unittest.cc index c48261f..bd1bd0c 100644 --- a/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view_unittest.cc +++ b/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view_unittest.cc
@@ -8,6 +8,7 @@ #include <string> #include "build/build_config.h" +#include "chrome/browser/ui/views/tabs/filename_elider.h" #include "content/public/test/browser_task_environment.h" #include "testing/gtest/include/gtest/gtest-param-test.h" #include "testing/gtest/include/gtest/gtest.h" @@ -55,8 +56,6 @@ class TabHoverCardBubbleViewFilenameEliderTest { protected: - using FilenameElider = TabHoverCardBubbleView::FilenameElider; - static constexpr float kGlyphWidth = 10.0; static constexpr float kGlyphHeight = 10.0;
diff --git a/chrome/browser/ui/webui/ash/login/base_screen_handler.cc b/chrome/browser/ui/webui/ash/login/base_screen_handler.cc index 1d456d5..3cdfe60 100644 --- a/chrome/browser/ui/webui/ash/login/base_screen_handler.cc +++ b/chrome/browser/ui/webui/ash/login/base_screen_handler.cc
@@ -35,8 +35,7 @@ if (!GetOobeUI()) { return; } - GetOobeUI()->GetCoreOobeView()->ShowScreenWithData(oobe_screen_, - std::move(data)); + GetOobeUI()->GetCoreOobe()->ShowScreenWithData(oobe_screen_, std::move(data)); } void BaseScreenHandler::RegisterMessages() {
diff --git a/chrome/browser/ui/webui/ash/login/base_webui_handler.cc b/chrome/browser/ui/webui/ash/login/base_webui_handler.cc index 1803ed1..5e9a2e8 100644 --- a/chrome/browser/ui/webui/ash/login/base_webui_handler.cc +++ b/chrome/browser/ui/webui/ash/login/base_webui_handler.cc
@@ -44,7 +44,7 @@ void BaseWebUIHandler::ShowScreenDeprecated(OobeScreenId screen) { if (!GetOobeUI()) return; - GetOobeUI()->GetCoreOobeView()->ShowScreenWithData(screen, absl::nullopt); + GetOobeUI()->GetCoreOobe()->ShowScreenWithData(screen, absl::nullopt); } OobeUI* BaseWebUIHandler::GetOobeUI() {
diff --git a/chrome/browser/ui/webui/ash/login/core_oobe_handler.cc b/chrome/browser/ui/webui/ash/login/core_oobe_handler.cc index f997433..ae4adff 100644 --- a/chrome/browser/ui/webui/ash/login/core_oobe_handler.cc +++ b/chrome/browser/ui/webui/ash/login/core_oobe_handler.cc
@@ -7,47 +7,24 @@ #include <type_traits> #include <utility> -#include "ash/constants/ash_features.h" -#include "ash/public/cpp/event_rewriter_controller.h" -#include "ash/public/cpp/shelf_config.h" #include "ash/public/cpp/tablet_mode.h" #include "ash/shell.h" -#include "base/command_line.h" -#include "base/functional/bind.h" #include "base/strings/utf_string_conversions.h" #include "base/values.h" -#include "build/branding_buildflags.h" #include "chrome/browser/ash/login/configuration_keys.h" -#include "chrome/browser/ash/login/demo_mode/demo_session.h" #include "chrome/browser/ash/login/demo_mode/demo_setup_controller.h" -#include "chrome/browser/ash/login/helper.h" -#include "chrome/browser/ash/login/lock/screen_locker.h" #include "chrome/browser/ash/login/ui/login_display_host.h" -#include "chrome/browser/ash/login/ui/oobe_dialog_size_utils.h" -#include "chrome/browser/ash/login/wizard_controller.h" #include "chrome/browser/ash/policy/enrollment/enrollment_requisition_manager.h" -#include "chrome/browser/ash/system/input_device_settings.h" -#include "chrome/browser/browser_process.h" -#include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/ui/ash/ash_util.h" -#include "chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h" -#include "chrome/browser/ui/webui/ash/login/demo_setup_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/oobe_ui.h" #include "chrome/common/channel_info.h" -#include "chrome/common/chrome_constants.h" -#include "chrome/common/pref_names.h" #include "chrome/grit/chromium_strings.h" #include "chrome/grit/generated_resources.h" -#include "components/login/base_screen_handler_utils.h" #include "components/login/localized_values_builder.h" -#include "components/prefs/pref_service.h" #include "components/strings/grit/components_strings.h" -#include "components/version_info/version_info.h" #include "google_apis/google_api_keys.h" #include "ui/aura/window_tree_host.h" -#include "ui/display/screen.h" #include "ui/events/event_sink.h" -#include "ui/gfx/geometry/size.h" // Enable VLOG level 1. #undef ENABLED_VLOG_LEVEL @@ -55,48 +32,9 @@ namespace ash { -CoreOobeHandler::CoreOobeHandler(const std::string& display_type) { - is_oobe_display_ = display_type == OobeUI::kOobeDisplay; +CoreOobeHandler::CoreOobeHandler() = default; - TabletMode::Get()->AddObserver(this); - - OobeConfiguration::Get()->AddAndFireObserver(this); - - ChromeKeyboardControllerClient::Get()->AddObserver(this); - - OnKeyboardVisibilityChanged( - ChromeKeyboardControllerClient::Get()->is_keyboard_visible()); - -#if BUILDFLAG(GOOGLE_CHROME_BRANDING) - version_info_updater_.StartUpdate(true); -#else - version_info_updater_.StartUpdate(false); -#endif - UpdateClientAreaSize( - display::Screen::GetScreen()->GetPrimaryDisplay().size()); - - // Don't show version label on the stable and beta channels by default. - version_info::Channel channel = chrome::GetChannel(); - if (channel != version_info::Channel::STABLE && - channel != version_info::Channel::BETA) { - ToggleSystemInfo(); - } - - if (ash::system::InputDeviceSettings::Get() - ->ForceKeyboardDrivenUINavigation()) - CallJS("cr.ui.Oobe.enableKeyboardFlow", true); -} - -CoreOobeHandler::~CoreOobeHandler() { - OobeConfiguration::Get()->RemoveObserver(this); - - // Ash may be released before us. - if (TabletMode::Get()) - TabletMode::Get()->RemoveObserver(this); - - if (ChromeKeyboardControllerClient::Get()) - ChromeKeyboardControllerClient::Get()->RemoveObserver(this); -} +CoreOobeHandler::~CoreOobeHandler() = default; void CoreOobeHandler::DeclareLocalizedValues( ::login::LocalizedValuesBuilder* builder) { @@ -110,7 +48,7 @@ const bool has_api_keys_configured = google_apis::HasAPIKeyConfigured() && google_apis::HasOAuthClientConfigured(); - if (!has_api_keys_configured && is_oobe_display_) { + if (!has_api_keys_configured) { builder->AddF("missingAPIKeysNotice", IDS_LOGIN_API_KEYS_NOTICE, base::ASCIIToUTF16(google_apis::kAPIKeysDevelopersHowToURL)); } @@ -122,17 +60,12 @@ builder->Add("next", IDS_EULA_NEXT_BUTTON); } -void CoreOobeHandler::GetAdditionalParameters(base::Value::Dict* dict) { - dict->Set("isInTabletMode", TabletMode::Get()->InTabletMode()); - dict->Set("isDemoModeEnabled", DemoSetupController::IsDemoModeAllowed()); - if (policy::EnrollmentRequisitionManager::IsMeetDevice()) { - // The value is used to show a different UI for this type of the devices. - dict->Set("deviceFlowType", "meet"); - } -} - void CoreOobeHandler::DeclareJSCallbacks() { - AddCallback("screenStateInitialize", &CoreOobeHandler::HandleInitialized); + AddCallback("initializeCoreHandler", + &CoreOobeHandler::HandleInitializeCoreHandler); + AddCallback("screenStateInitialize", + &CoreOobeHandler::HandleScreenStateInitialize); + AddCallback("updateCurrentScreen", &CoreOobeHandler::HandleUpdateCurrentScreen); AddCallback("backdropLoaded", &CoreOobeHandler::HandleBackdropLoaded); @@ -143,24 +76,114 @@ AddCallback("enableShelfButtons", &CoreOobeHandler::HandleEnableShelfButtons); } +void CoreOobeHandler::GetAdditionalParameters(base::Value::Dict* dict) { + dict->Set("isInTabletMode", TabletMode::Get()->InTabletMode()); + dict->Set("isDemoModeEnabled", DemoSetupController::IsDemoModeAllowed()); + if (policy::EnrollmentRequisitionManager::IsMeetDevice()) { + // The value is used to show a different UI for this type of the devices. + dict->Set("deviceFlowType", "meet"); + } +} + +ui::EventSink* CoreOobeHandler::GetEventSink() { + return Shell::GetPrimaryRootWindow()->GetHost()->GetEventSink(); +} + void CoreOobeHandler::ShowScreenWithData( const OobeScreenId& screen, absl::optional<base::Value::Dict> data) { + CHECK(ui_init_state_ == UiState::kFullyInitialized); + base::Value::Dict screen_params; screen_params.Set("id", screen.name); if (data.has_value()) { screen_params.Set("data", std::move(data.value())); } + CallJS("cr.ui.Oobe.showScreen", std::move(screen_params)); } -void CoreOobeHandler::ReloadContent(base::Value::Dict dictionary) { - CallJS("cr.ui.Oobe.reloadContent", std::move(dictionary)); +void CoreOobeHandler::UpdateOobeConfiguration() { + CHECK(ui_init_state_ == UiState::kFullyInitialized); + base::Value::Dict configuration = configuration::FilterConfiguration( + OobeConfiguration::Get()->configuration(), + configuration::ConfigurationHandlerSide::HANDLER_JS); + CallJS("cr.ui.Oobe.updateOobeConfiguration", std::move(configuration)); } -void CoreOobeHandler::HandleInitialized() { - VLOG(3) << "CoreOobeHandler::HandleInitialized"; - GetOobeUI()->InitializeHandlers(); +void CoreOobeHandler::ReloadContent() { + CHECK(ui_init_state_ == UiState::kFullyInitialized); + base::Value::Dict localized_strings = GetOobeUI()->GetLocalizedStrings(); + CallJS("cr.ui.Oobe.reloadContent", std::move(localized_strings)); +} + +void CoreOobeHandler::ForwardCancel() { + CHECK(ui_init_state_ == UiState::kFullyInitialized); + CallJS("cr.ui.Oobe.handleCancel"); +} + +void CoreOobeHandler::SetTabletModeState(bool tablet_mode_enabled) { + CHECK(ui_init_state_ == UiState::kFullyInitialized); + CallJS("cr.ui.Oobe.setTabletModeState", tablet_mode_enabled); +} + +void CoreOobeHandler::ToggleSystemInfo() { + CallJS("cr.ui.Oobe.toggleSystemInfo"); +} + +void CoreOobeHandler::TriggerDown() { + CallJS("cr.ui.Oobe.triggerDown"); +} + +void CoreOobeHandler::EnableKeyboardFlow() { + CallJS("cr.ui.Oobe.enableKeyboardFlow", true); +} + +void CoreOobeHandler::SetShelfHeight(int height) { + CallJS("cr.ui.Oobe.setShelfHeight", height); +} + +void CoreOobeHandler::SetOrientation(bool is_horizontal) { + CallJS("cr.ui.Oobe.setOrientation", is_horizontal); +} + +void CoreOobeHandler::SetDialogSize(int width, int height) { + CallJS("cr.ui.Oobe.setDialogSize", width, height); +} + +void CoreOobeHandler::SetVirtualKeyboardShown(bool shown) { + CallJS("cr.ui.Oobe.setVirtualKeyboardShown", shown); +} + +void CoreOobeHandler::SetOsVersionLabelText(const std::string& label_text) { + CallJS("cr.ui.Oobe.setLabelText", "version", label_text); +} + +void CoreOobeHandler::SetBluetoothDeviceInfo( + const std::string& bluetooth_name) { + CallJS("cr.ui.Oobe.setBluetoothDeviceInfo", bluetooth_name); +} + +void CoreOobeHandler::HandleInitializeCoreHandler() { + VLOG(3) << "CoreOobeHandler::HandleInitializeCoreHandler"; + CHECK(ui_init_state_ == UiState::kUninitialized); + ui_init_state_ = UiState::kCoreHandlerInitialized; + AllowJavascript(); + GetOobeUI()->GetCoreOobe()->UpdateUiInitState( + UiState::kCoreHandlerInitialized); +} + +void CoreOobeHandler::HandleScreenStateInitialize() { + VLOG(3) << "CoreOobeHandler::HandleScreenStateInitialize"; + CHECK(ui_init_state_ == UiState::kCoreHandlerInitialized); + ui_init_state_ = UiState::kFullyInitialized; + GetOobeUI()->GetCoreOobe()->UpdateUiInitState(UiState::kFullyInitialized); +} + +void CoreOobeHandler::HandleEnableShelfButtons(bool enable) { + if (LoginDisplayHost::default_host()) { + LoginDisplayHost::default_host()->SetShelfButtonsEnabled(enable); + } } void CoreOobeHandler::HandleUpdateCurrentScreen( @@ -173,95 +196,9 @@ GetOobeUI()->OnBackdropLoaded(); } -void CoreOobeHandler::HandleEnableShelfButtons(bool enable) { - if (LoginDisplayHost::default_host()) - LoginDisplayHost::default_host()->SetShelfButtonsEnabled(enable); -} - -void CoreOobeHandler::ForwardCancel() { - CallJS("cr.ui.Oobe.handleCancel"); -} - -void CoreOobeHandler::OnOSVersionLabelTextUpdated( - const std::string& os_version_label_text) { - UpdateLabel("version", os_version_label_text); -} - -void CoreOobeHandler::OnEnterpriseInfoUpdated(const std::string& message_text, - const std::string& asset_id) { - // Not relevant in OOBE mode. -} - -void CoreOobeHandler::OnDeviceInfoUpdated(const std::string& bluetooth_name) { - CallJS("cr.ui.Oobe.setBluetoothDeviceInfo", bluetooth_name); -} - -ui::EventSink* CoreOobeHandler::GetEventSink() { - return Shell::GetPrimaryRootWindow()->GetHost()->GetEventSink(); -} - -void CoreOobeHandler::UpdateLabel(const std::string& id, - const std::string& text) { - CallJS("cr.ui.Oobe.setLabelText", id, text); -} - -void CoreOobeHandler::OnTabletModeStarted() { - CallJS("cr.ui.Oobe.setTabletModeState", true); -} - -void CoreOobeHandler::OnTabletModeEnded() { - CallJS("cr.ui.Oobe.setTabletModeState", false); -} - -void CoreOobeHandler::UpdateClientAreaSize(const gfx::Size& size) { - CallJS("cr.ui.Oobe.setShelfHeight", ShelfConfig::Get()->shelf_size()); - - const gfx::Size display_size = - display::Screen::GetScreen()->GetPrimaryDisplay().size(); - const bool is_horizontal = display_size.width() > display_size.height(); - CallJS("cr.ui.Oobe.setOrientation", is_horizontal); - - const gfx::Size dialog_size = CalculateOobeDialogSize( - size, ShelfConfig::Get()->shelf_size(), is_horizontal); - CallJS("cr.ui.Oobe.setDialogSize", dialog_size.width(), dialog_size.height()); -} - -void CoreOobeHandler::ToggleSystemInfo() { - CallJS("cr.ui.Oobe.toggleSystemInfo"); -} - -void CoreOobeHandler::TriggerDown() { - CallJS("cr.ui.Oobe.triggerDown"); -} - -void CoreOobeHandler::LaunchHelpApp(int help_topic_id) { - HandleLaunchHelpApp(help_topic_id); -} - -void CoreOobeHandler::OnOobeConfigurationChanged() { - base::Value::Dict configuration = configuration::FilterConfiguration( - OobeConfiguration::Get()->configuration(), - configuration::ConfigurationHandlerSide::HANDLER_JS); - CallJS("cr.ui.Oobe.updateOobeConfiguration", std::move(configuration)); -} - -void CoreOobeHandler::OnKeyboardVisibilityChanged(bool shown) { - CallJS("cr.ui.Oobe.setVirtualKeyboardShown", shown); -} - void CoreOobeHandler::HandleLaunchHelpApp(int help_topic_id) { - if (!help_app_.get()) - help_app_ = new HelpAppLauncher( - LoginDisplayHost::default_host()->GetNativeWindow()); - help_app_->ShowHelpTopic( - static_cast<HelpAppLauncher::HelpTopic>(help_topic_id)); -} - -void CoreOobeHandler::HandleRaiseTabKeyEvent(bool reverse) { - ui::KeyEvent event(ui::ET_KEY_PRESSED, ui::VKEY_TAB, ui::EF_NONE); - if (reverse) - event.set_flags(ui::EF_SHIFT_DOWN); - SendEventToSink(&event); + LoginDisplayHost::default_host()->GetOobeUI()->GetCoreOobe()->LaunchHelpApp( + help_topic_id); } void CoreOobeHandler::HandleUpdateOobeUIState(int state) { @@ -271,4 +208,12 @@ } } +void CoreOobeHandler::HandleRaiseTabKeyEvent(bool reverse) { + ui::KeyEvent event(ui::ET_KEY_PRESSED, ui::VKEY_TAB, ui::EF_NONE); + if (reverse) { + event.set_flags(ui::EF_SHIFT_DOWN); + } + SendEventToSink(&event); +} + } // namespace ash
diff --git a/chrome/browser/ui/webui/ash/login/core_oobe_handler.h b/chrome/browser/ui/webui/ash/login/core_oobe_handler.h index e6ffe73..ebc6bef 100644 --- a/chrome/browser/ui/webui/ash/login/core_oobe_handler.h +++ b/chrome/browser/ui/webui/ash/login/core_oobe_handler.h
@@ -9,17 +9,10 @@ #include <string> #include <vector> -#include "ash/public/cpp/tablet_mode_observer.h" -#include "base/functional/callback.h" #include "base/values.h" -#include "chrome/browser/ash/login/help_app_launcher.h" #include "chrome/browser/ash/login/oobe_configuration.h" #include "chrome/browser/ash/login/oobe_screen.h" -#include "chrome/browser/ash/login/version_info_updater.h" -#include "chrome/browser/ash/tpm_firmware_update.h" -#include "chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h" #include "chrome/browser/ui/webui/ash/login/base_webui_handler.h" -#include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/events/event_source.h" namespace ui { @@ -28,34 +21,49 @@ namespace ash { -class CoreOobeView { +class CoreOobeView : public base::SupportsWeakPtr<CoreOobeView> { public: + // Possible Initialization States of the UI + enum class UiState { + kUninitialized, // Start of things + kCoreHandlerInitialized, // First oobe.js instruction + kFullyInitialized, // Fully initialized a.k.a 'screenStateInitialize' + }; + virtual ~CoreOobeView() = default; + // The following methods must only be called once the UI is fully initialized + // (kFullyInitialized). It is the responsibility of the client (CoreOobe) to + // ensure that this invariant is met. Otherwise it will CHECK(). virtual void ShowScreenWithData(const OobeScreenId& screen, absl::optional<base::Value::Dict> data) = 0; - virtual void ReloadContent(base::Value::Dict dictionary) = 0; - virtual void UpdateClientAreaSize(const gfx::Size& size) = 0; + virtual void UpdateOobeConfiguration() = 0; + virtual void ReloadContent() = 0; + virtual void ForwardCancel() = 0; + virtual void SetTabletModeState(bool tablet_mode_enabled) = 0; + + // The following methods are safe to be called at any |UiState|, although the + // existing mechanism inside |BaseWebUIHandler| will defer the calls until + // JavaScript is allowed in this handler (kCoreHandlerInitialized) virtual void ToggleSystemInfo() = 0; virtual void TriggerDown() = 0; - virtual void ForwardCancel() = 0; - virtual void LaunchHelpApp(int help_topic_id) = 0; + virtual void EnableKeyboardFlow() = 0; + virtual void SetShelfHeight(int height) = 0; + virtual void SetOrientation(bool is_horizontal) = 0; + virtual void SetDialogSize(int width, int height) = 0; + virtual void SetVirtualKeyboardShown(bool shown) = 0; + virtual void SetOsVersionLabelText(const std::string& label_text) = 0; + virtual void SetBluetoothDeviceInfo(const std::string& bluetooth_name) = 0; }; // The core handler for Javascript messages related to the "oobe" view. class CoreOobeHandler : public BaseWebUIHandler, - public VersionInfoUpdater::Delegate, public CoreOobeView, - public ui::EventSource, - public TabletModeObserver, - public OobeConfiguration::Observer, - public ChromeKeyboardControllerClient::Observer { + public ui::EventSource { public: - explicit CoreOobeHandler(const std::string& display_type); - + CoreOobeHandler(); CoreOobeHandler(const CoreOobeHandler&) = delete; CoreOobeHandler& operator=(const CoreOobeHandler&) = delete; - ~CoreOobeHandler() override; // BaseScreenHandler implementation: @@ -64,64 +72,46 @@ void DeclareJSCallbacks() override; void GetAdditionalParameters(base::Value::Dict* dict) override; - // VersionInfoUpdater::Delegate implementation: - void OnOSVersionLabelTextUpdated( - const std::string& os_version_label_text) override; - void OnEnterpriseInfoUpdated(const std::string& message_text, - const std::string& asset_id) override; - void OnDeviceInfoUpdated(const std::string& bluetooth_name) override; - void OnAdbSideloadStatusUpdated(bool enabled) override {} - + private: // ui::EventSource implementation: ui::EventSink* GetEventSink() override; - private: - // CoreOobeView implementation: + // ---- BEGIN --- CoreOobeView void ShowScreenWithData(const OobeScreenId& screen, absl::optional<base::Value::Dict> data) override; - void ReloadContent(base::Value::Dict dictionary) override; - // Updates client area size based on the primary screen size. - void UpdateClientAreaSize(const gfx::Size& size) override; + void UpdateOobeConfiguration() override; + void ReloadContent() override; + void ForwardCancel() override; + void SetTabletModeState(bool tablet_mode_enabled) override; + // Calls above will CHECK() if not |kFullyInitialized| + // Calls below are safe at any moment void ToggleSystemInfo() override; void TriggerDown() override; - // Forwards the cancel accelerator value to the shown screen. - void ForwardCancel() override; - void LaunchHelpApp(int help_topic_id) override; + void EnableKeyboardFlow() override; + void SetShelfHeight(int height) override; + void SetOrientation(bool is_horizontal) override; + void SetDialogSize(int width, int height) override; + void SetVirtualKeyboardShown(bool shown) override; + void SetOsVersionLabelText(const std::string& label_text) override; + void SetBluetoothDeviceInfo(const std::string& bluetooth_name) override; + // ---- END --- CoreOobeView - // TabletModeObserver: - void OnTabletModeStarted() override; - void OnTabletModeEnded() override; - - // OobeConfiguration::Observer: - void OnOobeConfigurationChanged() override; - - // ChromeKeyboardControllerClient::Observer: - void OnKeyboardVisibilityChanged(bool visible) override; - - // Handlers for JS WebUI messages. + // ---- Handlers for JS WebUI messages. + void HandleInitializeCoreHandler(); + void HandleScreenStateInitialize(); void HandleEnableShelfButtons(bool enable); - void HandleInitialized(); void HandleUpdateCurrentScreen(const std::string& screen); void HandleBackdropLoaded(); void HandleLaunchHelpApp(int help_topic_id); // Handles demo mode setup for tests. Accepts 'online' and 'offline' as // `demo_config`. void HandleUpdateOobeUIState(int state); - // When keyboard_utils.js arrow key down event is reached, raise it // to tab/shift-tab event. void HandleRaiseTabKeyEvent(bool reverse); - // Updates label with specified id with specified text. - void UpdateLabel(const std::string& id, const std::string& text); - - // Updates when version info is changed. - VersionInfoUpdater version_info_updater_{this}; - - // Help application used for help dialogs. - scoped_refptr<HelpAppLauncher> help_app_; - - bool is_oobe_display_ = false; + // Initialization state that is kept in sync with |CoreOobe|. + UiState ui_init_state_ = UiState::kUninitialized; }; } // namespace ash
diff --git a/chrome/browser/ui/webui/ash/login/locale_switch_screen_handler.cc b/chrome/browser/ui/webui/ash/login/locale_switch_screen_handler.cc index 8e7e2da..40f7c93 100644 --- a/chrome/browser/ui/webui/ash/login/locale_switch_screen_handler.cc +++ b/chrome/browser/ui/webui/ash/login/locale_switch_screen_handler.cc
@@ -8,20 +8,19 @@ #include "base/values.h" #include "chrome/browser/ash/login/screens/locale_switch_screen.h" +#include "chrome/browser/ash/login/ui/login_display_host.h" #include "chrome/browser/ui/webui/ash/login/core_oobe_handler.h" #include "chrome/browser/ui/webui/ash/login/oobe_ui.h" namespace ash { -LocaleSwitchScreenHandler::LocaleSwitchScreenHandler( - CoreOobeView* core_oobe_view) - : BaseScreenHandler(kScreenId), core_oobe_view_(core_oobe_view) {} +LocaleSwitchScreenHandler::LocaleSwitchScreenHandler() + : BaseScreenHandler(kScreenId) {} LocaleSwitchScreenHandler::~LocaleSwitchScreenHandler() = default; void LocaleSwitchScreenHandler::UpdateStrings() { - base::Value::Dict localized_strings = GetOobeUI()->GetLocalizedStrings(); - core_oobe_view_->ReloadContent(std::move(localized_strings)); + GetOobeUI()->GetCoreOobe()->ReloadContent(); } void LocaleSwitchScreenHandler::DeclareLocalizedValues(
diff --git a/chrome/browser/ui/webui/ash/login/locale_switch_screen_handler.h b/chrome/browser/ui/webui/ash/login/locale_switch_screen_handler.h index d86dcde..e2c2da48 100644 --- a/chrome/browser/ui/webui/ash/login/locale_switch_screen_handler.h +++ b/chrome/browser/ui/webui/ash/login/locale_switch_screen_handler.h
@@ -31,7 +31,7 @@ public: using TView = LocaleSwitchView; - explicit LocaleSwitchScreenHandler(CoreOobeView* core_oobe_view); + LocaleSwitchScreenHandler(); ~LocaleSwitchScreenHandler() override; // LocaleSwitchView: @@ -40,9 +40,6 @@ // BaseScreenHandler: void DeclareLocalizedValues( ::login::LocalizedValuesBuilder* builder) override; - - private: - raw_ptr<CoreOobeView> core_oobe_view_; }; } // namespace ash
diff --git a/chrome/browser/ui/webui/ash/login/oobe_ui.cc b/chrome/browser/ui/webui/ash/login/oobe_ui.cc index d54ea79..33e5aa5 100644 --- a/chrome/browser/ui/webui/ash/login/oobe_ui.cc +++ b/chrome/browser/ui/webui/ash/login/oobe_ui.cc
@@ -50,6 +50,7 @@ #include "chrome/browser/ui/webui/ash/login/base_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/choobe_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/consolidated_consent_screen_handler.h" +#include "chrome/browser/ui/webui/ash/login/core_oobe_handler.h" #include "chrome/browser/ui/webui/ash/login/cryptohome_recovery_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/cryptohome_recovery_setup_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/debug/debug_overlay_handler.h" @@ -371,7 +372,7 @@ AddScreenHandler(std::make_unique<UpdateScreenHandler>()); if (display_type_ == kOobeDisplay) { - AddScreenHandler(std::make_unique<WelcomeScreenHandler>(core_handler_)); + AddScreenHandler(std::make_unique<WelcomeScreenHandler>()); AddScreenHandler(std::make_unique<DemoPreferencesScreenHandler>()); @@ -404,7 +405,7 @@ AddScreenHandler(std::make_unique<EnrollmentScreenHandler>()); - AddScreenHandler(std::make_unique<LocaleSwitchScreenHandler>(core_handler_)); + AddScreenHandler(std::make_unique<LocaleSwitchScreenHandler>()); AddScreenHandler(std::make_unique<LacrosDataMigrationScreenHandler>()); @@ -615,10 +616,11 @@ LOG(WARNING) << "OobeUI created"; display_type_ = GetDisplayType(url); - auto core_handler = std::make_unique<CoreOobeHandler>(display_type_); - core_handler_ = core_handler.get(); - - AddWebUIHandler(std::move(core_handler)); + auto core_oobe_handler = std::make_unique<CoreOobeHandler>(); + core_handler_ = core_oobe_handler.get(); + core_oobe_ = + std::make_unique<CoreOobe>(display_type_, core_oobe_handler->AsWeakPtr()); + web_ui->AddMessageHandler(std::move(core_oobe_handler)); ConfigureOobeDisplay(); @@ -675,8 +677,8 @@ "worker-src blob: chrome://resources 'self';"); } -CoreOobeView* OobeUI::GetCoreOobeView() { - return core_handler_; +CoreOobe* OobeUI::GetCoreOobe() { + return core_oobe_.get(); } ErrorScreen* OobeUI::GetErrorScreen() { @@ -685,8 +687,10 @@ base::Value::Dict OobeUI::GetLocalizedStrings() { base::Value::Dict localized_strings; + core_handler_->GetLocalizedStrings(&localized_strings); for (BaseWebUIHandler* handler : webui_handlers_) handler->GetLocalizedStrings(&localized_strings); + const std::string& app_locale = g_browser_process->GetApplicationLocale(); webui::SetLoadTimeDataDefaults(app_locale, &localized_strings); localized_strings.Set("app_locale", app_locale);
diff --git a/chrome/browser/ui/webui/ash/login/oobe_ui.h b/chrome/browser/ui/webui/ash/login/oobe_ui.h index 94e6795e..072a4669 100644 --- a/chrome/browser/ui/webui/ash/login/oobe_ui.h +++ b/chrome/browser/ui/webui/ash/login/oobe_ui.h
@@ -16,6 +16,7 @@ #include "base/observer_list.h" #include "base/values.h" #include "chrome/browser/ash/login/oobe_screen.h" +#include "chrome/browser/ash/login/screens/core_oobe.h" #include "chrome/browser/ui/webui/ash/login/base_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/core_oobe_handler.h" #include "chrome/common/webui_url_constants.h" @@ -88,7 +89,7 @@ ~OobeUI() override; - CoreOobeView* GetCoreOobeView(); + CoreOobe* GetCoreOobe(); ErrorScreen* GetErrorScreen(); // Collects localized strings from the owned handlers. @@ -207,6 +208,7 @@ // Reference to CoreOobeHandler that handles common requests of Oobe page. raw_ptr<CoreOobeHandler, ExperimentalAsh> core_handler_ = nullptr; + std::unique_ptr<CoreOobe> core_oobe_; std::vector<BaseWebUIHandler*> webui_handlers_; // Non-owning pointers. std::vector<BaseWebUIHandler*> webui_only_handlers_; // Non-owning pointers.
diff --git a/chrome/browser/ui/webui/ash/login/welcome_screen_handler.cc b/chrome/browser/ui/webui/ash/login/welcome_screen_handler.cc index 6d6d1b5..af961d6 100644 --- a/chrome/browser/ui/webui/ash/login/welcome_screen_handler.cc +++ b/chrome/browser/ui/webui/ash/login/welcome_screen_handler.cc
@@ -53,10 +53,7 @@ // WelcomeScreenHandler, public: ----------------------------------------------- -WelcomeScreenHandler::WelcomeScreenHandler(CoreOobeView* core_oobe_view) - : BaseScreenHandler(kScreenId), core_oobe_view_(core_oobe_view) { - DCHECK(core_oobe_view_); -} +WelcomeScreenHandler::WelcomeScreenHandler() : BaseScreenHandler(kScreenId) {} WelcomeScreenHandler::~WelcomeScreenHandler() = default; @@ -80,8 +77,7 @@ void WelcomeScreenHandler::SetLanguageList(base::Value::List language_list) { language_list_ = std::move(language_list); - base::Value::Dict localized_strings = GetOobeUI()->GetLocalizedStrings(); - core_oobe_view_->ReloadContent(std::move(localized_strings)); + GetOobeUI()->GetCoreOobe()->ReloadContent(); } void WelcomeScreenHandler::SetInputMethodId(
diff --git a/chrome/browser/ui/webui/ash/login/welcome_screen_handler.h b/chrome/browser/ui/webui/ash/login/welcome_screen_handler.h index d0ab99d..c4d9507 100644 --- a/chrome/browser/ui/webui/ash/login/welcome_screen_handler.h +++ b/chrome/browser/ui/webui/ash/login/welcome_screen_handler.h
@@ -15,7 +15,6 @@ namespace ash { -class CoreOobeView; class WelcomeScreen; // Interface for WelcomeScreenHandler. @@ -65,7 +64,7 @@ public: using TView = WelcomeView; - explicit WelcomeScreenHandler(CoreOobeView* core_oobe_view); + WelcomeScreenHandler(); WelcomeScreenHandler(const WelcomeScreenHandler&) = delete; WelcomeScreenHandler& operator=(const WelcomeScreenHandler&) = delete; @@ -97,8 +96,6 @@ // Returns available timezones. static base::Value::List GetTimezoneList(); - - const raw_ptr<CoreOobeView> core_oobe_view_; }; } // namespace ash
diff --git a/chrome/browser/ui/webui/password_manager/password_manager_ui.cc b/chrome/browser/ui/webui/password_manager/password_manager_ui.cc index 449dc0b..0cb35f0 100644 --- a/chrome/browser/ui/webui/password_manager/password_manager_ui.cc +++ b/chrome/browser/ui/webui/password_manager/password_manager_ui.cc
@@ -161,7 +161,7 @@ {"editPassword", IDS_EDIT}, {"editPasswordFootnote", IDS_PASSWORD_MANAGER_UI_PASSWORD_EDIT_FOOTNOTE}, {"editPasswordTitle", IDS_PASSWORD_MANAGER_UI_EDIT_PASSWORD}, - {"emptyNote", IDS_PASSWORD_MANAGER_UI_NO_NOTE_SAVED}, + {"emptyNote", IDS_PASSWORD_MANAGER_UI_NO_NOTE_ADDED}, {"emptyStateImportSyncing", IDS_PASSWORD_MANAGER_UI_EMPTY_STATE_SYNCING_USERS}, {"exportPasswords", IDS_PASSWORD_MANAGER_UI_EXPORT_TITLE}, @@ -245,7 +245,7 @@ {"mutedCompromisedCredentials", IDS_PASSWORD_MANAGER_UI_MUTED_COMPROMISED_PASSWORDS}, {"notValidWebsite", IDS_PASSWORD_MANAGER_UI_NOT_VALID_WEB_ADDRESS}, - {"notesLabel", IDS_PASSWORD_MANAGER_UI_NOTES_LABEL}, + {"noteLabel", IDS_PASSWORD_MANAGER_UI_NOTE_LABEL}, {"noPasswordsFound", IDS_PASSWORD_MANAGER_UI_NO_PASSWORDS_FOUND}, {"opensInNewTab", IDS_PASSWORD_MANAGER_UI_OPENS_IN_NEW_TAB}, {"passwordCopiedToClipboard",
diff --git a/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc b/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc index 394396e..0e4e7a49 100644 --- a/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc +++ b/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc
@@ -229,12 +229,11 @@ size_t size_in_kb = print_data->size() / 1024; base::UmaHistogramMemoryKB("Printing.CUPS.PrintDocumentSize", size_in_kb); - const std::string* printer_id = settings.FindString(kSettingDeviceName); auto call_start_local_print_callback = base::BindOnce(&LocalPrinterHandlerChromeos::CallStartLocalPrint, weak_ptr_factory_.GetWeakPtr(), std::move(print_data), std::move(callback)); - GetAshJobSettings(printer_id ? *printer_id : "", + GetAshJobSettings(*settings.FindString(kSettingDeviceName), std::move(call_start_local_print_callback), std::move(settings)); }
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc index 93255ff..09a53e9 100644 --- a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc +++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
@@ -745,9 +745,7 @@ ReportUserActionHistogram(user_action); #if BUILDFLAG(ENABLE_PRINT_CONTENT_ANALYSIS) - const std::string* printer_name_ptr = - settings.FindString(kSettingPrinterName); - const std::string printer_name = printer_name_ptr ? *printer_name_ptr : ""; + const std::string device_name = *settings.FindString(kSettingDeviceName); auto on_verdict = base::BindOnce(&PrintPreviewHandler::OnVerdictByEnterprisePolicy, @@ -759,7 +757,7 @@ print_preview_ui()->GetWeakPointer()); enterprise_connectors::PrintIfAllowedByPolicy( - data, GetInitiator(), printer_name, std::move(on_verdict), + data, GetInitiator(), std::move(device_name), std::move(on_verdict), std::move(hide_preview)); #else
diff --git a/chrome/browser/ui/webui/realbox/realbox_handler.cc b/chrome/browser/ui/webui/realbox/realbox_handler.cc index 66a58fa6..b78a671 100644 --- a/chrome/browser/ui/webui/realbox/realbox_handler.cc +++ b/chrome/browser/ui/webui/realbox/realbox_handler.cc
@@ -510,6 +510,11 @@ "realboxMatchSearchboxTheme", base::FeatureList::IsEnabled(ntp_features::kRealboxMatchSearchboxTheme)); + source->AddString("realboxWidthBehavior", + base::GetFieldTrialParamValueByFeature( + ntp_features::kRealboxWidthBehavior, + ntp_features::kNtpRealboxWidthBehaviorParam)); + source->AddString( "realboxDefaultIcon", base::FeatureList::IsEnabled(ntp_features::kRealboxUseGoogleGIcon)
diff --git a/chrome/browser/ui/webui/settings/ash/apps_section.cc b/chrome/browser/ui/webui/settings/ash/apps_section.cc index c28909c5..0715f95 100644 --- a/chrome/browser/ui/webui/settings/ash/apps_section.cc +++ b/chrome/browser/ui/webui/settings/ash/apps_section.cc
@@ -453,7 +453,7 @@ html_source->AddBoolean( "showOsSettingsAppBadgingToggle", base::FeatureList::IsEnabled(features::kOsSettingsAppBadgingToggle)); - html_source->AddBoolean("showArcvmManageUsb", arc::IsArcVmEnabled()); + html_source->AddBoolean("isArcVmEnabled", arc::IsArcVmEnabled()); AddAppManagementStrings(html_source); AddGuestOsStrings(html_source);
diff --git a/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler.cc b/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler.cc index f288582..55e9879d 100644 --- a/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler.cc +++ b/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler.cc
@@ -312,6 +312,8 @@ navigate_params.window_action = NavigateParams::WindowAction::SHOW_WINDOW; navigate_params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB; Navigate(&navigate_params); + UMA_HISTOGRAM_ENUMERATION("NewTabPage.ChromeWebStoreOpen", + NtpChromeWebStoreOpen::kAppearance); } void CustomizeChromePageHandler::OpenThirdPartyThemePage( @@ -322,6 +324,8 @@ navigate_params.window_action = NavigateParams::WindowAction::SHOW_WINDOW; navigate_params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB; Navigate(&navigate_params); + UMA_HISTOGRAM_ENUMERATION("NewTabPage.ChromeWebStoreOpen", + NtpChromeWebStoreOpen::kCollections); } void CustomizeChromePageHandler::SetMostVisitedSettings( @@ -513,10 +517,11 @@ void* params) { DCHECK(choose_local_custom_background_callback_); if (ntp_custom_background_service_) { + theme_service_->UseDefaultTheme(); + profile_->set_last_selected_directory(path.DirName()); ntp_custom_background_service_->SelectLocalBackgroundImage(path); } - select_file_dialog_ = nullptr; std::move(choose_local_custom_background_callback_).Run(true); }
diff --git a/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler.h b/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler.h index 7467e4b..d3ff7e2 100644 --- a/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler.h +++ b/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler.h
@@ -30,6 +30,18 @@ class Profile; +/** + * Places where the chrome web store can be opened from in Customize Chrome. + * This enum must match the numbering for NTPChromeWebStoreOpen in enums.xml. + * These values are persisted to logs. Entries should not be renumbered, removed + * or reused. + */ +enum class NtpChromeWebStoreOpen { + kAppearance = 0, + kCollections = 1, + kMaxValue = kCollections, +}; + class CustomizeChromePageHandler : public side_panel::mojom::CustomizeChromePageHandler, public NtpBackgroundServiceObserver,
diff --git a/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler_unittest.cc b/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler_unittest.cc index 6fe563a..cc8fd6ab 100644 --- a/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler_unittest.cc +++ b/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler_unittest.cc
@@ -705,6 +705,7 @@ [&success](bool success_arg) { success = std::move(success_arg); })); EXPECT_CALL(mock_ntp_custom_background_service_, SelectLocalBackgroundImage) .Times(1); + EXPECT_CALL(mock_theme_service(), UseDefaultTheme).Times(1); handler().ChooseLocalCustomBackground(callback.Get()); EXPECT_TRUE(success); } @@ -732,17 +733,30 @@ } TEST_F(CustomizeChromePageHandlerTest, OpenChromeWebStore) { + histogram_tester().ExpectTotalCount("NewTabPage.ChromeWebStoreOpen", 0); handler().OpenChromeWebStore(); ASSERT_EQ(1, browser().tab_strip_model()->count()); ASSERT_EQ("https://chrome.google.com/webstore?category=theme", browser().tab_strip_model()->GetWebContentsAt(0)->GetURL()); + histogram_tester().ExpectTotalCount("NewTabPage.ChromeWebStoreOpen", 1); + + ASSERT_EQ( + histogram_tester().GetBucketCount("NewTabPage.ChromeWebStoreOpen", + NtpChromeWebStoreOpen::kAppearance), + 1); } TEST_F(CustomizeChromePageHandlerTest, OpenThirdPartyThemePage) { + histogram_tester().ExpectTotalCount("NewTabPage.ChromeWebStoreOpen", 0); handler().OpenThirdPartyThemePage("foo"); ASSERT_EQ(1, browser().tab_strip_model()->count()); ASSERT_EQ("https://chrome.google.com/webstore/detail/foo", browser().tab_strip_model()->GetWebContentsAt(0)->GetURL()); + histogram_tester().ExpectTotalCount("NewTabPage.ChromeWebStoreOpen", 1); + ASSERT_EQ( + histogram_tester().GetBucketCount("NewTabPage.ChromeWebStoreOpen", + NtpChromeWebStoreOpen::kCollections), + 1); } TEST_F(CustomizeChromePageHandlerTest, SetDailyRefreshCollectionId) {
diff --git a/chrome/browser/xsurface/BUILD.gn b/chrome/browser/xsurface/BUILD.gn index b5402b0..db849c9 100644 --- a/chrome/browser/xsurface/BUILD.gn +++ b/chrome/browser/xsurface/BUILD.gn
@@ -34,6 +34,9 @@ "android/java/src/org/chromium/chrome/browser/xsurface/feed/FeedUserInteractionReliabilityLogger.java", "android/java/src/org/chromium/chrome/browser/xsurface/feed/ReliabilityLoggingTestUtil.java", "android/java/src/org/chromium/chrome/browser/xsurface/feed/StreamType.java", + "android/java/src/org/chromium/chrome/browser/xsurface/pageinsights/PageInsightsSurfaceRenderer.java", + "android/java/src/org/chromium/chrome/browser/xsurface/pageinsights/PageInsightsSurfaceScope.java", + "android/java/src/org/chromium/chrome/browser/xsurface/pageinsights/PageInsightsSurfaceScopeDependencyProvider.java", ] deps = [ "//third_party/androidx:androidx_annotation_annotation_java" ] }
diff --git a/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/ProcessScope.java b/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/ProcessScope.java index 6b364f14..279b7b7 100644 --- a/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/ProcessScope.java +++ b/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/ProcessScope.java
@@ -7,6 +7,8 @@ import org.chromium.chrome.browser.xsurface.feed.FeedSurfaceScope; import org.chromium.chrome.browser.xsurface.feed.FeedSurfaceScopeDependencyProvider; +import org.chromium.chrome.browser.xsurface.pageinsights.PageInsightsSurfaceScope; +import org.chromium.chrome.browser.xsurface.pageinsights.PageInsightsSurfaceScopeDependencyProvider; /** * Implemented internally. @@ -45,6 +47,17 @@ return null; } + /** + * Returns PageInsightsSurfaceScope, for use in the Page Insights feature. + * + * @param dependencyProvider Provider for activity-scoped dependencies. + */ + @Nullable + default PageInsightsSurfaceScope obtainPageInsightsSurfaceScope( + PageInsightsSurfaceScopeDependencyProvider dependencyProvider) { + return null; + } + @Nullable default ImageCacheHelper provideImageCacheHelper() { return null;
diff --git a/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/pageinsights/PageInsightsSurfaceRenderer.java b/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/pageinsights/PageInsightsSurfaceRenderer.java new file mode 100644 index 0000000..71f4cd9 --- /dev/null +++ b/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/pageinsights/PageInsightsSurfaceRenderer.java
@@ -0,0 +1,36 @@ +// 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.xsurface.pageinsights; + +import android.view.View; + +import androidx.annotation.Nullable; + +import java.util.Map; + +/** + * Interface to call a rendering service to render a server-provided UI, in the context of the + * Page Insights feature. + * + * Implemented internally. + */ +public interface PageInsightsSurfaceRenderer { + /** + * Renders a server-provided UI, and returns a View containing it. + * + * @param renderData server-provided UI to be rendered. + * @param contextValues additional context to be incorporated into the rendered UI. + */ + @Nullable + default View render(byte[] renderData, Map<String, Object> contextValues) { + return null; + } + + /** + * Unbinds any server-provided UI from the given View, and cleans up. Should be called whenever + * the View is no longer shown to the user. + */ + default void unbindView(View view) {} +}
diff --git a/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/pageinsights/PageInsightsSurfaceScope.java b/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/pageinsights/PageInsightsSurfaceScope.java new file mode 100644 index 0000000..d8409b03 --- /dev/null +++ b/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/pageinsights/PageInsightsSurfaceScope.java
@@ -0,0 +1,24 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.xsurface.pageinsights; + +import androidx.annotation.Nullable; + +/** + * Provides renderers for the Page Insights feature to use when rendering a server-provided UI. + * + * Implemented internally. + */ +public interface PageInsightsSurfaceScope { + /** + * Returns a renderer to use when rendering server-provided UI. Each call will reuse the same + * dependencies (hence "Scope") but each call will return a new renderer, so that a single + * surface can support multiple rendered views. + */ + @Nullable + default PageInsightsSurfaceRenderer provideSurfaceRenderer() { + return null; + } +}
diff --git a/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/pageinsights/PageInsightsSurfaceScopeDependencyProvider.java b/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/pageinsights/PageInsightsSurfaceScopeDependencyProvider.java new file mode 100644 index 0000000..fd96545 --- /dev/null +++ b/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/pageinsights/PageInsightsSurfaceScopeDependencyProvider.java
@@ -0,0 +1,22 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.xsurface.pageinsights; + +import android.content.Context; + +import androidx.annotation.Nullable; + +/** + * Provides dependencies for PageInsightsSurfaceScope. Should only be called on the UI thread. + * + * Implemented in Chromium. + */ +public interface PageInsightsSurfaceScopeDependencyProvider { + /** Returns the activity context hosting the surface. */ + @Nullable + default Context getActivityContext() { + return null; + } +}
diff --git a/chrome/build/lacros64.pgo.txt b/chrome/build/lacros64.pgo.txt index c0a49451..6a52286a 100644 --- a/chrome/build/lacros64.pgo.txt +++ b/chrome/build/lacros64.pgo.txt
@@ -1 +1 @@ -chrome-chromeos-amd64-generic-main-1684483072-99bec59f8f1ada868201ce33d5bb272828dcf9db.profdata +chrome-chromeos-amd64-generic-main-1684511851-ee9700ef5c462699a0096e252df784745f1f2aeb.profdata
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index 45fbac87..14a49b1a 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1684475881-6c2551b5ddf60d2349ab95475f8a08bbe3907d27.profdata +chrome-linux-main-1684519166-8dea3a29c1b315123d5d0396bc650cd0a5c6e91b.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index b13b90b..750afac 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1684490030-2985119ed9072bb558f71d35f4c95fd851a0134e.profdata +chrome-mac-arm-main-1684519166-993e978a5bd776668ae7f2e61ce5661995f9a428.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index d542710..ea91384 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1684475881-bd77e158691e3eda9f72823e55bbd1e6a4fa52cc.profdata +chrome-mac-main-1684497579-6f9cf570334cc2f9f520c7ae674eabe5b64b329c.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 7463c44..ffb387e 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1684475881-06193b5100f31d67b38b90cc79112cd69225eac8.profdata +chrome-win32-main-1684519166-56536d9beb12720cf1161b573aaf47368379f831.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 18f416984e..d99cf1b65 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1684486496-8be05f794a0fdd3c5dcd45b4ff086327f7280f00.profdata +chrome-win64-main-1684519166-49b604f1c7bac7716c8390ce6b6297e53aa3755d.profdata
diff --git a/chrome/common/accessibility/read_anything_constants.h b/chrome/common/accessibility/read_anything_constants.h index ef64fef..3ac360a 100644 --- a/chrome/common/accessibility/read_anything_constants.h +++ b/chrome/common/accessibility/read_anything_constants.h
@@ -42,6 +42,7 @@ const int kButtonPadding = 2; const int kIconSize = 16; +const int kFontSizeIconSize = kIconSize + kInternalInsets; const int kColorsIconSize = 24; const int kSpacingIconSize = 20;
diff --git a/chrome/installer/setup/install_worker.cc b/chrome/installer/setup/install_worker.cc index d9db43c..c7433a43 100644 --- a/chrome/installer/setup/install_worker.cc +++ b/chrome/installer/setup/install_worker.cc
@@ -642,6 +642,7 @@ } kEnterpriseBrandRemapping[] = { {L"GGLS", L"GCEU"}, {L"GGRV", L"GCEV"}, + {L"GTPM", L"GCER"}, }; for (auto mapping : kEnterpriseBrandRemapping) {
diff --git a/chrome/installer/setup/install_worker_unittest.cc b/chrome/installer/setup/install_worker_unittest.cc index 73e3298..634d7d9 100644 --- a/chrome/installer/setup/install_worker_unittest.cc +++ b/chrome/installer/setup/install_worker_unittest.cc
@@ -441,6 +441,12 @@ installer::AddUpdateBrandCodeWorkItem(*installer_state(), &work_item_list); } +TEST_P(AddUpdateBrandCodeWorkItemTest, GTPM) { + StrictMock<MockWorkItemList> work_item_list; + SetupExpectations(L"GTPM", false, &work_item_list); + installer::AddUpdateBrandCodeWorkItem(*installer_state(), &work_item_list); +} + TEST_P(AddUpdateBrandCodeWorkItemTest, GGLS) { StrictMock<MockWorkItemList> work_item_list; SetupExpectations(L"GGLS", false, &work_item_list); @@ -459,6 +465,12 @@ installer::AddUpdateBrandCodeWorkItem(*installer_state(), &work_item_list); } +TEST_P(AddUpdateBrandCodeWorkItemTest, GTPM_CBCM) { + StrictMock<MockWorkItemList> work_item_list; + SetupExpectations(L"GTPM", true, &work_item_list); + installer::AddUpdateBrandCodeWorkItem(*installer_state(), &work_item_list); +} + TEST_P(AddUpdateBrandCodeWorkItemTest, TEST) { StrictMock<MockWorkItemList> work_item_list; SetupExpectations(L"TEST", false, &work_item_list);
diff --git a/chrome/renderer/accessibility/ax_tree_distiller.cc b/chrome/renderer/accessibility/ax_tree_distiller.cc index 58342588..ed1f4354 100644 --- a/chrome/renderer/accessibility/ax_tree_distiller.cc +++ b/chrome/renderer/accessibility/ax_tree_distiller.cc
@@ -23,7 +23,6 @@ static const ax::mojom::Role kContentRoles[]{ ax::mojom::Role::kHeading, ax::mojom::Role::kParagraph, - ax::mojom::Role::kListItem, ax::mojom::Role::kNote, }; @@ -102,10 +101,6 @@ // Try with the algorithm first. std::vector<ui::AXNodeID> content_node_ids; DistillViaAlgorithm(tree, &content_node_ids); - if (!content_node_ids.empty()) { - on_ax_tree_distilled_callback_.Run(tree.GetAXTreeID(), content_node_ids); - return; - } // If Read Anything with Screen 2x is enabled and the main content extractor // is bound, kick off Screen 2x run, which distills the AXTree in the @@ -113,7 +108,7 @@ #if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE) if (features::IsReadAnythingWithScreen2xEnabled() && main_content_extractor_.is_bound()) { - DistillViaScreen2x(tree, snapshot, ukm_source_id); + DistillViaScreen2x(tree, snapshot, ukm_source_id, &content_node_ids); return; } #endif @@ -133,20 +128,31 @@ } #if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE) -void AXTreeDistiller::DistillViaScreen2x(const ui::AXTree& tree, - const ui::AXTreeUpdate& snapshot, - const ukm::SourceId& ukm_source_id) { +void AXTreeDistiller::DistillViaScreen2x( + const ui::AXTree& tree, + const ui::AXTreeUpdate& snapshot, + const ukm::SourceId& ukm_source_id, + std::vector<ui::AXNodeID>* content_node_ids_algorithm) { DCHECK(main_content_extractor_.is_bound()); + // Make a copy of |content_node_ids_algorithm| rather than sending a pointer. main_content_extractor_->ExtractMainContent( snapshot, ukm_source_id, base::BindOnce(&AXTreeDistiller::ProcessScreen2xResult, - weak_ptr_factory_.GetWeakPtr(), tree.GetAXTreeID())); + weak_ptr_factory_.GetWeakPtr(), tree.GetAXTreeID(), + *content_node_ids_algorithm)); } void AXTreeDistiller::ProcessScreen2xResult( const ui::AXTreeID& tree_id, - const std::vector<ui::AXNodeID>& content_node_ids) { - on_ax_tree_distilled_callback_.Run(tree_id, content_node_ids); + std::vector<ui::AXNodeID> content_node_ids_algorithm, + const std::vector<ui::AXNodeID>& content_node_ids_screen2x) { + // Merge the results from the algorithm and from screen2x. + for (ui::AXNodeID content_node_id_screen2x : content_node_ids_screen2x) { + if (!base::Contains(content_node_ids_algorithm, content_node_id_screen2x)) { + content_node_ids_algorithm.push_back(content_node_id_screen2x); + } + } + on_ax_tree_distilled_callback_.Run(tree_id, content_node_ids_algorithm); // TODO(crbug.com/1266555): If no content nodes were identified, and // there is a selection, try sending Screen2x a partial tree just containing
diff --git a/chrome/renderer/accessibility/ax_tree_distiller.h b/chrome/renderer/accessibility/ax_tree_distiller.h index 17b0ae76..2e2b6d3 100644 --- a/chrome/renderer/accessibility/ax_tree_distiller.h +++ b/chrome/renderer/accessibility/ax_tree_distiller.h
@@ -67,7 +67,8 @@ #endif private: - // Distills the AXTree via a rules-based algorithm. + // Distills the AXTree via a rules-based algorithm. Results are added to + // |content_node_ids|. void DistillViaAlgorithm(const ui::AXTree& tree, std::vector<ui::AXNodeID>* content_node_ids); @@ -83,15 +84,21 @@ #if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE) // Passes |snapshot| to the Screen2x ML model, which identifes the main // content nodes and calls |ProcessScreen2xResult()| on completion. - void DistillViaScreen2x(const ui::AXTree& tree, - const ui::AXTreeUpdate& snapshot, - const ukm::SourceId& ukm_source_id); + // |content_node_ids_algorithm| are the content nodes identified by the + // algorithm. They are passed along to the screen2x callback. + void DistillViaScreen2x( + const ui::AXTree& tree, + const ui::AXTreeUpdate& snapshot, + const ukm::SourceId& ukm_source_id, + std::vector<ui::AXNodeID>* content_node_ids_algorithm); - // Called by the Screen2x service from the utility process. Runs the callback - // if Screen2x identified content nodes. If not, distills via the rules-based - // algorithm. - void ProcessScreen2xResult(const ui::AXTreeID& tree_id, - const std::vector<ui::AXNodeID>& content_node_ids); + // Called by the Screen2x service from the utility process. Merges the result + // from the algorithm with the result from Screen2x and passes the merged + // vector to the callback. + void ProcessScreen2xResult( + const ui::AXTreeID& tree_id, + std::vector<ui::AXNodeID> content_node_ids_algorithm, + const std::vector<ui::AXNodeID>& content_node_ids_screen2x); // Called when the main content extractor is disconnected. Runs the callback // with an empty list of content node IDs.
diff --git a/chrome/renderer/accessibility/read_anything_app_controller.cc b/chrome/renderer/accessibility/read_anything_app_controller.cc index 24c72f6..c2f236b2 100644 --- a/chrome/renderer/accessibility/read_anything_app_controller.cc +++ b/chrome/renderer/accessibility/read_anything_app_controller.cc
@@ -772,8 +772,11 @@ return; } - // Ignore the selection if it's collapsed, which is created by a simple click. - if ((anchor_offset == focus_offset) && (anchor_node_id == focus_node_id)) { + // Ignore the new selection if it's collapsed, which is created by a simple + // click, unless there was a previous selection, in which case the click + // clears the selection, so we should tell the main page to clear too. + if ((anchor_offset == focus_offset) && (anchor_node_id == focus_node_id) && + !model_.has_selection()) { return; }
diff --git a/chrome/renderer/accessibility/read_anything_app_controller_browsertest.cc b/chrome/renderer/accessibility/read_anything_app_controller_browsertest.cc index 171e3371..f535b74 100644 --- a/chrome/renderer/accessibility/read_anything_app_controller_browsertest.cc +++ b/chrome/renderer/accessibility/read_anything_app_controller_browsertest.cc
@@ -1220,24 +1220,60 @@ } TEST_F(ReadAnythingAppControllerTest, - OnSelectionChange_ClickDoesNotUpdateSelection) { + OnSelectionChange_ClickAfterClickDoesNotUpdateSelection) { ui::AXTreeUpdate update; SetUpdateTreeID(&update); - update.nodes.resize(3); + update.nodes.resize(2); update.nodes[0].id = 2; update.nodes[1].id = 3; - update.nodes[2].id = 4; update.nodes[0].role = ax::mojom::Role::kStaticText; update.nodes[1].role = ax::mojom::Role::kStaticText; - update.nodes[2].role = ax::mojom::Role::kStaticText; - ui::AXNodeID anchor_node_id = 2; - int anchor_offset = 15; - ui::AXNodeID focus_node_id = 2; - int focus_offset = 15; + AccessibilityEventReceived({update}); + + ui::AXTreeUpdate selection; + SetUpdateTreeID(&selection); + selection.has_tree_data = true; + selection.event_from = ax::mojom::EventFrom::kUser; + selection.tree_data.sel_anchor_object_id = 2; + selection.tree_data.sel_focus_object_id = 2; + selection.tree_data.sel_anchor_offset = 0; + selection.tree_data.sel_focus_offset = 0; + AccessibilityEventReceived({selection}); + + EXPECT_CALL(page_handler_, OnSelectionChange).Times(0); + OnSelectionChange(3, 5, 3, 5); + page_handler_.FlushForTesting(); +} + +TEST_F(ReadAnythingAppControllerTest, + OnSelectionChange_ClickAfterSelectionClearsSelection) { + ui::AXTreeUpdate update; + SetUpdateTreeID(&update); + update.nodes.resize(2); + update.nodes[0].id = 2; + update.nodes[1].id = 3; + update.nodes[0].role = ax::mojom::Role::kStaticText; + update.nodes[1].role = ax::mojom::Role::kStaticText; + AccessibilityEventReceived({update}); + + ui::AXTreeUpdate selection; + SetUpdateTreeID(&selection); + selection.has_tree_data = true; + selection.event_from = ax::mojom::EventFrom::kUser; + selection.tree_data.sel_anchor_object_id = 2; + selection.tree_data.sel_focus_object_id = 3; + selection.tree_data.sel_anchor_offset = 0; + selection.tree_data.sel_focus_offset = 1; + AccessibilityEventReceived({selection}); + + ui::AXNodeID anchor_node_id = 3; + int anchor_offset = 5; + ui::AXNodeID focus_node_id = 3; + int focus_offset = 5; EXPECT_CALL(page_handler_, OnSelectionChange(tree_id_, anchor_node_id, anchor_offset, focus_node_id, focus_offset)) - .Times(0); + .Times(1); OnSelectionChange(anchor_node_id, anchor_offset, focus_node_id, focus_offset); page_handler_.FlushForTesting(); Mock::VerifyAndClearExpectations(distiller_);
diff --git a/chrome/renderer/accessibility/read_anything_app_model.cc b/chrome/renderer/accessibility/read_anything_app_model.cc index 93287ef..fb3811e7 100644 --- a/chrome/renderer/accessibility/read_anything_app_model.cc +++ b/chrome/renderer/accessibility/read_anything_app_model.cc
@@ -546,16 +546,20 @@ for (const auto& event : event_generator) { switch (event.event_params.event) { case ui::AXEventGenerator::Event::DOCUMENT_SELECTION_CHANGED: - if (event.event_params.event_from == ax::mojom::EventFrom::kUser) { + if (event.event_params.event_from == ax::mojom::EventFrom::kUser || + event.event_params.event_from == ax::mojom::EventFrom::kAction) { requires_post_process_selection_ = true; } break; + case ui::AXEventGenerator::Event::DOCUMENT_TITLE_CHANGED: + case ui::AXEventGenerator::Event::ALERT: + requires_distillation_ = true; + break; // Audit these events e.g. to trigger distillation. case ui::AXEventGenerator::Event::NONE: case ui::AXEventGenerator::Event::ACCESS_KEY_CHANGED: case ui::AXEventGenerator::Event::ACTIVE_DESCENDANT_CHANGED: - case ui::AXEventGenerator::Event::ALERT: case ui::AXEventGenerator::Event::ARIA_CURRENT_CHANGED: case ui::AXEventGenerator::Event::ATK_TEXT_OBJECT_ATTRIBUTE_CHANGED: case ui::AXEventGenerator::Event::ATOMIC_CHANGED: @@ -572,7 +576,6 @@ case ui::AXEventGenerator::Event::DETAILS_CHANGED: case ui::AXEventGenerator::Event::DESCRIBED_BY_CHANGED: case ui::AXEventGenerator::Event::DESCRIPTION_CHANGED: - case ui::AXEventGenerator::Event::DOCUMENT_TITLE_CHANGED: case ui::AXEventGenerator::Event::DROPEFFECT_CHANGED: case ui::AXEventGenerator::Event::EDITABLE_TEXT_CHANGED: case ui::AXEventGenerator::Event::ENABLED_CHANGED:
diff --git a/chrome/services/printing/pdf_flattener.cc b/chrome/services/printing/pdf_flattener.cc index f9646e4..f74bd30 100644 --- a/chrome/services/printing/pdf_flattener.cc +++ b/chrome/services/printing/pdf_flattener.cc
@@ -44,4 +44,8 @@ std::move(callback).Run(std::move(region_mapping.region)); } +void PdfFlattener::SetUseSkiaRendererPolicy(bool use_skia) { + chrome_pdf::SetUseSkiaRendererPolicy(use_skia); +} + } // namespace printing
diff --git a/chrome/services/printing/pdf_flattener.h b/chrome/services/printing/pdf_flattener.h index eda65dc..877d993 100644 --- a/chrome/services/printing/pdf_flattener.h +++ b/chrome/services/printing/pdf_flattener.h
@@ -22,6 +22,7 @@ // printing::mojom::PdfFlattener: void FlattenPdf(base::ReadOnlySharedMemoryRegion src_pdf_region, FlattenPdfCallback callback) override; + void SetUseSkiaRendererPolicy(bool use_skia) override; }; } // namespace printing
diff --git a/chrome/services/printing/pdf_to_emf_converter.cc b/chrome/services/printing/pdf_to_emf_converter.cc index 69662df3..d51b8c8 100644 --- a/chrome/services/printing/pdf_to_emf_converter.cc +++ b/chrome/services/printing/pdf_to_emf_converter.cc
@@ -152,4 +152,8 @@ std::move(callback).Run(std::move(emf_region), scale_factor); } +void PdfToEmfConverter::SetUseSkiaRendererPolicy(bool use_skia) { + chrome_pdf::SetUseSkiaRendererPolicy(use_skia); +} + } // namespace printing
diff --git a/chrome/services/printing/pdf_to_emf_converter.h b/chrome/services/printing/pdf_to_emf_converter.h index 5308198..c6b1b96 100644 --- a/chrome/services/printing/pdf_to_emf_converter.h +++ b/chrome/services/printing/pdf_to_emf_converter.h
@@ -26,6 +26,7 @@ private: // mojom::PdfToEmfConverter implementation. void ConvertPage(uint32_t page_index, ConvertPageCallback callback) override; + void SetUseSkiaRendererPolicy(bool use_skia) override; void SetPrintMode(); void LoadPdf(base::ReadOnlySharedMemoryRegion pdf_region);
diff --git a/chrome/services/printing/public/mojom/pdf_flattener.mojom b/chrome/services/printing/public/mojom/pdf_flattener.mojom index 42fa311..62c2a0f 100644 --- a/chrome/services/printing/public/mojom/pdf_flattener.mojom +++ b/chrome/services/printing/public/mojom/pdf_flattener.mojom
@@ -15,4 +15,10 @@ // `flattened_pdf_region` contains the flattened PDF. FlattenPdf(mojo_base.mojom.ReadOnlySharedMemoryRegion src_pdf_region) => (mojo_base.mojom.ReadOnlySharedMemoryRegion? flattened_pdf_region); + + // Sets the status for enterprise policy `kPdfUseSkiaRendererEnabled`. It + // should be called immediately once `mojom::PdfFlattener` remote is + // bound to the printing service and only when the enterprise policy is + // managed. + SetUseSkiaRendererPolicy(bool use_skia); };
diff --git a/chrome/services/printing/public/mojom/pdf_to_emf_converter.mojom b/chrome/services/printing/public/mojom/pdf_to_emf_converter.mojom index 58a6e7d..e66313c 100644 --- a/chrome/services/printing/public/mojom/pdf_to_emf_converter.mojom +++ b/chrome/services/printing/public/mojom/pdf_to_emf_converter.mojom
@@ -16,6 +16,11 @@ ConvertPage(uint32 page_index) => (mojo_base.mojom.ReadOnlySharedMemoryRegion? emf_region, float scale_factor); + + // Sets the status for enterprise policy `kPdfUseSkiaRendererEnabled`. It + // should be called immediately once `mojom::NupPageConvert` remote is + // created and only when the enterprise policy is managed. + SetUseSkiaRendererPolicy(bool use_skia); }; // Generates a PdfToEmfConverter, for converting a PDF to EMF.
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 8b5bda5..6e85bb36 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -613,6 +613,7 @@ "//chrome/browser/chromeos", "//chromeos/dbus/constants", ] + public_deps += [ "//chromeos/constants" ] } if (is_chromeos_ash) { @@ -926,6 +927,7 @@ "//build:chromeos_buildflags", "//chrome:chrome_android_core", "//chrome/android:delegate_public_impl_java", + "//chrome/browser/3pcd_heuristics:browser_tests", "//chrome/browser/autofill", "//chrome/browser/browsing_data:constants", "//chrome/browser/dips:browser_tests", @@ -1314,7 +1316,6 @@ source_set("browser_tests_arc") { testonly = true sources = [ - "../browser/apps/app_shim/app_shim_listener_browsertest_mac.mm", "../browser/ui/cocoa/applescript/bookmark_applescript_test_utils.h", "../browser/ui/cocoa/applescript/bookmark_applescript_test_utils.mm", "../browser/ui/cocoa/applescript/bookmark_folder_applescript_browsertest.mm", @@ -1391,6 +1392,7 @@ "//chrome/browser:browser_themes", "//chrome/browser:buildflags", "//chrome/browser:theme_properties", + "//chrome/browser/3pcd_heuristics:browser_tests", "//chrome/browser/accessibility:test_support", "//chrome/browser/apps/app_service", "//chrome/browser/apps/app_service:constants", @@ -2616,6 +2618,12 @@ sources += [ "../browser/ui/views/web_apps/web_app_integration_browsertest_win_linux_cros.cc" ] } + if (is_mac) { + sources += [ + "../browser/ui/views/web_apps/web_app_integration_browsertest_mac.cc", + ] + } + if (is_chromeos_ash) { data += [ "//chrome/browser/resources/chromeos/arc_support/i18n_template_no_process.js" ] sources += [ @@ -2796,6 +2804,7 @@ if (is_mac) { sources += [ "../browser/app_controller_mac_browsertest.mm", + "../browser/apps/app_shim/app_shim_listener_browsertest_mac.mm", "../browser/apps/app_shim/test/app_shim_listener_test_api_mac.cc", "../browser/apps/app_shim/test/app_shim_listener_test_api_mac.h", "../browser/mac/auth_session_request_browsertest.mm", @@ -2813,7 +2822,6 @@ "../browser/ui/test/test_browser_dialog_mac.mm", "../browser/ui/views/frame/browser_non_client_frame_view_mac_browsertest.mm", "../browser/ui/views/intent_picker_bubble_view_browsertest_mac.cc", - "../browser/ui/views/web_apps/web_app_integration_browsertest_mac.cc", "../browser/webshare/mac/sharing_service_operation_browsertest.cc", "../common/mac/app_mode_chrome_locator_browsertest.mm", "../common/profiler/thread_profiler_browsertest.cc", @@ -5538,7 +5546,6 @@ source_set("unit_tests_arc") { testonly = true sources = [ - "../browser/apps/app_shim/mach_bootstrap_acceptor_unittest.mm", "../browser/mac/auth_session_request_unittest.mm", "../browser/mac/keystone_glue_unittest.mm", "../browser/ui/cocoa/applescript/apple_event_util_unittest.mm", @@ -5561,9 +5568,7 @@ "//base/test:test_support", "//chrome/app:command_ids", "//chrome/app/theme:chrome_unscaled_resources_grit", - "//chrome/app_shim:app_shim", "//chrome/browser", - "//chrome/browser/apps/app_shim:app_shim", "//chrome/browser/autofill:test_support", "//chrome/browser/mac:keystone_glue", "//chrome/browser/ui:test_support", @@ -6148,6 +6153,7 @@ "//chrome/browser:buildflags", "//chrome/browser:permissions_proto", "//chrome/browser:theme_properties", + "//chrome/browser/3pcd_heuristics:unit_tests", "//chrome/browser/apps:icon_standardizer", "//chrome/browser/apps:user_type_filter", "//chrome/browser/autofill", @@ -6622,6 +6628,7 @@ sources += [ "../../testing/gtest_mac_unittest.mm", "../browser/app_controller_mac_unittest.mm", + "../browser/apps/app_shim/mach_bootstrap_acceptor_unittest.mm", "../browser/device_reauth/mac/device_authenticator_mac_unittest.mm", "../browser/global_keyboard_shortcuts_mac_unittest.mm", "../browser/mac/exception_processor_unittest.mm", @@ -8032,6 +8039,7 @@ "../browser/lacros/account_manager/profile_account_manager_unittest.cc", "../browser/lacros/account_manager/signin_helper_lacros_unittest.cc", "../browser/lacros/cert/client_cert_store_lacros_unittest.cc", + "../browser/lacros/clipboard_history_lacros_unittest.cc", "../browser/lacros/device_settings_lacros_unittest.cc", "../browser/lacros/force_installed_tracker_lacros_unittest.cc", "../browser/lacros/fullscreen_controller_client_lacros_unittest.cc",
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/Features.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/Features.java index 0641ec9..863f970 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/Features.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/Features.java
@@ -7,6 +7,7 @@ import org.chromium.base.CommandLine; import org.chromium.base.test.util.FeaturesBase; import org.chromium.chrome.browser.flags.CachedFeatureFlags; +import org.chromium.chrome.browser.flags.CachedFlag; import java.lang.annotation.Annotation; import java.lang.annotation.Retention; @@ -131,7 +132,7 @@ private static void resetCachedFlags(boolean forInstrumentation) { CachedFeatureFlags.resetFlagsForTesting(); if (forInstrumentation) { - CachedFeatureFlags.resetDiskForTesting(); + CachedFlag.resetDiskForTesting(); } FieldTrials.getInstance().reset(); }
diff --git a/chrome/test/data/client_hints/accept_ch_ua_iframe_request.html b/chrome/test/data/client_hints/accept_ch_ua_iframe_request.html index e394e26..2614c9c 100644 --- a/chrome/test/data/client_hints/accept_ch_ua_iframe_request.html +++ b/chrome/test/data/client_hints/accept_ch_ua_iframe_request.html
@@ -2,6 +2,6 @@ <link rel="icon" href="data:;base64,="> <head></head> <body> -<iframe src="simple.html" id="test"></iframe> +<iframe src="simple_with_subresource.html" id="test"></iframe> </body> </html>
diff --git a/chrome/test/data/client_hints/simple_with_subresource.html b/chrome/test/data/client_hints/simple_with_subresource.html new file mode 100644 index 0000000..e2a0a4d --- /dev/null +++ b/chrome/test/data/client_hints/simple_with_subresource.html
@@ -0,0 +1,6 @@ +<html> +<body> +A simple html file. +<img src="simple.html"></img> +</body> +</html>
diff --git a/chrome/test/data/webui/chromeos/personalization_app/personalization_app_browsertest.js b/chrome/test/data/webui/chromeos/personalization_app/personalization_app_browsertest.js index f6aed7c5..1a91ce3 100644 --- a/chrome/test/data/webui/chromeos/personalization_app/personalization_app_browsertest.js +++ b/chrome/test/data/webui/chromeos/personalization_app/personalization_app_browsertest.js
@@ -225,7 +225,7 @@ getRouter() .shadowRoot.querySelector('personalization-main') .shadowRoot.querySelector('ambient-preview-large') - .shadowRoot.querySelector('#ambientSubpageLink'); + .shadowRoot.querySelector('cr-icon-button'); assertTrue(!!ambientSubpageLink); }); }); @@ -262,7 +262,7 @@ const ambientSubpageLink = getRouter() .shadowRoot.querySelector('personalization-main') - .shadowRoot.getElementById('ambientSubpageLink'); + .shadowRoot.querySelector('cr-icon-button'); assertFalse(!!ambientSubpageLink); }); }); @@ -286,7 +286,7 @@ getRouter() .shadowRoot.querySelector('personalization-main') .shadowRoot.querySelector('wallpaper-preview') - .shadowRoot.getElementById('wallpaperButton') + .shadowRoot.querySelector('cr-icon-button') .click(); assertEquals( ROOT_PAGE + 'wallpaper', window.location.href,
diff --git a/chrome/test/data/webui/chromeos/print_management/BUILD.gn b/chrome/test/data/webui/chromeos/print_management/BUILD.gn index 27c94000..2b0db952 100644 --- a/chrome/test/data/webui/chromeos/print_management/BUILD.gn +++ b/chrome/test/data/webui/chromeos/print_management/BUILD.gn
@@ -22,6 +22,7 @@ "../..:build_ts", "//ash/webui/print_management/resources:build_ts", "//third_party/polymer/v3_0:library", + "//ui/webui/resources/cr_elements:build_ts", "//ui/webui/resources/js:build_ts", ] }
diff --git a/chrome/test/data/webui/chromeos/print_management/print_management_test.ts b/chrome/test/data/webui/chromeos/print_management/print_management_test.ts index 5643d0c..9a503cf 100644 --- a/chrome/test/data/webui/chromeos/print_management/print_management_test.ts +++ b/chrome/test/data/webui/chromeos/print_management/print_management_test.ts
@@ -9,12 +9,15 @@ import {setMetadataProviderForTesting} from 'chrome://print-management/mojo_interface_provider.js'; import {PrintJobEntryElement} from 'chrome://print-management/print_job_entry.js'; import {PrintManagementElement} from 'chrome://print-management/print_management.js'; +import {PrinterSetupInfoElement} from 'chrome://print-management/printer_setup_info.js'; import {ActivePrintJobInfo, ActivePrintJobState, CompletedPrintJobInfo, PrinterErrorCode, PrintingMetadataProviderInterface, PrintJobCompletionStatus, PrintJobInfo, PrintJobsObserverRemote} from 'chrome://print-management/printing_manager.mojom-webui.js'; +import {CrButtonElement} from 'chrome://resources/cr_elements/cr_button/cr_button.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js'; import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {assertEquals, assertTrue} from 'chrome://webui-test/chai_assert.js'; +import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {flushTasks} from 'chrome://webui-test/polymer_test_util.js'; +import {isVisible} from 'chrome://webui-test/test_util.js'; export function initPrintJobEntryElement(): PrintJobEntryElement { const element = document.createElement('print-job-entry'); @@ -736,15 +739,45 @@ verifyPrintJobs(expectedPrintJobArr, getHistoryPrintJobEntries(page!)); }); - test('OngoingPrintJobEmptyState', async () => { + // Verify expected elements display when there are no print jobs and flag is + // off. + test('EmptyState_SetupAssistanceFlagOff', async () => { + // Ensure printer setup assistance flag is disabled for test. + loadTimeData.overrideValues({ + isSetupAssistanceEnabled: false, + }); await initializePrintManagementApp(/*expectedArr=*/[]); await mojoApi_.whenCalled('getPrintJobs'); flush(); + // Assert that ongoing list is empty and the empty state message is // not hidden. assertTrue(!querySelector(page!, '#ongoingList')); + assertFalse( + querySelector<HTMLElement>(page!, '#ongoingEmptyState')?.hidden as + boolean); assertTrue( - !querySelector<HTMLElement>(page!, '#ongoingEmptyState')?.hidden); + querySelector<PrinterSetupInfoElement>( + page!, PrinterSetupInfoElement.is) + ?.hidden as boolean); + }); + + // Verify expected elements display when there are no print jobs and flag is + // on. + test('EmptyState_SetupAssistanceFlagOn', async () => { + // Ensure printer setup assistance flag is enabled for test. + loadTimeData.overrideValues({ + isSetupAssistanceEnabled: true, + }); + await initializePrintManagementApp(/*expectedArr=*/[]); + await mojoApi_.whenCalled('getPrintJobs'); + flush(); + + // Assert that printer setup UI is not hidden when flag enabled. + assertFalse( + querySelector<PrinterSetupInfoElement>( + page!, PrinterSetupInfoElement.is) + ?.hidden as boolean); }); test('CancelOngoingPrintJob', async () => { @@ -1089,3 +1122,36 @@ jobEntryTestElement.getFileIconClass(), 'flex-center file-icon-yellow'); }); }); + +suite('PrinterSetupInfoTest', () => { + let printerSetupInfoElement: PrinterSetupInfoElement|null = null; + + teardown(() => { + if (printerSetupInfoElement) { + printerSetupInfoElement.remove(); + } + printerSetupInfoElement = null; + }); + + function initPrinterSetupInfoElement(): Promise<void> { + const element = document.createElement(PrinterSetupInfoElement.is); + document.body.appendChild(element); + printerSetupInfoElement = element as PrinterSetupInfoElement; + + return flushTasks(); + } + + // Verify core elements of element rendered. + test('ensureBasicLayoutRenders', async () => { + await initPrinterSetupInfoElement(); + + assertTrue(isVisible( + querySelector<IronIconElement>(printerSetupInfoElement!, 'iron-icon'))); + assertTrue(isVisible(querySelector<HTMLHeadingElement>( + printerSetupInfoElement!, '.message-heading'))); + assertTrue(isVisible(querySelector<HTMLParagraphElement>( + printerSetupInfoElement!, '.message-detail'))); + assertTrue(isVisible( + querySelector<CrButtonElement>(printerSetupInfoElement!, 'cr-button'))); + }); +});
diff --git a/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_edit_dialog_test.ts b/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_edit_dialog_test.ts index 954291e..2f37cba 100644 --- a/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_edit_dialog_test.ts +++ b/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_edit_dialog_test.ts
@@ -10,6 +10,8 @@ import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {AcceleratorEditDialogElement} from 'chrome://shortcut-customization/js/accelerator_edit_dialog.js'; import {AcceleratorEditViewElement} from 'chrome://shortcut-customization/js/accelerator_edit_view.js'; +import {AcceleratorLookupManager} from 'chrome://shortcut-customization/js/accelerator_lookup_manager.js'; +import {fakeAcceleratorConfig, fakeLayoutInfo} from 'chrome://shortcut-customization/js/fake_data.js'; import {FakeShortcutProvider} from 'chrome://shortcut-customization/js/fake_shortcut_provider.js'; import {setShortcutProviderForTesting} from 'chrome://shortcut-customization/js/mojo_interface_provider.js'; import {AcceleratorInfo, Modifier} from 'chrome://shortcut-customization/js/shortcut_types.js'; @@ -21,15 +23,23 @@ suite('acceleratorEditDialogTest', function() { let viewElement: AcceleratorEditDialogElement|null = null; let provider: FakeShortcutProvider; + let manager: AcceleratorLookupManager|null = null; setup(() => { provider = new FakeShortcutProvider(); setShortcutProviderForTesting(provider); + // Set up manager. + manager = AcceleratorLookupManager.getInstance(); + manager.setAcceleratorLookup(fakeAcceleratorConfig); + manager.setAcceleratorLayoutLookup(fakeLayoutInfo); viewElement = document.createElement('accelerator-edit-dialog'); document.body.appendChild(viewElement); }); teardown(() => { + if (manager) { + manager.reset(); + } viewElement!.remove(); viewElement = null; });
diff --git a/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_row_test.ts b/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_row_test.ts index ac28e72..2537b69 100644 --- a/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_row_test.ts +++ b/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_row_test.ts
@@ -8,7 +8,9 @@ import {strictQuery} from 'chrome://resources/ash/common/typescript_utils/strict_query.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {AcceleratorLookupManager} from 'chrome://shortcut-customization/js/accelerator_lookup_manager.js'; import {AcceleratorRowElement} from 'chrome://shortcut-customization/js/accelerator_row.js'; +import {fakeAcceleratorConfig, fakeLayoutInfo} from 'chrome://shortcut-customization/js/fake_data.js'; import {InputKeyElement} from 'chrome://shortcut-customization/js/input_key.js'; import {stringToMojoString16} from 'chrome://shortcut-customization/js/mojo_utils.js'; import {AcceleratorSource, AcceleratorState, LayoutStyle, Modifier, TextAcceleratorPartType} from 'chrome://shortcut-customization/js/shortcut_types.js'; @@ -27,8 +29,19 @@ suite('acceleratorRowTest', function() { let rowElement: AcceleratorRowElement|null = null; + let manager: AcceleratorLookupManager|null = null; + + setup(() => { + // Set up manager. + manager = AcceleratorLookupManager.getInstance(); + manager.setAcceleratorLookup(fakeAcceleratorConfig); + manager.setAcceleratorLayoutLookup(fakeLayoutInfo); + }); teardown(() => { + if (manager) { + manager.reset(); + } if (rowElement) { rowElement.remove(); } @@ -102,7 +115,8 @@ rowElement.acceleratorInfos = accelerators; rowElement.description = description; - rowElement.source = AcceleratorSource.kBrowser; + rowElement.source = AcceleratorSource.kAsh; + rowElement.action = 0; rowElement.layoutStyle = LayoutStyle.kDefault; let showDialogListenerCalled = false; @@ -112,16 +126,21 @@ await flushTasks(); - const rowContainer = - rowElement.shadowRoot!.querySelector('#container') as HTMLDivElement; - rowContainer.click(); + const acceleratorViewElement = + rowElement!.shadowRoot!.querySelectorAll('accelerator-view'); + assertEquals(1, acceleratorViewElement.length); + const editIconContainerElement = strictQuery( + '#editIconContainer', acceleratorViewElement[0]!.shadowRoot, + HTMLDivElement); + + editIconContainerElement.click(); await flushTasks(); assertTrue(showDialogListenerCalled); }); - test('DontShowDialogOnClickWhenCustomizationDisabled', async () => { + test('EditIconHiddenWhenCustomizationDisabled', async () => { loadTimeData.overrideValues({isCustomizationEnabled: false}); rowElement = initAcceleratorRowElement(); waitAfterNextRender(rowElement); @@ -136,52 +155,22 @@ rowElement.acceleratorInfos = accelerators; rowElement.description = description; - rowElement.source = AcceleratorSource.kBrowser; + rowElement.source = AcceleratorSource.kAsh; + rowElement.action = 0; rowElement.layoutStyle = LayoutStyle.kDefault; - let showDialogListenerCalled = false; - rowElement.addEventListener('show-edit-dialog', () => { - showDialogListenerCalled = true; - }); - await flushTasks(); - const rowContainer = - rowElement.shadowRoot!.querySelector('#container') as HTMLDivElement; - rowContainer.click(); + const acceleratorViewElement = + rowElement!.shadowRoot!.querySelectorAll('accelerator-view'); + assertEquals(1, acceleratorViewElement.length); - await flushTasks(); + const editIconContainerElement = strictQuery( + '#editIconContainer', acceleratorViewElement[0]!.shadowRoot, + HTMLDivElement); - assertFalse(showDialogListenerCalled); - }); - test('DontShowDialogForTextAccelerators', async () => { - loadTimeData.overrideValues({isCustomizationEnabled: true}); - rowElement = initAcceleratorRowElement(); - waitAfterNextRender(rowElement); - const accelerators = [createTextAcceleratorInfo([{ - text: stringToMojoString16('ctrl'), - type: TextAcceleratorPartType.kModifier, - }])]; - - rowElement.acceleratorInfos = accelerators; - rowElement.source = AcceleratorSource.kBrowser; - rowElement.layoutStyle = LayoutStyle.kText; - - let showDialogListenerCalled = false; - rowElement.addEventListener('show-edit-dialog', () => { - showDialogListenerCalled = true; - }); - - await flushTasks(); - - const rowContainer = - rowElement.shadowRoot!.querySelector('#container') as HTMLDivElement; - rowContainer.click(); - - await flushTasks(); - - assertFalse(showDialogListenerCalled); + assertFalse(isVisible(editIconContainerElement)); }); test('ShowTextAccelerator', async () => {
diff --git a/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_subsection_test.ts b/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_subsection_test.ts index c38cfba..63958c8c 100644 --- a/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_subsection_test.ts +++ b/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_subsection_test.ts
@@ -86,14 +86,22 @@ const rowListElement = sectionElement!.shadowRoot!.querySelectorAll('accelerator-row'); - // First accelerator-row corresponds to 'Snap Window Left'. + // First accelerator-row corresponds to 'Snap Window Left', and its category + // is kWindowsAndDesks. assertEquals( manager!.getAcceleratorName(/*source=*/ 0, /*action=*/ 0)!, rowListElement[0]!.description); - // Second accelerator-row corresponds to 'Snap Window Right'. + assertEquals( + manager!.getAcceleratorCategory(/*source=*/ 0, /*action=*/ 0)!, + AcceleratorCategory.kWindowsAndDesks); + // Second accelerator-row corresponds to 'Snap Window Right', and its + // category is kWindowsAndDesks. assertEquals( manager!.getAcceleratorName(/*source=*/ 0, /*action=*/ 1)!, rowListElement[1]!.description); + assertEquals( + manager!.getAcceleratorCategory(/*source=*/ 0, /*action=*/ 1)!, + AcceleratorCategory.kWindowsAndDesks); }); test('SkipAddingRowWhenCertainKeysAreUnavailable', async () => { @@ -114,10 +122,14 @@ assertEquals(1, rowListElement.length); // First and the only accelerator row in General -> Apps category - // corresponds to 'Open Diagnostic app'. + // corresponds to 'Open Diagnostic app'. And its category is kGeneral. assertEquals( manager!.getAcceleratorName(/*source=*/ 0, /*action=*/ 5)!, rowListElement[0]!.description); + assertEquals( + manager!.getAcceleratorCategory(/*source=*/ 0, /*action=*/ 5)!, + AcceleratorCategory.kGeneral); + }); test('RemoveAcceleratorWhenCertainKeysAreUnavailable', async () => { @@ -140,10 +152,14 @@ assertEquals(1, rowListElement[0]!.acceleratorInfos.length); // First and the only accelerator row in General -> GeneralControls category - // corresponds to 'Open/close Google assistant'. + // corresponds to 'Open/close Google assistant', and its category is + // kGeneral. assertEquals( manager!.getAcceleratorName(/*source=*/ 0, /*action=*/ 6)!, rowListElement[0]!.description); + assertEquals( + manager!.getAcceleratorCategory(/*source=*/ 0, /*action=*/ 6)!, + AcceleratorCategory.kGeneral); }); });
diff --git a/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_view_test.ts b/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_view_test.ts index 51b6c6526..ca7f1ef 100644 --- a/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_view_test.ts +++ b/chrome/test/data/webui/chromeos/shortcut_customization/accelerator_view_test.ts
@@ -5,6 +5,7 @@ import 'chrome://shortcut-customization/js/accelerator_view.js'; import 'chrome://webui-test/mojo_webui_test_support.js'; +import {strictQuery} from 'chrome://resources/ash/common/typescript_utils/strict_query.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {AcceleratorLookupManager} from 'chrome://shortcut-customization/js/accelerator_lookup_manager.js'; @@ -13,10 +14,12 @@ import {FakeShortcutProvider} from 'chrome://shortcut-customization/js/fake_shortcut_provider.js'; import {InputKeyElement, KeyInputState} from 'chrome://shortcut-customization/js/input_key.js'; import {setShortcutProviderForTesting} from 'chrome://shortcut-customization/js/mojo_interface_provider.js'; -import {AcceleratorConfigResult, AcceleratorSource, Modifier} from 'chrome://shortcut-customization/js/shortcut_types.js'; +import {AcceleratorConfigResult, AcceleratorSource, LayoutStyle, Modifier} from 'chrome://shortcut-customization/js/shortcut_types.js'; +import {isCategoryLocked} from 'chrome://shortcut-customization/js/shortcut_utils.js'; import {AcceleratorResultData} from 'chrome://shortcut-customization/mojom-webui/ash/webui/shortcut_customization_ui/mojom/shortcut_customization.mojom-webui.js'; -import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; +import {assertEquals, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {flushTasks} from 'chrome://webui-test/polymer_test_util.js'; +import {isVisible} from 'chrome://webui-test/test_util.js'; import {createStandardAcceleratorInfo, createUserAcceleratorInfo} from './shortcut_customization_test_util.js'; @@ -59,6 +62,16 @@ return element as InputKeyElement; } + function getLockIcon(): HTMLDivElement { + return strictQuery( + '.lock-icon-container', viewElement!.shadowRoot, HTMLDivElement); + } + + function getEditIcon(): HTMLDivElement { + return strictQuery( + '#editIconContainer', viewElement!.shadowRoot, HTMLDivElement); + } + test('LoadsBasicAccelerator', async () => { viewElement = initAcceleratorViewElement(); await flushTasks(); @@ -144,108 +157,6 @@ assertEquals('e', pendingKey.key); }); - test('LockIconVisibleWhenCustomizationEnabled', async () => { - loadTimeData.overrideValues({isCustomizationEnabled: true}); - viewElement = initAcceleratorViewElement(); - await flushTasks(); - const acceleratorInfo = createStandardAcceleratorInfo( - Modifier.CONTROL | Modifier.SHIFT, - /*key=*/ 71, - /*keyDisplay=*/ 'g'); - - viewElement.acceleratorInfo = acceleratorInfo; - - // This set() call is necessary to notify the element that a sub-property - // has been updated. - viewElement.set('acceleratorInfo.locked', false); - viewElement.sourceIsLocked = false; - await flushTasks(); - let lockItemContainer = viewElement.shadowRoot!.querySelector( - '#lockIconContainer') as HTMLDivElement; - // If customization is enabled, the acceleratorInfo is not locked, and the - // sourceIsLocked property is false, we expect the lock icon to be hidden. - assertTrue(lockItemContainer.hidden); - - viewElement.set('acceleratorInfo.locked', true); - viewElement.sourceIsLocked = false; - await flushTasks(); - lockItemContainer = viewElement.shadowRoot!.querySelector( - '#lockIconContainer') as HTMLDivElement; - // If customization is enabled, the acceleratorInfo is locked, and the - // sourceIsLocked property is false, we expect the lock icon to be visible. - assertFalse(lockItemContainer.hidden); - - viewElement.set('acceleratorInfo.locked', false); - viewElement.sourceIsLocked = true; - await flushTasks(); - lockItemContainer = viewElement.shadowRoot!.querySelector( - '#lockIconContainer') as HTMLDivElement; - // If customization is enabled, the acceleratorInfo is not locked, and the - // sourceIsLocked property is true, we expect the lock icon to be visible. - assertFalse(lockItemContainer.hidden); - - viewElement.set('acceleratorInfo.locked', true); - viewElement.sourceIsLocked = true; - await flushTasks(); - lockItemContainer = viewElement.shadowRoot!.querySelector( - '#lockIconContainer') as HTMLDivElement; - // If customization is enabled, the acceleratorInfo is locked, and the - // sourceIsLocked property is true, we expect the lock icon to be visible. - assertFalse(lockItemContainer.hidden); - }); - - test('LockIconHiddenWhenCustomizationDisabled', async () => { - loadTimeData.overrideValues({isCustomizationEnabled: false}); - viewElement = initAcceleratorViewElement(); - const acceleratorInfo = createStandardAcceleratorInfo( - Modifier.CONTROL | Modifier.SHIFT, - /*key=*/ 71, - /*keyDisplay=*/ 'g'); - - viewElement.acceleratorInfo = acceleratorInfo; - - viewElement.set('acceleratorInfo.locked', false); - viewElement.sourceIsLocked = false; - await flush(); - - let lockItemContainer = viewElement.shadowRoot!.querySelector( - '#lockIconContainer') as HTMLDivElement; - - // If customization is disabled, the lock icon should always be hidden, - // regardless of the acceleratorInfo.locked or sourceIsLocked properties. - assertTrue(lockItemContainer.hidden); - - viewElement.set('acceleratorInfo.locked', true); - viewElement.sourceIsLocked = false; - await flush(); - lockItemContainer = viewElement.shadowRoot!.querySelector( - '#lockIconContainer') as HTMLDivElement; - - // If customization is disabled, the lock icon should always be hidden, - // regardless of the acceleratorInfo.locked or sourceIsLocked properties. - assertTrue(lockItemContainer.hidden); - - viewElement.set('acceleratorInfo.locked', false); - viewElement.sourceIsLocked = true; - await flush(); - lockItemContainer = viewElement.shadowRoot!.querySelector( - '#lockIconContainer') as HTMLDivElement; - - // If customization is disabled, the lock icon should always be hidden, - // regardless of the acceleratorInfo.locked or sourceIsLocked properties. - assertTrue(lockItemContainer.hidden); - - viewElement.set('acceleratorInfo.locked', true); - viewElement.sourceIsLocked = true; - await flush(); - lockItemContainer = viewElement.shadowRoot!.querySelector( - '#lockIconContainer') as HTMLDivElement; - - // If customization is disabled, the lock icon should always be hidden, - // regardless of the acceleratorInfo.locked or sourceIsLocked properties. - assertTrue(lockItemContainer.hidden); - }); - test('ElementFocusableWhenCustomizationEnabled', async () => { loadTimeData.overrideValues({isCustomizationEnabled: true}); viewElement = initAcceleratorViewElement(); @@ -341,4 +252,137 @@ assertEquals(KeyInputState.ALPHANUMERIC_SELECTED, pendingKey.keyState); assertEquals('f3', pendingKey.key); }); -}); \ No newline at end of file + + test('LockIconVisibilityBasedOnProperties', async () => { + const scenarios = [ + {customizationEnabled: true, locked: true, sourceIsLocked: true}, + {customizationEnabled: true, locked: true, sourceIsLocked: false}, + {customizationEnabled: true, locked: false, sourceIsLocked: true}, + {customizationEnabled: true, locked: false, sourceIsLocked: false}, + {customizationEnabled: false, locked: true, sourceIsLocked: true}, + {customizationEnabled: false, locked: true, sourceIsLocked: false}, + {customizationEnabled: false, locked: false, sourceIsLocked: true}, + {customizationEnabled: false, locked: false, sourceIsLocked: false}, + ]; + + // Prepare all test cases by looping the fakeLayoutInfo. + const testCases = []; + for (const layoutInfo of fakeLayoutInfo) { + // If it's text accelerator, break the loop early. + if (layoutInfo.style !== LayoutStyle.kDefault) { + continue; + } + for (const scenario of scenarios) { + // replicate getCategory() logic. + const category = manager!.getAcceleratorCategory( + layoutInfo.source, layoutInfo.action); + // replicate shouldShowLockIcon() logic. + const expectLockIconVisible = scenario.customizationEnabled && + !isCategoryLocked(category) && + (scenario.locked || scenario.sourceIsLocked); + testCases.push({ + ...scenario, + layoutInfo: layoutInfo, + expectLockIconVisible: expectLockIconVisible, + }); + } + } + // Verify lock icon show/hide based on properties. + for (const testCase of testCases) { + loadTimeData.overrideValues( + {isCustomizationEnabled: testCase.customizationEnabled}); + viewElement = initAcceleratorViewElement(); + viewElement.source = testCase.layoutInfo.source; + viewElement.action = testCase.layoutInfo.action; + const acceleratorInfo = createStandardAcceleratorInfo( + Modifier.CONTROL | Modifier.SHIFT, + /*key=*/ 71, + /*keyDisplay=*/ 'g'); + viewElement.acceleratorInfo = acceleratorInfo; + viewElement.set('acceleratorInfo.locked', testCase.locked); + viewElement.sourceIsLocked = testCase.sourceIsLocked; + + await flush(); + assertEquals(testCase.expectLockIconVisible, isVisible(getLockIcon())); + } + }); + + test('EditIconVisibilityBasedOnProperties', async () => { + // Mainly test on customizationEnabled and accelerator is not locked. + const scenarios = [ + { + customizationEnabled: true, + locked: false, + sourceIsLocked: false, + isAcceleratorRow: false, + }, + { + customizationEnabled: true, + locked: false, + sourceIsLocked: false, + isAcceleratorRow: true, + }, + { + customizationEnabled: true, + locked: true, + sourceIsLocked: false, + isAcceleratorRow: false, + }, + { + customizationEnabled: true, + locked: false, + sourceIsLocked: true, + isAcceleratorRow: true, + }, + { + customizationEnabled: false, + locked: false, + sourceIsLocked: false, + isAcceleratorRow: false, + }, + ]; + + // Prepare all test cases by looping the fakeLayoutInfo. + const testCases = []; + for (const layoutInfo of fakeLayoutInfo) { + // If it's text accelerator, break the loop early. + if (layoutInfo.style !== LayoutStyle.kDefault) { + continue; + } + for (const scenario of scenarios) { + // replicate getCategory() logic. + const category = manager!.getAcceleratorCategory( + layoutInfo.source, layoutInfo.action); + // replicate shouldShowLockIcon() logic. + const expectEditIconVisible = scenario.customizationEnabled && + scenario.isAcceleratorRow && !isCategoryLocked(category) && + !scenario.locked && !scenario.sourceIsLocked; + testCases.push({ + ...scenario, + layoutInfo: layoutInfo, + expectEditIconVisible: expectEditIconVisible, + }); + } + } + for (const testCase of testCases) { + loadTimeData.overrideValues( + {isCustomizationEnabled: testCase.customizationEnabled}); + viewElement = initAcceleratorViewElement(); + viewElement.source = testCase.layoutInfo.source; + viewElement.action = testCase.layoutInfo.action; + viewElement.showEditIcon = testCase.isAcceleratorRow; + const acceleratorInfo = createStandardAcceleratorInfo( + Modifier.CONTROL | Modifier.SHIFT, + /*key=*/ 71, + /*keyDisplay=*/ 'g'); + viewElement.acceleratorInfo = acceleratorInfo; + viewElement.set('acceleratorInfo.locked', testCase.locked); + viewElement.sourceIsLocked = testCase.sourceIsLocked; + + await flush(); + assertEquals( + testCase.expectEditIconVisible, + !getEditIcon().hasAttribute('hidden')); + } + }); +});
diff --git a/chrome/test/data/webui/chromeos/shortcut_customization/search_box_test.ts b/chrome/test/data/webui/chromeos/shortcut_customization/search_box_test.ts index 0335b9b..70a30ce 100644 --- a/chrome/test/data/webui/chromeos/shortcut_customization/search_box_test.ts +++ b/chrome/test/data/webui/chromeos/shortcut_customization/search_box_test.ts
@@ -9,7 +9,8 @@ import {IronDropdownElement} from 'chrome://resources/polymer/v3_0/iron-dropdown/iron-dropdown.js'; import {IronListElement} from 'chrome://resources/polymer/v3_0/iron-list/iron-list.js'; import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {CycleTabsTextSearchResult, fakeSearchResults, TakeScreenshotSearchResult} from 'chrome://shortcut-customization/js/fake_data.js'; +import {AcceleratorLookupManager} from 'chrome://shortcut-customization/js/accelerator_lookup_manager.js'; +import {CycleTabsTextSearchResult, fakeAcceleratorConfig, fakeLayoutInfo, fakeSearchResults, TakeScreenshotSearchResult} from 'chrome://shortcut-customization/js/fake_data.js'; import {FakeShortcutSearchHandler} from 'chrome://shortcut-customization/js/search/fake_shortcut_search_handler.js'; import {SearchBoxElement} from 'chrome://shortcut-customization/js/search/search_box.js'; import {SearchResultRowElement} from 'chrome://shortcut-customization/js/search/search_result_row.js'; @@ -26,15 +27,24 @@ let resultsListElement: IronListElement|null = null; let handler: FakeShortcutSearchHandler; + let manager: AcceleratorLookupManager|null = null; setup(() => { // Set up SearchHandler. handler = new FakeShortcutSearchHandler(); handler.setFakeSearchResult(fakeSearchResults); setShortcutSearchHandlerForTesting(handler); + + // Set up manager. + manager = AcceleratorLookupManager.getInstance(); + manager.setAcceleratorLookup(fakeAcceleratorConfig); + manager.setAcceleratorLayoutLookup(fakeLayoutInfo); }); teardown(() => { + if (manager) { + manager.reset(); + } if (searchBoxElement) { searchBoxElement.remove(); }
diff --git a/chrome/test/data/webui/chromeos/shortcut_customization/search_result_row_test.ts b/chrome/test/data/webui/chromeos/shortcut_customization/search_result_row_test.ts index 478178ef..9b8526b 100644 --- a/chrome/test/data/webui/chromeos/shortcut_customization/search_result_row_test.ts +++ b/chrome/test/data/webui/chromeos/shortcut_customization/search_result_row_test.ts
@@ -6,7 +6,8 @@ import {strictQuery} from 'chrome://resources/ash/common/typescript_utils/strict_query.js'; import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {CycleTabsTextSearchResult, SnapWindowLeftSearchResult, TakeScreenshotSearchResult} from 'chrome://shortcut-customization/js/fake_data.js'; +import {AcceleratorLookupManager} from 'chrome://shortcut-customization/js/accelerator_lookup_manager.js'; +import {CycleTabsTextSearchResult, fakeAcceleratorConfig, fakeLayoutInfo, SnapWindowLeftSearchResult, TakeScreenshotSearchResult} from 'chrome://shortcut-customization/js/fake_data.js'; import {InputKeyElement} from 'chrome://shortcut-customization/js/input_key.js'; import {mojoString16ToString} from 'chrome://shortcut-customization/js/mojo_utils.js'; import {getBoldedDescription} from 'chrome://shortcut-customization/js/search/search_result_bolding.js'; @@ -27,8 +28,19 @@ suite('searchResultRowTest', function() { let searchResultRowElement: SearchResultRowElement|null = null; + let manager: AcceleratorLookupManager|null = null; + + setup(() => { + // Set up manager. + manager = AcceleratorLookupManager.getInstance(); + manager.setAcceleratorLookup(fakeAcceleratorConfig); + manager.setAcceleratorLayoutLookup(fakeLayoutInfo); + }); teardown(() => { + if (manager) { + manager.reset(); + } if (searchResultRowElement) { searchResultRowElement.remove(); }
diff --git a/chrome/test/data/webui/chromeos/shortcut_customization/shortcut_customization_test.ts b/chrome/test/data/webui/chromeos/shortcut_customization/shortcut_customization_test.ts index 3508ba1..70b1358b 100644 --- a/chrome/test/data/webui/chromeos/shortcut_customization/shortcut_customization_test.ts +++ b/chrome/test/data/webui/chromeos/shortcut_customization/shortcut_customization_test.ts
@@ -8,7 +8,9 @@ import {strictQuery} from 'chrome://resources/ash/common/typescript_utils/strict_query.js'; import {CrButtonElement} from 'chrome://resources/cr_elements/cr_button/cr_button.js'; import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js'; +import {CrDrawerElement} from 'chrome://resources/cr_elements/cr_drawer/cr_drawer.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; +import {IronIconElement} from 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js'; import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {AcceleratorEditViewElement} from 'chrome://shortcut-customization/js/accelerator_edit_view.js'; import {AcceleratorLookupManager} from 'chrome://shortcut-customization/js/accelerator_lookup_manager.js'; @@ -138,8 +140,13 @@ subSections[subsectionIndex]!.shadowRoot!.querySelectorAll( 'accelerator-row') as NodeListOf<AcceleratorRowElement>; - // Click on the first accelerator, expect the edit dialog to open. - accelerators[0]!.click(); + // Click on the first accelerator's edit icon, expect the edit dialog to + // open. + const acceleratorView = + accelerators[0]!.shadowRoot!.querySelectorAll('accelerator-view'); + const editIconContainer = acceleratorView[0]!.shadowRoot!.querySelector( + '#editIconContainer') as HTMLDivElement; + editIconContainer.click(); await flushTasks(); } @@ -149,6 +156,7 @@ } test('LoadFakeWindowsAndDesksPage', async () => { + loadTimeData.overrideValues({isCustomizationEnabled: true}); page = initShortcutCustomizationAppElement(); await flushTasks(); @@ -177,6 +185,13 @@ assertEquals( page.i18n(getSubcategoryNameStringId(expectedSecondSubcat)), actualSubsections[1]!.title); + // Assert no lock icon displayed next to subsection title under + // WindowsAndDesks category. + for (const subsection of actualSubsections) { + const lockIcon = strictQuery( + '.lock-icon-container', subsection.shadowRoot, HTMLDivElement); + assertFalse(isVisible(lockIcon)); + } // Assert 2 accelerators are loaded for the second subcategory. assertEquals( (expectedLayouts!.get(expectedSecondSubcat) as LayoutInfo[]).length, @@ -184,6 +199,7 @@ }); test('LoadFakeBrowserPage', async () => { + loadTimeData.overrideValues({isCustomizationEnabled: true}); page = initShortcutCustomizationAppElement(); await flushTasks(); @@ -209,6 +225,13 @@ assertEquals( page.i18n(getSubcategoryNameStringId(keyIterator.value)), actualSubsections[0]!.title); + // Assert lock icon displayed next to every subcategories under Browser + // category. + for (const subsection of actualSubsections) { + const lockIcon = subsection!.shadowRoot!.querySelector( + '.lock-icon-container') as IronIconElement; + assertTrue(isVisible(lockIcon)); + } // Assert only 1 accelerator is within this subsection. assertEquals( (expectedLayouts!.get(keyIterator.value) as LayoutInfo[]).length, @@ -228,8 +251,16 @@ subSections[0]!.shadowRoot!.querySelectorAll('accelerator-row'); // Only three accelerators rows for this subsection. assertEquals(3, accelerators.length); - // Click on the first accelerator, expect the edit dialog to open. - accelerators[0]!.click(); + + // Click on the first accelerator's edit button, expect the edit dialog to + // open. + const acceleratorView = + accelerators[0]!.shadowRoot!.querySelectorAll('accelerator-view'); + assertEquals(1, acceleratorView.length); + const editIconContainer = acceleratorView[0]!.shadowRoot!.querySelector( + '#editIconContainer') as HTMLDivElement; + editIconContainer.click(); + await flushTasks(); editDialog = getPage().shadowRoot!.querySelector('#editDialog'); assertTrue(!!editDialog); @@ -515,6 +546,9 @@ }); test('DisableDefaultAccelerator', async () => { + loadTimeData.overrideValues({isCustomizationEnabled: true}); + manager!.setAcceleratorLookup(fakeAcceleratorConfig); + manager!.setAcceleratorLayoutLookup(fakeLayoutInfo); page = initShortcutCustomizationAppElement(); await flushTasks(); @@ -783,6 +817,44 @@ assertEquals(1, textLookup.length); }); + test('BottomNavContentPresentInSideNav', async () => { + page = initShortcutCustomizationAppElement(); + await flushTasks(); + const navigationPanel = + strictQuery('navigation-view-panel', getPage().shadowRoot, HTMLElement); + const sideNav = + strictQuery('#sideNav', navigationPanel.shadowRoot, HTMLDivElement); + const navContentInSideNavSlot = sideNav.querySelector<HTMLSlotElement>( + 'slot[name=bottom-nav-content-panel]'); + assertTrue(!!navContentInSideNavSlot); + const navContentInSideNavWrapper = + navContentInSideNavSlot.assignedElements()[0]; + assertTrue(!!navContentInSideNavWrapper); + const navContentInSideNav = navContentInSideNavWrapper.querySelector( + 'shortcuts-bottom-nav-content'); + assertTrue( + !!navContentInSideNav, 'Bottom nav content in side nav should exist'); + }); + + test('BottomNavContentPresentInDrawer', async () => { + page = initShortcutCustomizationAppElement(); + await flushTasks(); + const navigationPanel = + strictQuery('navigation-view-panel', getPage().shadowRoot, HTMLElement); + const drawer = + strictQuery('cr-drawer', navigationPanel.shadowRoot, CrDrawerElement); + const navContentInDrawerSlot = drawer.querySelector<HTMLSlotElement>( + 'slot[name=bottom-nav-content-drawer]'); + assertTrue(!!navContentInDrawerSlot); + const navContentInDrawerWrapper = + navContentInDrawerSlot?.assignedElements()[0]; + assertTrue(!!navContentInDrawerWrapper); + const navContentInDrawer = + navContentInDrawerWrapper.querySelector('shortcuts-bottom-nav-content'); + assertTrue( + !!navContentInDrawer, 'Bottom nav content in drawer should exist'); + }); + test('LaunchOldKeyboardSettings', async () => { loadTimeData.overrideValues({ isInputDeviceSettingsSplitEnabled: false,
diff --git a/chrome/test/data/webui/chromeos/shortcut_customization/text_accelerator_test.ts b/chrome/test/data/webui/chromeos/shortcut_customization/text_accelerator_test.ts index 6dab5d4..3da9cc7 100644 --- a/chrome/test/data/webui/chromeos/shortcut_customization/text_accelerator_test.ts +++ b/chrome/test/data/webui/chromeos/shortcut_customization/text_accelerator_test.ts
@@ -5,13 +5,18 @@ import 'chrome://shortcut-customization/js/text_accelerator.js'; import 'chrome://webui-test/mojo_webui_test_support.js'; +import {strictQuery} from 'chrome://resources/ash/common/typescript_utils/strict_query.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import {IronIconElement} from 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js'; +import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {AcceleratorLookupManager} from 'chrome://shortcut-customization/js/accelerator_lookup_manager.js'; +import {fakeAcceleratorConfig, fakeLayoutInfo} from 'chrome://shortcut-customization/js/fake_data.js'; import {InputKeyElement, KeyInputState} from 'chrome://shortcut-customization/js/input_key.js'; import {mojoString16ToString, stringToMojoString16} from 'chrome://shortcut-customization/js/mojo_utils.js'; -import {TextAcceleratorPart, TextAcceleratorPartType} from 'chrome://shortcut-customization/js/shortcut_types.js'; +import {AcceleratorSource, LayoutStyle, TextAcceleratorPart, TextAcceleratorPartType} from 'chrome://shortcut-customization/js/shortcut_types.js'; +import {isCategoryLocked} from 'chrome://shortcut-customization/js/shortcut_utils.js'; import {TextAcceleratorElement} from 'chrome://shortcut-customization/js/text_accelerator.js'; -import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; +import {assertEquals} from 'chrome://webui-test/chai_assert.js'; import {flushTasks} from 'chrome://webui-test/polymer_test_util.js'; import {isVisible} from 'chrome://webui-test/test_util.js'; @@ -23,6 +28,20 @@ suite('textAcceleratorTest', function() { let textAccelElement: TextAcceleratorElement|null = null; + let manager: AcceleratorLookupManager|null = null; + + setup(() => { + // Set up manager. + manager = AcceleratorLookupManager.getInstance(); + manager.setAcceleratorLookup(fakeAcceleratorConfig); + manager.setAcceleratorLayoutLookup(fakeLayoutInfo); + }); + + teardown(() => { + if (manager) { + manager.reset(); + } + }); function getTextPartsContainer(): HTMLElement { return textAccelElement!.shadowRoot!.querySelector('.parts-container') as @@ -41,9 +60,9 @@ return getTextPartsContainer().querySelectorAll('#delimiter-icon'); } - function getLockIcon(): IronIconElement { - return textAccelElement!.shadowRoot!.querySelector('#lock') as - IronIconElement; + function getLockIcon(): HTMLDivElement { + return strictQuery( + '.lock-icon-container', textAccelElement!.shadowRoot, HTMLDivElement); } setup(() => { @@ -57,10 +76,13 @@ textAccelElement = null; }); - function initTextAcceleratorElement(parts: TextAcceleratorPart[] = []): - Promise<void> { + function initTextAcceleratorElement( + parts: TextAcceleratorPart[] = [], source: AcceleratorSource, + action: number): Promise<void> { textAccelElement = document.createElement('text-accelerator'); textAccelElement.parts = parts; + textAccelElement.source = source; + textAccelElement.action = action; document.body.appendChild(textAccelElement); return flushTasks(); } @@ -69,7 +91,7 @@ test('TextAcceleratorPartsSingleModifier', async () => { const ctrlKey = createTextAcceleratorPart('ctrl', TextAcceleratorPartType.kModifier); - await initTextAcceleratorElement([ctrlKey]); + await initTextAcceleratorElement([ctrlKey], AcceleratorSource.kAmbient, 0); assertEquals(1, getTextPartsContainer().children.length); assertEquals(1, textAccelElement!.parts.length); const inputKey = getAllInputKeys()[0]; @@ -79,7 +101,7 @@ test('TextAcceleratorPartsSingleKey', async () => { const bKey = createTextAcceleratorPart('b', TextAcceleratorPartType.kKey); - await initTextAcceleratorElement([bKey]); + await initTextAcceleratorElement([bKey], AcceleratorSource.kAmbient, 0); assertEquals(1, getTextPartsContainer().children.length); assertEquals(1, textAccelElement!.parts.length); const inputKey = getAllInputKeys()[0]; @@ -90,7 +112,8 @@ test('TextAcceleratorPartsPlainText', async () => { const plainText = createTextAcceleratorPart( 'Some text', TextAcceleratorPartType.kPlainText); - await initTextAcceleratorElement([plainText]); + await initTextAcceleratorElement( + [plainText], AcceleratorSource.kAmbient, 0); assertEquals(1, getTextPartsContainer().children.length); const part = getAllPlainTextParts()[0]; assertEquals(1, textAccelElement!.parts.length); @@ -100,7 +123,8 @@ test('TextAcceleratorPartsDelimiter', async () => { const delimiter = createTextAcceleratorPart('+', TextAcceleratorPartType.kDelimiter); - await initTextAcceleratorElement([delimiter]); + await initTextAcceleratorElement( + [delimiter], AcceleratorSource.kAmbient, 0); assertEquals(1, getTextPartsContainer().children.length); const delimiterPart = getAllDelimiterParts()[0]; assertEquals(1, textAccelElement!.parts.length); @@ -115,7 +139,8 @@ 'Some text', TextAcceleratorPartType.kPlainText); const delimiter = createTextAcceleratorPart('+', TextAcceleratorPartType.kDelimiter); - await initTextAcceleratorElement([ctrlKey, bKey, plainText, delimiter]); + await initTextAcceleratorElement( + [ctrlKey, bKey, plainText, delimiter], AcceleratorSource.kAmbient, 0); assertEquals(4, getTextPartsContainer().children.length); assertEquals(4, textAccelElement!.parts.length); @@ -132,19 +157,43 @@ assertEquals(delimiterPart!.icon, 'shortcut-customization-keys:plus'); }); - test('LockIconPresentWhenCustomizationEnabled', async () => { - loadTimeData.overrideValues({isCustomizationEnabled: true}); - const ctrlKey = - createTextAcceleratorPart('ctrl', TextAcceleratorPartType.kModifier); - await initTextAcceleratorElement([ctrlKey]); - assertTrue(isVisible(getLockIcon())); - }); + test('LockIconVisibilityBasedOnProperties', async () => { + const scenarios = [ + {customizationEnabled: true}, + {customizationEnabled: false}, + ]; + // Prepare all test cases by looping the fakeLayoutInfo. + const testCases = []; + for (const layoutInfo of fakeLayoutInfo) { + // If it's not text-accelerator, break the loop early. + if (layoutInfo.style === LayoutStyle.kDefault) { + continue; + } + for (const scenario of scenarios) { + // replicate getCategory() logic. + const category = manager!.getAcceleratorCategory( + layoutInfo.source, layoutInfo.action); + // replicate shouldShowLockIcon() logic. + const expectLockIconVisible = + scenario.customizationEnabled && !isCategoryLocked(category); + testCases.push({ + ...scenario, + layoutInfo: layoutInfo, + expectLockIconVisible: expectLockIconVisible, + }); + } + } + // Verify lock icon show/hide based on properties. + for (const testCase of testCases) { + loadTimeData.overrideValues( + {isCustomizationEnabled: testCase.customizationEnabled}); + const ctrlKey = + createTextAcceleratorPart('ctrl', TextAcceleratorPartType.kModifier); + await initTextAcceleratorElement( + [ctrlKey], testCase.layoutInfo.source, testCase.layoutInfo.action); - test('LockIconHiddenWhenCustomizationDisabled', async () => { - loadTimeData.overrideValues({isCustomizationEnabled: false}); - const ctrlKey = - createTextAcceleratorPart('ctrl', TextAcceleratorPartType.kModifier); - await initTextAcceleratorElement([ctrlKey]); - assertFalse(isVisible(getLockIcon())); + await flush(); + assertEquals(testCase.expectLockIconVisible, isVisible(getLockIcon())); + } }); });
diff --git a/chrome/test/data/webui/password_manager/checkup_section_test.ts b/chrome/test/data/webui/password_manager/checkup_section_test.ts index bc0a986..033ecfc 100644 --- a/chrome/test/data/webui/password_manager/checkup_section_test.ts +++ b/chrome/test/data/webui/password_manager/checkup_section_test.ts
@@ -5,13 +5,13 @@ import 'chrome://password-manager/password_manager.js'; import {CheckupSubpage, Page, PasswordCheckInteraction, PasswordManagerImpl, PluralStringProxy, PluralStringProxyImpl, Router, UrlParam} from 'chrome://password-manager/password_manager.js'; -import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; +import {assertArrayEquals, assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {flushTasks} from 'chrome://webui-test/polymer_test_util.js'; import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js'; import {isVisible} from 'chrome://webui-test/test_util.js'; import {TestPasswordManagerProxy} from './test_password_manager_proxy.js'; -import {makeInsecureCredential, makePasswordCheckStatus} from './test_util.js'; +import {createCredentialGroup, makeInsecureCredential, makePasswordCheckStatus} from './test_util.js'; const PasswordCheckState = chrome.passwordsPrivate.PasswordCheckState; @@ -225,19 +225,22 @@ assertFalse(section.$.weakRow.hasAttribute('non-clickable')); }); - test('Number of checked passwords', async function() { + test('Number of checked sites shown', async function() { + passwordManager.data.groups = Array(10).fill(createCredentialGroup()); passwordManager.data.checkStatus = makePasswordCheckStatus( - {state: PasswordCheckState.IDLE, totalNumber: 10}); + {state: PasswordCheckState.IDLE, totalNumber: 20}); const section = document.createElement('checkup-section'); document.body.appendChild(section); + passwordManager.whenCalled('getPasswordCheckStatus'); + await flushTasks(); - assertEquals(10, await pluralString.whenCalled('checkedPasswords')); - const statusLabel = - section.shadowRoot!.querySelector<HTMLElement>('#checkupStatusLabel'); - assertTrue(!!statusLabel); - assertEquals('checkedPasswords', statusLabel.textContent!.trim()); + await pluralString.whenCalled('checkedPasswords'); + // getPluralString() for 'checkedPasswords' is called 2 times with 0 and 10. + assertArrayEquals([0, 10], pluralString.getArgs('checkedPasswords')); + assertEquals( + 'checkedPasswords', section.$.checkupStatusLabel.textContent!.trim()); }); [CheckupSubpage.COMPROMISED, CheckupSubpage.REUSED, CheckupSubpage.WEAK] @@ -315,4 +318,29 @@ assertEquals( PasswordCheckInteraction.START_CHECK_AUTOMATICALLY, interaction); }); + + test('changing number of groups changes title', async function() { + passwordManager.data.groups = Array(10).fill(createCredentialGroup()); + passwordManager.data.checkStatus = makePasswordCheckStatus( + {state: PasswordCheckState.IDLE, totalNumber: 20}); + + const section = document.createElement('checkup-section'); + document.body.appendChild(section); + passwordManager.whenCalled('getPasswordCheckStatus'); + + await flushTasks(); + + await pluralString.whenCalled('checkedPasswords'); + // getPluralString() for 'checkedPasswords' is called 2 times with 0 and 10. + assertArrayEquals([0, 10], pluralString.getArgs('checkedPasswords')); + + passwordManager.data.groups = Array(9).fill(createCredentialGroup()); + assertTrue(!!passwordManager.listeners.savedPasswordListChangedListener); + passwordManager.listeners.savedPasswordListChangedListener([]); + + await pluralString.whenCalled('checkedPasswords'); + // getPluralString() for 'checkedPasswords' is called 3 times with 0, 10 + // and 9. + assertArrayEquals([0, 10, 9], pluralString.getArgs('checkedPasswords')); + }); });
diff --git a/chrome/test/data/webui/settings/autofill_section_test.ts b/chrome/test/data/webui/settings/autofill_section_test.ts index 254f1a8..a5c920d 100644 --- a/chrome/test/data/webui/settings/autofill_section_test.ts +++ b/chrome/test/data/webui/settings/autofill_section_test.ts
@@ -330,10 +330,10 @@ 'Sync is disabled, the local indicator should be visible.'); changeListener(autofillManager.data.addresses, [], [], undefined); - assertTrue( + assertFalse( isVisible(section.$.addressList.children[0]!.querySelector( '[icon*=cloud-off]')), - 'The user is logged-out, the local indicator should be visible.'); + 'The local indicator should not be shown to logged-out users'); document.body.removeChild(section); });
diff --git a/chrome/test/data/webui/settings/chromeos/apps_page_test.js b/chrome/test/data/webui/settings/chromeos/apps_page_test.js index 4351034..e2cf0a3 100644 --- a/chrome/test/data/webui/settings/chromeos/apps_page_test.js +++ b/chrome/test/data/webui/settings/chromeos/apps_page_test.js
@@ -594,13 +594,13 @@ test('ManageUsbDevice', function() { // ARCVM is not enabled - subpage.showArcvmManageUsb = false; + subpage.isArcVmManageUsbAvailable = false; flush(); assertFalse( !!subpage.shadowRoot.querySelector('#manageArcvmShareUsbDevices')); // ARCMV is enabled - subpage.showArcvmManageUsb = true; + subpage.isArcVmManageUsbAvailable = true; flush(); assertTrue( !!subpage.shadowRoot.querySelector('#manageArcvmShareUsbDevices'));
diff --git a/chrome/test/data/webui/side_panel/customize_chrome/categories_test.ts b/chrome/test/data/webui/side_panel/customize_chrome/categories_test.ts index 1128163f..bca4d92 100644 --- a/chrome/test/data/webui/side_panel/customize_chrome/categories_test.ts +++ b/chrome/test/data/webui/side_panel/customize_chrome/categories_test.ts
@@ -111,7 +111,6 @@ const event = await eventPromise; assertTrue(!!event); assertEquals(1, handler.getCallCount('chooseLocalCustomBackground')); - assertEquals(1, handler.getCallCount('setDefaultColor')); }); test('clicking Chrome Web Store tile opens Chrome Web Store', async () => {
diff --git a/chromeos/ash/components/audio/audio_devices_pref_handler.h b/chromeos/ash/components/audio/audio_devices_pref_handler.h index adf14eb..fb009f0 100644 --- a/chromeos/ash/components/audio/audio_devices_pref_handler.h +++ b/chromeos/ash/components/audio/audio_devices_pref_handler.h
@@ -75,6 +75,15 @@ // Reads the speak-on-mute detection enabled value from prefs. virtual bool GetSpeakOnMuteDetectionEnabledValue() const = 0; + // Reads the should show speak-on-mute detection opt-in nudge value from + // prefs. + virtual bool GetShouldShowSpeakOnMuteOptInNudgeValue() const = 0; + // Sets the should show speak-on-mute detection opt-in nudge value from prefs. + // It should be set to false if user has changed the speak-on-mute detection + // enabled pref. + virtual void SetShouldShowSpeakOnMuteOptInNudgeValue( + bool should_show_opt_in_nudge) = 0; + // Adds an audio preference observer. virtual void AddAudioPrefObserver(AudioPrefObserver* observer) = 0; // Removes an audio preference observer.
diff --git a/chromeos/ash/components/audio/audio_devices_pref_handler_impl.cc b/chromeos/ash/components/audio/audio_devices_pref_handler_impl.cc index a472c40..771f3337 100644 --- a/chromeos/ash/components/audio/audio_devices_pref_handler_impl.cc +++ b/chromeos/ash/components/audio/audio_devices_pref_handler_impl.cc
@@ -351,6 +351,17 @@ return local_state_->GetBoolean(prefs::kUserSpeakOnMuteDetectionEnabled); } +bool AudioDevicesPrefHandlerImpl::GetShouldShowSpeakOnMuteOptInNudgeValue() + const { + return local_state_->GetBoolean(prefs::kShouldShowSpeakOnMuteOptInNudge); +} + +void AudioDevicesPrefHandlerImpl::SetShouldShowSpeakOnMuteOptInNudgeValue( + bool should_show_opt_in_nudge) { + local_state_->SetBoolean(prefs::kShouldShowSpeakOnMuteOptInNudge, + should_show_opt_in_nudge); +} + void AudioDevicesPrefHandlerImpl::AddAudioPrefObserver( AudioPrefObserver* observer) { observers_.AddObserver(observer); @@ -549,7 +560,8 @@ registry->RegisterDictionaryPref(prefs::kAudioDevicesState); registry->RegisterBooleanPref(prefs::kInputNoiseCancellationEnabled, false); registry->RegisterBooleanPref(prefs::kUserSpeakOnMuteDetectionEnabled, false); - registry->RegisterBooleanPref(prefs::kUserSpeakOnMuteDetectionOptIn, false); + registry->RegisterBooleanPref(prefs::kShouldShowSpeakOnMuteOptInNudge, true); + registry->RegisterIntegerPref(prefs::kSpeakOnMuteOptInNudgeShownCount, 0); // Register the prefs backing the audio muting policies. // Policy for audio input is handled by kAudioCaptureAllowed in the Chrome
diff --git a/chromeos/ash/components/audio/audio_devices_pref_handler_impl.h b/chromeos/ash/components/audio/audio_devices_pref_handler_impl.h index 2e8a3bd3..cea0f33 100644 --- a/chromeos/ash/components/audio/audio_devices_pref_handler_impl.h +++ b/chromeos/ash/components/audio/audio_devices_pref_handler_impl.h
@@ -62,6 +62,10 @@ bool GetSpeakOnMuteDetectionEnabledValue() const override; + bool GetShouldShowSpeakOnMuteOptInNudgeValue() const override; + void SetShouldShowSpeakOnMuteOptInNudgeValue( + bool should_show_opt_in_nudge) override; + void AddAudioPrefObserver(AudioPrefObserver* observer) override; void RemoveAudioPrefObserver(AudioPrefObserver* observer) override;
diff --git a/chromeos/ash/components/audio/audio_devices_pref_handler_impl_unittest.cc b/chromeos/ash/components/audio/audio_devices_pref_handler_impl_unittest.cc index 27dc6ca..b5f11af 100644 --- a/chromeos/ash/components/audio/audio_devices_pref_handler_impl_unittest.cc +++ b/chromeos/ash/components/audio/audio_devices_pref_handler_impl_unittest.cc
@@ -478,6 +478,13 @@ EXPECT_TRUE(audio_pref_handler_->GetNoiseCancellationState()); } +TEST_P(AudioDevicesPrefHandlerTest, + ShouldShowSpeakOnMuteOptInNudgePrefRegistered) { + EXPECT_TRUE(audio_pref_handler_->GetShouldShowSpeakOnMuteOptInNudgeValue()); + audio_pref_handler_->SetShouldShowSpeakOnMuteOptInNudgeValue(false); + EXPECT_FALSE(audio_pref_handler_->GetShouldShowSpeakOnMuteOptInNudgeValue()); +} + TEST_P(AudioDevicesPrefHandlerTest, UserPriority) { AudioDevice device = GetDeviceWithVersion(2); EXPECT_EQ(kUserPriorityNone, GetUserPriority(device));
diff --git a/chromeos/ash/components/audio/audio_devices_pref_handler_stub.cc b/chromeos/ash/components/audio/audio_devices_pref_handler_stub.cc index 586e551..b5152d9 100644 --- a/chromeos/ash/components/audio/audio_devices_pref_handler_stub.cc +++ b/chromeos/ash/components/audio/audio_devices_pref_handler_stub.cc
@@ -137,6 +137,16 @@ return is_speak_on_mute_detection_enabled_; } +bool AudioDevicesPrefHandlerStub::GetShouldShowSpeakOnMuteOptInNudgeValue() + const { + return should_show_speak_on_mute_opt_in_nudge_; +} + +void AudioDevicesPrefHandlerStub::SetShouldShowSpeakOnMuteOptInNudgeValue( + bool should_show_opt_in_nudge) { + should_show_speak_on_mute_opt_in_nudge_ = should_show_opt_in_nudge; +} + void AudioDevicesPrefHandlerStub::SetAudioOutputAllowedValue( bool is_audio_output_allowed) { is_audio_output_allowed_ = is_audio_output_allowed;
diff --git a/chromeos/ash/components/audio/audio_devices_pref_handler_stub.h b/chromeos/ash/components/audio/audio_devices_pref_handler_stub.h index 85d33e17..30bbb439 100644 --- a/chromeos/ash/components/audio/audio_devices_pref_handler_stub.h +++ b/chromeos/ash/components/audio/audio_devices_pref_handler_stub.h
@@ -55,6 +55,11 @@ size_t keep_devices) override; bool GetAudioOutputAllowedValue() const override; bool GetSpeakOnMuteDetectionEnabledValue() const override; + + bool GetShouldShowSpeakOnMuteOptInNudgeValue() const override; + void SetShouldShowSpeakOnMuteOptInNudgeValue( + bool should_show_opt_in_nudge) override; + void AddAudioPrefObserver(AudioPrefObserver* observer) override; void RemoveAudioPrefObserver(AudioPrefObserver* observer) override; @@ -78,6 +83,7 @@ bool is_audio_output_allowed_ = true; bool is_speak_on_mute_detection_enabled_ = false; + bool should_show_speak_on_mute_opt_in_nudge_ = true; bool noise_cancellation_state_ = true; };
diff --git a/chromeos/ash/components/audio/cras_audio_handler.cc b/chromeos/ash/components/audio/cras_audio_handler.cc index 0fecf33c..c74b863c 100644 --- a/chromeos/ash/components/audio/cras_audio_handler.cc +++ b/chromeos/ash/components/audio/cras_audio_handler.cc
@@ -1453,6 +1453,11 @@ speak_on_mute_detection_on_ = som_on; // Sets speak-on-mute detection enabled based on pref value. CrasAudioClient::Get()->SetSpeakOnMuteDetection(speak_on_mute_detection_on_); + + // No longer shows the opt-in nudge as user has changed the speak-on-mute + // detection setting. + audio_pref_handler_->SetShouldShowSpeakOnMuteOptInNudgeValue( + /*should_show_opt_in_nudge=*/false); } void CrasAudioHandler::UpdateAudioMute() {
diff --git a/chromeos/ash/components/audio/cras_audio_handler_unittest.cc b/chromeos/ash/components/audio/cras_audio_handler_unittest.cc index 4c600d4..681891f 100644 --- a/chromeos/ash/components/audio/cras_audio_handler_unittest.cc +++ b/chromeos/ash/components/audio/cras_audio_handler_unittest.cc
@@ -5165,18 +5165,27 @@ // Speak-on-mute detection should still be disabled since the pref is // disabled by default. EXPECT_FALSE(fake_cras_audio_client()->speak_on_mute_detection_enabled()); + EXPECT_FALSE(audio_pref_handler_->GetSpeakOnMuteDetectionEnabledValue()); + // `kShouldShowSpeakOnMuteOptInNudge` pref should be enabled by default. + EXPECT_TRUE(audio_pref_handler_->GetShouldShowSpeakOnMuteOptInNudgeValue()); // Simulate enable pref for speak-on-mute detection, which should enable // speak-on-mute detection. audio_pref_handler_->SetSpeakOnMuteDetectionEnabledValue( /*is_speak_on_mute_detection_enabled=*/true); EXPECT_TRUE(fake_cras_audio_client()->speak_on_mute_detection_enabled()); + // `kShouldShowSpeakOnMuteOptInNudge` pref should be disabled as the + // `kUserSpeakOnMuteDetectionEnabled` pref has been changed. + EXPECT_FALSE(audio_pref_handler_->GetShouldShowSpeakOnMuteOptInNudgeValue()); // Simulate disable pref for speak-on-mute detection, which should disable // speak-on-mute detection. audio_pref_handler_->SetSpeakOnMuteDetectionEnabledValue( /*is_speak_on_mute_detection_enabled=*/false); EXPECT_FALSE(fake_cras_audio_client()->speak_on_mute_detection_enabled()); + // `kShouldShowSpeakOnMuteOptInNudge` pref should be disabled as the + // `kUserSpeakOnMuteDetectionEnabled` pref has been changed. + EXPECT_FALSE(audio_pref_handler_->GetShouldShowSpeakOnMuteOptInNudgeValue()); } } // namespace ash
diff --git a/chromeos/crosapi/mojom/clipboard_history.mojom b/chromeos/crosapi/mojom/clipboard_history.mojom index bb2938c6..99ee0e6 100644 --- a/chromeos/crosapi/mojom/clipboard_history.mojom +++ b/chromeos/crosapi/mojom/clipboard_history.mojom
@@ -44,14 +44,6 @@ kFile = 3, }; -// Deprecated. Use `ClipboardHistoryItemDescriptor` instead. -[RenamedFrom="crosapi.mojom.ClipboardHistoryItemDescriptor"] -struct DeprecatedClipboardHistoryItemDescriptor { - mojo_base.mojom.String16 display_text; - ClipboardHistoryDisplayFormat display_format; - string item_id; -}; - // Describes a clipboard history item. // // NOTE: This structure does not contain the actual clipboard data. The @@ -79,8 +71,8 @@ // ClipboardHistory (//ash/clipboard) is an Ash-Chrome feature that shows the // last few things copied. It is shown by accelerator and contextual menu. This // allows Lacros-Chrome to show the ClipboardHistory menu by contextual menu. -// Next MinVersion: 2 -// Next method ID: 2 +// Next MinVersion: 3 +// Next method ID: 3 [Stable, Uuid="2dc3f126-d79f-4d9e-a7a7-0989c1be8acd"] interface ClipboardHistory { // Shows a menu in Ash-Chrome with the last few things copied. @@ -97,4 +89,18 @@ mojo_base.mojom.UnguessableToken item_id, int32 event_flags, ClipboardHistoryControllerShowSource paste_source); + + // Registers `client` which is implemented in Lacros-Chrome so that `client` + // can receive remote calls from Ash-Chrome. Used only when the clipboard + // history refresh feature is enabled. + [MinVersion=2] + RegisterClient@2(pending_remote<ClipboardHistoryClient> client); +}; + +// This interface is implemented by Lacros-Chrome. +[Stable, Uuid="67a12272-d7c0-40f8-8b09-90a150787358"] +interface ClipboardHistoryClient { + // Sets the clipboard history item descriptors cached in Lacros-Chrome. + SetClipboardHistoryItemDescriptors@0( + array<ClipboardHistoryItemDescriptor> item_descriptors); };
diff --git a/chromeos/profiles/arm-exp.afdo.newest.txt b/chromeos/profiles/arm-exp.afdo.newest.txt index 2b9b62ef..35f19dd 100644 --- a/chromeos/profiles/arm-exp.afdo.newest.txt +++ b/chromeos/profiles/arm-exp.afdo.newest.txt
@@ -1 +1 @@ -chromeos-chrome-arm-none-115-5735.18-1684150800-benchmark-115.0.5777.0-r1-redacted.afdo.xz +chromeos-chrome-arm-exp-115-5735.18-1684144513-benchmark-115.0.5779.0-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/arm.afdo.newest.txt b/chromeos/profiles/arm.afdo.newest.txt index 2b9b62ef..c07c7f6b 100644 --- a/chromeos/profiles/arm.afdo.newest.txt +++ b/chromeos/profiles/arm.afdo.newest.txt
@@ -1 +1 @@ -chromeos-chrome-arm-none-115-5735.18-1684150800-benchmark-115.0.5777.0-r1-redacted.afdo.xz +chromeos-chrome-arm-none-115-5735.18-1684150800-benchmark-115.0.5779.0-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/atom.afdo.newest.txt b/chromeos/profiles/atom.afdo.newest.txt index 0bf63a4..75eeb16 100644 --- a/chromeos/profiles/atom.afdo.newest.txt +++ b/chromeos/profiles/atom.afdo.newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-atom-115-5735.18-1684144513-benchmark-115.0.5777.0-r1-redacted.afdo.xz +chromeos-chrome-amd64-atom-115-5735.18-1684144513-benchmark-115.0.5779.0-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/bigcore.afdo.newest.txt b/chromeos/profiles/bigcore.afdo.newest.txt index 89073582..e161e5c 100644 --- a/chromeos/profiles/bigcore.afdo.newest.txt +++ b/chromeos/profiles/bigcore.afdo.newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-bigcore-115-5735.18-1684149627-benchmark-115.0.5777.0-r1-redacted.afdo.xz +chromeos-chrome-amd64-bigcore-115-5735.18-1684149627-benchmark-115.0.5779.0-r1-redacted.afdo.xz
diff --git a/chromeos/strings/chromeos_strings_ar.xtb b/chromeos/strings/chromeos_strings_ar.xtb index eda20e5..2d4848f 100644 --- a/chromeos/strings/chromeos_strings_ar.xtb +++ b/chromeos/strings/chromeos_strings_ar.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872">يدير <ph name="MANAGER" /> هذا الجهاز، وقد يتمكَّن من مراقبة نشاطك.</translation> <translation id="1478594628797167447">الماسح الضوئي</translation> <translation id="1483493594462132177">إرسال</translation> +<translation id="1488850966314959671">يتعذَّر الاتصال بهذه الشبكة باستخدام أي أسماء نقاط وصول (APN) مخصَّصة ومفعَّلة. يُرجى التواصل مع مشغِّل شبكة الجوّال للحصول على مزيد من المعلومات.</translation> <translation id="1491076385728777984">جارِ تحديث البرامج الثابتة على الجهاز <ph name="DEVICE_NAME" />.</translation> <translation id="1499041187027566160">الصوت مرتفع</translation> <translation id="1499900233129743732">يدير <ph name="MANAGER" /> هذا المستخدم، ويمكنه إدارة الإعدادات ومراقبة نشاط المستخدم عن بُعد.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">إعادة المسح الضوئي</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5584044598279886848">يتعذّر إيقاف اسم نقطة الوصول (APN) هذا أو إزالته. يُرجى التأكُّد من إيقاف أو إزالة أسماء نقاط الوصول المفعَّلة من نوع attach.</translation> <translation id="5600027863942488546">تم اختبار المفتاح <ph name="KEY_NAME" />.</translation> <translation id="5620281292257375798">داخلي فقط</translation> <translation id="5649768706273821470">استماع</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">يتبقى أقل من دقيقة.</translation> <translation id="917720651393141712">اختبار</translation> <translation id="9188992814426075118">يمكن أن تكون لوحة المفاتيح متطابقة تلقائيًا مع خلفيتك.</translation> +<translation id="9189000703457422362">يتعذّر الاتصال بهذه الشبكة باستخدام أسماء نقاط الوصول (APN) التي يتم رصدها تلقائيًا. يُرجى التواصل مع مشغِّل شبكة الجوّال للحصول على مزيد من المعلومات.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">تعذَّر الاتصال بالبوابة من خلال تطبيقات Android.</translation> <translation id="9211490828691860325">جميع أسطح المكتب</translation>
diff --git a/chromeos/strings/chromeos_strings_az.xtb b/chromeos/strings/chromeos_strings_az.xtb index c7813f50..123a034 100644 --- a/chromeos/strings/chromeos_strings_az.xtb +++ b/chromeos/strings/chromeos_strings_az.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> bu cihazı idarə edir və fəaliyyətinizə nəzarət edə bilər.</translation> <translation id="1478594628797167447">Skaner</translation> <translation id="1483493594462132177">Göndərin</translation> +<translation id="1488850966314959671">Aktivləşdirilmiş fərdi APN ilə bu şəbəkəyə qoşulmaq olmur. Ətraflı məlumat üçün mobil operator ilə əlaqə saxlayın.</translation> <translation id="1491076385728777984"><ph name="DEVICE_NAME" /> cihazında proqram güncəllənir</translation> <translation id="1499041187027566160">həcmi artırın</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> bu istifadəçini idarə edir və ayarları məsafədən idarə edə və istifadəçinin fəaliyyətini izləyə bilər.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Yenidən skan edin</translation> <translation id="5583640892426849032">Geri silmə</translation> +<translation id="5584044598279886848">Bu APN-i deaktiv etmək və ya silmək olmur. Əlavə edilmiş aktiv APN-lər deaktiv edilməli və ya silinməlidir.</translation> <translation id="5600027863942488546"><ph name="KEY_NAME" /> düyməsi test edilib</translation> <translation id="5620281292257375798">Yalnız daxili</translation> <translation id="5649768706273821470">Dinləyin</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">Bir dəqiqədən az qalıb</translation> <translation id="917720651393141712">Test</translation> <translation id="9188992814426075118">Klaviaturanız avtomatik olaraq divar kağızı ilə uyğunlaşa bilər</translation> +<translation id="9189000703457422362">Avtomatik aşkarlanan APN ilə bu şəbəkəyə qoşulmaq olmur. Ətraflı məlumat üçün mobil operator ilə əlaqə saxlayın.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Android tətbiqlərindən giriş ilə əlaqə saxlamaq olmur</translation> <translation id="9211490828691860325">Bütün masalar</translation>
diff --git a/chromeos/strings/chromeos_strings_be.xtb b/chromeos/strings/chromeos_strings_be.xtb index 5c26e655..b9f5cbd 100644 --- a/chromeos/strings/chromeos_strings_be.xtb +++ b/chromeos/strings/chromeos_strings_be.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> кіруе гэтай прыладай і можа адсочваць вашы дзеянні.</translation> <translation id="1478594628797167447">Сканер</translation> <translation id="1483493594462132177">Адправіць</translation> +<translation id="1488850966314959671">Не ўдалося падключыцца да гэтай сеткі ні з адным з уключаных уласных ідэнтыфікатараў APN. Па дадатковую інфармацыю звяртайцеся да аператара мабільнай сувязі.</translation> <translation id="1491076385728777984">Ідзе абнаўленне ўбудаванага праграмнага забеспячэння прылады "<ph name="DEVICE_NAME" />"</translation> <translation id="1499041187027566160">павялічыць гучнасць</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> можа кіраваць наладамі гэтага карыстальніка і адсочваць яго дзеянні.</translation> @@ -218,6 +219,7 @@ <translation id="2638662041295312666">Відарыс уліковага запісу</translation> <translation id="2640549051766135490">Выбраны альбом "<ph name="TITLE" />" (<ph name="DESC" />)</translation> <translation id="267442004702508783">абнавіць</translation> +<translation id="268270014981824665">цьмяная клавіятура</translation> <translation id="2712812801627182647">Ключ аўтэнтыфікацыі TLS</translation> <translation id="2713444072780614174">Белы</translation> <translation id="2717139507051041123">Уключыць рэжым цёмных колераў</translation> @@ -225,6 +227,7 @@ <translation id="2744221223678373668">Абагулена</translation> <translation id="2751739896257479635">Фаза 2 аўтэнтыфікацыі EAP</translation> <translation id="2783010256799387990">ПРОЙДЗЕНА</translation> +<translation id="2787435249130282949">большая яркасць клавіятуры</translation> <translation id="2789486458103222910">OK</translation> <translation id="2805756323405976993">Праграмы</translation> <translation id="28232023175184696">Няма падключэння да інтэрнэту. Націсніце, каб паўтарыць спробу.</translation> @@ -328,11 +331,13 @@ <translation id="3749289110408117711">Назва файла</translation> <translation id="3771294271822695279">Відэафайлы</translation> <translation id="3784455785234192852">Блакіроўка</translation> +<translation id="380097101658023925">Налады RGB</translation> <translation id="38114475217616659">Ачысціць усю гісторыю</translation> <translation id="3820172043799983114">Несапраўдны PIN-код.</translation> <translation id="3824259034819781947">Далучыць файлы</translation> <translation id="3838338534323494292">Новы пароль</translation> <translation id="3845880861638660475">Каб закрыць дыялогавае акно, націсніце <ph name="ALT_SHORTCUT_START" />Alt<ph name="ALT_SHORTCUT_END" /> + <ph name="ESC_SHORTCUT_START" />Esc<ph name="ESC_SHORTCUT_END" />.</translation> +<translation id="3848280697030027394">зацямніць клавіятуру</translation> <translation id="385051799172605136">Назад</translation> <translation id="3858860766373142691">Назва</translation> <translation id="3862598938296403232">Патрабуецца апісанне</translation> @@ -404,6 +409,7 @@ <translation id="4382484599443659549">PDF</translation> <translation id="4394049700291259645">Выключыць</translation> <translation id="439429847087949098">Ідзе перазапуск прылады "<ph name="DEVICE_NAME" />"</translation> +<translation id="4395835743215824109">наладзіць клавіятуру</translation> <translation id="4415951057168511744">Бягучы аватар</translation> <translation id="4422041425070339732">стрэлка ўніз</translation> <translation id="4425149324548788773">Мой Дыск</translation> @@ -444,6 +450,7 @@ <translation id="4731797938093519117">Бацькоўскі доступ</translation> <translation id="473775607612524610">Абнавіць</translation> <translation id="4744944742468440486">Інфармацыя, звязаная з вылучаным вамі фрагментам</translation> +<translation id="4771607256327216405">клавіятура ярчэй</translation> <translation id="4773299976671772492">Спынена</translation> <translation id="4782311465517282004">Атрымлівайце азначэнні, пераклады або пераводзьце адзінкі вымярэння: для гэтага вам трэба дакрануцца да тэксту і ўтрымліваць палец або націснуць на тэкст правай кнопкай мышы.</translation> <translation id="4791000909649665275"><ph name="NUMBER" /> фота</translation> @@ -492,6 +499,7 @@ <translation id="500920857929044050">Спыніць праверку</translation> <translation id="5017508259293544172">LEAP</translation> <translation id="5019310272469539976">Паказваць фота, час, надвор'е і інфармацыю пра медыяфайлы, калі экран неактыўны.</translation> +<translation id="5038292761217083259">рознакаляровая падсветка клавіятуры</translation> <translation id="5039804452771397117">Дазволіць</translation> <translation id="5049856988445523908">SIM-карта заблакіравана (<ph name="LOCK_TYPE" />)</translation> <translation id="5050042263972837708">Назва групы</translation> @@ -556,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Сканіраваць паўторна</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5584044598279886848">Не ўдалося адключыць або выдаліць гэты ідэнтыфікатар APN. Вам трэба адключыць або выдаліць далучаныя APN, якія былі ўключаны.</translation> <translation id="5600027863942488546">Клавіша "<ph name="KEY_NAME" />" праверана</translation> <translation id="5620281292257375798">Для ўнутранага карыстання</translation> <translation id="5649768706273821470">Праслухаць</translation> @@ -640,6 +649,7 @@ <translation id="6280912520669706465">ARC</translation> <translation id="6284632978374966585">Уключыць цёмную тэму</translation> <translation id="6285899124799306373">адкрыць панэль запуску</translation> +<translation id="629550705077076970">зацямненне клавіятуры</translation> <translation id="6302401976930124515"><ph name="TEST_NAME" />: тэст скасаваны</translation> <translation id="631063167932043783">Праграма "Агляд"</translation> <translation id="6319207335391420837">Абнаўленне ўбудаванага ПЗ прылады "<ph name="DEVICE_NAME" />"</translation> @@ -658,6 +668,7 @@ <translation id="6401427872449207797">пошук у браўзеры</translation> <translation id="6410257289063177456">Файлы відарысаў</translation> <translation id="641081527798843608">Супадзенне суб'екта</translation> +<translation id="6411934471898487866">яркасць клавіятуры</translation> <translation id="6412715219990689313">Убудаваная клавіятура</translation> <translation id="6417265370957905582">Памочнік Google</translation> <translation id="6423239382391657905">OpenVPN</translation> @@ -804,13 +815,16 @@ <translation id="7620771111601174153">Атрымаць больш інфармацыі ў Даведачным цэнтры</translation> <translation id="763165478673169849">Час апошняга скіду</translation> <translation id="7648838807254605802">Вялікая затрымка HTTPS</translation> +<translation id="765159867434478292">Падзелены</translation> <translation id="7656388927906093505">Гэта мыш.</translation> <translation id="7658239707568436148">Скасаваць</translation> <translation id="7665800271478495366">Змяніць аватар</translation> +<translation id="7683228889864052081">адценне клавіятуры</translation> <translation id="7690294790491645610">Пацвердзіце новы пароль</translation> <translation id="7701040980221191251">Няма</translation> <translation id="7705524343798198388">VPN</translation> <translation id="7716280709122323042">WPA3</translation> +<translation id="7718231387947923843">падсвятленне клавіятуры</translation> <translation id="773153675489693198">Колькасць цыклаў</translation> <translation id="7747039790905080783">Папярэдне абагулены ключ</translation> <translation id="7762130827864645708">Пароль зменены. У далейшым выкарыстоўвайце яго.</translation> @@ -854,6 +868,7 @@ <translation id="8075838845814659848">Узровень зараду акумулятара</translation> <translation id="8076492880354921740">Укладкі</translation> <translation id="8082366717211101304">Не ўдалося ажыццявіць DNS-пераўтварэнне з праграм для Android</translation> +<translation id="8082644724189923105">зона клавіятуры</translation> <translation id="808894953321890993">Змяніць пароль</translation> <translation id="8094062939584182041">Дазволіць Google апавяшчаць вас па электроннай пошце пра гэту праблему</translation> <translation id="8104083085214006426">Вы карыстаецеся адкрытай небяспечнай сеткай</translation> @@ -902,6 +917,7 @@ <translation id="8456761643544401578">Аўтаматычнае ўключэнне цёмнага рэжыму</translation> <translation id="8461329675984532579">Назва аператара</translation> <translation id="8475690821716466388">Сетка Wi-Fi абаронена слабым пратаколам WEP PSK</translation> +<translation id="8476242415522716722">свячэнне клавіятуры</translation> <translation id="8477551185774834963">Затрымка DNS крыху перавышае дапушчальнае парогавае значэнне</translation> <translation id="8483248364096924578">IP-адрас</translation> <translation id="8491311378305535241">Не ўдалося падключыцца праз брандмаўар да вэб-сайтаў HTTP з праграм Android</translation> @@ -945,6 +961,7 @@ <translation id="8845001906332463065">Атрымаць даведку</translation> <translation id="8855781559874488009">Не ўдалося падключыцца праз брандмаўар да вэб-сайтаў HTTP</translation> <translation id="885701979325669005">Сховішча</translation> +<translation id="885704831271383379">меншая яркасць клавіятуры</translation> <translation id="8863170912498892583">Уключыць цёмную тэму</translation> <translation id="8863888432376731307">Атрымайце <ph name="INTENT" /> і дадатковую інфармацыю ў адказ на запыт "<ph name="QUERY" />"</translation> <translation id="8864415976656252616">Няма прапанавага змесціва. Азнаёмцеся з папулярным даведачным змесцівам.</translation> @@ -997,6 +1014,7 @@ <translation id="9173638680043580060">Застаецца менш за хвіліну</translation> <translation id="917720651393141712">Праверыць</translation> <translation id="9188992814426075118">Падсветка клавіятуры можа аўтаматычна падбірацца пад колер шпалер</translation> +<translation id="9189000703457422362">Не ўдалося падключыцца да гэтай сеткі з выкарыстаннем аўтаматычна распазнаных APN. Па дадатковую інфармацыю звяртайцеся да аператара мабільнай сувязі.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Не ўдалося звязацца са шлюзам з праграм для Android</translation> <translation id="9211490828691860325">Усе працоўныя сталы</translation>
diff --git a/chromeos/strings/chromeos_strings_bn.xtb b/chromeos/strings/chromeos_strings_bn.xtb index a513557..21ab1da6 100644 --- a/chromeos/strings/chromeos_strings_bn.xtb +++ b/chromeos/strings/chromeos_strings_bn.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> এই ডিভাইস ম্যানেজ করে এবং তার ফলে হয়ত সে আপনার অ্যাক্টিভিটি মনিটর করতে পারে।</translation> <translation id="1478594628797167447">স্ক্যানার</translation> <translation id="1483493594462132177">পাঠান</translation> +<translation id="1488850966314959671">চালু করা কাস্টম APN ব্যবহার করে এই নেটওয়ার্কের সাথে কানেক্ট করা যাচ্ছে না। আরও তথ্যের জন্য আপনার মোবাইল পরিষেবা প্রদানকারীর সাথে যোগাযোগ করুন।</translation> <translation id="1491076385728777984"><ph name="DEVICE_NAME" /> ডিভাইসে ফার্মওয়্যার আপডেট করা হচ্ছে</translation> <translation id="1499041187027566160">ভলিউম বাড়ান</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> এই ব্যবহারকারীকে ম্যানেজ করে এবং তার ফলে এটি হয়ত অন্য জায়গা থেকে সেটিংস ম্যানেজ করতে এবং ব্যবহারকারীর অ্যাক্টিভিটির উপর নজর রাখতে পারে।</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">আবার স্ক্যান করুন</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5584044598279886848">এই APN বন্ধ করা বা সরানো যাচ্ছে না। চালু করা আছে এমন অ্যাটাচ করা APN বন্ধ করা বা সরানো আছে কিনা তা নিশ্চিত করুন।</translation> <translation id="5600027863942488546"><ph name="KEY_NAME" /> কী পরীক্ষা করা হয়েছে</translation> <translation id="5620281292257375798">শুধুমাত্র ইন্টার্নাল</translation> <translation id="5649768706273821470">শুনুন</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">এক মিনিটেরও কম সময় বাকি আছে</translation> <translation id="917720651393141712">পরীক্ষা করুন</translation> <translation id="9188992814426075118">আপনার কীবোর্ডের রঙ নিজে থেকে আপনার ওয়ালপেপারের রঙয়ের সাথে মিলতে পারে</translation> +<translation id="9189000703457422362">অটোমেটিক শনাক্ত করা APN ব্যবহার করে এই নেটওয়ার্কের সাথে কানেক্ট করা যাচ্ছে না। আরও তথ্যের জন্য আপনার মোবাইল পরিষেবা প্রদানকারীর সাথে যোগাযোগ করুন।</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Android অ্যাপ থেকে গেটওয়েতে যোগাযোগ করা যাচ্ছে না</translation> <translation id="9211490828691860325">সব ডেক্স</translation>
diff --git a/chromeos/strings/chromeos_strings_bs.xtb b/chromeos/strings/chromeos_strings_bs.xtb index 170e890..fd746c35 100644 --- a/chromeos/strings/chromeos_strings_bs.xtb +++ b/chromeos/strings/chromeos_strings_bs.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> upravlja ovim uređajem i moguće je da može pratiti vaše aktivnosti.</translation> <translation id="1478594628797167447">Skener</translation> <translation id="1483493594462132177">Pošalji</translation> +<translation id="1488850966314959671">Nije se moguće povezati s mrežom putem nijednog omogućenog prilagođenog APN-a. Kontaktirajte mobilnog operatera za više informacija.</translation> <translation id="1491076385728777984">Ažuriranje firmvera na uređaju <ph name="DEVICE_NAME" /></translation> <translation id="1499041187027566160">pojačavanje jačine zvuka</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> upravlja ovim korisnikom i može udaljeno upravljati postavkama i pratiti aktivnost korisnika.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Skeniraj ponovo</translation> <translation id="5583640892426849032">Tipka za brisanje</translation> +<translation id="5584044598279886848">Nije moguće onemogućiti ili ukloniti APN. Provjerite jesu li omogućeni priloženi APN-ovi onemogućeni ili uklonjeni.</translation> <translation id="5600027863942488546">Testirana je tipka <ph name="KEY_NAME" /></translation> <translation id="5620281292257375798">Samo interno</translation> <translation id="5649768706273821470">Poslušajte</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">Preostalo je manje od minute</translation> <translation id="917720651393141712">Test</translation> <translation id="9188992814426075118">Tastatura može automatski prilagoditi pozadinsku sliku</translation> +<translation id="9189000703457422362">Nije se moguće povezati s mrežom putem automatski otkrivenih APN-ova. Kontaktirajte mobilnog operatera za više informacija.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Nije moguće kontaktirati pristupnika iz Android aplikacija</translation> <translation id="9211490828691860325">Sve radne površine</translation>
diff --git a/chromeos/strings/chromeos_strings_ca.xtb b/chromeos/strings/chromeos_strings_ca.xtb index dc016dc..d3f77ce 100644 --- a/chromeos/strings/chromeos_strings_ca.xtb +++ b/chromeos/strings/chromeos_strings_ca.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> gestiona aquest dispositiu i és possible que pugui monitorar la teva activitat.</translation> <translation id="1478594628797167447">Escàners</translation> <translation id="1483493594462132177">Envia</translation> +<translation id="1488850966314959671">No es pot connectar a aquesta xarxa mitjançant cap APN personalitzat activat. Contacta amb el teu operador de telefonia mòbil per obtenir més informació.</translation> <translation id="1491076385728777984">S'està actualitzant el microprogramari que hi ha a <ph name="DEVICE_NAME" /></translation> <translation id="1499041187027566160">apuja el volum</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> gestiona aquest usuari i és possible que gestioni les opcions de configuració i monitori l'activitat de l'usuari de manera remota.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Torna a escanejar</translation> <translation id="5583640892426849032">Retrocés</translation> +<translation id="5584044598279886848">No es pot desactivar ni suprimir aquest APN. Assegura't de desactivar o suprimir els APN del tipus Attach que estiguin activats.</translation> <translation id="5600027863942488546">S'ha provat la tecla <ph name="KEY_NAME" /></translation> <translation id="5620281292257375798">Només intern</translation> <translation id="5649768706273821470">Escolta</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">Queda menys d'un minut</translation> <translation id="917720651393141712">Prova</translation> <translation id="9188992814426075118">El teclat pot coincidir automàticament amb el fons de pantalla</translation> +<translation id="9189000703457422362">No es pot connectar a aquesta xarxa mitjançant APN detectats automàticament. Contacta amb el teu operador de telefonia mòbil per obtenir més informació.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">No es pot contactar amb la passarel·la des d'aplicacions d'Android</translation> <translation id="9211490828691860325">Tots els escriptoris</translation>
diff --git a/chromeos/strings/chromeos_strings_cs.xtb b/chromeos/strings/chromeos_strings_cs.xtb index 7a7b453b..b976748b 100644 --- a/chromeos/strings/chromeos_strings_cs.xtb +++ b/chromeos/strings/chromeos_strings_cs.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872">Toto zařízení je spravováno doménou <ph name="MANAGER" />, která také může sledovat vaši aktivitu.</translation> <translation id="1478594628797167447">Skener</translation> <translation id="1483493594462132177">Odeslat</translation> +<translation id="1488850966314959671">K této síti se nelze připojit pomocí žádných povolených vlastních APN. Další informace vám sdělí mobilní operátor.</translation> <translation id="1491076385728777984">Aktualizace firmwaru v zařízení <ph name="DEVICE_NAME" /></translation> <translation id="1499041187027566160">zvýšit hlasitost</translation> <translation id="1499900233129743732">Tohoto uživatele spravuje doména <ph name="MANAGER" />, která také může vzdáleně spravovat nastavení a sledovat jeho aktivitu.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Naskenovat znovu</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5584044598279886848">Tento APN nelze deaktivovat ani odstranit. Je třeba deaktivovat nebo odstranit aktivované připojené APN.</translation> <translation id="5600027863942488546">Klávesa <ph name="KEY_NAME" /> byla vyzkoušena</translation> <translation id="5620281292257375798">Pouze pro interní použití</translation> <translation id="5649768706273821470">Poslechnout si</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">Zbývá méně než minuta</translation> <translation id="917720651393141712">Test</translation> <translation id="9188992814426075118">Klávesnice může automaticky odpovídat tapetě</translation> +<translation id="9189000703457422362">K této síti se pomocí automaticky zjištěných APN nelze připojit. Další informace vám sdělí mobilní operátor.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Z aplikací pro Android nelze kontaktovat bránu</translation> <translation id="9211490828691860325">Všechny plochy</translation>
diff --git a/chromeos/strings/chromeos_strings_cy.xtb b/chromeos/strings/chromeos_strings_cy.xtb index e2cdc02..ff516d1 100644 --- a/chromeos/strings/chromeos_strings_cy.xtb +++ b/chromeos/strings/chromeos_strings_cy.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872">Mae <ph name="MANAGER" /> yn rheoli'r ddyfais hon ac mae'n bosib y bydd yn gallu monitro'ch gweithgarwch.</translation> <translation id="1478594628797167447">Sganiwr</translation> <translation id="1483493594462132177">Anfon</translation> +<translation id="1488850966314959671">Nid oes modd cysylltu â'r rhwydwaith hwn gan ddefnyddio unrhyw APNs personol sydd wedi'u galluogi. Cysylltwch â'ch cludydd gwasanaethau symudol am ragor o wybodaeth.</translation> <translation id="1491076385728777984">Wrthi'n diweddaru'r gadarnwedd ar <ph name="DEVICE_NAME" /></translation> <translation id="1499041187027566160">codi'r sain</translation> <translation id="1499900233129743732">Mae <ph name="MANAGER" /> yn rheoli'r defnyddiwr hwn ac mae'n bosib y bydd yn rheoli gosodiadau o bell ac yn monitro gweithgarwch y defnyddiwr.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Ail-sganio</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5584044598279886848">Methu ag analluogi na thynnu'r APN hwn. Sicrhewch fod APNs atodi sydd wedi'u galluogi wedi'u hanalluogi neu eu tynnu.</translation> <translation id="5600027863942488546">Mae'r fysell <ph name="KEY_NAME" /> wedi'i phrofi</translation> <translation id="5620281292257375798">Mewnol yn unig</translation> <translation id="5649768706273821470">Gwrando</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">Llai na munud ar ôl</translation> <translation id="917720651393141712">Prawf</translation> <translation id="9188992814426075118">Gall eich bysellfwrdd cyfateb â'ch papur wal</translation> +<translation id="9189000703457422362">Nid oes modd cysylltu â'r rhwydwaith hwn gan ddefnyddio APNs a ganfyddir yn awtomatig. Cysylltwch â'ch cludydd gwasanaethau symudol am ragor o wybodaeth.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Methu â chysylltu'r porth o apiau Android</translation> <translation id="9211490828691860325">Pob desg</translation>
diff --git a/chromeos/strings/chromeos_strings_en-GB.xtb b/chromeos/strings/chromeos_strings_en-GB.xtb index 5bb4f3e..907a574c 100644 --- a/chromeos/strings/chromeos_strings_en-GB.xtb +++ b/chromeos/strings/chromeos_strings_en-GB.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> manages this device and may be able to monitor your activity.</translation> <translation id="1478594628797167447">Scanner</translation> <translation id="1483493594462132177">Send</translation> +<translation id="1488850966314959671">Can't connect to this network using any enabled custom APNs. Contact your mobile operator for more information.</translation> <translation id="1491076385728777984">Updating firmware on <ph name="DEVICE_NAME" /></translation> <translation id="1499041187027566160">volume up</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> manages this user and may remotely manage settings and monitor user activity.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Rescan</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5584044598279886848">Can't disable or remove this APN. Make sure that enabled attach APNs are disabled or removed.</translation> <translation id="5600027863942488546"><ph name="KEY_NAME" /> key tested</translation> <translation id="5620281292257375798">Internal only</translation> <translation id="5649768706273821470">Listen</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">Less than a minute remaining</translation> <translation id="917720651393141712">Test</translation> <translation id="9188992814426075118">Your keyboard can automatically match your wallpaper</translation> +<translation id="9189000703457422362">Can't connect to this network using automatically detected APNs. Contact your mobile operator for more information.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Can't contact the gateway from Android apps</translation> <translation id="9211490828691860325">All desks</translation>
diff --git a/chromeos/strings/chromeos_strings_es-419.xtb b/chromeos/strings/chromeos_strings_es-419.xtb index 2f9182c..8d1b3d2 100644 --- a/chromeos/strings/chromeos_strings_es-419.xtb +++ b/chromeos/strings/chromeos_strings_es-419.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> administra este dispositivo y es posible que pueda supervisar tu actividad.</translation> <translation id="1478594628797167447">Escáner</translation> <translation id="1483493594462132177">Enviar</translation> +<translation id="1488850966314959671">No se puede establecer una conexión con esta red usando ningún APN personalizado habilitado. Comunícate con tu operador de telefonía celular para obtener más información.</translation> <translation id="1491076385728777984">Actualizando el firmware de <ph name="DEVICE_NAME" /></translation> <translation id="1499041187027566160">subir volumen</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> administra a este usuario y es posible que administre la configuración y supervise la actividad del usuario de forma remota.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Volver a escanear</translation> <translation id="5583640892426849032">Tecla de retroceso</translation> +<translation id="5584044598279886848">No se puede inhabilitar ni quitar este APN. Asegúrate de que se inhabiliten o se quiten los APN anexos que estén habilitados.</translation> <translation id="5600027863942488546">Se probó la tecla <ph name="KEY_NAME" /></translation> <translation id="5620281292257375798">Solo para uso interno</translation> <translation id="5649768706273821470">Escuchar</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">Queda menos de un minuto</translation> <translation id="917720651393141712">Probar</translation> <translation id="9188992814426075118">El teclado puede coincidir automáticamente con tu fondo de pantalla</translation> +<translation id="9189000703457422362">No se puede establecer una conexión con esta red usando los APN detectados automáticamente. Comunícate con tu operador de telefonía celular para obtener más información.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">No se puede establecer contacto con la puerta de enlace desde apps para Android</translation> <translation id="9211490828691860325">Todos los escritorios</translation>
diff --git a/chromeos/strings/chromeos_strings_eu.xtb b/chromeos/strings/chromeos_strings_eu.xtb index c9838e3..5d516f8 100644 --- a/chromeos/strings/chromeos_strings_eu.xtb +++ b/chromeos/strings/chromeos_strings_eu.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> domeinuak kudeatzen du gailu hau, eta baliteke zure jardueren jarraipena egin ahal izatea.</translation> <translation id="1478594628797167447">Eskanerra</translation> <translation id="1483493594462132177">Bidali</translation> +<translation id="1488850966314959671">Ezin da konektatu sare horretara gaitutako APN pertsonalizatuen bidez. Informazio gehiago lortzeko, jarri telefonia mugikorreko operadorearekin harremanetan.</translation> <translation id="1491076385728777984"><ph name="DEVICE_NAME" /> gailuaren firmwarea eguneratzen</translation> <translation id="1499041187027566160">igo bolumena</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> domeinuak kudeatzen du erabiltzaile hau, eta baliteke urrunetik haren ezarpenak kudeatzea eta jarduerak gainbegiratzea.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Eskaneatu berriro</translation> <translation id="5583640892426849032">Atzera tekla</translation> +<translation id="5584044598279886848">APN hau ezin da desgaitu edo kendu. Ziurtatu gaituta dauden APN erantsiak desgaitu edo kendu direla.</translation> <translation id="5600027863942488546"><ph name="KEY_NAME" /> probatu da</translation> <translation id="5620281292257375798">Barnekoa soilik</translation> <translation id="5649768706273821470">Entzun</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">Minutu bat baino gutxiago geratzen da</translation> <translation id="917720651393141712">Proba</translation> <translation id="9188992814426075118">Teklatuaren atzeko argiztapena automatikoki bat etor daiteke horma-paperaren kolorearekin</translation> +<translation id="9189000703457422362">Ezin da konektatu sare horretara automatikoki hautemandako APNen bidez. Informazio gehiago lortzeko, jarri telefonia mugikorreko operadorearekin harremanetan.</translation> <translation id="9193744392140377127">APNa*</translation> <translation id="9204237731135241582">Ezin da jarri harremanetan atebidearekin Android-erako aplikazioetatik</translation> <translation id="9211490828691860325">Lan-eremu guztiak</translation>
diff --git a/chromeos/strings/chromeos_strings_fa.xtb b/chromeos/strings/chromeos_strings_fa.xtb index ce7d443..911008aa 100644 --- a/chromeos/strings/chromeos_strings_fa.xtb +++ b/chromeos/strings/chromeos_strings_fa.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> این دستگاه را مدیریت میکند و ممکن است بتواند بر فعالیتتان نظارت داشته باشد.</translation> <translation id="1478594628797167447">اسکنر</translation> <translation id="1483493594462132177">ارسال</translation> +<translation id="1488850966314959671">با هیچکدام از نقطههای APN سفارشی فعال نمیتوان به این شبکه متصل شد. برای کسب اطلاعات بیشتر با شرکت مخابراتیتان تماس بگیرید.</translation> <translation id="1491076385728777984">درحال بهروزرسانی سفتافزار در <ph name="DEVICE_NAME" /></translation> <translation id="1499041187027566160">بالا بردن صدا</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> این کاربر را مدیریت میکند و میتواند ازراهدور تنظیمات را مدیریت کند و بر فعالیت کاربر نظارت داشته باشد.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">اسکن مجدد</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5584044598279886848">این APN را نمیتوان غیرفعال یا حذف کرد. مطمئن شوید نقطههای APN پیوستشده فعال را غیرفعال یا حذف کردهاید.</translation> <translation id="5600027863942488546">کلید <ph name="KEY_NAME" /> امتحان شد</translation> <translation id="5620281292257375798">فقط داخلی</translation> <translation id="5649768706273821470">گوش دادن</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">کمتر از یک دقیقه باقیمانده است</translation> <translation id="917720651393141712">آزمایش کردن</translation> <translation id="9188992814426075118">صفحهکلیدتان میتواند بهطور خودکار با کاغذدیواری منطبق شود</translation> +<translation id="9189000703457422362">نمیتوان بااستفاده از نقطههای APN که بهطور خودکار شناسایی شده است به این شبکه متصل شد. برای کسب اطلاعات بیشتر با شرکت مخابراتیتان تماس بگیرید.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">نمیتوان از برنامههای Android با دروازه تماس گرفت</translation> <translation id="9211490828691860325">همه میزکارها</translation>
diff --git a/chromeos/strings/chromeos_strings_fi.xtb b/chromeos/strings/chromeos_strings_fi.xtb index 90e0c79..fa891f5 100644 --- a/chromeos/strings/chromeos_strings_fi.xtb +++ b/chromeos/strings/chromeos_strings_fi.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> ylläpitää tätä laitetta ja voi ehkä seurata toimintaasi.</translation> <translation id="1478594628797167447">Skanneri</translation> <translation id="1483493594462132177">Lähetä</translation> +<translation id="1488850966314959671">Tähän verkkoon ei saada yhteyttä millään käytössä olevalla muokatulla APN:llä. Pyydä lisätietoa mobiilioperaattorilta.</translation> <translation id="1491076385728777984">Päivitetään laiteohjelmistoa: <ph name="DEVICE_NAME" /></translation> <translation id="1499041187027566160">Lisää äänenvoimakkuutta.</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> ylläpitää tätä käyttäjää ja voi muuttaa asetuksia ja seurata käyttäjän toimia etänä.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Skannaa uudelleen</translation> <translation id="5583640892426849032">Askelpalautin</translation> +<translation id="5584044598279886848">APN:ää ei voi poistaa käytöstä tai kokonaan. Varmista, että liitetyt, käyttöön otetut APN:t on poistettu käytöstä tai kokonaan.</translation> <translation id="5600027863942488546">Näppäin testattu: <ph name="KEY_NAME" /></translation> <translation id="5620281292257375798">Vain sisäinen</translation> <translation id="5649768706273821470">Kuuntele</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">Alle minuutti jäljellä</translation> <translation id="917720651393141712">Testi</translation> <translation id="9188992814426075118">Näppäimistössä voi automaattisesti käyttää taustakuvan värejä</translation> +<translation id="9189000703457422362">Verkkoon ei saada yhteyttä automaattisesti havaituilla APN:illä. Pyydä lisätietoa mobiilioperaattorilta.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Yhdyskäytävään ei saada yhteyttä Android-sovelluksilla</translation> <translation id="9211490828691860325">Kaikki työpöydät</translation>
diff --git a/chromeos/strings/chromeos_strings_fr-CA.xtb b/chromeos/strings/chromeos_strings_fr-CA.xtb index aabe770..30d5373 100644 --- a/chromeos/strings/chromeos_strings_fr-CA.xtb +++ b/chromeos/strings/chromeos_strings_fr-CA.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> gère cet appareil et pourrait surveiller votre activité sur celui-ci.</translation> <translation id="1478594628797167447">Numériseur</translation> <translation id="1483493594462132177">Envoi</translation> +<translation id="1488850966314959671">Impossible de se connecter à ce réseau à l'aide de nom de points d'accès (APN) personnalisés activés. Contactez votre fournisseur de services cellulaires pour plus d'informations.</translation> <translation id="1491076385728777984">Mise à jour du micrologiciel de <ph name="DEVICE_NAME" /> en cours…</translation> <translation id="1499041187027566160">augmenter le volume</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> gère cet utilisateur et peut gérer ses paramètres et faire le suivi de son activité à distance.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Numériser de nouveau</translation> <translation id="5583640892426849032">Effacement arrière</translation> +<translation id="5584044598279886848">Impossible de désactiver ou de retirer ce nom de points d'accès (APN). Assurez-vous que les noms de points d'accès (APN) joints activés sont désactivés ou retirés.</translation> <translation id="5600027863942488546">Touche <ph name="KEY_NAME" /> testée</translation> <translation id="5620281292257375798">Pour usage interne seulement</translation> <translation id="5649768706273821470">Écouter</translation> @@ -1010,6 +1012,7 @@ <translation id="9173638680043580060">Il reste moins d'une minute</translation> <translation id="917720651393141712">Test</translation> <translation id="9188992814426075118">Votre clavier peut automatiquement s'agencer à votre fond d'écran</translation> +<translation id="9189000703457422362">Impossible de se connecter à ce réseau à l'aide des noms de points d'accès (APN) détectés automatiquement. Contactez votre fournisseur de services cellulaires pour plus d'informations.</translation> <translation id="9193744392140377127">Nom du point d'accès*</translation> <translation id="9204237731135241582">Impossible de communiquer avec la passerelle à partir d'applications Android</translation> <translation id="9211490828691860325">Tous les bureaux</translation>
diff --git a/chromeos/strings/chromeos_strings_fr.xtb b/chromeos/strings/chromeos_strings_fr.xtb index adf8ae7d..4c12a0cc 100644 --- a/chromeos/strings/chromeos_strings_fr.xtb +++ b/chromeos/strings/chromeos_strings_fr.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872">Il est possible que <ph name="MANAGER" />, qui gère cet appareil, puisse surveiller votre activité.</translation> <translation id="1478594628797167447">Scanner</translation> <translation id="1483493594462132177">Envoyer</translation> +<translation id="1488850966314959671">Impossible de se connecter à ce réseau avec les APN personnalisés activés. Pour en savoir plus, contactez votre opérateur mobile.</translation> <translation id="1491076385728777984">Mise à jour du micrologiciel sur <ph name="DEVICE_NAME" /></translation> <translation id="1499041187027566160">augmenter le volume</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> gère cet utilisateur dont il peut modifier les paramètres et surveiller l'activité à distance.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Rescanner</translation> <translation id="5583640892426849032">Retour</translation> +<translation id="5584044598279886848">Impossible de désactiver ou de supprimer cet APN. Assurez-vous que les APN connectés sont désactivés ou supprimés.</translation> <translation id="5600027863942488546">Touche <ph name="KEY_NAME" /> testée</translation> <translation id="5620281292257375798">Interne uniquement</translation> <translation id="5649768706273821470">Écouter</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">Moins d'une minute restante</translation> <translation id="917720651393141712">Tester</translation> <translation id="9188992814426075118">Votre clavier peut être automatiquement assorti à votre fond d'écran</translation> +<translation id="9189000703457422362">Impossible de se connecter à ce réseau avec des APN détectés automatiquement. Pour en savoir plus, contactez votre opérateur mobile.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Impossible de contacter la passerelle depuis les applis Android</translation> <translation id="9211490828691860325">Tous les bureaux</translation>
diff --git a/chromeos/strings/chromeos_strings_gl.xtb b/chromeos/strings/chromeos_strings_gl.xtb index 8efe381..1bec0a1 100644 --- a/chromeos/strings/chromeos_strings_gl.xtb +++ b/chromeos/strings/chromeos_strings_gl.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> xestiona este dispositivo e pode supervisar a túa actividade.</translation> <translation id="1478594628797167447">Escáner</translation> <translation id="1483493594462132177">Enviar</translation> +<translation id="1488850966314959671">Non se puido conectar con esta rede a través de ningún APN personalizado activado. Se necesitas máis información, ponte en contacto co teu operador móbil.</translation> <translation id="1491076385728777984">Actualizando firmware do dispositivo (<ph name="DEVICE_NAME" />)</translation> <translation id="1499041187027566160">sube o volume</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> xestiona este usuario, e pode axustar a súa configuración e supervisar a súa actividade de forma remota.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Volver buscar</translation> <translation id="5583640892426849032">Retroceso</translation> +<translation id="5584044598279886848">Non se pode desactivar nin quitar este APN. Asegúrate de que os APN de conexión estean desactivados ou quitados.</translation> <translation id="5600027863942488546">Tecla <ph name="KEY_NAME" /> probada</translation> <translation id="5620281292257375798">Só para uso interno</translation> <translation id="5649768706273821470">Escoitar</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">Queda menos dun minuto</translation> <translation id="917720651393141712">Probar</translation> <translation id="9188992814426075118">O teclado pode combinar automaticamente co teu fondo de pantalla</translation> +<translation id="9189000703457422362">Non se puido conectar con esta rede a través de ningún APN detectado automaticamente. Se necesitas máis información, ponte en contacto co teu operador móbil.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Non se puido establecer contacto coa pasarela desde aplicacións para Android</translation> <translation id="9211490828691860325">Todos os ordenadores</translation>
diff --git a/chromeos/strings/chromeos_strings_gu.xtb b/chromeos/strings/chromeos_strings_gu.xtb index 72c9ffd..99a6b026 100644 --- a/chromeos/strings/chromeos_strings_gu.xtb +++ b/chromeos/strings/chromeos_strings_gu.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> આ ડિવાઇસને મેનેજ કરે છે અને કદાચ તમારી પ્રવૃત્તિનું નિરીક્ષણ કરી શકે છે.</translation> <translation id="1478594628797167447">સ્કૅનર</translation> <translation id="1483493594462132177">મોકલો</translation> +<translation id="1488850966314959671">કોઈ ચાલુ કરેલા કસ્ટમ APNsનો ઉપયોગ કરીને આ નેટવર્ક સાથે કનેક્ટ કરી શકતાં નથી. વધુ માહિતી માટે તમારા મોબાઇલ ઑપરેટરનો સંપર્ક કરો.</translation> <translation id="1491076385728777984"><ph name="DEVICE_NAME" /> માટે ફર્મવેયર અપડેટ કરી રહ્યાં છીએ</translation> <translation id="1499041187027566160">વૉલ્યૂમ વધારો</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> આ વપરાશકર્તાને મેનેજ કરે છે તથા સેટિંગ અને વપરાશકર્તાની પ્રવૃત્તિને દૂરથી મેનેજ અને તેનું નિરીક્ષણ કરે એવું બની શકે.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">ફરી સ્કૅન કરો</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5584044598279886848">આ APNને બંધ કરી કે કાઢી શકતાં નથી. ખાતરી કરો કે જોડેલા APN જે ચાલુ કરેલા છે, તેને બંધ કરવામાં અથવા કાઢી નાખવામાં આવ્યા છે.</translation> <translation id="5600027863942488546"><ph name="KEY_NAME" /> કીનું પરીક્ષણ કર્યું</translation> <translation id="5620281292257375798">માત્ર આંતરિક</translation> <translation id="5649768706273821470">સાંભળો</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">એક મિનિટ કરતાં ઓછો સમય બાકી છે</translation> <translation id="917720651393141712">પરીક્ષણ કરો</translation> <translation id="9188992814426075118">તમારું કીબોર્ડ ઑટોમૅટિક રીતે તમારા વૉલપેપર સાથે મેળ કરી શકે છે</translation> +<translation id="9189000703457422362">જેની ઑટોમૅટિક રીતે ભાળ મળી હોય તેવા APNsનો ઉપયોગ કરીને આ નેટવર્ક સાથે કનેક્ટ કરી શકતાં નથી. વધુ માહિતી માટે તમારા મોબાઇલ ઑપરેટરનો સંપર્ક કરો.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Android ઍપથી ગેટવે સાથે સંપર્ક કરી શકતા નથી</translation> <translation id="9211490828691860325">તમામ ડેસ્ક</translation>
diff --git a/chromeos/strings/chromeos_strings_hi.xtb b/chromeos/strings/chromeos_strings_hi.xtb index f8eff63..de1beec8 100644 --- a/chromeos/strings/chromeos_strings_hi.xtb +++ b/chromeos/strings/chromeos_strings_hi.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872">इस डिवाइस को <ph name="MANAGER" /> मैनेज करता है और यह आपकी गतिविधि पर नज़र रख सकता है.</translation> <translation id="1478594628797167447">स्कैनर</translation> <translation id="1483493594462132177">भेजें</translation> +<translation id="1488850966314959671">चालू कस्टम एपीएन का इस्तेमाल करके, इस नेटवर्क से कनेक्ट नहीं किया जा सकता. ज़्यादा जानकारी के लिए, मोबाइल और इंटरनेट सेवा देने वाली कंपनी से संपर्क करें.</translation> <translation id="1491076385728777984"><ph name="DEVICE_NAME" /> का फ़र्मवेयर अपडेट किया जा रहा है</translation> <translation id="1499041187027566160">वॉल्यूम बढ़ाएं</translation> <translation id="1499900233129743732">इस उपयोगकर्ता को <ph name="MANAGER" /> प्रबंधित करता है और यह किसी दूसरी जगह पर होते हुए भी सेटिंग को प्रबंधित कर सकता है. साथ ही, यह उपयोगकर्ता की गतिविधि पर नज़र रख सकता है.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">दोबारा स्कैन करें</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5584044598279886848">इस एपीएन को बंद नहीं किया जा सकता और न ही हटाया जा सकता. पक्का करें कि अटैच किए गए जिन एपीएन को चालू किया गया था उन्हें बंद कर दिया गया है या हटा दिया गया है.</translation> <translation id="5600027863942488546"><ph name="KEY_NAME" /> की जांच की गई</translation> <translation id="5620281292257375798">सिर्फ़ अंदरूनी</translation> <translation id="5649768706273821470">सुनें</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">एक मिनट से कम बचा है</translation> <translation id="917720651393141712">टेस्ट</translation> <translation id="9188992814426075118">कीबोर्ड की बैकलाइट, आपके वॉलपेपर के हिसाब से अपने-आप सेट हो सकती है</translation> +<translation id="9189000703457422362">अपने-आप पता लगने वाले एपीएन का इस्तेमाल करके, इस नेटवर्क से कनेक्ट नहीं किया जा सकता. ज़्यादा जानकारी के लिए, मोबाइल और इंटरनेट सेवा देने वाली कंपनी से संपर्क करें.</translation> <translation id="9193744392140377127">एपीएन*</translation> <translation id="9204237731135241582">Android ऐप्लिकेशन से, गेटवे के साथ संपर्क नहीं किया जा सकता</translation> <translation id="9211490828691860325">सभी डेस्क</translation>
diff --git a/chromeos/strings/chromeos_strings_hr.xtb b/chromeos/strings/chromeos_strings_hr.xtb index 8be731c..37009e6 100644 --- a/chromeos/strings/chromeos_strings_hr.xtb +++ b/chromeos/strings/chromeos_strings_hr.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872">Uređajem upravlja <ph name="MANAGER" /> i taj upravitelj možda može nadzirati vašu aktivnost.</translation> <translation id="1478594628797167447">Skener</translation> <translation id="1483493594462132177">Pošalji</translation> +<translation id="1488850966314959671">Povezivanje s tom mrežom nije moguće pomoću omogućenih prilagođenih APN-ova. Za više informacija obratite se mobilnom operateru.</translation> <translation id="1491076385728777984">Ažuriranje opreme na uređaju <ph name="DEVICE_NAME" /></translation> <translation id="1499041187027566160">pojačavanje glasnoće</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> upravlja ovim korisnikom i možda može daljinski upravljati postavkama i nadzirati aktivnost korisnika.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Skeniraj ponovo</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5584044598279886848">Taj se APN ne može onemogućiti niti ukloniti. Ako imate omogućene pridružene APN-ove, onemogućite ih ili uklonite.</translation> <translation id="5600027863942488546">Testirana je tipka <ph name="KEY_NAME" /></translation> <translation id="5620281292257375798">Samo interno</translation> <translation id="5649768706273821470">Poslušajte</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">Preostalo je manje od minute</translation> <translation id="917720651393141712">Test</translation> <translation id="9188992814426075118">Tipkovnica se može automatski uskladiti s pozadinom</translation> +<translation id="9189000703457422362">Povezivanje s tom mrežom nije moguće pomoću automatski otkrivenih APN-ova. Za više informacija obratite se mobilnom operateru.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Kontaktiranje pristupnika iz Android aplikacija nije uspjelo</translation> <translation id="9211490828691860325">Sve radne površine</translation>
diff --git a/chromeos/strings/chromeos_strings_hu.xtb b/chromeos/strings/chromeos_strings_hu.xtb index e61d90b..084cb8f 100644 --- a/chromeos/strings/chromeos_strings_hu.xtb +++ b/chromeos/strings/chromeos_strings_hu.xtb
@@ -118,7 +118,9 @@ <translation id="1801418420130173017">Sötét téma kikapcsolása</translation> <translation id="1807246157184219062">Világos</translation> <translation id="1827738518074806965">Galéria</translation> +<translation id="1836553715834333258">Rendszer színe</translation> <translation id="1838374766361614909">Keresett kifejezés törlése</translation> +<translation id="1840474674287087346">Asztal színe</translation> <translation id="1851218745569890714">Videokonferencia</translation> <translation id="1852934301711881861">ChromeOS Flex telepítése</translation> <translation id="1856388568474281774">Lefelé nyíl</translation> @@ -421,6 +423,7 @@ <translation id="4454245904991689773">Beolvasás ide</translation> <translation id="4479639480957787382">Ethernet</translation> <translation id="4483049906298469269">Nem sikerült a nem alapértelmezett hálózati átjáró pingelése</translation> +<translation id="4500966230243561393">Kezelőfelület színe</translation> <translation id="4503223151711056411">Balra nyíl</translation> <translation id="4507392511610824664">fényerő növelése</translation> <translation id="4511264077854731334">Portál</translation> @@ -499,6 +502,7 @@ <translation id="500920857929044050">Teszt leállítása</translation> <translation id="5017508259293544172">LEAP</translation> <translation id="5019310272469539976">Tétlen képernyőjén megjelenhetnek fotók, az idő, az időjárás és egyéb médiatartalmak információi.</translation> +<translation id="5035083460461104704">Témaszín</translation> <translation id="5038292761217083259">többszínű billentyűzet</translation> <translation id="5039804452771397117">Engedélyezés</translation> <translation id="5049856988445523908">SIM zárolva (<ph name="LOCK_TYPE" />)</translation> @@ -814,6 +818,7 @@ <translation id="7618774594543487847">Semleges</translation> <translation id="7620771111601174153">További információ a Súgóban</translation> <translation id="763165478673169849">Utolsó visszaállítás ideje</translation> +<translation id="7633068090678117093">Háttérkép</translation> <translation id="7648838807254605802">Hosszú várakozási idő HTTPS esetén</translation> <translation id="765159867434478292">Megosztás</translation> <translation id="7656388927906093505">Az eszköz egy egér.</translation> @@ -979,6 +984,7 @@ <translation id="8930521118335213258">Peer</translation> <translation id="8930622219860340959">Vezeték nélküli</translation> <translation id="8936793075252196307">Ügyfél IP-címe</translation> +<translation id="8944651180182756621">Indító színe</translation> <translation id="894617464444543719">Az eszköz egy telefon.</translation> <translation id="8957423540740801332">jobbra</translation> <translation id="8968751544471797276">Töltési sebesség</translation> @@ -1012,6 +1018,7 @@ <translation id="9149391708638971077">Memóriateszt futtatása</translation> <translation id="9161276708550942948">szóköz</translation> <translation id="9173638680043580060">Kevesebb mint 1 perc van hátra</translation> +<translation id="9174334653006917325">UI színe</translation> <translation id="917720651393141712">Tesztelés</translation> <translation id="9188992814426075118">A billentyűzet képes automatikusan a háttérképhez igazodni</translation> <translation id="9189000703457422362">Nem lehet csatlakozni ehhez a hálózathoz automatikusan észlelt APN-ek használatával. A szolgáltatótól kérhet további információt.</translation>
diff --git a/chromeos/strings/chromeos_strings_id.xtb b/chromeos/strings/chromeos_strings_id.xtb index b4f8459..0d87216 100644 --- a/chromeos/strings/chromeos_strings_id.xtb +++ b/chromeos/strings/chromeos_strings_id.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> akan mengelola perangkat ini dan mungkin dapat memantau aktivitas Anda.</translation> <translation id="1478594628797167447">Pemindai</translation> <translation id="1483493594462132177">Kirim</translation> +<translation id="1488850966314959671">Tidak dapat terhubung ke jaringan ini menggunakan APN kustom yang diaktifkan. Hubungi operator seluler Anda untuk mengetahui informasi selengkapnya.</translation> <translation id="1491076385728777984">Mengupdate firmware di <ph name="DEVICE_NAME" /></translation> <translation id="1499041187027566160">mengeraskan volume</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> akan mengelola pengguna ini serta mungkin dapat mengelola setelan dan memantau aktivitas pengguna dari jarak jauh.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Pindai ulang</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5584044598279886848">Tidak dapat menonaktifkan atau menghapus APN ini. Pastikan APN aktif yang terpasang dinonaktifkan atau dihapus.</translation> <translation id="5600027863942488546">Tombol <ph name="KEY_NAME" /> diuji</translation> <translation id="5620281292257375798">Khusus internal</translation> <translation id="5649768706273821470">Dengar</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">Kurang dari satu menit lagi</translation> <translation id="917720651393141712">Uji</translation> <translation id="9188992814426075118">Keyboard dapat otomatis menyesuaikan dengan wallpaper Anda</translation> +<translation id="9189000703457422362">Tidak dapat terhubung ke jaringan ini menggunakan APN yang terdeteksi secara otomatis. Hubungi operator seluler Anda untuk mengetahui informasi selengkapnya.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Tidak dapat terhubung ke gateway dari aplikasi Android</translation> <translation id="9211490828691860325">Semua desktop</translation>
diff --git a/chromeos/strings/chromeos_strings_iw.xtb b/chromeos/strings/chromeos_strings_iw.xtb index 9d9bc7ce..ee34000 100644 --- a/chromeos/strings/chromeos_strings_iw.xtb +++ b/chromeos/strings/chromeos_strings_iw.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872">הניהול של המכשיר הזה נעשה מהדומיין <ph name="MANAGER" /> וייתכן שאפשר יהיה לעקוב ממנו אחר הפעילות שלך.</translation> <translation id="1478594628797167447">סורק</translation> <translation id="1483493594462132177">שליחה</translation> +<translation id="1488850966314959671">לא ניתן להתחבר לרשת הזו באמצעות פריטי APN בהתאמה אישית שהופעלו. למידע נוסף, צריך ליצור קשר עם ספק הסלולר.</translation> <translation id="1491076385728777984">מתבצע עדכון קושחה ב-<ph name="DEVICE_NAME" /></translation> <translation id="1499041187027566160">הגברת עוצמת הקול</translation> <translation id="1499900233129743732">המשתמש הזה מנוהל על ידי <ph name="MANAGER" />. הדומיין הזה עשוי לנהל מרחוק את ההגדרות ולעקוב אחר פעילות המשתמש.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">סריקה מחדש</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5584044598279886848">לא ניתן להשבית או להסיר את ה-APN הזה. צריך לוודא שפריטי ה-APN המצורפים שהופעלו הושבתו או הוסרו.</translation> <translation id="5600027863942488546">בוצעה בדיקה של המקש <ph name="KEY_NAME" /></translation> <translation id="5620281292257375798">פנימי בלבד</translation> <translation id="5649768706273821470">האזנה</translation> @@ -1010,6 +1012,7 @@ <translation id="9173638680043580060">נותרה פחות מדקה</translation> <translation id="917720651393141712">בדיקה</translation> <translation id="9188992814426075118">אפשר להגדיר התאמה אוטומטית של המקלדת לטפט</translation> +<translation id="9189000703457422362">לא ניתן להתחבר לרשת הזו באמצעות פריטי APN שזוהו באופן אוטומטי. למידע נוסף, צריך ליצור קשר עם ספק הסלולר.</translation> <translation id="9193744392140377127">*APN</translation> <translation id="9204237731135241582">לא ניתן ליצור קשר עם השער מאפליקציות ל-Android</translation> <translation id="9211490828691860325">כל שולחנות העבודה הווירטואליים</translation>
diff --git a/chromeos/strings/chromeos_strings_kk.xtb b/chromeos/strings/chromeos_strings_kk.xtb index 4f2978e..0015ade 100644 --- a/chromeos/strings/chromeos_strings_kk.xtb +++ b/chromeos/strings/chromeos_strings_kk.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> құрылғыңызды басқарады және әрекетіңізді де бақылауы мүмкін.</translation> <translation id="1478594628797167447">Сканер</translation> <translation id="1483493594462132177">Жіберу</translation> +<translation id="1488850966314959671">Қосулы реттелетін APN аттары арқылы бұл желіге қосылу мүмкін емес. Қосымша ақпарат алу үшін мобильдік операторыңызға хабарласыңыз.</translation> <translation id="1491076385728777984"><ph name="DEVICE_NAME" /> құрылғысының микробағдарламасы жаңартылуда</translation> <translation id="1499041187027566160">дыбыс деңгейін арттыру</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> бұл пайдаланушыны басқарады және параметрлер мен пайдаланушы әрекеттерін қашықтан бақылай алады.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Қайта сканерлеу</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5584044598279886848">Бұл APN атын өшіру немесе жою мүмкін емес. Қосылған әрі тіркелген APN аттарының өшірілгеніне немесе жойылғанына көз жеткізіңіз.</translation> <translation id="5600027863942488546"><ph name="KEY_NAME" /> пернесі тексерілді.</translation> <translation id="5620281292257375798">Тек ішкі қолданысқа арналған</translation> <translation id="5649768706273821470">Тыңдау</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">Бір минутқа жетпейтін уақыт қалды.</translation> <translation id="917720651393141712">Тексеру</translation> <translation id="9188992814426075118">Пернетақта тұсқағазды автоматты түрде сәйкестендіре алады.</translation> +<translation id="9189000703457422362">Автоматты түрде анықталған APN аттары арқылы бұл желіге қосылу мүмкін емес. Қосымша ақпарат алу үшін мобильдік операторыңызға хабарласыңыз.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Android қолданбаларынан шлюзге қосылу мүмкін емес.</translation> <translation id="9211490828691860325">Барлық жұмыс үстелдері</translation>
diff --git a/chromeos/strings/chromeos_strings_km.xtb b/chromeos/strings/chromeos_strings_km.xtb index eecb48f..006d3b0 100644 --- a/chromeos/strings/chromeos_strings_km.xtb +++ b/chromeos/strings/chromeos_strings_km.xtb
@@ -118,7 +118,9 @@ <translation id="1801418420130173017">បិទរចនាប័ទ្មងងឹត</translation> <translation id="1807246157184219062">ភ្លឺ</translation> <translation id="1827738518074806965">វិចិត្រសាល</translation> +<translation id="1836553715834333258">ពណ៌ប្រព័ន្ធ</translation> <translation id="1838374766361614909">ជម្រះការស្វែងរក</translation> +<translation id="1840474674287087346">ពណ៌អេក្រង់ដើម</translation> <translation id="1851218745569890714">ការប្រជុំតាមវីដេអូ</translation> <translation id="1852934301711881861">ដំឡើង ChromeOS Flex</translation> <translation id="1856388568474281774">ព្រួញចុះក្រោម</translation> @@ -421,6 +423,7 @@ <translation id="4454245904991689773">រក្សាទុកការស្កេនទៅក្នុង</translation> <translation id="4479639480957787382">ខ្សែអ៊ីនធឺណិត</translation> <translation id="4483049906298469269">មិនអាចភីងច្រកបណ្ដាញមិនមែនលំនាំដើមបានទេ</translation> +<translation id="4500966230243561393">ពណ៌ផ្ទៃ</translation> <translation id="4503223151711056411">ព្រួញទៅឆ្វេង</translation> <translation id="4507392511610824664">បង្កើនពន្លឺ</translation> <translation id="4511264077854731334">ច្រក</translation> @@ -499,6 +502,7 @@ <translation id="500920857929044050">បញ្ឈប់ការធ្វើតេស្ត</translation> <translation id="5017508259293544172">LEAP</translation> <translation id="5019310272469539976">បង្ហាញព័ត៌មានអំពីមេឌៀ ម៉ោង អាកាសធាតុ និងរូបថត នៅពេលអេក្រង់របស់អ្នកអសកម្ម។</translation> +<translation id="5035083460461104704">ពណ៌ទម្រង់រចនា</translation> <translation id="5038292761217083259">ក្ដារចុចពណ៌ចម្រុះ</translation> <translation id="5039804452771397117">អនុញ្ញាត</translation> <translation id="5049856988445523908">បានចាក់សោស៊ីម (<ph name="LOCK_TYPE" />)</translation> @@ -814,6 +818,7 @@ <translation id="7618774594543487847">ស្រាល</translation> <translation id="7620771111601174153">ស្វែងយល់បន្ថែមនៅក្នុងមជ្ឈមណ្ឌលជំនួយ</translation> <translation id="763165478673169849">ពេលវេលាកំណត់ឡើងវិញចុងក្រោយ</translation> +<translation id="7633068090678117093">រូបភាពផ្ទៃខាងក្រោយ</translation> <translation id="7648838807254605802">ការពន្យារ HTTPS ខ្ពស់</translation> <translation id="765159867434478292">បំបែក</translation> <translation id="7656388927906093505">ឧបករណ៍គឺជាកណ្ដុរ។</translation> @@ -979,6 +984,7 @@ <translation id="8930521118335213258">Peer</translation> <translation id="8930622219860340959">ឥតខ្សែ</translation> <translation id="8936793075252196307">អាសយដ្ឋាន IP របស់កម្មវិធីភ្ញៀវ</translation> +<translation id="8944651180182756621">ពណ៌កម្មវិធីចាប់ផ្ដើម</translation> <translation id="894617464444543719">ឧបករណ៍គឺជាទូរសព្ទ។</translation> <translation id="8957423540740801332">ស្តាំ</translation> <translation id="8968751544471797276">អត្រាសាកថ្ម</translation> @@ -1012,6 +1018,7 @@ <translation id="9149391708638971077">ដំណើរការតេស្តអង្គចងចាំ</translation> <translation id="9161276708550942948">ដកឃ្លា</translation> <translation id="9173638680043580060">នៅសល់តិចជាងមួយនាទី</translation> +<translation id="9174334653006917325">ពណ៌ UI</translation> <translation id="917720651393141712">ធ្វើតេស្ត</translation> <translation id="9188992814426075118">ក្ដារចុចរបស់អ្នកអាចត្រូវគ្នាជាមួយផ្ទាំងរូបភាពរបស់អ្នកដោយស្វ័យប្រវត្តិ</translation> <translation id="9189000703457422362">មិនអាចភ្ជាប់ទៅបណ្ដាញនេះ ដោយប្រើ APN ដែលបានរកឃើញដោយស្វ័យប្រវត្តិទេ។ សូមទាក់ទងទៅក្រុមហ៊ុនសេវាទូរសព្ទចល័តរបស់អ្នក ដើម្បីទទួលបានព័ត៌មានបន្ថែម។</translation>
diff --git a/chromeos/strings/chromeos_strings_lv.xtb b/chromeos/strings/chromeos_strings_lv.xtb index d818944..c888565 100644 --- a/chromeos/strings/chromeos_strings_lv.xtb +++ b/chromeos/strings/chromeos_strings_lv.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> pārvalda šo ierīci un, iespējams, var pārraudzīt jūsu darbību.</translation> <translation id="1478594628797167447">Skeneris</translation> <translation id="1483493594462132177">Sūtīt</translation> +<translation id="1488850966314959671">Nevienu iespējotu pielāgoto APN nevar izmantot, lai izveidotu savienojumu ar šo tīklu. Lai iegūtu plašāku informāciju, sazinieties ar savu mobilo sakaru operatoru.</translation> <translation id="1491076385728777984">Notiek ierīces “<ph name="DEVICE_NAME" />” aparātprogrammatūras atjaunināšana</translation> <translation id="1499041187027566160">palielināt skaļumu</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> pārvalda šo lietotāju un, iespējams, var attālināti pārvaldīt iestatījumus un pārraudzīt lietotāja darbības.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Atkārtoti skenēt</translation> <translation id="5583640892426849032">Atkāpšanās taustiņš</translation> +<translation id="5584044598279886848">Nevar atspējot vai noņemt šo APN. Iespējotie pievienotie APN ir jāatspējo vai jānoņem.</translation> <translation id="5600027863942488546">Taustiņš “<ph name="KEY_NAME" />” ir pārbaudīts</translation> <translation id="5620281292257375798">Tikai iekšējai lietošanai</translation> <translation id="5649768706273821470">Klausīties</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">Atlicis mazāk par minūti</translation> <translation id="917720651393141712">Testēt</translation> <translation id="9188992814426075118">Tastatūra var automātiski pielāgot jūsu fona tapeti.</translation> +<translation id="9189000703457422362">Nevar izveidot savienojumu ar šo tīklu, izmantojot automātiski noteiktos APN. Lai iegūtu plašāku informāciju, sazinieties ar savu mobilo sakaru operatoru.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Nevar sazināties ar vārteju no Android lietotnēm</translation> <translation id="9211490828691860325">Visas darbvietas</translation>
diff --git a/chromeos/strings/chromeos_strings_mk.xtb b/chromeos/strings/chromeos_strings_mk.xtb index b278601..254393a 100644 --- a/chromeos/strings/chromeos_strings_mk.xtb +++ b/chromeos/strings/chromeos_strings_mk.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> управува со уредов и може да ја набљудува вашата активност.</translation> <translation id="1478594628797167447">Скенер</translation> <translation id="1483493594462132177">Испрати</translation> +<translation id="1488850966314959671">Не може да се поврзе на мрежава со овозможени приспособени APN. Контактирајте со вашиот мобилен оператор за повеќе информации.</translation> <translation id="1491076385728777984">Се ажурира фирмверот на <ph name="DEVICE_NAME" /></translation> <translation id="1499041187027566160">засили звук</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> управува со корисников и може оддалеку да управува со поставките и да ја набљудува неговата активност.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Скенирај пак</translation> <translation id="5583640892426849032">Backspace-копче</translation> +<translation id="5584044598279886848">Не може да се оневозможи или отстрани оваа APN. Уверете се дека овозможените приложени APN се оневозможени или отстранети.</translation> <translation id="5600027863942488546">Копчето <ph name="KEY_NAME" /> е тестирано</translation> <translation id="5620281292257375798">Само интерно</translation> <translation id="5649768706273821470">Слушај</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">Преостанува помалку од една минута</translation> <translation id="917720651393141712">Тест</translation> <translation id="9188992814426075118">Тастатурата може автоматски да се совпаѓа со тапетот</translation> +<translation id="9189000703457422362">Не може да се поврзе на мрежава со автоматски откриени APN. Контактирајте со вашиот мобилен оператор за повеќе информации.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Не може да се стапи во контакт со портал од апликации на Android</translation> <translation id="9211490828691860325">Сите работни површини</translation>
diff --git a/chromeos/strings/chromeos_strings_ml.xtb b/chromeos/strings/chromeos_strings_ml.xtb index 702bcd8..d4b735d 100644 --- a/chromeos/strings/chromeos_strings_ml.xtb +++ b/chromeos/strings/chromeos_strings_ml.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> ഈ ഉപകരണം മാനേജ് ചെയ്യുന്നു, ഒപ്പം നിങ്ങളുടെ ആക്റ്റിവിറ്റികൾ നിരീക്ഷിക്കാനുമായേക്കും.</translation> <translation id="1478594628797167447">സ്കാനർ</translation> <translation id="1483493594462132177">അയയ്ക്കുക</translation> +<translation id="1488850966314959671">പ്രവർത്തനക്ഷമമാക്കിയ ഏതെങ്കിലും ഇഷ്ടാനുസൃത APN-കൾ ഉപയോഗിച്ച് ഈ നെറ്റ്വർക്കിലേക്ക് കണക്റ്റ് ചെയ്യാനാകുന്നില്ല. കൂടുതൽ വിവരങ്ങൾക്ക് നിങ്ങളുടെ മൊബൈൽ സേവനദാതാവിനെ ബന്ധപ്പെടുക.</translation> <translation id="1491076385728777984"><ph name="DEVICE_NAME" /> ഉപകരണത്തിലെ ഫേംവെയർ അപ്ഡേറ്റ് ചെയ്യുന്നു</translation> <translation id="1499041187027566160">വോളിയം കൂട്ടുക</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> ആണ് ഈ ഉപയോക്താവിനെ മാനേജ് ചെയ്യുന്നത്, ഒപ്പം വിദൂരമായി ക്രമീകരണം മാനേജ് ചെയ്യുകയും ഉപയോക്തൃ ആക്റ്റിവിറ്റി നിരീക്ഷിക്കുകയും ചെയ്തേക്കാം.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">വീണ്ടും സ്കാൻ ചെയ്യുക</translation> <translation id="5583640892426849032">ബാക്ക്സ്പെയ്സ്</translation> +<translation id="5584044598279886848">ഈ APN പ്രവർത്തനരഹിതമാക്കാനോ നീക്കം ചെയ്യാനോ കഴിയില്ല. പ്രവർത്തനക്ഷമമാക്കിയ, അറ്റാച്ച് ചെയ്ത APN-കൾ പ്രവർത്തനരഹിതമാക്കുകയോ നീക്കം ചെയ്യുകയോ ചെയ്തിട്ടുണ്ടെന്ന് ഉറപ്പാക്കുക.</translation> <translation id="5600027863942488546"><ph name="KEY_NAME" /> കീ പരിശോധിച്ചു</translation> <translation id="5620281292257375798">ആന്തരികം മാത്രം</translation> <translation id="5649768706273821470">കേൾക്കുക</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">ഒരു മിനിറ്റിലും താഴെ ശേഷിക്കുന്നു</translation> <translation id="917720651393141712">ടെസ്റ്റ്</translation> <translation id="9188992814426075118">നിങ്ങളുടെ കീബോർഡിന് വാൾപേപ്പറുമായി സ്വയമേവ പൊരുത്തപ്പെടാനാകും</translation> +<translation id="9189000703457422362">സ്വയമേവ കണ്ടെത്തിയ APN-കൾ ഉപയോഗിച്ച് ഈ നെറ്റ്വർക്കിലേക്ക് കണക്റ്റ് ചെയ്യാനാകുന്നില്ല. കൂടുതൽ വിവരങ്ങൾക്ക് നിങ്ങളുടെ മൊബൈൽ സേവനദാതാവിനെ ബന്ധപ്പെടുക.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Android ആപ്പുകളിൽ നിന്ന് ഗേറ്റ്വേയുമായി ബന്ധപ്പെടാനാകുന്നില്ല</translation> <translation id="9211490828691860325">എല്ലാ ഡെസ്കുകളും</translation>
diff --git a/chromeos/strings/chromeos_strings_mn.xtb b/chromeos/strings/chromeos_strings_mn.xtb index 0303466..e820925d 100644 --- a/chromeos/strings/chromeos_strings_mn.xtb +++ b/chromeos/strings/chromeos_strings_mn.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> энэ төхөөрөмжийг удирддаг бөгөөд таны үйл ажиллагааг хянах боломжтой байж болзошгүй.</translation> <translation id="1478594628797167447">Скан хийгч</translation> <translation id="1483493594462132177">Илгээх</translation> +<translation id="1488850966314959671">Аливаа идэвхжүүлсэн захиалгат APN-уудыг ашиглан энэ сүлжээнд холбогдох боломжгүй. Дэлгэрэнгүй мэдээлэл авах бол мобайл оператор компанитайгаа холбогдоно уу.</translation> <translation id="1491076385728777984"><ph name="DEVICE_NAME" /> дээр жижиг программыг шинэчилж байна</translation> <translation id="1499041187027566160">дууны түвшинг нэмэх</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> энэ хэрэглэгчийг удирддаг бөгөөд алсаас тохиргоог удирдаж, хэрэглэгчийн үйл ажиллагааг хянаж болзошгүй.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Дахин скан хийх</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5584044598279886848">Энэ APN-г идэвхгүй болгох эсвэл хасах боломжгүй. Идэвхжүүлсэн хавсаргах APN-уудыг идэвхгүй болгосон эсвэл хассан болохыг баталгаажуулна уу.</translation> <translation id="5600027863942488546"><ph name="KEY_NAME" /> товчлуурыг туршиж үзсэн</translation> <translation id="5620281292257375798">Зөвхөн дотоодод</translation> <translation id="5649768706273821470">Сонсох</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">Минут хүрэхгүй хугацаа үлдлээ</translation> <translation id="917720651393141712">Шалгалт</translation> <translation id="9188992814426075118">Таны гар дэлгэцийн зурагтай тань автоматаар таарах боломжтой</translation> +<translation id="9189000703457422362">Автоматаар устгасан APN-уудыг ашиглан энэ сүлжээнд холбогдох боломжгүй. Дэлгэрэнгүй мэдээлэл авах бол мобайл оператор компанитайгаа холбогдоно уу.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Android аппуудаас гэйтвэйтэй холбогдох боломжгүй</translation> <translation id="9211490828691860325">Бүх дэлгэц</translation>
diff --git a/chromeos/strings/chromeos_strings_my.xtb b/chromeos/strings/chromeos_strings_my.xtb index 7479919..854ef45c 100644 --- a/chromeos/strings/chromeos_strings_my.xtb +++ b/chromeos/strings/chromeos_strings_my.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> က စီမံခန့်ခွဲသည့်အတွက် သင်၏လုပ်ဆောင်ချက်ကို စောင့်ကြည့်နိုင်ပါသည်။</translation> <translation id="1478594628797167447">စကင်ဖတ်စနစ်</translation> <translation id="1483493594462132177">ပို့ရန်</translation> +<translation id="1488850966314959671">ဖွင့်ထားသော စိတ်ကြိုက် APN များ သုံးပြီး ဤကွန်ရက်သို့ ချိတ်ဆက်၍မရပါ။ နောက်ထပ်အချက်အလက်အတွက် သင့်မိုဘိုင်းဖုန်းကုမ္ပဏီကို ဆက်သွယ်ပါ။</translation> <translation id="1491076385728777984"><ph name="DEVICE_NAME" /> တွင် ဖာမ်းဝဲအပ်ဒိတ်လုပ်နေသည်</translation> <translation id="1499041187027566160">အသံ တိုးပါ</translation> <translation id="1499900233129743732">ဤအသုံးပြုသူကို <ph name="MANAGER" /> က စီမံခန့်ခွဲသည့်အတွက် ဆက်တင်များကို အဝေးထိန်းစီမံပြီး အသုံးပြုသူ၏လုပ်ဆောင်ချက်ကို စောင့်ကြည့်နိုင်သည်။</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">စကင်ပြန်ဖတ်ရန်</translation> <translation id="5583640892426849032">နောက်ပြန်</translation> +<translation id="5584044598279886848">ဤ APN ကို ပိတ်၍မရပါ (သို့) ဖယ်ရှား၍မရပါ။ ဖွင့်ထားသော ပူးတွဲပါ APN များကို ပိတ်ထားကြောင်း (သို့) ဖယ်ရှားထားကြောင်း သေချာပါစေ။</translation> <translation id="5600027863942488546"><ph name="KEY_NAME" /> ခလုတ် စမ်းသပ်ထားသည်</translation> <translation id="5620281292257375798">ရုံးတွင်းသာ</translation> <translation id="5649768706273821470">နားထောင်</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">တစ်မိနစ်ပင် မကျန်တော့ပါ</translation> <translation id="917720651393141712">စမ်းသပ်မှု</translation> <translation id="9188992814426075118">ကီးဘုတ်က သင့်နောက်ခံကို အလိုအလျောက် တူညီအောင်လုပ်နိုင်သည်</translation> +<translation id="9189000703457422362">အလိုအလျောက် တွေ့ရှိသော APN များ သုံးပြီး ဤကွန်ရက်သို့ ချိတ်ဆက်၍မရပါ။ နောက်ထပ်အချက်အလက်အတွက် သင့်မိုဘိုင်းဖုန်းကုမ္ပဏီကို ဆက်သွယ်ပါ။</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Android အက်ပ်များမှ ဂိတ်ဝကို ဆက်သွယ်၍မရပါ</translation> <translation id="9211490828691860325">မျက်နှာပြင်နေရာအားလုံး</translation>
diff --git a/chromeos/strings/chromeos_strings_no.xtb b/chromeos/strings/chromeos_strings_no.xtb index 2ef3107..92f227a4 100644 --- a/chromeos/strings/chromeos_strings_no.xtb +++ b/chromeos/strings/chromeos_strings_no.xtb
@@ -118,7 +118,9 @@ <translation id="1801418420130173017">Slå av mørkt tema</translation> <translation id="1807246157184219062">Lys</translation> <translation id="1827738518074806965">Kunstgalleri</translation> +<translation id="1836553715834333258">Systemfarge</translation> <translation id="1838374766361614909">Fjern søket</translation> +<translation id="1840474674287087346">Skrivebordsfarge</translation> <translation id="1851218745569890714">Videokonferanser</translation> <translation id="1852934301711881861">Installer ChromeOS Flex</translation> <translation id="1856388568474281774">Nedoverpil</translation> @@ -421,6 +423,7 @@ <translation id="4454245904991689773">Skann til</translation> <translation id="4479639480957787382">Ethernet</translation> <translation id="4483049906298469269">Kunne ikke pinge gatewayen for ikke-standardnettverket</translation> +<translation id="4500966230243561393">Grensesnittfarge</translation> <translation id="4503223151711056411">Venstrepil</translation> <translation id="4507392511610824664">lysstyrke opp</translation> <translation id="4511264077854731334">Portal</translation> @@ -499,6 +502,7 @@ <translation id="500920857929044050">Stans testen</translation> <translation id="5017508259293544172">LEAP</translation> <translation id="5019310272469539976">Vis bilder, tidspunkt, vær og medieinfo når skjermen er inaktiv.</translation> +<translation id="5035083460461104704">Temafarge</translation> <translation id="5038292761217083259">tastatur med flere farger</translation> <translation id="5039804452771397117">Tillat</translation> <translation id="5049856988445523908">SIM-kortet er låst (<ph name="LOCK_TYPE" />)</translation> @@ -814,6 +818,7 @@ <translation id="7618774594543487847">Nøytral</translation> <translation id="7620771111601174153">Finn ut mer i Brukerstøtte</translation> <translation id="763165478673169849">Forrige tidspunkt for tilbakestilling</translation> +<translation id="7633068090678117093">Bakgrunnsbilde</translation> <translation id="7648838807254605802">Høy HTTPS-tidsforsinkelse</translation> <translation id="765159867434478292">Del</translation> <translation id="7656388927906093505">Enheten er en mus.</translation> @@ -979,6 +984,7 @@ <translation id="8930521118335213258">Motpart</translation> <translation id="8930622219860340959">Trådløs</translation> <translation id="8936793075252196307">Klient-IP-adresse</translation> +<translation id="8944651180182756621">Appoversiktfarge</translation> <translation id="894617464444543719">Enheten er en telefon.</translation> <translation id="8957423540740801332">høyre</translation> <translation id="8968751544471797276">Ladefrekvens</translation> @@ -1012,6 +1018,7 @@ <translation id="9149391708638971077">Kjør minnetest</translation> <translation id="9161276708550942948">mellomrom</translation> <translation id="9173638680043580060">Mindre enn et minutt igjen</translation> +<translation id="9174334653006917325">UI-farge</translation> <translation id="917720651393141712">Test</translation> <translation id="9188992814426075118">Tastaturet kan matche bakgrunnen automatisk</translation> <translation id="9189000703457422362">Kan ikke koble til dette nettverket med APN-er som registreres automatisk. Kontakt mobiloperatøren din for å få mer informasjon.</translation>
diff --git a/chromeos/strings/chromeos_strings_pa.xtb b/chromeos/strings/chromeos_strings_pa.xtb index 88cb094..b5e803a 100644 --- a/chromeos/strings/chromeos_strings_pa.xtb +++ b/chromeos/strings/chromeos_strings_pa.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> ਵੱਲੋਂ ਇਸ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਬੰਧਨ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਅਤੇ ਤੁਹਾਡੀ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ।</translation> <translation id="1478594628797167447">ਸਕੈਨਰ</translation> <translation id="1483493594462132177">ਭੇਜੋ</translation> +<translation id="1488850966314959671">ਕਿਸੇ ਵੀ ਚਾਲੂ ਕੀਤੇ ਵਿਉਂਤਬੱਧ APN ਦੀ ਵਰਤੋਂ ਕਰ ਕੇ ਇਸ ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ ਆਪਣੇ ਮੋਬਾਈਲ ਕੈਰੀਅਰ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।</translation> <translation id="1491076385728777984"><ph name="DEVICE_NAME" /> 'ਤੇ ਫ਼ਰਮਵੇਅਰ ਨੂੰ ਅੱਪਡੇਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</translation> <translation id="1499041187027566160">ਵੌਲਿਊਮ ਵਧਾਓ</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> ਇਸ ਵਰਤੋਂਕਾਰ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਦਾ ਹੈ ਅਤੇ ਦੂਰ-ਦਰਾਡੇ ਤੋਂ ਸੈਟਿੰਗਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਅਤੇ ਵਰਤੋਂਕਾਰ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦਾ ਹੈ।</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">ਮੁੜ-ਸਕੈਨ ਕਰੋ</translation> <translation id="5583640892426849032">ਬੈਕਸਪੇਸ</translation> +<translation id="5584044598279886848">ਇਸ APN ਨੂੰ ਬੰਦ ਜਾਂ ਹਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ। ਪੱਕਾ ਕਰੋ ਕਿ ਚਾਲੂ ਕੀਤੇ ਨੱਥੀ APN ਬੰਦ ਹਨ ਜਾਂ ਹਟਾਏ ਦਿੱਤੇ ਗਏ ਹਨ।</translation> <translation id="5600027863942488546"><ph name="KEY_NAME" /> ਕੁੰਜੀ ਦੀ ਜਾਂਚ ਕੀਤੀ ਗਈ</translation> <translation id="5620281292257375798">ਸਿਰਫ਼ ਅੰਦਰੂਨੀ</translation> <translation id="5649768706273821470">ਸੁਣਿਆ</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">ਇੱਕ ਮਿੰਟ ਤੋਂ ਘੱਟ ਸਮਾਂ ਬਾਕੀ</translation> <translation id="917720651393141712">ਜਾਂਚ</translation> <translation id="9188992814426075118">ਤੁਹਾਡਾ ਕੀ-ਬੋਰਡ ਤੁਹਾਡੇ ਵਾਲਪੇਪਰ ਨਾਲ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਮੇਲ ਖਾ ਸਕਦਾ ਹੈ</translation> +<translation id="9189000703457422362">ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਪਛਾਣੇ ਗਏ APN ਦੀ ਵਰਤੋਂ ਕਰ ਕੇ ਇਸ ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ ਆਪਣੇ ਮੋਬਾਈਲ ਕੈਰੀਅਰ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Android ਐਪਾਂ ਤੋਂ ਗੇਟਵੇ ਨਾਲ ਸੰਪਰਕ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ</translation> <translation id="9211490828691860325">ਸਾਰੇ ਡੈਸਕ</translation>
diff --git a/chromeos/strings/chromeos_strings_ro.xtb b/chromeos/strings/chromeos_strings_ro.xtb index 5bada1f2..53cfa31 100644 --- a/chromeos/strings/chromeos_strings_ro.xtb +++ b/chromeos/strings/chromeos_strings_ro.xtb
@@ -118,7 +118,9 @@ <translation id="1801418420130173017">Dezactivează tema întunecată</translation> <translation id="1807246157184219062">Luminos</translation> <translation id="1827738518074806965">Galerie de imagini</translation> +<translation id="1836553715834333258">Culoarea sistemului</translation> <translation id="1838374766361614909">Șterge căutarea</translation> +<translation id="1840474674287087346">Culoarea desktopului</translation> <translation id="1851218745569890714">Conferințe video</translation> <translation id="1852934301711881861">Instalează sistemul de operare Chrome Flex</translation> <translation id="1856388568474281774">Săgeată în jos</translation> @@ -421,6 +423,7 @@ <translation id="4454245904991689773">Scanează către</translation> <translation id="4479639480957787382">Ethernet</translation> <translation id="4483049906298469269">Nu s-a putut da ping către gateway-ul de rețea care nu este prestabilit</translation> +<translation id="4500966230243561393">Culoarea interfeței</translation> <translation id="4503223151711056411">Săgeată spre stânga</translation> <translation id="4507392511610824664">mărește luminozitatea</translation> <translation id="4511264077854731334">Portal</translation> @@ -499,6 +502,7 @@ <translation id="500920857929044050">Oprește testul</translation> <translation id="5017508259293544172">LEAP</translation> <translation id="5019310272469539976">Când ecranul este inactiv, se afișează fotografii, ora, vremea și informații despre media.</translation> +<translation id="5035083460461104704">Culoarea temei</translation> <translation id="5038292761217083259">tastatură multicoloră</translation> <translation id="5039804452771397117">Permite</translation> <translation id="5049856988445523908">Card SIM blocat (<ph name="LOCK_TYPE" />)</translation> @@ -814,6 +818,7 @@ <translation id="7618774594543487847">Neutru</translation> <translation id="7620771111601174153">Află mai multe din Centrul de ajutor</translation> <translation id="763165478673169849">Data ultimei resetări</translation> +<translation id="7633068090678117093">Imagine de fundal</translation> <translation id="7648838807254605802">Latență mare a solicitărilor HTTPS</translation> <translation id="765159867434478292">Pe jumătate</translation> <translation id="7656388927906093505">Dispozitivul este un mouse.</translation> @@ -979,6 +984,7 @@ <translation id="8930521118335213258">Peer</translation> <translation id="8930622219860340959">Wireless</translation> <translation id="8936793075252196307">Adresa IP a clientului</translation> +<translation id="8944651180182756621">Culoarea lansatorului</translation> <translation id="894617464444543719">Dispozitivul este un telefon.</translation> <translation id="8957423540740801332">dreapta</translation> <translation id="8968751544471797276">Rata de încărcare</translation> @@ -1012,6 +1018,7 @@ <translation id="9149391708638971077">Rulează testul Memorie</translation> <translation id="9161276708550942948">spațiu</translation> <translation id="9173638680043580060">A rămas mai puțin de un minut</translation> +<translation id="9174334653006917325">Culoarea interfeței de utilizare</translation> <translation id="917720651393141712">Testează</translation> <translation id="9188992814426075118">Tastatura se poate potrivi automat cu imaginea de fundal</translation> <translation id="9189000703457422362">Nu se poate conecta la această rețea folosind APN-uri detectate automat. Contactează operatorul de telefonie mobilă pentru informații suplimentare.</translation>
diff --git a/chromeos/strings/chromeos_strings_ru.xtb b/chromeos/strings/chromeos_strings_ru.xtb index b807095d..beb868b4 100644 --- a/chromeos/strings/chromeos_strings_ru.xtb +++ b/chromeos/strings/chromeos_strings_ru.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872">Этим устройством управляет <ph name="MANAGER" />. Ваши действия могут отслеживаться.</translation> <translation id="1478594628797167447">Сканер</translation> <translation id="1483493594462132177">Отправить</translation> +<translation id="1488850966314959671">Не удается подключиться к этой сети через включенные персональные точки доступа. За подробной информацией обратитесь к оператору мобильной связи.</translation> <translation id="1491076385728777984"><ph name="DEVICE_NAME" />: обновление встроенного ПО…</translation> <translation id="1499041187027566160">увеличить громкость</translation> <translation id="1499900233129743732">Этим аккаунтом управляет <ph name="MANAGER" />. Администратор может отслеживать действия пользователя, а также удаленно изменять настройки.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Сканировать повторно</translation> <translation id="5583640892426849032">Клавиша возврата (Backspace)</translation> +<translation id="5584044598279886848">Не удается отключить или удалить эту точку доступа. Убедитесь, что точки доступа типа Attach отключены или удалены.</translation> <translation id="5600027863942488546">Клавиша <ph name="KEY_NAME" /> протестирована</translation> <translation id="5620281292257375798">Конфиденциально</translation> <translation id="5649768706273821470">Прослушать</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">Осталось меньше минуты…</translation> <translation id="917720651393141712">Проверить</translation> <translation id="9188992814426075118">Цвет клавиатуры может автоматически подстраиваться под цвет обоев.</translation> +<translation id="9189000703457422362">Не удается подключиться к этой сети через автоматически обнаруженные точки доступа. За подробной информацией обратитесь к оператору мобильной связи.</translation> <translation id="9193744392140377127">Точка доступа*</translation> <translation id="9204237731135241582">Не удается связаться со шлюзом в приложениях для Android.</translation> <translation id="9211490828691860325">Все рабочие столы</translation>
diff --git a/chromeos/strings/chromeos_strings_si.xtb b/chromeos/strings/chromeos_strings_si.xtb index 5875d806..3e4d420c 100644 --- a/chromeos/strings/chromeos_strings_si.xtb +++ b/chromeos/strings/chromeos_strings_si.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> මෙම උපාංගය කළමනාකරණය කරන අතර ඔබගේ ක්රියාකාරකම නිරීක්ෂණ කිරීමට හැකි වීමට ඉඩ ඇත.</translation> <translation id="1478594628797167447">ස්කෑනරය</translation> <translation id="1483493594462132177">යවන්න</translation> +<translation id="1488850966314959671">සබල කළ අභිරුචි APN භාවිතයෙන් මෙම ජාලයට සම්බන්ධ විය නොහැක. වැඩිදුර තොරතුරු සඳහා ඔබේ ජංගම වාහකය සම්බන්ධ කර ගන්න.</translation> <translation id="1491076385728777984"><ph name="DEVICE_NAME" /> හි නිත්ය මෘදුකාංග යාවත්කාලීන කරමින්.</translation> <translation id="1499041187027566160">හඬ පරිමාව වැඩි කිරීම</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> මෙම පරිශීලකයා කළමනාකරණය කරන අතර දුරස්ථව සැකසීම් කළමනාකරණය කිරීමට සහ පරිශීලක ක්රියාකාරකම් නිරීක්ෂණය කිරීමට හැකිය.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">යළි ස්කෑන් කරන්න</translation> <translation id="5583640892426849032">ආපසුයවනය</translation> +<translation id="5584044598279886848">මෙම APN අබල කිරීමට හෝ ඉවත් කිරීමට නොහැක. සබල කළ අමුණා ඇති APNs අබල කර හෝ ඉවත් කර ඇති බවට වග බලා ගන්න.</translation> <translation id="5600027863942488546"><ph name="KEY_NAME" /> යතුර පරීක්ෂා කරන ලදි</translation> <translation id="5620281292257375798">අභ්යන්තර පමණයි</translation> <translation id="5649768706273821470">සවන් දෙන්න</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">මිනිත්තුවකට වඩා අඩුවෙන් ඉතිරිව ඇත</translation> <translation id="917720651393141712">පරීක්ෂාව</translation> <translation id="9188992814426075118">ඔබගේ යතුරු පුවරුව ස්වයංක්රීයව ඔබගේ වෝල්පේපරයට ගැළපේ</translation> +<translation id="9189000703457422362">ස්වයංක්රීයව අනාවරණය කරගත් APNs භාවිතයෙන් මෙම ජාලයට සම්බන්ධ විය නොහැක. වැඩිදුර තොරතුරු සඳහා ඔබේ ජංගම වාහකය සම්බන්ධ කර ගන්න.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Android යෙදුම් වෙතින් වාහල සම්බන්ධ කර ගත නොහැකිය</translation> <translation id="9211490828691860325">සියලු වැඩතල</translation>
diff --git a/chromeos/strings/chromeos_strings_sk.xtb b/chromeos/strings/chromeos_strings_sk.xtb index 213b2ef..ddbc1bb9 100644 --- a/chromeos/strings/chromeos_strings_sk.xtb +++ b/chromeos/strings/chromeos_strings_sk.xtb
@@ -118,7 +118,9 @@ <translation id="1801418420130173017">Vypnúť tmavý motív</translation> <translation id="1807246157184219062">Svetlý režim</translation> <translation id="1827738518074806965">Umelecká galéria</translation> +<translation id="1836553715834333258">Farba systému</translation> <translation id="1838374766361614909">Vymazať vyhľadávanie</translation> +<translation id="1840474674287087346">Farba pracovnej plochy</translation> <translation id="1851218745569890714">Videokonferencie</translation> <translation id="1852934301711881861">Nainštalovať Chrome OS Flex</translation> <translation id="1856388568474281774">Šípka nadol</translation> @@ -421,6 +423,7 @@ <translation id="4454245904991689773">Adresár na skenovanie</translation> <translation id="4479639480957787382">Ethernet</translation> <translation id="4483049906298469269">Nepredvolenú bránu siete sa nepodarilo otestovať</translation> +<translation id="4500966230243561393">Farba rozhrania</translation> <translation id="4503223151711056411">Šípka doľava</translation> <translation id="4507392511610824664">zvýšenie jasu</translation> <translation id="4511264077854731334">Portál</translation> @@ -499,6 +502,7 @@ <translation id="500920857929044050">Zastaviť test</translation> <translation id="5017508259293544172">LEAP</translation> <translation id="5019310272469539976">Nastavte, aby sa pri nečinnosti obrazovky zobrazovali fotky, čas, počasie a informácie o médiách.</translation> +<translation id="5035083460461104704">Farba motívu</translation> <translation id="5038292761217083259">klávesnica s viacerými farbami</translation> <translation id="5039804452771397117">Povoliť</translation> <translation id="5049856988445523908">SIM karta je uzamknutá (<ph name="LOCK_TYPE" />)</translation> @@ -814,6 +818,7 @@ <translation id="7618774594543487847">Neutrálny</translation> <translation id="7620771111601174153">Ďalšie informácie v centre pomoci</translation> <translation id="763165478673169849">Čas posledného resetovania</translation> +<translation id="7633068090678117093">Obrázok na pozadí</translation> <translation id="7648838807254605802">Vysoká latencia protokolu HTTPS</translation> <translation id="765159867434478292">Rozdeliť</translation> <translation id="7656388927906093505">Zariadenie je myš.</translation> @@ -979,6 +984,7 @@ <translation id="8930521118335213258">Podobná aplikácia</translation> <translation id="8930622219860340959">Bezdrôtové pripojenie</translation> <translation id="8936793075252196307">Adresa IP klienta</translation> +<translation id="8944651180182756621">Farba Spúšťača</translation> <translation id="894617464444543719">Zariadenie je telefón.</translation> <translation id="8957423540740801332">doprava</translation> <translation id="8968751544471797276">Rýchlosť nabíjania</translation> @@ -1012,6 +1018,7 @@ <translation id="9149391708638971077">Spustiť test pamäte</translation> <translation id="9161276708550942948">medzera</translation> <translation id="9173638680043580060">Zostáva menej ako minúta</translation> +<translation id="9174334653006917325">Farba používateľského rozhrania</translation> <translation id="917720651393141712">Testovať</translation> <translation id="9188992814426075118">Klávesnica sa môže automaticky prispôsobiť tapete</translation> <translation id="9189000703457422362">K tejto sieti sa nedá pripojiť pomocou automaticky rozpoznávaných názvov prístupového bodu (APN). Viac sa dozviete od svojho operátora.</translation>
diff --git a/chromeos/strings/chromeos_strings_sl.xtb b/chromeos/strings/chromeos_strings_sl.xtb index 94e2788..2c1d67a 100644 --- a/chromeos/strings/chromeos_strings_sl.xtb +++ b/chromeos/strings/chromeos_strings_sl.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> upravlja to napravo in morda nadzira vašo dejavnost.</translation> <translation id="1478594628797167447">Optični bralniki</translation> <translation id="1483493594462132177">Pošlji</translation> +<translation id="1488850966314959671">S tem omrežjem se ni mogoče povezati prek omogočenih APN-jev po meri. Če želite več informacij, se obrnite na mobilnega operaterja.</translation> <translation id="1491076385728777984">Posodabljanje vdelane programske opreme v napravi <ph name="DEVICE_NAME" /></translation> <translation id="1499041187027566160">povečanje glasnosti</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> upravlja tega uporabnika in lahko na daljavo upravlja nastavitve ter nadzira dejavnost uporabnika.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Znova optično preberi</translation> <translation id="5583640892426849032">Vračalka</translation> +<translation id="5584044598279886848">Tega APN-ja ni mogoče onemogočiti ali odstraniti. Omogočeni povezani APN-ji morajo biti onemogočeni ali odstranjeni.</translation> <translation id="5600027863942488546">Tipka <ph name="KEY_NAME" /> je bila preizkušena.</translation> <translation id="5620281292257375798">Samo za interno rabo</translation> <translation id="5649768706273821470">Poslušajte</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">Še manj kot minuta</translation> <translation id="917720651393141712">Preizkus</translation> <translation id="9188992814426075118">Tipkovnica se lahko samodejno ujema z zaslonskim ozadjem.</translation> +<translation id="9189000703457422362">S tem omrežjem se ni mogoče povezati prek samodejno zaznanih APN-jev. Če želite več informacij, se obrnite na mobilnega operaterja.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Iz aplikacij za Android ni mogoče vzpostaviti stika s prehodom.</translation> <translation id="9211490828691860325">Vsa namizja</translation>
diff --git a/chromeos/strings/chromeos_strings_sq.xtb b/chromeos/strings/chromeos_strings_sq.xtb index 731239b4..75b97d3 100644 --- a/chromeos/strings/chromeos_strings_sq.xtb +++ b/chromeos/strings/chromeos_strings_sq.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> e menaxhon këtë pajisje dhe mund të jetë në gjendje të monitorojë aktivitetin tënd.</translation> <translation id="1478594628797167447">Skaner</translation> <translation id="1483493594462132177">Dërgo</translation> +<translation id="1488850966314959671">Nuk mund të lidhesh me këtë rrjet duke përdorur një nga APN-të e personalizuara të aktivizuara. Kontakto me operatorin tënd celular për më shumë informacione.</translation> <translation id="1491076385728777984">Po përditësohet firmueri në <ph name="DEVICE_NAME" /></translation> <translation id="1499041187027566160">rrit volumin</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> menaxhon këtë përdorues dhe mund të menaxhojë në distancë cilësimet dhe të monitorojë aktivitetin e përdoruesit.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Skano përsëri</translation> <translation id="5583640892426849032">Hapësirë prapa</translation> +<translation id="5584044598279886848">Kjo APN nuk mund të çaktivizohet apo të hiqet. Sigurohu që të çaktivizohen ose të hiqen APN-të e bashkëngjitura të aktivizuara.</translation> <translation id="5600027863942488546">Tasti <ph name="KEY_NAME" /> u testua</translation> <translation id="5620281292257375798">Vetëm i brendshëm</translation> <translation id="5649768706273821470">Dëgjo</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">Ka mbetur më pak se një minutë</translation> <translation id="917720651393141712">Provë</translation> <translation id="9188992814426075118">Tastiera jote mund të përputhet automatikisht me imazhin e sfondit</translation> +<translation id="9189000703457422362">Nuk mund të lidhesh me këtë rrjet duke përdorur APN-të e zbuluara automatikisht. Kontakto me operatorin tënd celular për më shumë informacione.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Portëkalimi nuk mund të kontaktohet nga aplikacionet për Android</translation> <translation id="9211490828691860325">Të gjitha tavolinat e punës</translation>
diff --git a/chromeos/strings/chromeos_strings_sw.xtb b/chromeos/strings/chromeos_strings_sw.xtb index f8ba003..66ec501b 100644 --- a/chromeos/strings/chromeos_strings_sw.xtb +++ b/chromeos/strings/chromeos_strings_sw.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> anadhibiti kifaa hiki na anaweza kufuatilia shughuli zako.</translation> <translation id="1478594628797167447">Kichanganuzi</translation> <translation id="1483493594462132177">Tuma</translation> +<translation id="1488850966314959671">Imeshindwa kuunganisha kwenye mtandao huu kwa kutumia APN yoyote maalum iliyowashwa. Wasiliana na mtoa huduma za simu ili upate maelezo zaidi.</translation> <translation id="1491076385728777984">Inasasisha programu dhibiti kwenye <ph name="DEVICE_NAME" /></translation> <translation id="1499041187027566160">ongeza sauti</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> inamdhibiti mtumiaji huyu na huenda ikadhibiti mipangilio na kufuatilia shughuli za mtumiaji kwa mbali.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Changanua upya</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5584044598279886848">Imeshindwa kuzima au kuondoa APN hii. Hakikisha APN ulizowasha ambazo zimeambatishwa zimezimwa au kuondolewa.</translation> <translation id="5600027863942488546">Kitufe cha <ph name="KEY_NAME" /> kimejaribishwa</translation> <translation id="5620281292257375798">Ndani ya kampuni pekee</translation> <translation id="5649768706273821470">Sikiliza</translation> @@ -593,7 +595,7 @@ <translation id="5866840822086176774">Thabiti sana</translation> <translation id="5876385649737594562">Washa ili uteue chaguo</translation> <translation id="588258955323874662">Skrini nzima</translation> -<translation id="5895138241574237353">Zzima na uwashe</translation> +<translation id="5895138241574237353">Zima na uwashe</translation> <translation id="5901630391730855834">Manjano</translation> <translation id="5903200662178656908">Kifaa ni muunganiko wa kibodi na kipanya.</translation> <translation id="5904994456462260490">Weka APN mpya</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">Imesalia chini ya dakika moja</translation> <translation id="917720651393141712">Jaribu</translation> <translation id="9188992814426075118">Kibodi yako inaweza kuunda mandhari yanayolingana na mwanga wake kiotomatiki</translation> +<translation id="9189000703457422362">Imeshindwa kuunganisha kwenye mtandao huu kwa kutumia APN zinazotambuliwa kiotomatiki. Wasiliana na mtoa huduma za simu ili upate maelezo zaidi.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Imeshindwa kuwasiliana na lango kutoka kwenye programu za Android</translation> <translation id="9211490828691860325">Maeneokazi yote</translation>
diff --git a/chromeos/strings/chromeos_strings_ta.xtb b/chromeos/strings/chromeos_strings_ta.xtb index 6cb5b7ad..5378e4d1 100644 --- a/chromeos/strings/chromeos_strings_ta.xtb +++ b/chromeos/strings/chromeos_strings_ta.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872">இந்தச் சாதனத்தை <ph name="MANAGER" /> நிர்வகிக்கிறது. இது உங்கள் செயல்பாட்டையும் கண்காணிக்கக்கூடும்.</translation> <translation id="1478594628797167447">ஸ்கேனர்</translation> <translation id="1483493594462132177">அனுப்பு</translation> +<translation id="1488850966314959671">இயக்கப்பட்ட பிரத்தியேக APNகளைப் பயன்படுத்தி இந்த நெட்வொர்க் உடன் இணைக்க முடியவில்லை. கூடுதல் தகவலுக்கு உங்கள் மொபைல் நிறுவனத்தைத் தொடர்புகொள்ளவும்.</translation> <translation id="1491076385728777984"><ph name="DEVICE_NAME" /> இல் நிலைபொருளைப் புதுப்பிக்கிறது</translation> <translation id="1499041187027566160">ஒலியளவை அதிகரிக்கும்</translation> <translation id="1499900233129743732">இந்தப் பயனரை <ph name="MANAGER" /> நிர்வகிக்கிறது. இது தொலைநிலையிலிருந்து அமைப்புகளை நிர்வகிக்கலாம், அத்துடன் பயனர் செயல்பாட்டையும் கண்காணிக்கலாம்.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">மீண்டும் ஸ்கேன் செய்</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5584044598279886848">இந்த APNனை முடக்கவோ அகற்றவோ முடியவில்லை. இணைக்கப்பட்ட APNகள் இயக்கப்பட்டிருந்தால் அவை முடக்கப்பட்டிருப்பதை அல்லது அகற்றப்பட்டிருப்பதை உறுதிசெய்துகொள்ளவும்.</translation> <translation id="5600027863942488546"><ph name="KEY_NAME" /> பட்டன் சோதனை செய்யப்பட்டது</translation> <translation id="5620281292257375798">அகப் பயன்பாட்டிற்கானது</translation> <translation id="5649768706273821470">கேள்</translation> @@ -1010,6 +1012,7 @@ <translation id="9173638680043580060">ஒரு நிமிடத்திற்கும் குறைவான நேரமே மீதமுள்ளது</translation> <translation id="917720651393141712">சோதனை செய்</translation> <translation id="9188992814426075118">உங்கள் வால்பேப்பருக்கு ஏற்றவாறு கீபோர்டு வண்ணம் தானாகவே மாறும்</translation> +<translation id="9189000703457422362">தானாகக் கண்டறியப்பட்ட APNகளைப் பயன்படுத்தி இந்த நெட்வொர்க் உடன் இணைக்க முடியவில்லை. கூடுதல் தகவலுக்கு உங்கள் மொபைல் நிறுவனத்தைத் தொடர்புகொள்ளவும்.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Android ஆப்ஸில் இருந்து கேட்வேயைத் தொடர்புகொள்ள முடியவில்லை</translation> <translation id="9211490828691860325">அனைத்து டெஸ்குகளும்</translation>
diff --git a/chromeos/strings/chromeos_strings_te.xtb b/chromeos/strings/chromeos_strings_te.xtb index 2108c76..3d4c3bb7 100644 --- a/chromeos/strings/chromeos_strings_te.xtb +++ b/chromeos/strings/chromeos_strings_te.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" />, ఈ పరికరాన్ని మేనేజ్ చేస్తుంది, ఇంకా మీ యాక్టివిటీని మానిటర్ చేయగలదు.</translation> <translation id="1478594628797167447">స్కానర్</translation> <translation id="1483493594462132177">పంపు</translation> +<translation id="1488850966314959671">ఎనేబుల్ చేసిన అనుకూల APNలు వేటినీ ఉపయోగించి ఈ నెట్వర్క్కు కనెక్ట్ చేయడం సాధ్యపడదు. మరింత సమాచారం కోసం మీ మొబైల్ క్యారియర్ను సంప్రదించండి.</translation> <translation id="1491076385728777984"><ph name="DEVICE_NAME" />లో ఫర్మ్వేర్ అప్డేట్ చేయబడుతోంది</translation> <translation id="1499041187027566160">వాల్యూమ్ పెంచుతుంది</translation> <translation id="1499900233129743732"><ph name="MANAGER" />, ఈ యూజర్ను మేనేజ్ చేస్తుంది, ఇంకా అది సెట్టింగ్లను రిమోట్గా మేనేజ్ చేయవచ్చు, యూజర్ యాక్టివిటీని మానిటర్ చేయవచ్చు.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">మళ్లీ స్కాన్ చేయండి</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5584044598279886848">ఈ APNను డిజేబుల్ చేయడం లేదా తీసివేయడం సాధ్యపడదు. ఎనేబుల్ చేసి ఉన్న అటాచ్ చేయబడిన APNలు డిసేబుల్ చేయబడ్డాయని లేదా తీసివేయబడ్డాయని నిర్ధారించుకోండి.</translation> <translation id="5600027863942488546"><ph name="KEY_NAME" /> కీని పరీక్షించారు</translation> <translation id="5620281292257375798">అంతర్గతం మాత్రమే</translation> <translation id="5649768706273821470">వినండి</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">నిమిషం కంటే తక్కువ సమయం మిగిలి ఉంది</translation> <translation id="917720651393141712">టెస్ట్ చేయండి</translation> <translation id="9188992814426075118">మీ కీబోర్డ్ ఆటోమేటిక్గా మీ వాల్పేపర్తో మ్యాచ్ అవుతుంది</translation> +<translation id="9189000703457422362">ఆటోమేటిక్గా గుర్తించబడే APNలను ఉపయోగించి ఈ నెట్వర్క్కు కనెక్ట్ చేయడం సాధ్యపడదు. మరింత సమాచారం కోసం మీ మొబైల్ క్యారియర్ను సంప్రదించండి.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Android యాప్ల నుండి గేట్వేను సంప్రదించడం సాధ్యపడదు</translation> <translation id="9211490828691860325">అన్ని డెస్క్లు</translation>
diff --git a/chromeos/strings/chromeos_strings_th.xtb b/chromeos/strings/chromeos_strings_th.xtb index b03a23c3..56bad23 100644 --- a/chromeos/strings/chromeos_strings_th.xtb +++ b/chromeos/strings/chromeos_strings_th.xtb
@@ -118,7 +118,9 @@ <translation id="1801418420130173017">ปิดใช้ธีมมืด</translation> <translation id="1807246157184219062">สว่าง</translation> <translation id="1827738518074806965">แกลเลอรีศิลปะ</translation> +<translation id="1836553715834333258">สีของระบบ</translation> <translation id="1838374766361614909">ล้างการค้นหา</translation> +<translation id="1840474674287087346">สีของเดสก์ท็อป</translation> <translation id="1851218745569890714">การประชุมทางวิดีโอ</translation> <translation id="1852934301711881861">ติดตั้ง Chrome OS Flex</translation> <translation id="1856388568474281774">ลูกศรลง</translation> @@ -421,6 +423,7 @@ <translation id="4454245904991689773">สแกนแล้วบันทึกไว้ใน</translation> <translation id="4479639480957787382">อีเทอร์เน็ต</translation> <translation id="4483049906298469269">ใช้คำสั่ง ping กับเกตเวย์เครือข่ายที่ไม่ใช่ค่าเริ่มต้นไม่สำเร็จ</translation> +<translation id="4500966230243561393">สีของอินเทอร์เฟซ</translation> <translation id="4503223151711056411">ลูกศรซ้าย</translation> <translation id="4507392511610824664">เพิ่มความสว่าง</translation> <translation id="4511264077854731334">พอร์ทัล</translation> @@ -499,6 +502,7 @@ <translation id="500920857929044050">หยุดการทดสอบ</translation> <translation id="5017508259293544172">LEAP</translation> <translation id="5019310272469539976">ระบบจะแสดงรูปภาพ เวลา สภาพอากาศ และข้อมูลสื่อเมื่อไม่มีการใช้งานหน้าจอ</translation> +<translation id="5035083460461104704">สีของธีม</translation> <translation id="5038292761217083259">แป้นพิมพ์หลากสี</translation> <translation id="5039804452771397117">อนุญาต</translation> <translation id="5049856988445523908">ล็อกซิมแล้ว (<ph name="LOCK_TYPE" />)</translation> @@ -814,6 +818,7 @@ <translation id="7618774594543487847">ปานกลาง</translation> <translation id="7620771111601174153">ดูข้อมูลเพิ่มเติมในศูนย์ช่วยเหลือ</translation> <translation id="763165478673169849">เวลารีเซ็ตล่าสุด</translation> +<translation id="7633068090678117093">ภาพพื้นหลัง</translation> <translation id="7648838807254605802">เวลาในการตอบสนองของ HTTPS สูง</translation> <translation id="765159867434478292">แยก</translation> <translation id="7656388927906093505">อุปกรณ์เป็นเมาส์</translation> @@ -979,6 +984,7 @@ <translation id="8930521118335213258">รายการเทียบเท่า</translation> <translation id="8930622219860340959">ไร้สาย</translation> <translation id="8936793075252196307">ที่อยู่ IP ของไคลเอ็นต์</translation> +<translation id="8944651180182756621">สีของ Launcher</translation> <translation id="894617464444543719">อุปกรณ์เป็นโทรศัพท์</translation> <translation id="8957423540740801332">ด้านขวา</translation> <translation id="8968751544471797276">อัตราการชาร์จ</translation> @@ -1012,6 +1018,7 @@ <translation id="9149391708638971077">ทดสอบหน่วยความจำ</translation> <translation id="9161276708550942948">วรรค</translation> <translation id="9173638680043580060">เหลืออีกไม่ถึง 1 นาที</translation> +<translation id="9174334653006917325">สีของ UI</translation> <translation id="917720651393141712">ทดสอบ</translation> <translation id="9188992814426075118">แป้นพิมพ์สามารถจับคู่กับวอลเปเปอร์ได้โดยอัตโนมัติ</translation> <translation id="9189000703457422362">ไม่สามารถเชื่อมต่อกับเครือข่ายนี้โดยใช้ APN ที่ตรวจพบโดยอัตโนมัติ โปรดติดต่อสอบถามข้อมูลเพิ่มเติมจากผู้ให้บริการเครือข่ายมือถือ</translation>
diff --git a/chromeos/strings/chromeos_strings_tr.xtb b/chromeos/strings/chromeos_strings_tr.xtb index 3b9be7c..cb03c13 100644 --- a/chromeos/strings/chromeos_strings_tr.xtb +++ b/chromeos/strings/chromeos_strings_tr.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> bu cihazı yönetiyor ve etkinliklerinizi izleyebilir.</translation> <translation id="1478594628797167447">Tarayıcı</translation> <translation id="1483493594462132177">Gönder</translation> +<translation id="1488850966314959671">Etkinleştirilmiş özel APN'ler kullanarak bu ağa bağlanılamıyor. Daha fazla bilgi için mobil operatörünüzle iletişime geçin.</translation> <translation id="1491076385728777984"><ph name="DEVICE_NAME" /> cihazındaki donanım yazılımı güncelleniyor</translation> <translation id="1499041187027566160">sesi aç</translation> <translation id="1499900233129743732"><ph name="MANAGER" />, bu kullanıcıyı yönetir ve hem ayarları uzaktan yönetebilir hem de kullanıcı etkinliğini izleyebilir.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Yeniden tara</translation> <translation id="5583640892426849032">Geri al tuşu</translation> +<translation id="5584044598279886848">Bu APN devre dışı bırakılamaz veya kaldırılamaz. Etkin durumdaki eklenmiş APN'lerin devre dışı bırakıldığından veya kaldırıldığından emin olun.</translation> <translation id="5600027863942488546"><ph name="KEY_NAME" /> tuşu test edildi</translation> <translation id="5620281292257375798">Yalnızca dahili</translation> <translation id="5649768706273821470">Dinle</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">Bir dakikadan az kaldı</translation> <translation id="917720651393141712">Test</translation> <translation id="9188992814426075118">Klavyeniz duvar kağıdınızla otomatik olarak eşleşebilir</translation> +<translation id="9189000703457422362">Otomatik olarak algılanan APN'ler kullanarak bu ağa bağlanılamıyor. Daha fazla bilgi için mobil operatörünüzle iletişime geçin.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Android uygulamalarından ağ geçidiyle iletişim kurulamıyor</translation> <translation id="9211490828691860325">Tüm masalar</translation>
diff --git a/chromeos/strings/chromeos_strings_uk.xtb b/chromeos/strings/chromeos_strings_uk.xtb index 4dbc99a..1cd1747 100644 --- a/chromeos/strings/chromeos_strings_uk.xtb +++ b/chromeos/strings/chromeos_strings_uk.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> керує цим пристроєм і може відстежувати ваші дії.</translation> <translation id="1478594628797167447">Сканери</translation> <translation id="1483493594462132177">Надіслати</translation> +<translation id="1488850966314959671">Не вдалося підключитися до цієї мережі через увімкнені спеціальні точки доступу. Щоб отримати додаткову інформацію, зверніться до свого оператора мобільного зв’язку.</translation> <translation id="1491076385728777984"><ph name="DEVICE_NAME" />: оновлення мікропрограми на пристрої</translation> <translation id="1499041187027566160">збільшити гучність</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> керує цим користувачем і може віддалено змінювати налаштування та відстежувати його дії.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">Технологія UMTS</translation> <translation id="5578519639599103840">Сканувати ще раз</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5584044598279886848">Не вдалося вимкнути або вилучити цю точку доступу. Переконайтеся, що ввімкнені точки доступу, які підключено, вимкнено або вилучено.</translation> <translation id="5600027863942488546">Клавішу "<ph name="KEY_NAME" />" перевірено</translation> <translation id="5620281292257375798">Лише для внутрішнього використання</translation> <translation id="5649768706273821470">Слухати</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">Залишилося менше хвилини</translation> <translation id="917720651393141712">Перевірити</translation> <translation id="9188992814426075118">Колір підсвічування клавіатури може автоматично підлаштовуватися до фонового малюнка</translation> +<translation id="9189000703457422362">Не вдалося підключитися до цієї мережі через автоматично виявлені точки доступу. Щоб отримати додаткову інформацію, зверніться до свого оператора мобільного зв’язку.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Не вдається зв’язатися зі шлюзом із додатків для Android</translation> <translation id="9211490828691860325">Усі робочі столи</translation>
diff --git a/chromeos/strings/chromeos_strings_uz.xtb b/chromeos/strings/chromeos_strings_uz.xtb index 049a22c..d4c46d5 100644 --- a/chromeos/strings/chromeos_strings_uz.xtb +++ b/chromeos/strings/chromeos_strings_uz.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872">Bu qurilma <ph name="MANAGER" /> domenida boshqariladi va faoliyatingiz kuzatilishi mumkin.</translation> <translation id="1478594628797167447">Skaner</translation> <translation id="1483493594462132177">Yuborish</translation> +<translation id="1488850966314959671">Yoqilgan shaxsiy APNlar orqali bu tarmoqqa ulanmadi. Batafsil axborot olish uchun mobil aloqa operatoriga bogʻlaning.</translation> <translation id="1491076385728777984"><ph name="DEVICE_NAME" /> mikrodasturi yangilanmoqda</translation> <translation id="1499041187027566160">ovozni ko‘tarish</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> bu foydalanuvchi faoliyatini masofadan kuzatishi va boshqarishi mumkin.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Qayta skanerlash</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5584044598279886848">Bu APN faolsizlantirilmadi yoki olib tashlanmadi. Unga ulangan APN nuqtalari faolsizlantirilishi yoki olib tashlanishi kerak</translation> <translation id="5600027863942488546"><ph name="KEY_NAME" /> tugmasi sinaldi</translation> <translation id="5620281292257375798">Maxfiy</translation> <translation id="5649768706273821470">Tinglash</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">Bir daqiqadan kamroq vaqt qoldi</translation> <translation id="917720651393141712">Test</translation> <translation id="9188992814426075118">Klaviatura ranglari fon rasmiga avtomatik moslanishi mumkin</translation> +<translation id="9189000703457422362">Avtomatik topilgan APN orqali bu tarmoqqa ulanish imkonsiz. Batafsil axborot olish uchun mobil aloqa operatoriga bogʻlaning.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Android ilovalardan shlyuzga ulanish imkonsiz</translation> <translation id="9211490828691860325">Barcha ish stollari</translation>
diff --git a/chromeos/strings/chromeos_strings_vi.xtb b/chromeos/strings/chromeos_strings_vi.xtb index 2190205..9209b13 100644 --- a/chromeos/strings/chromeos_strings_vi.xtb +++ b/chromeos/strings/chromeos_strings_vi.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> quản lý thiết bị này và có thể giám sát hoạt động của bạn.</translation> <translation id="1478594628797167447">Máy quét</translation> <translation id="1483493594462132177">Gửi</translation> +<translation id="1488850966314959671">Không thể kết nối với mạng này bằng bất cứ APN tuỳ chỉnh đã bật nào. Hãy liên hệ với nhà mạng di động để biết thêm thông tin.</translation> <translation id="1491076385728777984">Cập nhật chương trình cơ sở trên <ph name="DEVICE_NAME" /></translation> <translation id="1499041187027566160">tăng âm lượng</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> quản lý người dùng này và có thể quản lý từ xa các tùy chọn cài đặt cũng như giám sát hoạt động của người dùng.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">Quét lại</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5584044598279886848">Không thể tắt hoặc xoá APN này. Hãy nhớ tắt hoặc xoá các APN đính kèm đã bật.</translation> <translation id="5600027863942488546">Đã thử phím <ph name="KEY_NAME" /></translation> <translation id="5620281292257375798">Chỉ sử dụng nội bộ</translation> <translation id="5649768706273821470">Nghe</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">Còn chưa đầy 1 phút</translation> <translation id="917720651393141712">Kiểm tra</translation> <translation id="9188992814426075118">Bàn phím có thể tự động khớp với hình nền của bạn</translation> +<translation id="9189000703457422362">Không thể kết nối với mạng này bằng APN được phát hiện tự động. Hãy liên hệ với nhà mạng di động để biết thêm thông tin.</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Không thể kết nối với cổng vào từ các ứng dụng Android</translation> <translation id="9211490828691860325">Tất cả các không gian làm việc</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-HK.xtb b/chromeos/strings/chromeos_strings_zh-HK.xtb index 30651a12..5228343d 100644 --- a/chromeos/strings/chromeos_strings_zh-HK.xtb +++ b/chromeos/strings/chromeos_strings_zh-HK.xtb
@@ -64,7 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> 會管理此裝置,並可能監察您的活動。</translation> <translation id="1478594628797167447">掃瞄器</translation> <translation id="1483493594462132177">傳送</translation> -<translation id="1488850966314959671">無法透過任何已啟用的自訂 APN 連上這個網路,詳情請洽詢你的行動電信業者。</translation> +<translation id="1488850966314959671">無法透過任何已啟用的自訂 APN 連線至此網絡,請聯絡流動網絡供應商以瞭解詳情。</translation> <translation id="1491076385728777984">正在更新 <ph name="DEVICE_NAME" />的韌體</translation> <translation id="1499041187027566160">調高音量</translation> <translation id="1499900233129743732"><ph name="MANAGER" /> 管理此使用者,並可能會遠端管理設定並監察使用者活動。</translation> @@ -564,7 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">重新掃瞄</translation> <translation id="5583640892426849032">Backspace</translation> -<translation id="5584044598279886848">無法停用或移除這個 APN,請務必停用或移除已啟用的連結 APN。</translation> +<translation id="5584044598279886848">無法停用或移除此 APN。請確保啟用的附加 APN 都已停用或移除。</translation> <translation id="5600027863942488546">測試咗 <ph name="KEY_NAME" /> 制</translation> <translation id="5620281292257375798">只供內部使用</translation> <translation id="5649768706273821470">收聽</translation> @@ -1014,7 +1014,7 @@ <translation id="9173638680043580060">尚餘不到 1 分鐘</translation> <translation id="917720651393141712">測試</translation> <translation id="9188992814426075118">鍵盤可自動與桌布配搭</translation> -<translation id="9189000703457422362">無法透過自動偵測到的 APN 連上這個網路,詳情請洽詢你的行動電信業者。</translation> +<translation id="9189000703457422362">無法透過自動偵測的 APN 連線至此網絡。請聯絡流動網絡供應商以瞭解詳情。</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">無法從 Android 應用程式連線至閘道</translation> <translation id="9211490828691860325">所有桌面</translation>
diff --git a/chromeos/strings/chromeos_strings_zu.xtb b/chromeos/strings/chromeos_strings_zu.xtb index bb783e5..457806b0 100644 --- a/chromeos/strings/chromeos_strings_zu.xtb +++ b/chromeos/strings/chromeos_strings_zu.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> iphatha le divayisi futhi ingakwazi ukwengamela umsebenzi wakho.</translation> <translation id="1478594628797167447">Iskena</translation> <translation id="1483493594462132177">Thumela</translation> +<translation id="1488850966314959671">Ayikwazi ukuxhuma kule nethiwekhi isebenzisa noma yimaphi ama-APN angokwezifiso anikwe amandla. Xhumana nenkampani yakho yenethiwekhi yeselula ukuze uthole ulwazi olwengeziwe.</translation> <translation id="1491076385728777984">Ibuyekeza i-firmware ku-<ph name="DEVICE_NAME" /></translation> <translation id="1499041187027566160">ivolumu iphezulu</translation> <translation id="1499900233129743732">I-<ph name="MANAGER" /> iphatha lo msebenzisi futhi ingaphatha amasethingi isekudeni futhi iqaphe umsebenzi womsebenzisi.</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">I-UMTS</translation> <translation id="5578519639599103840">Phinda uskene</translation> <translation id="5583640892426849032">I-Backspace</translation> +<translation id="5584044598279886848">Ayikwazi ukukhubaza noma ukususa le APN. Qinisekisa ukuthi i-APN yokunamathisela enikwe amandla ivaliwe noma ikhishiwe.</translation> <translation id="5600027863942488546">Ukhiye we-<ph name="KEY_NAME" /> uhloliwe</translation> <translation id="5620281292257375798">Kwangaphakathi kuphela</translation> <translation id="5649768706273821470">Lalela</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">Ngaphansi kweminithi okusele</translation> <translation id="917720651393141712">Ukuhlolwa</translation> <translation id="9188992814426075118">Ikhibhodi yakho ingafanisa ngokuzenzekelayo isithombe sakho sangemuva</translation> +<translation id="9189000703457422362">Ayikwazi ukuxhuma kule nethiwekhi isebenzisa ama-APN atholwe ngokuzenzekelayo. Xhumana nenkampani yakho yenethiwekhi yeselula ukuze uthole ulwazi olwengeziwe.</translation> <translation id="9193744392140377127">I-APN*</translation> <translation id="9204237731135241582">Ayikwazi ukuxhumana nomasango ovela kuma-app we-Android</translation> <translation id="9211490828691860325">Wonke amatafula</translation>
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 074efbf9..816c12766 100644 --- a/chromeos/ui/frame/multitask_menu/multitask_menu_nudge_controller.cc +++ b/chromeos/ui/frame/multitask_menu/multitask_menu_nudge_controller.cc
@@ -332,9 +332,15 @@ return; } - // If the anchor is passed and hidden, we cannot show the nudge. - if (anchor_view && !anchor_view->IsDrawn()) { - return; + // If the anchor is passed and hidden or offscreen, we cannot show the nudge. + if (anchor_view) { + if (!anchor_view->IsDrawn() || + !display::Screen::GetScreen() + ->GetDisplayNearestWindow(window) + .bounds() + .Contains(anchor_view->GetBoundsInScreen())) { + return; + } } window_ = window; @@ -357,7 +363,13 @@ } UpdateWidgetAndPulse(); - CHECK(nudge_widget_); + + // It is possible `UpdateWidgetAndPulse` could not find a good bounds to place + // the nudge. In that case the widget and pulse and observations would have + // been cleaned up. + if (!nudge_widget_) { + return; + } // Fade the education nudge in. ui::Layer* layer = nudge_widget_->GetLayer();
diff --git a/components/BUILD.gn b/components/BUILD.gn index fe0075d..29eaada 100644 --- a/components/BUILD.gn +++ b/components/BUILD.gn
@@ -347,6 +347,9 @@ "//components/file_access:unit_tests", "//components/gcm_driver/instance_id:unit_tests", "//components/heavy_ad_intervention:unit_tests", + "//components/history/content/browser:unit_tests", + "//components/history_clusters/core:unit_tests", + "//components/history_clusters/ui:unit_tests", "//components/invalidation/impl:unit_tests", "//components/javascript_dialogs:unit_tests", "//components/js_injection/common:unit_tests", @@ -414,9 +417,6 @@ "//components/browsing_topics/common:unit_tests", "//components/certificate_transparency:unit_tests", "//components/content_settings/browser:unit_tests", - "//components/history/content/browser:unit_tests", - "//components/history_clusters/core:unit_tests", - "//components/history_clusters/ui:unit_tests", "//components/language/content/browser:unit_tests", "//components/media_router/browser:unit_tests", "//components/media_router/common:unit_tests",
diff --git a/components/app_restore/app_restore_data.cc b/components/app_restore/app_restore_data.cc index dc146d2..d2704c83 100644 --- a/components/app_restore/app_restore_data.cc +++ b/components/app_restore/app_restore_data.cc
@@ -32,7 +32,7 @@ constexpr char kActivationIndexKey[] = "index"; constexpr char kFirstNonPinnedTabIndexKey[] = "first_non_pinned_tab_index"; constexpr char kDeskIdKey[] = "desk_id"; -constexpr char kDeskGuidKey[] = "desk_guid"; +constexpr char kDeskUuidKey[] = "desk_guid"; constexpr char kCurrentBoundsKey[] = "current_bounds"; constexpr char kWindowStateTypeKey[] = "window_state_type"; constexpr char kPreMinimizedShowStateTypeKey[] = "pre_min_state"; @@ -247,7 +247,7 @@ first_non_pinned_tab_index = GetIntValueFromDict(data, kFirstNonPinnedTabIndexKey); desk_id = GetIntValueFromDict(data, kDeskIdKey); - desk_guid = GetGuidValueFromDict(data, kDeskGuidKey); + desk_guid = GetGuidValueFromDict(data, kDeskUuidKey); current_bounds = GetBoundsRectFromDict(data, kCurrentBoundsKey); window_state_type = GetWindowStateTypeFromDict(data); pre_minimized_show_state_type = GetPreMinimizedShowStateTypeFromDict(data); @@ -443,7 +443,7 @@ launch_info_dict.Set(kDeskIdKey, desk_id.value()); if (desk_guid.is_valid()) { - launch_info_dict.Set(kDeskGuidKey, desk_guid.AsLowercaseString()); + launch_info_dict.Set(kDeskUuidKey, desk_guid.AsLowercaseString()); } if (current_bounds.has_value()) {
diff --git a/components/app_restore/app_restore_utils.cc b/components/app_restore/app_restore_utils.cc index 54b261dc..0776de50 100644 --- a/components/app_restore/app_restore_utils.cc +++ b/components/app_restore/app_restore_utils.cc
@@ -108,8 +108,11 @@ ApplyProperties(window_info.get(), &out_params->init_properties_container); - if (window_info->desk_id) + if (window_info->desk_guid.is_valid()) { + out_params->workspace = window_info->desk_guid.AsLowercaseString(); + } else if (window_info->desk_id) { out_params->workspace = base::NumberToString(*window_info->desk_id); + } if (window_info->current_bounds) out_params->bounds = *window_info->current_bounds; if (window_info->window_state_type) {
diff --git a/components/app_restore/restore_data.cc b/components/app_restore/restore_data.cc index d93cc9c..0b31010 100644 --- a/components/app_restore/restore_data.cc +++ b/components/app_restore/restore_data.cc
@@ -303,10 +303,10 @@ return data_it->second.get(); } -void RestoreData::SetDeskIndex(int desk_index) { +void RestoreData::SetDeskUuid(const base::Uuid& desk_uuid) { for (auto& [app_id, launch_list] : app_id_to_launch_list_) { for (auto& [window_id, app_restore_data] : launch_list) { - app_restore_data->desk_id = desk_index; + app_restore_data->desk_guid = desk_uuid; } } }
diff --git a/components/app_restore/restore_data.h b/components/app_restore/restore_data.h index e328577..d5869a7 100644 --- a/components/app_restore/restore_data.h +++ b/components/app_restore/restore_data.h
@@ -176,8 +176,8 @@ const AppRestoreData* GetAppRestoreData(const std::string& app_id, int window_id) const; - // Sets `desk_index` as the desk to launch on for all windows. - void SetDeskIndex(int desk_index); + // Sets `desk_uuid` as the desk to launch on for all windows. + void SetDeskUuid(const base::Uuid& desk_uuid); // Make all contained window IDs globally unique for a desk template // launch. This must be done before launching. Returns a mapping of new window
diff --git a/components/app_restore/restore_data_unittest.cc b/components/app_restore/restore_data_unittest.cc index fe40cda5..bb7dad6f 100644 --- a/components/app_restore/restore_data_unittest.cc +++ b/components/app_restore/restore_data_unittest.cc
@@ -399,7 +399,7 @@ kCurrentBounds1, kWindowStateType1, kPreMinimizedWindowStateType1, /*snap_percentage=*/0, kMaxSize1, kMinSize1, std::u16string(kTitle1), kBoundsInRoot1, kPrimaryColor1, kStatusBarColor1, - /*tab_group_infos=*/{}); + /*expected_tab_group_infos=*/{}); const auto app_restore_data_it2 = launch_list_it1->second.find(kWindowId2); std::vector<tab_groups::TabGroupInfo> expected_tab_group_infos; @@ -498,7 +498,8 @@ kActivationIndex2, kFirstNonPinnedTabIndex, kDeskId2, kDeskGuid2, kCurrentBounds2, kWindowStateType2, kPreMinimizedWindowStateType2, /*snap_percentage=*/0, absl::nullopt, kMinSize2, std::u16string(kTitle2), - kBoundsInRoot2, kPrimaryColor2, kStatusBarColor2, /*tab_group_infos=*/{}); + kBoundsInRoot2, kPrimaryColor2, kStatusBarColor2, + /*expected_tab_group_infos=*/{}); // Verify the restore data for |kAppId2| still exists. const auto launch_list_it2 = @@ -923,4 +924,46 @@ EXPECT_TRUE(*app_restore_data_1 == *app_restore_data_2); } +TEST_F(RestoreDataTest, ToString) { + AddAppLaunchInfos(); + ModifyWindowInfos(); + ModifyThemeColors(); + VerifyRestoreData(restore_data()); + const std::string expected_string = base::StringPrintf( + "( (App ID: %s, Count: 2)(Window ID: %d)Activation index: %d \n" + "Desk: 1 \n" + "Desk guid: %s \n" + "Current bounds: %s \n" + "Window state: %d \n" + "Pre minimized show state: -1 \n" + "Snap percentage: -1 \n" + "Display id: -1 \n" + "App Title: %s(Window ID: %d)Activation index: %d \n" + "Desk: 2 \n" + "Desk guid: %s \n" + "Current bounds: %s \n" + "Window state: %d \n" + "Pre minimized show state: 3 \n" + "Snap percentage: -1 \n" + "Display id: -1 \n" + "App Title: %s(App ID: %s, Count: 1)(Window ID: %d)Activation index: %d " + "\n" + "Desk: -2 \nDesk guid: %s \n" + "Current bounds: %s \n" + "Window state: %d \n" + "Pre minimized show state: -1 \n" + "Snap percentage: 75 \n" + "Display id: -1 \nApp Title: )", + kAppId1, kWindowId1, kActivationIndex1, + kDeskGuid1.AsLowercaseString().c_str(), + kCurrentBounds1.ToString().c_str(), kWindowStateType1, + base::UTF16ToUTF8(kTitle1).c_str(), kWindowId2, kActivationIndex2, + kDeskGuid2.AsLowercaseString().c_str(), + kCurrentBounds2.ToString().c_str(), kWindowStateType2, + base::UTF16ToUTF8(kTitle2).c_str(), kAppId2, kWindowId3, + kActivationIndex3, kDeskGuid3.AsLowercaseString().c_str(), + kCurrentBounds3.ToString().c_str(), kWindowStateType3); + EXPECT_EQ(restore_data().ToString(), expected_string); +} + } // namespace app_restore
diff --git a/components/app_restore/window_info.cc b/components/app_restore/window_info.cc index b056747..f1251b6 100644 --- a/components/app_restore/window_info.cc +++ b/components/app_restore/window_info.cc
@@ -42,7 +42,7 @@ std::string ToPrefixedString(base::Uuid val, const std::string& prefix) { return prefix + ": " + - (val.is_valid() ? val : base::Uuid()).AsLowercaseString(); + (val.is_valid() ? val : base::Uuid()).AsLowercaseString() + " \n"; } } // namespace
diff --git a/components/autofill/core/browser/autofill_profile_sync_util.cc b/components/autofill/core/browser/autofill_profile_sync_util.cc index 0c6c7d5..904f227 100644 --- a/components/autofill/core/browser/autofill_profile_sync_util.cc +++ b/components/autofill/core/browser/autofill_profile_sync_util.cc
@@ -183,6 +183,11 @@ specifics->set_address_home_landmark( TruncateUTF8(UTF16ToUTF8(entry.GetRawInfo(ADDRESS_HOME_LANDMARK)))); } + if (base::FeatureList::IsEnabled( + features::kAutofillEnableSupportForBetweenStreets)) { + specifics->set_address_home_between_streets(TruncateUTF8( + UTF16ToUTF8(entry.GetRawInfo(ADDRESS_HOME_BETWEEN_STREETS)))); + } specifics->set_address_home_street_address( TruncateUTF8(UTF16ToUTF8(entry.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS)))); specifics->set_address_home_line1( @@ -229,6 +234,12 @@ ConvertProfileToSpecificsVerificationStatus( entry.GetVerificationStatus(ADDRESS_HOME_LANDMARK))); } + if (base::FeatureList::IsEnabled( + features::kAutofillEnableSupportForBetweenStreets)) { + specifics->set_address_home_between_streets_status( + ConvertProfileToSpecificsVerificationStatus( + entry.GetVerificationStatus(ADDRESS_HOME_BETWEEN_STREETS))); + } specifics->set_address_home_street_address_status( ConvertProfileToSpecificsVerificationStatus( entry.GetVerificationStatus(ADDRESS_HOME_STREET_ADDRESS))); @@ -443,6 +454,15 @@ specifics.address_home_landmark_status())); } + if (base::FeatureList::IsEnabled( + features::kAutofillEnableSupportForBetweenStreets)) { + profile->SetRawInfoWithVerificationStatus( + ADDRESS_HOME_BETWEEN_STREETS, + UTF8ToUTF16(specifics.address_home_between_streets()), + ConvertSpecificsToProfileVerificationStatus( + specifics.address_home_between_streets_status())); + } + // Set either the deprecated subparts (line1 & line2) or the full address // (street_address) if it is present. This is needed because all the address // fields are backed by the same storage.
diff --git a/components/autofill/core/browser/autofill_profile_sync_util_unittest.cc b/components/autofill/core/browser/autofill_profile_sync_util_unittest.cc index 834217e..bc2c3859 100644 --- a/components/autofill/core/browser/autofill_profile_sync_util_unittest.cc +++ b/components/autofill/core/browser/autofill_profile_sync_util_unittest.cc
@@ -95,6 +95,10 @@ profile.SetRawInfoWithVerificationStatus(ADDRESS_HOME_LANDMARK, u"Red tree", VerificationStatus::kObserved); + profile.SetRawInfoWithVerificationStatus(ADDRESS_HOME_BETWEEN_STREETS, + u"Marcos y Oliva", + VerificationStatus::kObserved); + profile.SetRawInfoWithVerificationStatus(ADDRESS_HOME_SORTING_CODE, u"CEDEX", VerificationStatus::kObserved); @@ -256,6 +260,10 @@ specifics.set_address_home_landmark_status( sync_pb::AutofillProfileSpecifics_VerificationStatus_OBSERVED); + specifics.set_address_home_between_streets("Marcos y Oliva"); + specifics.set_address_home_between_streets_status( + sync_pb::AutofillProfileSpecifics_VerificationStatus_OBSERVED); + specifics.set_address_home_sorting_code("CEDEX"); specifics.set_address_home_sorting_code_status( sync_pb::AutofillProfileSpecifics_VerificationStatus_OBSERVED); @@ -279,7 +287,10 @@ AutofillProfileSyncUtilTest() { // Fix a time for implicitly constructed use_dates in AutofillProfile. test_clock_.SetNow(kJune2017); - features_.InitAndEnableFeature(features::kAutofillEnableSupportForLandmark); + features_.InitWithFeatures( + {features::kAutofillEnableSupportForLandmark, + features::kAutofillEnableSupportForBetweenStreets}, + {}); } private:
diff --git a/components/autofill/core/browser/contact_info_sync_util.cc b/components/autofill/core/browser/contact_info_sync_util.cc index 51efc428..83657fed 100644 --- a/components/autofill/core/browser/contact_info_sync_util.cc +++ b/components/autofill/core/browser/contact_info_sync_util.cc
@@ -199,6 +199,11 @@ features::kAutofillEnableSupportForLandmark)) { s.Set(specifics.mutable_address_landmark(), ADDRESS_HOME_LANDMARK); } + if (base::FeatureList::IsEnabled( + features::kAutofillEnableSupportForBetweenStreets)) { + s.Set(specifics.mutable_address_between_streets(), + ADDRESS_HOME_BETWEEN_STREETS); + } // Set email, phone and company values and statuses. s.Set(specifics.mutable_email_address(), EMAIL_ADDRESS); @@ -301,6 +306,10 @@ features::kAutofillEnableSupportForLandmark)) { s.Set(specifics.address_landmark(), ADDRESS_HOME_LANDMARK); } + if (base::FeatureList::IsEnabled( + features::kAutofillEnableSupportForBetweenStreets)) { + s.Set(specifics.address_between_streets(), ADDRESS_HOME_BETWEEN_STREETS); + } // Set email, phone and company values and statuses. s.Set(specifics.email_address(), EMAIL_ADDRESS); @@ -442,6 +451,10 @@ trimmed_specifics.clear_address_landmark(); } + if (d.Delete(trimmed_specifics.mutable_address_between_streets())) { + trimmed_specifics.clear_address_between_streets(); + } + // Delete email, phone and company values and statuses. if (d.Delete(trimmed_specifics.mutable_email_address())) { trimmed_specifics.clear_email_address();
diff --git a/components/autofill/core/browser/contact_info_sync_util_unittest.cc b/components/autofill/core/browser/contact_info_sync_util_unittest.cc index bbd2ea3..1f4a64b 100644 --- a/components/autofill/core/browser/contact_info_sync_util_unittest.cc +++ b/components/autofill/core/browser/contact_info_sync_util_unittest.cc
@@ -95,6 +95,9 @@ VerificationStatus::kParsed); profile.SetRawInfoWithVerificationStatus(ADDRESS_HOME_LANDMARK, u"Red tree", VerificationStatus::kObserved); + profile.SetRawInfoWithVerificationStatus(ADDRESS_HOME_BETWEEN_STREETS, + u"Marcos y Oliva", + VerificationStatus::kObserved); // All of the following types don't store verification statuses. // Set email, phone and company values. @@ -191,7 +194,8 @@ ContactInfoSpecifics::PARSED); SetToken(specifics.mutable_address_landmark(), "Red tree", ContactInfoSpecifics::OBSERVED); - + SetToken(specifics.mutable_address_between_streets(), "Marcos y Oliva", + ContactInfoSpecifics::OBSERVED); // All of the following types don't store verification statuses in // AutofillProfile. This corresponds to `VERIFICATION_STATUS_UNSPECIFIED`. // Set email, phone and company values and statuses. @@ -218,7 +222,10 @@ class ContactInfoSyncUtilTest : public testing::Test { public: ContactInfoSyncUtilTest() { - features_.InitAndEnableFeature(features::kAutofillEnableSupportForLandmark); + features_.InitWithFeatures( + {features::kAutofillEnableSupportForLandmark, + features::kAutofillEnableSupportForBetweenStreets}, + {}); } private:
diff --git a/components/autofill/core/browser/webdata/autofill_table.cc b/components/autofill/core/browser/webdata/autofill_table.cc index 0dddbe3..1096aab 100644 --- a/components/autofill/core/browser/webdata/autofill_table.cc +++ b/components/autofill/core/browser/webdata/autofill_table.cc
@@ -36,6 +36,7 @@ #include "components/autofill/core/browser/data_model/credit_card.h" #include "components/autofill/core/browser/data_model/credit_card_cloud_token_data.h" #include "components/autofill/core/browser/data_model/iban.h" +#include "components/autofill/core/browser/field_types.h" #include "components/autofill/core/browser/geo/autofill_country.h" #include "components/autofill/core/browser/payments/payments_customer_data.h" #include "components/autofill/core/browser/personal_data_manager.h" @@ -1075,6 +1076,7 @@ ADDRESS_HOME_APT_NUM, ADDRESS_HOME_FLOOR, ADDRESS_HOME_LANDMARK, + ADDRESS_HOME_BETWEEN_STREETS, EMAIL_ADDRESS, PHONE_HOME_WHOLE_NUMBER, BIRTHDATE_DAY, @@ -1118,6 +1120,11 @@ type == ADDRESS_HOME_LANDMARK) { continue; } + if (!base::FeatureList::IsEnabled( + features::kAutofillEnableSupportForBetweenStreets) && + type == ADDRESS_HOME_BETWEEN_STREETS) { + continue; + } InsertBuilder(db, s, kContactInfoTypeTokensTable, {kGuid, kType, kValue, kVerificationStatus}); s.BindString(0, profile.guid());
diff --git a/components/autofill/core/browser/webdata/autofill_table_unittest.cc b/components/autofill/core/browser/webdata/autofill_table_unittest.cc index c47840986..a964cc5 100644 --- a/components/autofill/core/browser/webdata/autofill_table_unittest.cc +++ b/components/autofill/core/browser/webdata/autofill_table_unittest.cc
@@ -175,8 +175,10 @@ if (profile_source() == AutofillProfile::Source::kAccount) { // Only enable support for new setting visible features for kAccount // source. - features_.InitAndEnableFeature( - features::kAutofillEnableSupportForLandmark); + features_.InitWithFeatures( + {features::kAutofillEnableSupportForLandmark, + features::kAutofillEnableSupportForBetweenStreets}, + {}); } } AutofillProfile::Source profile_source() const { return GetParam(); } @@ -969,6 +971,12 @@ home_profile.SetRawInfoWithVerificationStatus( ADDRESS_HOME_LANDMARK, u"Red tree", VerificationStatus::kObserved); } + if (base::FeatureList::IsEnabled( + features::kAutofillEnableSupportForBetweenStreets)) { + home_profile.SetRawInfoWithVerificationStatus( + ADDRESS_HOME_BETWEEN_STREETS, u"Marcos y Oliva", + VerificationStatus::kObserved); + } home_profile.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, u"18181234567"); home_profile.SetRawInfoAsInt(BIRTHDATE_DAY, 14); @@ -1221,6 +1229,10 @@ features::kAutofillEnableSupportForLandmark)) { profile.SetRawInfo(ADDRESS_HOME_LANDMARK, u"Red tree"); } + if (base::FeatureList::IsEnabled( + features::kAutofillEnableSupportForBetweenStreets)) { + profile.SetRawInfo(ADDRESS_HOME_BETWEEN_STREETS, u"Marcos y Oliva"); + } profile.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, u"18181234567"); profile.SetRawInfoAsInt(BIRTHDATE_DAY, 14); profile.SetRawInfoAsInt(BIRTHDATE_MONTH, 3);
diff --git a/components/autofill/core/common/autofill_features.cc b/components/autofill/core/common/autofill_features.cc index 716babd1c..c1a8848 100644 --- a/components/autofill/core/common/autofill_features.cc +++ b/components/autofill/core/common/autofill_features.cc
@@ -184,6 +184,12 @@ "AutofillEnableSelectMenu", base::FEATURE_DISABLED_BY_DEFAULT); +// Controls if Chrome support filling and importing between streets. +// TODO(crbug.com/1441904) Remove once launched. +BASE_FEATURE(kAutofillEnableSupportForBetweenStreets, + "AutofillEnableSupportForBetweenStreets", + base::FEATURE_DISABLED_BY_DEFAULT); + // Controls if Chrome support filling and importing landmarks. // TODO(crbug.com/1441904) Remove once launched. BASE_FEATURE(kAutofillEnableSupportForLandmark,
diff --git a/components/autofill/core/common/autofill_features.h b/components/autofill/core/common/autofill_features.h index 3b79252..44039b7 100644 --- a/components/autofill/core/common/autofill_features.h +++ b/components/autofill/core/common/autofill_features.h
@@ -48,6 +48,8 @@ COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillEnableSelectMenu); COMPONENT_EXPORT(AUTOFILL) +BASE_DECLARE_FEATURE(kAutofillEnableSupportForBetweenStreets); +COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillEnableSupportForLandmark); COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillEnableWithinFencedFrame);
diff --git a/components/autofill/ios/browser/autofill_agent.mm b/components/autofill/ios/browser/autofill_agent.mm index c24a2bc..75dadaf 100644 --- a/components/autofill/ios/browser/autofill_agent.mm +++ b/components/autofill/ios/browser/autofill_agent.mm
@@ -636,6 +636,7 @@ // "clear form" button. NSString* value = nil; NSString* displayDescription = nil; + UIImage* icon = nil; if (popup_suggestion.frontend_id.as_int() >= 0) { // Filter out any key/value suggestions if the user hasn't typed yet. if (popup_suggestion.frontend_id == @@ -653,6 +654,23 @@ displayDescription = SysUTF16ToNSString(popup_suggestion.labels[0][0].value); } + + // Only show icon for credit card suggestions. + if (delegate && + delegate->GetPopupType() == autofill::PopupType::kCreditCards) { + // If available, the custom icon for the card is preferred over the + // generic network icon. The network icon may also be missing, in + // which case we do not set an icon at all. + if (!popup_suggestion.custom_icon.IsEmpty()) { + icon = popup_suggestion.custom_icon.ToUIImage(); + } else if (!popup_suggestion.icon.empty()) { + const int resourceID = + autofill::CreditCard::IconResourceId(popup_suggestion.icon); + icon = ui::ResourceBundle::GetSharedInstance() + .GetNativeImageNamed(resourceID) + .ToUIImage(); + } + } } else if (popup_suggestion.frontend_id == autofill::PopupItemId::kClearForm) { // Show the "clear form" button. @@ -671,21 +689,6 @@ ? SysUTF16ToNSString(*popup_suggestion.acceptance_a11y_announcement) : nil; - // Only show icon for credit card suggestions. - UIImage* icon = nil; - if (delegate && - delegate->GetPopupType() == autofill::PopupType::kCreditCards) { - if (popup_suggestion.custom_icon.IsEmpty()) { - const int resourceID = - autofill::CreditCard::IconResourceId(popup_suggestion.icon); - icon = ui::ResourceBundle::GetSharedInstance() - .GetNativeImageNamed(resourceID) - .ToUIImage(); - } else { - icon = popup_suggestion.custom_icon.ToUIImage(); - } - } - FormSuggestion* suggestion = [FormSuggestion suggestionWithValue:value displayDescription:displayDescription
diff --git a/components/autofill/ios/browser/autofill_agent_unittests.mm b/components/autofill/ios/browser/autofill_agent_unittests.mm index 3abe253..b85bc7b 100644 --- a/components/autofill/ios/browser/autofill_agent_unittests.mm +++ b/components/autofill/ios/browser/autofill_agent_unittests.mm
@@ -223,7 +223,6 @@ __block BOOL completion_handler_called = NO; autofill::MockAutofillPopupDelegate mock_delegate; - EXPECT_CALL(mock_delegate, GetPopupType); EXPECT_CALL(mock_delegate, OnPopupShown); // Make the suggestions available to AutofillAgent. @@ -277,11 +276,20 @@ .WillOnce(testing::Return(PopupType::kUnspecified)); // Initialize suggestion. std::vector<autofill::Suggestion> autofillSuggestions = { - autofill::Suggestion("", "", "visaCC", PopupItemId::kShowAccountCards)}; + autofill::Suggestion("", "", "visaCC", + autofill::Suggestion::FrontendId(1)), + // This suggestion has a valid credit card icon, but the Suggestion type + // (kShowAccountCards) is wrong. + autofill::Suggestion("", "", "visaCC", + autofill::PopupItemId::kShowAccountCards), + }; // Completion handler to retrieve suggestions. auto completionHandler = ^(NSArray<FormSuggestion*>* suggestions, id<FormSuggestionProvider> delegate) { + ASSERT_EQ(2U, suggestions.count); completion_handler_icon = [suggestions[0].icon copy]; + // The non-credit card suggestion should never have an icon. + EXPECT_EQ(nil, suggestions[1].icon); }; // Make credit card suggestion. @@ -307,6 +315,37 @@ EXPECT_EQ(nil, completion_handler_icon); } +// Tests that an empty network icon in a credit card suggestion will not cause +// any problems. Regression test for crbug.com/1446933 +TEST_F(AutofillAgentTests, showAutofillPopup_EmptyIconInCreditCardSuggestion) { + // Deliberately initialize this as non-nil, as we are expecting it to be set + // to nil by the test. + __block UIImage* completion_handler_icon = gfx::test::CreatePlatformImage(); + ASSERT_NE(nil, completion_handler_icon); + + testing::NiceMock<autofill::MockAutofillPopupDelegate> mock_delegate; + EXPECT_CALL(mock_delegate, GetPopupType) + .WillRepeatedly(testing::Return(PopupType::kCreditCards)); + + const std::string emptyIcon = ""; + std::vector<autofill::Suggestion> autofillSuggestions = {autofill::Suggestion( + "", "", emptyIcon, autofill::Suggestion::FrontendId(1))}; + + // Completion handler to retrieve suggestions. + auto completionHandler = ^(NSArray<FormSuggestion*>* suggestions, + id<FormSuggestionProvider> delegate) { + completion_handler_icon = [suggestions[0].icon copy]; + }; + + // Make credit card suggestion. + [autofill_agent_ showAutofillPopup:autofillSuggestions + popupDelegate:mock_delegate.GetWeakPtr()]; + [autofill_agent_ retrieveSuggestionsForForm:nil + webState:&fake_web_state_ + completionHandler:completionHandler]; + EXPECT_EQ(nil, completion_handler_icon); +} + // Tests that for credit cards, a custom icon is preferred over the default // icon. TEST_F(AutofillAgentTests, @@ -332,7 +371,7 @@ // Initialize suggestion, initially without a custom icon. std::vector<autofill::Suggestion> autofillSuggestions = {autofill::Suggestion( - "", "", suggestion_network_icon, PopupItemId::kShowAccountCards)}; + "", "", suggestion_network_icon, autofill::Suggestion::FrontendId(1))}; ASSERT_TRUE(autofillSuggestions[0].custom_icon.IsEmpty()); // When the custom icon is not present, the default icon should be used.
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb index 1f0ba25..b427e6a 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb
@@ -122,7 +122,7 @@ <translation id="3115898365077584848">Mostrar información</translation> <translation id="3123473560110926937">Bloqueados en algunos sitios</translation> <translation id="3143754809889689516">Reproducir desde el principio</translation> -<translation id="3162899666601560689">Los sitios pueden usar cookies para mejorar la experiencia de navegación, por ejemplo, para mantener el acceso a ellos o recordar elementos del carrito de compras.</translation> +<translation id="3162899666601560689">Los sitios pueden usar cookies para mejorar la experiencia de navegación, por ejemplo, para mantener el acceso a ellos o recordar artículos del carrito de compras.</translation> <translation id="3165022941318558018">Permitir que un sitio utilice cookies de terceros</translation> <translation id="3198916472715691905">Datos almacenados: <ph name="STORAGE_AMOUNT" /></translation> <translation id="321187648315454507">Para permitir que <ph name="APP_NAME" /> te envíe notificaciones, actívalas también en la <ph name="BEGIN_LINK" />Configuración de Android<ph name="END_LINK" />.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb index 5788b04..0bf8fa51 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb
@@ -122,7 +122,7 @@ <translation id="3115898365077584848">Mostra informazioni</translation> <translation id="3123473560110926937">Bloccati su alcuni siti</translation> <translation id="3143754809889689516">Riproduci dall'inizio</translation> -<translation id="3162899666601560689">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</translation> +<translation id="3162899666601560689">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.</translation> <translation id="3165022941318558018">Consenti a un sito di utilizzare i cookie di terze parti</translation> <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> di dati memorizzati</translation> <translation id="321187648315454507">Per consentire all'app <ph name="APP_NAME" /> di inviarti notifiche, devi attivare le notifiche anche nelle <ph name="BEGIN_LINK" />Impostazioni Android<ph name="END_LINK" />.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb index 0578d58..f68a6a2 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb
@@ -32,7 +32,7 @@ <translation id="1644574205037202324">ประวัติการเข้าชม</translation> <translation id="1647582022260550163">คุณแน่ใจไหมว่าต้องการรีเซ็ตสิทธิ์ รวมถึงล้างคุกกี้และข้อมูลเว็บไซต์</translation> <translation id="1660204651932907780">อนุญาตให้เว็บไซต์เล่นเสียง (แนะนำ)</translation> -<translation id="1677097821151855053">คุกกี้และข้อมูลอื่นๆ ของเว็บไซต์ใช้ในการจดจำคุณ เช่น เพื่อลงชื่อเข้าใช้ให้คุณหรือปรับโฆษณาตามโปรไฟล์ของคุณ ดู<ph name="BEGIN_LINK" />การตั้งค่า<ph name="END_LINK" />เพื่อจัดการคุกกี้สำหรับทุกเว็บไซต์</translation> +<translation id="1677097821151855053">ระบบใช้คุกกี้และข้อมูลของเว็บไซต์ในการจดจำคุณ เช่น เพื่อลงชื่อเข้าใช้ให้คุณหรือปรับโฆษณาตามโปรไฟล์ของคุณ ดู<ph name="BEGIN_LINK" />การตั้งค่า<ph name="END_LINK" />เพื่อจัดการคุกกี้สำหรับทุกเว็บไซต์</translation> <translation id="1688867105868176567">ล้างข้อมูลเว็บไซต์ไหม</translation> <translation id="169515064810179024">บล็อกไม่ให้เว็บไซต์เข้าถึงเซ็นเซอร์ตรวจจับการเคลื่อนไหว</translation> <translation id="1717218214683051432">เซ็นเซอร์ตรวจจับการเคลื่อนไหว</translation> @@ -449,7 +449,7 @@ <translation id="9019902583201351841">มีการจัดการโดยผู้ปกครอง</translation> <translation id="9039697262778250930">คุณอาจออกจากระบบเว็บไซต์เหล่านี้</translation> <translation id="9074739597929991885">บลูทูธ</translation> -<translation id="9090268041676521955">เว็บไซต์นี้อยู่ในกลุ่มที่สามารถดูกิจกรรมของคุณได้ กลุ่มที่ <ph name="FPS_OWNER" /> กำหนดไว้</translation> +<translation id="9090268041676521955">เว็บไซต์นี้อยู่ในกลุ่มที่สามารถดูกิจกรรมของคุณได้ ซึ่งเป็นกลุ่มที่ <ph name="FPS_OWNER" /> กำหนดไว้</translation> <translation id="9106233582039520022">ลบคุกกี้ไหม</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" /> <ph name="PERMISSION_2" /> และอีก <ph name="NUM_MORE" /> รายการ}other{<ph name="PERMISSION_1" /> <ph name="PERMISSION_2" /> และอีก <ph name="NUM_MORE" /> รายการ}}</translation> <translation id="913657688200966289">เปิดการใช้สิทธิ์สำหรับ <ph name="APP_NAME" /> ใน<ph name="BEGIN_LINK" />การตั้งค่า Android<ph name="END_LINK" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb index ccd5bd4..c70ad25 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb
@@ -122,7 +122,7 @@ <translation id="3115898365077584848">Bilgileri Göster</translation> <translation id="3123473560110926937">Bazı sitelerde engelleniyor</translation> <translation id="3143754809889689516">Baştan oynat</translation> -<translation id="3162899666601560689">Siteler size daha iyi bir göz atma deneyimi sunmak, örneğin, oturumunuzu açık tutmak veya alışveriş sepetinizdeki ürünleri hatırlamak için çerez kullanabilir</translation> +<translation id="3162899666601560689">Siteler size daha iyi bir göz atma deneyimi sunmak, örneğin, oturumunuzu açık tutmak veya alışveriş sepetinizdeki ürünleri hatırlamak için çerez kullanabilir.</translation> <translation id="3165022941318558018">Bir sitenin, üçüncü taraf çerezlerini kullanmasına izin verin</translation> <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> depolanmış veri</translation> <translation id="321187648315454507"><ph name="APP_NAME" /> uygulamasının size bildirim gönderebilmesi için <ph name="BEGIN_LINK" />Android Ayarları<ph name="END_LINK" />'nda da bildirimleri açın.</translation>
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ChromeDialog.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ChromeDialog.java index 718d4fcc..3183957 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ChromeDialog.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ChromeDialog.java
@@ -4,7 +4,10 @@ package org.chromium.components.browser_ui.widget; +import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; + import android.content.Context; +import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewStub; @@ -26,9 +29,11 @@ */ public class ChromeDialog extends ComponentDialog { private boolean mIsFullScreen; + private Context mContext; public ChromeDialog(@NonNull Context context, @StyleRes int themeResId) { super(context, themeResId); + mContext = context; if (themeResId == R.style.ThemeOverlay_BrowserUI_Fullscreen) { mIsFullScreen = true; } else { @@ -74,6 +79,21 @@ } } + @Override + public void addContentView(View view, ViewGroup.LayoutParams params) { + if (BuildInfo.getInstance().isAutomotive && mIsFullScreen && params.width == MATCH_PARENT + && params.height == MATCH_PARENT) { + ViewGroup automotiveLayout = (ViewGroup) LayoutInflater.from(mContext).inflate( + R.layout.automotive_layout_with_back_button_toolbar, null); + super.addContentView( + automotiveLayout, new LinearLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT)); + setAutomotiveToolbarBackButtonAction(); + automotiveLayout.addView(view, params); + } else { + super.addContentView(view, params); + } + } + private void setAutomotiveToolbarBackButtonAction() { Toolbar backButtonToolbarForAutomotive = findViewById(R.id.back_button_toolbar); if (backButtonToolbarForAutomotive != null) {
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/FullscreenAlertDialog.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/FullscreenAlertDialog.java index 63b19648..0e9034e 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/FullscreenAlertDialog.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/FullscreenAlertDialog.java
@@ -58,9 +58,9 @@ if (BuildInfo.getInstance().isAutomotive) { MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams(); params.setMargins(viewSpacingLeft, viewSpacingTop, viewSpacingRight, viewSpacingBottom); - View automotiveLayout = LayoutInflater.from(mContext).inflate( + ViewGroup automotiveLayout = (ViewGroup) LayoutInflater.from(mContext).inflate( R.layout.automotive_layout_with_back_button_toolbar, null); - ((ViewGroup) automotiveLayout).addView(view, params); + automotiveLayout.addView(view, params); mAutomotiveToolbar = automotiveLayout.findViewById(R.id.back_button_toolbar); super.setView(automotiveLayout); } else { @@ -105,10 +105,10 @@ @Override public Builder setView(View view) { if (BuildInfo.getInstance().isAutomotive) { - View automotiveLayout = LayoutInflater.from(mContext).inflate( + ViewGroup automotiveLayout = (ViewGroup) LayoutInflater.from(mContext).inflate( R.layout.automotive_layout_with_back_button_toolbar, null); mAutomotiveToolbar = automotiveLayout.findViewById(R.id.back_button_toolbar); - ((ViewGroup) automotiveLayout).addView(view); + automotiveLayout.addView(view); super.setView(automotiveLayout); } else { super.setView(view);
diff --git a/components/commerce_strings.grdp b/components/commerce_strings.grdp index 30480c45..fbaefab 100644 --- a/components/commerce_strings.grdp +++ b/components/commerce_strings.grdp
@@ -128,7 +128,7 @@ </message> - <if expr="is_macosx"> + <if expr="use_titlecase"> <message name="IDS_SIDE_PANEL_UNTRACK_BUTTON" desc="Text shown when user right-clicks a tracked product from the side panel. User can click this button to untrack this product."> Untrack Price </message> @@ -150,8 +150,8 @@ <message name="IDS_PRICE_TRACKING_SIDE_PANEL_ERROR_BUTTON" desc="Text shown in side panel toast button when an attempt to track or untrack a product failed. Clicking the button would retry the failed attempt to track or untrack a product."> Try Again </message> - </if> <!-- is_macosx --> - <if expr="not is_macosx"> + </if> <!-- use_titlecase --> + <if expr="not use_titlecase"> <message name="IDS_SIDE_PANEL_UNTRACK_BUTTON" desc="Text shown when user right-clicks a tracked product from the side panel. User can click this button to untrack this product."> Untrack price </message> @@ -173,7 +173,7 @@ <message name="IDS_PRICE_TRACKING_SIDE_PANEL_ERROR_BUTTON" desc="Text shown in side panel toast button when an attempt to track or untrack a product failed. Clicking the button would retry the failed attempt to track or untrack a product."> Try again </message> - </if> <!-- not is_macosx --> + </if> <!-- not use_titlecase --> <message name="IDS_PRICE_TRACKING_SETTINGS_TITLE" desc="Text shown in chrome settings. User can turn on or off the toggle next to this setting item to manage whether they want to receive price drop notifications."> Get price tracking notifications @@ -187,6 +187,18 @@ <message name="IDS_PRICE_TRACKING_SIDE_PANEL_ERROR_MESSAGE" desc="Text shown in side panel toast when an attempt to track or untrack a product failed."> Something went wrong. </message> + + <!-- For Desktop Price Insights --> + <if expr="use_titlecase"> + <message name="IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TITLE" desc="The title name of the Shopping Insights feature in the side panel combo box."> + Shopping Insights + </message> + </if> <!-- use_titlecase --> + <if expr="not use_titlecase"> + <message name="IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TITLE" desc="The title name of the Shopping Insights feature in the side panel combo box."> + Shopping insights + </message> + </if> <!-- not use_titlecase --> </if> <!-- Android only -->
diff --git a/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TITLE.png.sha1 b/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TITLE.png.sha1 new file mode 100644 index 0000000..522fab7 --- /dev/null +++ b/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TITLE.png.sha1
@@ -0,0 +1 @@ +ab2855d4c5b2a2826a54649bc5e690c3d01b9cfb \ No newline at end of file
diff --git a/components/components_strings.grd b/components/components_strings.grd index 9d2e3682..c102f88 100644 --- a/components/components_strings.grd +++ b/components/components_strings.grd
@@ -336,7 +336,7 @@ <part file="version_ui_strings.grdp" /> <part file="webapps_strings.grdp" /> - <if expr="not is_ios"> + <if expr="use_blink"> <part file="history_clusters_strings.grdp" /> </if> <if expr="is_android">
diff --git a/components/cronet/stale_host_resolver.cc b/components/cronet/stale_host_resolver.cc index 7e2070e..c04d5e4 100644 --- a/components/cronet/stale_host_resolver.cc +++ b/components/cronet/stale_host_resolver.cc
@@ -49,10 +49,8 @@ int Start(net::CompletionOnceCallback result_callback) override; const net::AddressList* GetAddressResults() const override; const net::HostResolverEndpointResults* GetEndpointResults() const override; - const absl::optional<std::vector<std::string>>& GetTextResults() - const override; - const absl::optional<std::vector<net::HostPortPair>>& GetHostnameResults() - const override; + const std::vector<std::string>* GetTextResults() const override; + const std::vector<net::HostPortPair>* GetHostnameResults() const override; const std::set<std::string>* GetDnsAliasResults() const override; net::ResolveErrorInfo GetResolveErrorInfo() const override; const absl::optional<net::HostCache::EntryStaleness>& GetStaleInfo() @@ -201,8 +199,8 @@ return cache_request_->GetEndpointResults(); } -const absl::optional<std::vector<std::string>>& -StaleHostResolver::RequestImpl::GetTextResults() const { +const std::vector<std::string>* StaleHostResolver::RequestImpl::GetTextResults() + const { if (network_request_) return network_request_->GetTextResults(); @@ -210,7 +208,7 @@ return cache_request_->GetTextResults(); } -const absl::optional<std::vector<net::HostPortPair>>& +const std::vector<net::HostPortPair>* StaleHostResolver::RequestImpl::GetHostnameResults() const { if (network_request_) return network_request_->GetHostnameResults();
diff --git a/components/device_event_log/OWNERS b/components/device_event_log/OWNERS index d313f84..89e99e9 100644 --- a/components/device_event_log/OWNERS +++ b/components/device_event_log/OWNERS
@@ -1,2 +1,4 @@ +chengweih@chromium.org +mattreynolds@chromium.org stevenjb@chromium.org reillyg@chromium.org
diff --git a/components/embedder_support/origin_trials/origin_trials_settings_storage.cc b/components/embedder_support/origin_trials/origin_trials_settings_storage.cc index fca9b8d1..c7988ec 100644 --- a/components/embedder_support/origin_trials/origin_trials_settings_storage.cc +++ b/components/embedder_support/origin_trials/origin_trials_settings_storage.cc
@@ -5,9 +5,7 @@ #include "components/embedder_support/origin_trials/origin_trials_settings_storage.h" namespace { -// TODO(https://crbug.com/1216609): Keep the limit the same as the existing CLI -// solution. When this bug is resolved, this limit will be increased. -const int kOriginMaxDisabledTrialTokens = 11; +const int kMaxDisabledTokens = 1024; } // namespace namespace embedder_support { @@ -22,9 +20,10 @@ } void OriginTrialsSettingsStorage::SetDisabledTokens( const base::Value::List& disabled_tokens_list) { - // TODO: Do not silently ignore the config if it exceeds the limit. For more - // information: https://crrev.com/c/4374245/comment/6d15e085_b16be69c - if (disabled_tokens_list.size() > kOriginMaxDisabledTrialTokens) { + if (disabled_tokens_list.size() > kMaxDisabledTokens) { + LOG(WARNING) << "Input has " << disabled_tokens_list.size() + << " disabled tokens, which exceeds max of " + << kMaxDisabledTokens << " and will not be stored"; return; }
diff --git a/components/embedder_support/origin_trials/origin_trials_settings_storage_unittest.cc b/components/embedder_support/origin_trials/origin_trials_settings_storage_unittest.cc index 5af8d3e..e4991df 100644 --- a/components/embedder_support/origin_trials/origin_trials_settings_storage_unittest.cc +++ b/components/embedder_support/origin_trials/origin_trials_settings_storage_unittest.cc
@@ -14,7 +14,7 @@ namespace embedder_support { // Matches kOriginMaxDisabledTrialTokens in origin_trials_settings_storage.cc -const unsigned long kOriginMaxDisabledTrialTokens = 11; +const unsigned long kOriginMaxDisabledTrialTokens = 1024; class OriginTrialsSettingsStorageTest : public testing::Test { protected: OriginTrialsSettingsStorageTest()
diff --git a/components/feedback/redaction_tool/redaction_tool.cc b/components/feedback/redaction_tool/redaction_tool.cc index f130fe7..07d1950 100644 --- a/components/feedback/redaction_tool/redaction_tool.cc +++ b/components/feedback/redaction_tool/redaction_tool.cc
@@ -703,12 +703,12 @@ if (detected != nullptr) { (*detected)[PIIType::kMACAddress].insert(mac); } - skipped.AppendToString(&result); + result.append(skipped.data(), skipped.size()); result += replacement_mac; RecordPIIRedactedHistogram(PIIType::kMACAddress); } - text.AppendToString(&result); + result.append(text.data(), text.size()); return result; } @@ -733,8 +733,8 @@ re2::StringPiece skipped, pre_whitespace, hash_prefix, hash_suffix; while (FindAndConsumeAndGetSkipped(&text, *hash_re, &skipped, &pre_whitespace, &hash_prefix, &hash_suffix)) { - skipped.AppendToString(&result); - pre_whitespace.AppendToString(&result); + result.append(skipped.data(), skipped.size()); + result.append(pre_whitespace.data(), pre_whitespace.size()); // Check if it's a valid length for our hashes or if we need to skip due to // the whitespace check. @@ -742,8 +742,8 @@ if ((hash_length != 32 && hash_length != 40 && hash_length != 64) || (hash_length == 32 && pre_whitespace.length() >= 3)) { // This is not a hash string, skip it. - hash_prefix.AppendToString(&result); - hash_suffix.AppendToString(&result); + result.append(hash_prefix.data(), hash_prefix.size()); + result.append(hash_suffix.data(), hash_suffix.size()); continue; } @@ -768,7 +768,7 @@ RecordPIIRedactedHistogram(PIIType::kStableIdentifier); } - text.AppendToString(&result); + result.append(text.data(), text.size()); return result; } @@ -806,8 +806,8 @@ while (FindAndConsumeAndGetSkipped(&text, *path_re, &skipped, &path_prefix, &pre_data, &post_data, &app_specific)) { // We can record these parts as-is. - skipped.AppendToString(&result); - path_prefix.AppendToString(&result); + result.append(skipped.data(), skipped.size()); + result.append(path_prefix.data(), path_prefix.size()); // |app_specific| has to be redacted. First, convert it into components, // and then redact each component as follows: @@ -815,7 +815,8 @@ // - Otherwise, remove all the characters in the component but the first // one. // - If the original component has 2 or more bytes, add '_'. - const base::FilePath path(app_specific.as_string()); + const base::FilePath path( + std::string(app_specific.data(), app_specific.size())); std::vector<std::string> components = path.GetComponents(); DCHECK(!components.empty()); @@ -831,12 +832,12 @@ } if (detected != nullptr) { (*detected)[PIIType::kAndroidAppStoragePath].insert( - app_specific.as_string()); + std::string(app_specific.data(), app_specific.size())); } RecordPIIRedactedHistogram(PIIType::kAndroidAppStoragePath); } - text.AppendToString(&result); + result.append(text.data(), text.size()); return result; #else @@ -869,7 +870,7 @@ while (FindAndConsumeAndGetSkipped(&text, *cc_re, &skipped, &sequence, &post_sequence)) { - skipped.AppendToString(&result); + result.append(skipped.data(), skipped.size()); RecordCreditCardRedactionHistogram(CreditCardDetection::kRegexMatch); // Timestamps in ms have a surprisingly high number of false positives. @@ -877,15 +878,15 @@ // tying unrelated numbers together. if (post_sequence.contains("ms")) { RecordCreditCardRedactionHistogram(CreditCardDetection::kTimestamp); - sequence.AppendToString(&result); - post_sequence.AppendToString(&result); + result.append(sequence.data(), sequence.size()); + result.append(post_sequence.data(), post_sequence.size()); continue; } if (HasRepeatedChar(sequence, ' ') || HasRepeatedChar(sequence, '-')) { RecordCreditCardRedactionHistogram(CreditCardDetection::kRepeatedChars); - sequence.AppendToString(&result); - post_sequence.AppendToString(&result); + result.append(sequence.data(), sequence.size()); + result.append(post_sequence.data(), post_sequence.size()); continue; } @@ -895,7 +896,7 @@ const auto cc_it = credit_cards_.find(number); if (cc_it != credit_cards_.cend()) { result += cc_it->second; - post_sequence.AppendToString(&result); + result.append(post_sequence.data(), post_sequence.size()); RecordCreditCardRedactionHistogram(CreditCardDetection::kValidated); continue; } @@ -910,19 +911,19 @@ RecordPIIRedactedHistogram(PIIType::kCreditCard); result += it->second; } else { - sequence.AppendToString(&result); + result.append(sequence.data(), sequence.size()); } if (detected) { (*detected)[PIIType::kCreditCard].insert(it->first); } } else { RecordCreditCardRedactionHistogram(CreditCardDetection::kDoesntValidate); - sequence.AppendToString(&result); + result.append(sequence.data(), sequence.size()); } - post_sequence.AppendToString(&result); + result.append(post_sequence.data(), post_sequence.size()); } - text.AppendToString(&result); + result.append(text.data(), text.size()); return result; } @@ -943,7 +944,7 @@ re2::StringPiece skipped; re2::StringPiece iban; while (FindAndConsumeAndGetSkipped(&text, *iban_re, &skipped, &iban)) { - skipped.AppendToString(&result); + result.append(skipped.data(), skipped.size()); // Validation sequence as per [1]. // // [1] @@ -951,7 +952,7 @@ // Remove the separating characters. std::string stripped; - base::RemoveChars(iban.as_string(), " -", &stripped); + base::RemoveChars(std::string(iban.data(), iban.size()), " -", &stripped); if (const auto previous_iban = ibans_.find(stripped); previous_iban != ibans_.end()) { @@ -1007,7 +1008,7 @@ } if (remainder != 1) { - iban.AppendToString(&result); + result.append(iban.data(), iban.size()); continue; } @@ -1023,7 +1024,7 @@ RecordPIIRedactedHistogram(PIIType::kIBAN); } - text.AppendToString(&result); + result.append(text.data(), text.size()); return result; } @@ -1088,13 +1089,13 @@ if (detected != nullptr) { (*detected)[pattern.pii_type].insert(matched_id_as_string); } - skipped.AppendToString(&result); - pre_matched_id.AppendToString(&result); + result.append(skipped.data(), skipped.size()); + result.append(pre_matched_id.data(), pre_matched_id.size()); result += replacement_id; - post_matched_id.AppendToString(&result); + result.append(post_matched_id.data(), post_matched_id.size()); RecordPIIRedactedHistogram(pattern.pii_type); } - text.AppendToString(&result); + result.append(text.data(), text.size()); return result; } @@ -1175,8 +1176,8 @@ re2::StringPiece matched_id; while (FindAndConsumeAndGetSkipped(&text, *re, &skipped, &matched_id)) { if (IsUrlExempt(matched_id, first_party_extension_ids_)) { - skipped.AppendToString(&result); - matched_id.AppendToString(&result); + result.append(skipped.data(), skipped.size()); + result.append(matched_id.data(), matched_id.size()); continue; } std::string matched_id_as_string(matched_id); @@ -1187,8 +1188,8 @@ // Double-check overly opportunistic IPv4 address matching. if ((strcmp("IPv4", pattern.alias) == 0) && ShouldSkipIPAddress(skipped)) { - skipped.AppendToString(&result); - matched_id.AppendToString(&result); + result.append(skipped.data(), skipped.size()); + result.append(matched_id.data(), matched_id.size()); continue; } @@ -1210,12 +1211,12 @@ } } - skipped.AppendToString(&result); + result.append(skipped.data(), skipped.size()); result += replacement_id; RecordPIIRedactedHistogram(pattern.pii_type); } - text.AppendToString(&result); + result.append(text.data(), text.size()); return result; }
diff --git a/components/history/core/test/history_backend_db_base_test.cc b/components/history/core/test/history_backend_db_base_test.cc index b2577e7..ce1dde5 100644 --- a/components/history/core/test/history_backend_db_base_test.cc +++ b/components/history/core/test/history_backend_db_base_test.cc
@@ -112,6 +112,7 @@ void HistoryBackendDBBaseTest::DeleteBackend() { if (backend_) { backend_->Closing(); + db_ = nullptr; backend_ = nullptr; } }
diff --git a/components/omnibox/browser/BUILD.gn b/components/omnibox/browser/BUILD.gn index 465ffc6..5369208 100644 --- a/components/omnibox/browser/BUILD.gn +++ b/components/omnibox/browser/BUILD.gn
@@ -3,6 +3,7 @@ # found in the LICENSE file. import("//build/buildflag_header.gni") +import("//build/config/features.gni") import("//build/config/ui.gni") import("//components/optimization_guide/features.gni") import("//components/vector_icons/vector_icons.gni") @@ -373,7 +374,7 @@ deps += [ "//components/keep_alive_registry" ] } - if (!is_ios) { + if (use_blink) { sources += [ "actions/history_clusters_action.cc", "actions/history_clusters_action.h", @@ -382,13 +383,8 @@ ] deps += [ "//components/history_clusters/core", - "//components/optimization_guide/core:entities", - ] - } - - if (use_blink) { - deps += [ "//components/keyed_service/content", + "//components/optimization_guide/core:entities", "//content/public/browser", ] } @@ -856,6 +852,9 @@ "actions/history_clusters_action_unittest.cc", "history_cluster_provider_unittest.cc", ] + } + + if (use_blink) { deps += [ "//components/history_clusters/core:test_support" ] } }
diff --git a/components/omnibox/browser/actions/omnibox_action_factory_android.cc b/components/omnibox/browser/actions/omnibox_action_factory_android.cc index bc34f49..c14edb6b 100644 --- a/components/omnibox/browser/actions/omnibox_action_factory_android.cc +++ b/components/omnibox/browser/actions/omnibox_action_factory_android.cc
@@ -51,11 +51,12 @@ base::android::ScopedJavaGlobalRef<jobject> BuildOmniboxActionInSuggest( JNIEnv* env, const std::u16string& hint, - const std::string& serialized_action) { + int action_type, + const std::string& action_uri) { return base::android::ScopedJavaGlobalRef( Java_OmniboxActionFactory_buildActionInSuggest( - env, base::android::ConvertUTF16ToJavaString(env, hint), - base::android::ToJavaByteArray(env, serialized_action))); + env, base::android::ConvertUTF16ToJavaString(env, hint), action_type, + base::android::ConvertUTF8ToJavaString(env, action_uri))); } // Convert a vector of OmniboxActions to Java counterpart.
diff --git a/components/omnibox/browser/actions/omnibox_action_factory_android.h b/components/omnibox/browser/actions/omnibox_action_factory_android.h index e95542b0..597ef4c 100644 --- a/components/omnibox/browser/actions/omnibox_action_factory_android.h +++ b/components/omnibox/browser/actions/omnibox_action_factory_android.h
@@ -25,7 +25,8 @@ base::android::ScopedJavaGlobalRef<jobject> BuildOmniboxActionInSuggest( JNIEnv* env, const std::u16string& hint, - const std::string& serialized_action); + int action_type, + const std::string& action_uri); base::android::ScopedJavaLocalRef<jobjectArray> ToJavaOmniboxActionsList( JNIEnv* env,
diff --git a/components/omnibox/browser/actions/omnibox_action_in_suggest.cc b/components/omnibox/browser/actions/omnibox_action_in_suggest.cc index cb3de36..66ddd87 100644 --- a/components/omnibox/browser/actions/omnibox_action_in_suggest.cc +++ b/components/omnibox/browser/actions/omnibox_action_in_suggest.cc
@@ -93,12 +93,9 @@ base::android::ScopedJavaLocalRef<jobject> OmniboxActionInSuggest::GetOrCreateJavaObject(JNIEnv* env) const { if (!j_omnibox_action_) { - std::string serialized_action; - if (!action_info_.SerializeToString(&serialized_action)) { - serialized_action.clear(); - } - j_omnibox_action_.Reset( - BuildOmniboxActionInSuggest(env, strings_.hint, serialized_action)); + j_omnibox_action_.Reset(BuildOmniboxActionInSuggest( + env, strings_.hint, action_info_.action_type(), + action_info_.action_uri())); } return base::android::ScopedJavaLocalRef<jobject>(j_omnibox_action_); }
diff --git a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/action/OmniboxActionFactory.java b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/action/OmniboxActionFactory.java index 7c5cad8a..a56f1a3 100644 --- a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/action/OmniboxActionFactory.java +++ b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/action/OmniboxActionFactory.java
@@ -5,36 +5,27 @@ package org.chromium.components.omnibox.action; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.google.protobuf.InvalidProtocolBufferException; import org.chromium.base.annotations.CalledByNative; -import org.chromium.components.omnibox.EntityInfoProto; /** * An interface for handling interactions for Omnibox Action Chips. */ public class OmniboxActionFactory { @CalledByNative - public static @Nullable OmniboxAction buildOmniboxPedal( + public static @NonNull OmniboxAction buildOmniboxPedal( @NonNull String hint, @OmniboxPedalType int pedalId) { return new OmniboxPedal(hint, pedalId); } @CalledByNative - public static @Nullable OmniboxActionInSuggest buildActionInSuggest( - @NonNull String hint, @NonNull byte[] serializedActionInfo) { - try { - return new OmniboxActionInSuggest( - hint, EntityInfoProto.ActionInfo.parseFrom(serializedActionInfo)); - } catch (InvalidProtocolBufferException e) { - } - return null; + public static @NonNull OmniboxActionInSuggest buildActionInSuggest(@NonNull String hint, + /* EntityInfoProto.ActionInfo.ActionType */ int actionType, @NonNull String actionUri) { + return new OmniboxActionInSuggest(hint, actionType, actionUri); } @CalledByNative - public static @Nullable OmniboxAction buildHistoryClustersAction( + public static @NonNull OmniboxAction buildHistoryClustersAction( @NonNull String hint, @NonNull String query) { return new HistoryClustersAction(hint, query); }
diff --git a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/action/OmniboxActionInSuggest.java b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/action/OmniboxActionInSuggest.java index c36e8db..3e48af9 100644 --- a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/action/OmniboxActionInSuggest.java +++ b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/action/OmniboxActionInSuggest.java
@@ -22,13 +22,14 @@ /** Map of {@link EntityInfoProto.ActionInfo.ActionType} to {@link ChipIcon}. */ private static final SparseArray<ChipIcon> ICON_MAP = createIconMap(); /** The details about the underlying action. */ - public final @NonNull EntityInfoProto.ActionInfo actionInfo; + public final /* EntityInfoProto.ActionInfo.ActionType */ int actionType; + private final @NonNull String mActionUri; - public OmniboxActionInSuggest( - @NonNull String hint, @NonNull EntityInfoProto.ActionInfo actionInfo) { - super(OmniboxActionType.ACTION_IN_SUGGEST, hint, - ICON_MAP.get(actionInfo.getActionType().getNumber(), null)); - this.actionInfo = actionInfo; + public OmniboxActionInSuggest(@NonNull String hint, + /* EntityInfoProto.ActionInfo.ActionType */ int actionType, @NonNull String actionUri) { + super(OmniboxActionType.ACTION_IN_SUGGEST, hint, ICON_MAP.get(actionType, null)); + this.actionType = actionType; + mActionUri = actionUri; } /** @@ -65,24 +66,23 @@ */ @Override public void execute(OmniboxActionDelegate delegate) { - var actionType = actionInfo.getActionType(); boolean actionStarted = false; boolean isIncognito = delegate.isIncognito(); Intent intent = null; try { - intent = Intent.parseUri(actionInfo.getActionUri(), Intent.URI_INTENT_SCHEME); + intent = Intent.parseUri(mActionUri, Intent.URI_INTENT_SCHEME); } catch (URISyntaxException e) { // Never happens. http://b/279756377. } switch (actionType) { - case REVIEWS: + case EntityInfoProto.ActionInfo.ActionType.REVIEWS_VALUE: delegate.loadPageInCurrentTab(intent.getDataString()); actionStarted = true; break; - case CALL: + case EntityInfoProto.ActionInfo.ActionType.CALL_VALUE: // Don't call directly. Use `DIAL` instead to let the user decide. // Note also that ACTION_CALL requires a dedicated permission. intent.setAction(Intent.ACTION_DIAL); @@ -92,7 +92,7 @@ actionStarted = delegate.startActivity(intent); break; - case DIRECTIONS: + case EntityInfoProto.ActionInfo.ActionType.DIRECTIONS_VALUE: // Open directions in maps only if maps are installed and the incognito mode is // not engaged. In all other cases, redirect the action to Browser. if (!isIncognito) { @@ -116,15 +116,8 @@ OmniboxMetrics.ActionInSuggestIntentResult.ACTIVITY_NOT_FOUND); } - switch (actionType) { - case DIRECTIONS: - delegate.loadPageInCurrentTab(intent.getDataString()); - break; - - case CALL: - case REVIEWS: - // Give up. Don't add the `default` clause though, capture missed variants. - break; + if (actionType == EntityInfoProto.ActionInfo.ActionType.DIRECTIONS_VALUE) { + delegate.loadPageInCurrentTab(intent.getDataString()); } } }
diff --git a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/action/OmniboxActionInSuggestUnitTest.java b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/action/OmniboxActionInSuggestUnitTest.java index 30b388e..92e1e576 100644 --- a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/action/OmniboxActionInSuggestUnitTest.java +++ b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/action/OmniboxActionInSuggestUnitTest.java
@@ -7,7 +7,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThrows; import static org.mockito.Mockito.any; import static org.mockito.Mockito.doReturn; @@ -57,12 +56,7 @@ @Test public void creation_usesCustomIconForKnownActionTypes() { for (var kesemActionType : sKnownActionTypes) { - var proto = EntityInfoProto.ActionInfo.newBuilder() - .setActionType(EntityInfoProto.ActionInfo.ActionType.forNumber( - kesemActionType)) - .build(); - - var action = new OmniboxActionInSuggest("hint", proto); + var action = new OmniboxActionInSuggest("hint", kesemActionType, ""); assertNotEquals(OmniboxAction.DEFAULT_ICON, action.icon); } } @@ -71,37 +65,25 @@ public void creation_usesFallbackIconForUnknownActionTypes() { for (var kesemActionType : EntityInfoProto.ActionInfo.ActionType.values()) { if (sKnownActionTypes.contains(kesemActionType.getNumber())) continue; - - var proto = - EntityInfoProto.ActionInfo.newBuilder().setActionType(kesemActionType).build(); - - var action = new OmniboxActionInSuggest("hint", proto); + var action = new OmniboxActionInSuggest("hint", kesemActionType.getNumber(), ""); assertEquals(OmniboxAction.DEFAULT_ICON, action.icon); } } @Test - public void creation_creationFailsWithInvalidSerializedProto() { - assertNull(OmniboxActionFactory.buildActionInSuggest("hint", new byte[] {1, 2, 3})); - } - - @Test - public void creation_creationSucceedsWithValidSerializedProto() { - var proto = EntityInfoProto.ActionInfo.newBuilder().setDisplayedText("text").build(); - var action = new OmniboxActionInSuggest("hint", proto); - - assertNotNull(action); - assertEquals(action.actionInfo.getDisplayedText(), "text"); - } - - @Test public void creation_failsWithNullHint() { - assertThrows(AssertionError.class, () -> new OmniboxActionInSuggest(null, EMPTY_INFO)); + assertThrows(AssertionError.class, + () + -> new OmniboxActionInSuggest( + null, EntityInfoProto.ActionInfo.ActionType.CALL_VALUE, "")); } @Test public void creation_failsWithEmptyHint() { - assertThrows(AssertionError.class, () -> new OmniboxActionInSuggest("", EMPTY_INFO)); + assertThrows(AssertionError.class, + () + -> new OmniboxActionInSuggest( + "", EntityInfoProto.ActionInfo.ActionType.CALL_VALUE, "")); } @Test @@ -121,9 +103,9 @@ } @Test - public void safeCasting_successWithHistoryClusters() { - OmniboxActionInSuggest.from( - OmniboxActionFactory.buildActionInSuggest("hint", EMPTY_INFO.toByteArray())); + public void safeCasting_successWithFactoryBuiltAction() { + OmniboxActionInSuggest.from(OmniboxActionFactory.buildActionInSuggest( + "hint", EntityInfoProto.ActionInfo.ActionType.CALL_VALUE, "")); } /** @@ -132,12 +114,7 @@ private OmniboxAction buildActionInSuggest( EntityInfoProto.ActionInfo.ActionType type, Intent intent) { var uri = intent.toUri(Intent.URI_INTENT_SCHEME); - var action = EntityInfoProto.ActionInfo.newBuilder() - .setActionType(type) - .setActionUri(uri) - .build(); - - return new OmniboxActionInSuggest("wink", action); + return new OmniboxActionInSuggest("wink", type.getNumber(), uri); } @Test
diff --git a/components/omnibox/browser/autocomplete_controller.cc b/components/omnibox/browser/autocomplete_controller.cc index fc8bc64..58dce28 100644 --- a/components/omnibox/browser/autocomplete_controller.cc +++ b/components/omnibox/browser/autocomplete_controller.cc
@@ -1617,9 +1617,7 @@ std::priority_queue<std::pair<float, AutocompleteResult::iterator>> output_and_match_itr_heap; for (auto& [output, stripped_destination_url] : results) { - // The model is expected to generate an output. if (!output.has_value()) { - NOTREACHED(); continue; }
diff --git a/components/omnibox/browser/history_cluster_provider_unittest.cc b/components/omnibox/browser/history_cluster_provider_unittest.cc index bbe790f..afa70ec 100644 --- a/components/omnibox/browser/history_cluster_provider_unittest.cc +++ b/components/omnibox/browser/history_cluster_provider_unittest.cc
@@ -87,6 +87,10 @@ history_url_provider_.get(), history_quick_provider_.get()); } + void TearDown() override { + autocomplete_provider_client_->set_history_clusters_service(nullptr); + } + ~HistoryClustersProviderTest() override { // The provider will kick off an async task to refresh the keyword cache. // Wait for it to avoid it possibly being processed after the next test case @@ -113,13 +117,13 @@ base::test::TaskEnvironment task_environment_; + std::unique_ptr<FakeAutocompleteProviderClient> autocomplete_provider_client_; + base::ScopedTempDir history_dir_; std::unique_ptr<history::HistoryService> history_service_; std::unique_ptr<history_clusters::HistoryClustersService> history_clusters_service_; - std::unique_ptr<FakeAutocompleteProviderClient> autocomplete_provider_client_; - scoped_refptr<FakeAutocompleteProvider> search_provider_; scoped_refptr<FakeAutocompleteProvider> history_url_provider_; scoped_refptr<FakeAutocompleteProvider> history_quick_provider_;
diff --git a/components/password_manager/core/browser/BUILD.gn b/components/password_manager/core/browser/BUILD.gn index 4c98011f..b3fd5a55a 100644 --- a/components/password_manager/core/browser/BUILD.gn +++ b/components/password_manager/core/browser/BUILD.gn
@@ -51,8 +51,6 @@ "affiliation/hash_affiliation_fetcher.h", "affiliation/lookup_affiliation_response_parser.cc", "affiliation/lookup_affiliation_response_parser.h", - "android_backend_error.cc", - "android_backend_error.h", "browser_save_password_progress_logger.cc", "browser_save_password_progress_logger.h", "bulk_leak_check_service.cc", @@ -351,6 +349,8 @@ if (is_android) { sources += [ + "android_backend_error.cc", + "android_backend_error.h", "built_in_backend_to_android_backend_migrator.cc", "built_in_backend_to_android_backend_migrator.h", "password_manager_eviction_util.cc",
diff --git a/components/password_manager/core/browser/fake_form_fetcher.h b/components/password_manager/core/browser/fake_form_fetcher.h index 4c6eced0..3e8d45a 100644 --- a/components/password_manager/core/browser/fake_form_fetcher.h +++ b/components/password_manager/core/browser/fake_form_fetcher.h
@@ -7,7 +7,6 @@ #include <vector> -#include "base/memory/raw_ptr_exclusion.h" #include "base/observer_list.h" #include "components/password_manager/core/browser/form_fetcher.h" #include "components/password_manager/core/browser/password_form.h" @@ -94,8 +93,6 @@ std::vector<const PasswordForm*> non_federated_same_scheme_; std::vector<const PasswordForm*> best_matches_; std::vector<const PasswordForm*> insecure_credentials_; - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #addr-of bool is_blocklisted_ = false; absl::optional<PasswordStoreBackendError> profile_store_backend_error_; };
diff --git a/components/password_manager/core/browser/field_info_table.h b/components/password_manager/core/browser/field_info_table.h index 92a17ed..c7ac1f55 100644 --- a/components/password_manager/core/browser/field_info_table.h +++ b/components/password_manager/core/browser/field_info_table.h
@@ -7,7 +7,7 @@ #include <vector> -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/time/time.h" #include "components/autofill/core/browser/field_types.h" #include "components/autofill/core/common/signatures.h" @@ -63,9 +63,7 @@ std::vector<FieldInfo> GetAllRowsForFormSignature(uint64_t form_signature); private: - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION sql::Database* db_ = nullptr; + raw_ptr<sql::Database> db_ = nullptr; }; } // namespace password_manager
diff --git a/components/password_manager/core/browser/http_password_store_migrator_unittest.cc b/components/password_manager/core/browser/http_password_store_migrator_unittest.cc index 071a812..df57fee7 100644 --- a/components/password_manager/core/browser/http_password_store_migrator_unittest.cc +++ b/components/password_manager/core/browser/http_password_store_migrator_unittest.cc
@@ -21,6 +21,7 @@ using testing::_; using testing::ElementsAre; using testing::Invoke; +using testing::IsEmpty; using testing::Pointee; using testing::Return; using testing::SaveArg; @@ -80,15 +81,10 @@ class MockConsumer : public HttpPasswordStoreMigrator::Consumer { public: - MOCK_METHOD1(ProcessForms, void(const std::vector<PasswordForm*>& forms)); - - void ProcessMigratedForms( - std::vector<std::unique_ptr<PasswordForm>> forms) override { - std::vector<PasswordForm*> raw_forms(forms.size()); - base::ranges::transform(forms, raw_forms.begin(), - &std::unique_ptr<PasswordForm>::get); - ProcessForms(raw_forms); - } + MOCK_METHOD(void, + ProcessMigratedForms, + (std::vector<std::unique_ptr<PasswordForm>>), + (override)); }; class MockNetworkContext : public network::TestNetworkContext { @@ -156,7 +152,7 @@ &store(), &mock_network_context(), &consumer()); - EXPECT_CALL(consumer(), ProcessForms(std::vector<PasswordForm*>())); + EXPECT_CALL(consumer(), ProcessMigratedForms(IsEmpty())); migrator.OnGetPasswordStoreResults( std::vector<std::unique_ptr<PasswordForm>>()); } @@ -196,8 +192,8 @@ EXPECT_CALL(store(), RemoveLogin(form)).Times(is_hsts); EXPECT_CALL(store(), RemoveLogin(federated_form)).Times(is_hsts); EXPECT_CALL(consumer(), - ProcessForms(ElementsAre(Pointee(expected_form), - Pointee(expected_federated_form)))); + ProcessMigratedForms(ElementsAre( + Pointee(expected_form), Pointee(expected_federated_form)))); std::vector<std::unique_ptr<PasswordForm>> results; results.push_back(std::make_unique<PasswordForm>(psl_form)); results.push_back(std::make_unique<PasswordForm>(form)); @@ -229,9 +225,8 @@ url::Origin::Create(GURL(kTestHttpsURL)), &store(), &mock_network_context(), &consumer()); - EXPECT_CALL(consumer(), ProcessForms(_)).WillOnce(Invoke([&migrator](Unused) { - migrator.reset(); - })); + EXPECT_CALL(consumer(), ProcessMigratedForms(_)) + .WillOnce(Invoke([&migrator](Unused) { migrator.reset(); })); migrator->OnGetPasswordStoreResults( std::vector<std::unique_ptr<PasswordForm>>());
diff --git a/components/password_manager/core/browser/insecure_credentials_table.h b/components/password_manager/core/browser/insecure_credentials_table.h index be404d99..6cc58a6 100644 --- a/components/password_manager/core/browser/insecure_credentials_table.h +++ b/components/password_manager/core/browser/insecure_credentials_table.h
@@ -6,7 +6,7 @@ #define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_INSECURE_CREDENTIALS_TABLE_H_ #include "base/functional/callback.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/time/time.h" #include "base/types/strong_alias.h" #include "components/password_manager/core/browser/password_form.h" @@ -101,9 +101,7 @@ std::vector<InsecureCredential> GetRows(FormPrimaryKey parent_key) const; private: - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION sql::Database* db_ = nullptr; + raw_ptr<sql::Database> db_ = nullptr; }; } // namespace password_manager
diff --git a/components/password_manager/core/browser/password_notes_table.h b/components/password_manager/core/browser/password_notes_table.h index 344b32b..995bfcb0 100644 --- a/components/password_manager/core/browser/password_notes_table.h +++ b/components/password_manager/core/browser/password_notes_table.h
@@ -7,7 +7,7 @@ #include <string> -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/time/time.h" #include "components/password_manager/core/browser/password_form.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -47,9 +47,7 @@ GetAllPasswordNotesForTest() const; private: - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION sql::Database* db_ = nullptr; + raw_ptr<sql::Database> db_ = nullptr; }; } // namespace password_manager
diff --git a/components/payments/content/android/BUILD.gn b/components/payments/content/android/BUILD.gn index c72ee42..b3a9b85 100644 --- a/components/payments/content/android/BUILD.gn +++ b/components/payments/content/android/BUILD.gn
@@ -334,7 +334,6 @@ "junit/src/org/chromium/components/payments/test_support/DefaultPaymentFeatureConfig.java", "junit/src/org/chromium/components/payments/test_support/FakeClock.java", "junit/src/org/chromium/components/payments/test_support/PaymentRequestServiceBuilder.java", - "junit/src/org/chromium/components/payments/test_support/ShadowPaymentFeatureList.java", "junit/src/org/chromium/components/payments/test_support/ShadowWebContentsStatics.java", ] deps = [
diff --git a/components/payments/content/android/junit/src/org/chromium/components/payments/test_support/ShadowPaymentFeatureList.java b/components/payments/content/android/junit/src/org/chromium/components/payments/test_support/ShadowPaymentFeatureList.java deleted file mode 100644 index 352a12e..0000000 --- a/components/payments/content/android/junit/src/org/chromium/components/payments/test_support/ShadowPaymentFeatureList.java +++ /dev/null
@@ -1,68 +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. - -package org.chromium.components.payments.test_support; - -import org.robolectric.annotation.Implementation; -import org.robolectric.annotation.Implements; -import org.robolectric.annotation.Resetter; - -import org.chromium.components.payments.PaymentFeatureList; - -import java.util.HashMap; -import java.util.Map; - -/** - * The shadow of PaymentFeatureList that allows unit tests to avoid loading native libraries to - * check payment feature flag states. Usage example: - * - * @RunWith(BaseRobolectricTestRunner.class) - * @Config(manifest = Config.NONE, shadows = {ShadowPaymentFeatureList.class}) - * public class MyTest {} - * - * @deprecated use {@link DefaultPaymentFeatureConfig} with @Enable/DisableFeatures and - * JUnitProcessor instead. - */ -@Deprecated -@Implements(PaymentFeatureList.class) -public class ShadowPaymentFeatureList { - private static final Map<String, Boolean> sFeatureStatuses = new HashMap<>(); - - public static void setDefaultStatuses() { - ShadowPaymentFeatureList.setFeatureEnabled(PaymentFeatureList.WEB_PAYMENTS, true); - ShadowPaymentFeatureList.setFeatureEnabled( - PaymentFeatureList.WEB_PAYMENTS_SINGLE_APP_UI_SKIP, true); - ShadowPaymentFeatureList.setFeatureEnabled( - PaymentFeatureList.GPAY_APP_DYNAMIC_UPDATE, true); - ShadowPaymentFeatureList.setFeatureEnabled( - PaymentFeatureList.WEB_PAYMENTS_EXPERIMENTAL_FEATURES, true); - ShadowPaymentFeatureList.setFeatureEnabled( - PaymentFeatureList.SECURE_PAYMENT_CONFIRMATION, true); - ShadowPaymentFeatureList.setFeatureEnabled( - PaymentFeatureList.ADD_IDENTITY_IN_CAN_MAKE_PAYMENT_EVENT, false); - ShadowPaymentFeatureList.setFeatureEnabled( - PaymentFeatureList.OMIT_PARAMETERS_IN_READY_TO_PAY, false); - } - - @Resetter - public static void reset() { - sFeatureStatuses.clear(); - setDefaultStatuses(); - } - - @Implementation - public static boolean isEnabled(String featureName) { - assert sFeatureStatuses.containsKey(featureName) : "The feature state has yet been set."; - return sFeatureStatuses.get(featureName); - } - - /** - * Set the given feature to be enabled. - * @param featureName The name of the feature. - * @param enabled Whether to enable the feature. - */ - public static void setFeatureEnabled(String featureName, boolean enabled) { - sFeatureStatuses.put(featureName, enabled); - } -}
diff --git a/components/policy/core/common/remote_commands/test_support/remote_command_builders.cc b/components/policy/core/common/remote_commands/test_support/remote_command_builders.cc index 3785553..977b97f 100644 --- a/components/policy/core/common/remote_commands/test_support/remote_command_builders.cc +++ b/components/policy/core/common/remote_commands/test_support/remote_command_builders.cc
@@ -12,8 +12,10 @@ namespace policy { // static -// The initial value is randomly chosen. -int64_t RemoteCommandBuilder::g_last_command_id_ = 1666; +// +// Note we deliberately use a number that doesn't fit in an int32 to discover +// truncation errors. +int64_t RemoteCommandBuilder::g_last_command_id_ = (1LL << 35) + 1; RemoteCommandBuilder::RemoteCommandBuilder() { result_.set_command_id(g_last_command_id_ + 1); @@ -23,7 +25,7 @@ return std::move(result_); } -RemoteCommandBuilder& RemoteCommandBuilder::SetCommandId(int value) { +RemoteCommandBuilder& RemoteCommandBuilder::SetCommandId(int64_t value) { g_last_command_id_ = value; result_.set_command_id(value); return *this;
diff --git a/components/policy/core/common/remote_commands/test_support/remote_command_builders.h b/components/policy/core/common/remote_commands/test_support/remote_command_builders.h index 78ad22e..e898c66 100644 --- a/components/policy/core/common/remote_commands/test_support/remote_command_builders.h +++ b/components/policy/core/common/remote_commands/test_support/remote_command_builders.h
@@ -28,7 +28,7 @@ enterprise_management::RemoteCommand Build(); - RemoteCommandBuilder& SetCommandId(int id); + RemoteCommandBuilder& SetCommandId(int64_t value); RemoteCommandBuilder& ClearCommandId(); RemoteCommandBuilder& SetType(enterprise_management::RemoteCommand::Type); RemoteCommandBuilder& ClearType();
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb index 0fec1b8..f34a38b0 100644 --- a/components/policy/resources/policy_templates_es-419.xtb +++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -3380,6 +3380,17 @@ Para obtener información detallada sobre los patrones de <ph name="URL_LABEL" /> válidos, consulta https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> no es un valor aceptado para esta política.</translation> <translation id="4061590579642538878">Proporciona datos sobre los informes de fallas</translation> +<translation id="4062646759141042418">Habilita <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> para una lista de URLs. + +Si estableces esta política, se especificará qué URLs ofrecerá <ph name="PRODUCT_NAME" /> para iniciar el flujo de certificación de los perfiles administrados. Esto último permite que esos sitios web obtengan un conjunto certificado de señales contextuales del dispositivo. +Esta política solo se puede configurar mediante la página de Chrome Enterprise Connectors en <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />. + +Si dejas vacía esta política o no la estableces, ningún sitio web podrá iniciar el flujo de certificación a nivel del usuario ni obtener señales del dispositivo. Sin embargo, si se habilita la política <ph name="BROWSER_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST" /> +correspondiente, se puede iniciar el flujo de certificación para el navegador administrado y se pueden obtener las señales del dispositivo. + +En <ph name="PRODUCT_OS_NAME" />, esta política está relacionada con la certificación remota donde automáticamente se genera un certificado y se sube al servidor. Para usar el flujo de certificación en la pantalla de acceso del dispositivo, usa la política <ph name="DEVICE_LOGIN_SCREEN_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST_POLICY_NAME" />. + +Para obtener información detallada sobre los patrones válidos de <ph name="URL_LABEL" />, consulta https://support.google.com/chrome/a?p=url_blocklist_filter_format.</translation> <translation id="4070039109671307724">Varios</translation> <translation id="4072225853834793549">Inhabilitar las combinaciones de accesibilidad en la pantalla de acceso</translation> <translation id="4075675819066819571">Ubicar la biblioteca en el lado izquierdo de la pantalla</translation> @@ -4207,6 +4218,7 @@ Si la estableces como falsa o no la estableces, es posible que la cancelación del eco de audio del sistema siga habilitada debido a su plan de lanzamiento, pero no se aplique de manera forzosa.</translation> +<translation id="4800865664096110749">Habilitar el flujo de certificación de <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> para una lista de las URLs en los perfiles administrados</translation> <translation id="4801512016965057443">Permitir itinerancia de datos móviles</translation> <translation id="4801647366128872782">Especificar las URLs que permiten generar informes sobre la tecnología heredada</translation> <translation id="4802744647065138872">Limita la cantidad de instantáneas sobre los datos del usuario que se conservan en caso de tener que realizar reversión de emergencia.</translation> @@ -5552,6 +5564,21 @@ Si no la estableces, <ph name="PRODUCT_NAME" /> utilizará el directorio predeterminado para el almacenamiento en caché, pero los usuarios podrán cambiar esa configuración con la función experimental de la línea de comandos --disk-cache-dir. <ph name="PRODUCT_NAME" /> administra el contenido del directorio raíz de un volumen. Por lo tanto, para evitar pérdida de datos u otros errores, no establezcas esta política para el directorio raíz o cualquier directorio que se utilice para otros propósitos. Consulta las variables que puedes utilizar (https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables).</translation> +<translation id="6082391187598394288">Esta política se puede usar de manera temporal para forzar la habilitación de la compatibilidad con la +API de PPB_VideoDecoder(Dev). + +Si no estableces la política o la inhabilitas, el navegador decidirá si +la API es compatible. +Si la habilitas, se admitirá la API. + +Esta política se puede usar en caso de que la eliminación continua de la compatibilidad con esta API +muestre problemas. Si tienes que utilizar la política, informa un error en crbug.com, +en el que expliques tu caso de uso y agrega a {blundell, vasilyt}@chromium.org en el campo Cc. La política está +disponible hasta la versión 114 de +<ph name="PRODUCT_NAME" />, después de la cual se eliminó la compatibilidad con esta API de forma incondicional. + +NOTA: Solo los procesos del renderizador recién iniciados reflejarán los cambios de esta +política mientras se esté ejecutando el navegador.</translation> <translation id="6083631234867522991">Windows (clientes de Windows):</translation> <translation id="608788685013546076">Establecer en porcentaje el umbral de la batería para el cambio de carga fuera del horario de mayor consumo</translation> <translation id="6089679180657323464">Supervisa la configuración del controlador de telemetría y diagnósticos wilco.</translation> @@ -5678,6 +5705,15 @@ Si estableces la política con un código hexadecimal de color válido, se generará automáticamente un tema basado en ese color y se aplicará al navegador. Los usuarios no podrán cambiar el tema establecido por la política. Si no la estableces, los usuarios podrán cambiar el tema de su navegador como prefieran.</translation> +<translation id="6195356309340063061">Habilita <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> para una lista de URLs. + +Si estableces esta política, se especificará qué URLs ofrecerá <ph name="PRODUCT_NAME" /> para iniciar el flujo de certificación de los navegadores administrados. Esto último permite que esos sitios web obtengan un conjunto certificado de señales contextuales del dispositivo. +Esta política solo se puede configurar mediante la página de Chrome Enterprise Connectors en <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />. + +Si dejas vacía esta política o no la estableces, ningún sitio web podrá iniciar el flujo de certificación a nivel del navegador ni obtener señales del dispositivo. Sin embargo, si se habilita la política <ph name="USER_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST" /> +correspondiente, se puede iniciar el flujo de certificación para el perfil administrado y se pueden obtener las señales del dispositivo. + +Para obtener información detallada sobre los patrones válidos de <ph name="URL_LABEL" />, consulta https://support.google.com/chrome/a?p=url_blocklist_filter_format.</translation> <translation id="6195802366906945965">Determina si se utilizará el verificador de certificados integrado para verificar los certificados de servidores</translation> <translation id="6198947200418556248">Esta política dejó de estar disponible. Si todavía necesitas el comportamiento heredado de las cookies, usa <ph name="LEGACY_SAMESITE_COOKIE_BEHAVIOR_ENABLED_FOR_DOMAIN_LIST_POLICY_NAME" />. Permite revertir todas las cookies al comportamiento del atributo <ph name="ATTRIBUTE_SAMESITE_NAME" /> heredado. Si se revierte el comportamiento, las cookies que no tengan un atributo <ph name="ATTRIBUTE_SAMESITE_NAME" /> especificado se tratarán según el atributo "<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />", las cookies con el atributo "<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />" ya no necesitarán el atributo "<ph name="ATTRIBUTE_SECURE_NAME" />", y se omitirá la comparación de esquemas cuando se evalúa si dos sitios son el mismo sitio. Para obtener la descripción completa, consulta https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies. @@ -7319,6 +7355,7 @@ Si inhabilitas la política, no se recopilarán datos anónimos con URL. Si no la estableces, el usuario podrá cambiar esta configuración de forma manual.</translation> +<translation id="7585312329612243723">Habilitar el flujo de certificación de <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> para una lista de las URLs en los navegadores administrados</translation> <translation id="7587345076013230465">Notificar al usuario que debe seleccionar el certificado de cliente cada vez que la política de selección automática coincida con varios certificados en la pantalla de acceso</translation> <translation id="7587921466180902617">Habilitar la prueba interna de Screencast para los usuarios de Family Link</translation> <translation id="759957074386651883">Configuración de Navegación segura</translation>
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb index 6e9d617..e722b75 100644 --- a/components/policy/resources/policy_templates_fr.xtb +++ b/components/policy/resources/policy_templates_fr.xtb
@@ -3344,6 +3344,16 @@ Pour en savoir plus sur les formats <ph name="URL_LABEL" /> valides, veuillez consulter la page https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. La valeur <ph name="WILDCARD_VALUE" /> n'est pas acceptée pour cette règle.</translation> <translation id="4061590579642538878">Transmettre les informations liées aux rapports d'erreur.</translation> +<translation id="4062646759141042418">Activer <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> pour une liste d'URL. + +Cette règle permet de spécifier à quelles URL <ph name="PRODUCT_NAME" /> proposera de lancer le flux d'attestation pour les profils gérés. Elle permet à ces sites Web d'obtenir un ensemble certifié de signaux contextuels provenant de l'appareil. +Cette règle ne peut être configurée que sur la page des connecteurs Chrome Enterprise dans la <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />. + +Si cette règle n'est pas configurée ou qu'elle est vide, aucun site Web ne peut lancer le parcours d'attestation au niveau de l'utilisateur ni recevoir de signaux de l'appareil. Toutefois, si la règle <ph name="BROWSER_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST" /> correspondante est activée, le flux d'attestation peut être lancé pour le navigateur géré et les signaux de l'appareil peuvent être collectés. + +Pour <ph name="PRODUCT_OS_NAME" />, cette règle est liée à l'attestation à distance, où un certificat est automatiquement généré et importé sur le serveur. Pour utiliser le flux d'attestation sur l'écran de connexion de l'appareil, veuillez utiliser la règle <ph name="DEVICE_LOGIN_SCREEN_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST_POLICY_NAME" />. + +Pour en savoir plus sur les formats <ph name="URL_LABEL" /> valides, veuillez consulter https://support.google.com/chrome/a?p=url_blocklist_filter_format.</translation> <translation id="4070039109671307724">Divers</translation> <translation id="4072225853834793549">Désactiver les raccourcis d'accessibilité sur l'écran de connexion</translation> <translation id="4075675819066819571">Placer l'étagère sur le côté gauche de l'écran</translation> @@ -4114,6 +4124,7 @@ Si cette règle est définie sur "True", l'annulation de l'écho audio du système est toujours activée. Si elle est définie sur "False" ou n'est pas définie, il est possible que l'annulation de l'écho audio du système soit activée, en fonction de son plan de lancement, mais elle n'est pas appliquée par cette règle.</translation> +<translation id="4800865664096110749">Activer le flux d'attestation <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> pour une liste d'URL dans les profils gérés</translation> <translation id="4801512016965057443">Autoriser l'itinérance des données mobiles</translation> <translation id="4801647366128872782">Spécifier les URL qui génèrent un rapport en cas d'utilisation d'anciennes technologies</translation> <translation id="4802744647065138872">Limite le nombre d'instantanés de données utilisateur retenus en prévision d'un éventuel rollback d'urgence.</translation> @@ -5436,6 +5447,14 @@ Si cette règle n'est pas configurée, <ph name="PRODUCT_NAME" /> utilise le répertoire de cache par défaut. Toutefois, l'utilisateur peut modifier ce paramètre avec le flag de ligne de commande "--disk-cache-dir". <ph name="PRODUCT_NAME" /> gère le contenu du répertoire racine d'un volume. Ainsi, pour éviter de perdre des données ou de générer d'autres erreurs, ne définissez pas cette règle sur le répertoire racine ni sur un autre répertoire utilisé à d'autres fins. Pour savoir quelles variables vous pouvez utiliser, consultez la page https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables.</translation> +<translation id="6082391187598394288">Cette règle peut être utilisée temporairement pour forcer l'activation de la prise en charge de l'API PPB_VideoDecoder(Dev). + +Si elle n'est pas configurée ou si elle est désactivée, le navigateur décide si l'API est prise en charge. +Si elle est activée, l'API est prise en charge. + +Cette règle peut être utilisée si l'élimination de la prise en charge de l'API entraîne des problèmes. Si vous devez utiliser cette règle, veuillez signaler un bug sur crbug.com en expliquant votre cas d'utilisation et mettez en copie {blundell, vasilyt}@chromium.org. La règle est disponible jusqu'à la version 114 de <ph name="PRODUCT_NAME" />, après laquelle la prise en charge de cette API a été supprimée sans conditions. + +REMARQUE : Seuls les nouveaux processus du moteur de rendu refléteront les modifications apportées à cette règle lorsque le navigateur sera en cours d'exécution.</translation> <translation id="6083631234867522991">Windows (clients Windows) :</translation> <translation id="608788685013546076">Définir le niveau de batterie minimal autorisé avec l'alimentation alternée en heures pleines</translation> <translation id="6089679180657323464">Contrôle les paramètres du dispositif de contrôle de diagnostic et de télémétrie de Wilco.</translation> @@ -5560,6 +5579,14 @@ Si tel est le cas, un thème basé sur cette couleur est automatiquement généré et appliqué au navigateur. Les utilisateurs ne peuvent pas modifier le thème défini dans cette règle. En revanche, ils peuvent appliquer le thème de leur choix au navigateur si la règle n'est pas configurée.</translation> +<translation id="6195356309340063061">Activer <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> pour une liste d'URL. + +Cette règle permet de spécifier à quelles URL <ph name="PRODUCT_NAME" /> proposera de lancer le flux d'attestation pour les navigateurs gérés. Elle permet à ces sites Web d'obtenir un ensemble certifié de signaux contextuels provenant de l'appareil. +Cette règle ne peut être configurée que sur la page des connecteurs Chrome Enterprise dans la <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />. + +Si cette règle n'est pas configurée ou qu'elle est vide, aucun site Web ne peut lancer le parcours d'attestation au niveau du navigateur ni recevoir de signaux de l'appareil. Toutefois, si la règle <ph name="USER_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST" /> correspondante est activée, le flux d'attestation peut être lancé pour le profil géré et les signaux de l'appareil peuvent être collectés. + +Pour en savoir plus sur les formats <ph name="URL_LABEL" /> valides, veuillez consulter https://support.google.com/chrome/a?p=url_blocklist_filter_format.</translation> <translation id="6195802366906945965">Déterminer si l'outil de vérification des certificats intégré sera utilisé pour vérifier les certificats des serveurs</translation> <translation id="6198947200418556248">Cette règle est obsolète. Si vous nécessitez toujours l'ancien comportement des cookies, veuillez utiliser <ph name="LEGACY_SAMESITE_COOKIE_BEHAVIOR_ENABLED_FOR_DOMAIN_LIST_POLICY_NAME" />. Permet de rétablir l'ancien comportement <ph name="ATTRIBUTE_SAMESITE_NAME" /> pour tous les cookies. Si vous rétablissez l'ancien comportement, les cookies dont la valeur de l'attribut <ph name="ATTRIBUTE_SAMESITE_NAME" /> n'est pas spécifiée sont traités comme si la valeur "<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />" était définie. Ceux dont l'attribut a pour valeur "<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />" n'exigent plus que la valeur de l'attribut "<ph name="ATTRIBUTE_SECURE_NAME" />" soit spécifiée. Les schémas ne sont pas non plus comparés pour déterminer si deux sites sont identiques ou non. Pour obtenir une description complète, consultez https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies. @@ -7162,6 +7189,7 @@ Si vous la désactivez, les données anonymes incluant les URL ne sont pas collectées. Si cette règle n'est pas configurée, l'utilisateur peut modifier ce paramètre manuellement.</translation> +<translation id="7585312329612243723">Activer le flux d'attestation <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> pour une liste d'URL dans les navigateurs gérés</translation> <translation id="7587345076013230465">Demander à l'utilisateur de sélectionner le certificat client chaque fois que la règle de sélection automatique établit une correspondance avec plusieurs certificats sur l'écran de connexion</translation> <translation id="7587921466180902617">Active la version dogfood de l'enregistreur d'écran pour les utilisateurs de Family Link</translation> <translation id="759957074386651883">Paramètres de navigation sécurisée</translation>
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb index 71649d3..802b082 100644 --- a/components/policy/resources/policy_templates_id.xtb +++ b/components/policy/resources/policy_templates_id.xtb
@@ -3387,6 +3387,17 @@ Untuk informasi selengkapnya tentang pola <ph name="URL_LABEL" /> yang valid, lihat https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> bukanlah nilai yang diterima untuk kebijakan ini.</translation> <translation id="4061590579642538878">Laporkan informasi tentang laporan kerusakan.</translation> +<translation id="4062646759141042418">Mengaktifkan <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> untuk daftar URL. + +Menyetel kebijakan ini akan menentukan URL mana yang akan ditawarkan oleh <ph name="PRODUCT_NAME" /> untuk memulai alur pengesahan bagi profil terkelola. Hal ini memungkinkan situs tersebut mendapatkan serangkaian sinyal kontekstual yang telah disahkan dari perangkat. +Kebijakan ini hanya dapat dikonfigurasi melalui halaman Chrome Enterprise Connectors di <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />. + +Jika kebijakan ini disetel ke kosong atau tidak disetel, tidak ada situs yang akan dapat memulai alur pengesahan tingkat pengguna dan memperoleh sinyal dari perangkat. Namun, jika kebijakan +<ph name="BROWSER_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST" /> yang sesuai diaktifkan, alur pengesahan dapat dimulai untuk browser terkelola dan sinyal perangkat dapat dikumpulkan. + +Untuk <ph name="PRODUCT_OS_NAME" />, kebijakan ini berhubungan dengan pengesahan jarak jauh dengan sertifikat yang otomatis dibuat dan diupload ke server. Untuk penggunaan alur pengesahan pada layar login perangkat, gunakan kebijakan <ph name="DEVICE_LOGIN_SCREEN_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST_POLICY_NAME" />. + +Untuk informasi selengkapnya tentang pola <ph name="URL_LABEL" /> yang valid, lihat https://support.google.com/chrome/a?p=url_blocklist_filter_format.</translation> <translation id="4070039109671307724">Lain-lain</translation> <translation id="4072225853834793549">Nonaktifkan pintasan aksesibilitas di layar login</translation> <translation id="4075675819066819571">Posisikan rak di sisi kiri layar</translation> @@ -4212,6 +4223,7 @@ Jika kebijakan ini disetel ke salah (false) atau tidak disetel, pengurangan gema audio sistem mungkin masih diaktifkan berdasarkan rencana peluncurannya, tetapi tidak diberlakukan oleh kebijakan ini.</translation> +<translation id="4800865664096110749">Mengaktifkan alur pengesahan <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> untuk daftar URL di Profil Terkelola</translation> <translation id="4801512016965057443">Izinkan roaming data seluler</translation> <translation id="4801647366128872782">Menentukan URL yang mengizinkan laporan teknologi lama</translation> <translation id="4802744647065138872">Membatasi jumlah ringkasan data pengguna yang disimpan untuk digunakan ketika terjadi rollback darurat.</translation> @@ -5557,6 +5569,21 @@ Jika tidak ditetapkan, <ph name="PRODUCT_NAME" /> akan menggunakan direktori cache default, tetapi pengguna dapat mengubah setelan tersebut dengan tanda command line --dir-cache-disk. <ph name="PRODUCT_NAME" /> akan mengelola konten direktori utama volume. Agar tidak kehilangan data atau mengalami error lainnya, jangan menetapkan kebijakan ini ke direktori utama atau semua direktori yang digunakan untuk tujuan lainnya. Lihat variabel yang dapat Anda gunakan (https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables).</translation> +<translation id="6082391187598394288">Kebijakan ini dapat digunakan sementara waktu untuk mengaktifkan paksa dukungan bagi +PPB_VideoDecoder(Dev) API. + +Jika kebijakan tidak disetel atau disetel ke Nonaktif, browser akan menentukan apakah +API didukung atau tidak. +Jika kebijakan disetel ke Aktif, API akan didukung. + +Kebijakan ini dapat digunakan jika penghapusan dukungan yang sedang berlangsung untuk API ini +menyebabkan masalah. Jika Anda harus menggunakan kebijakan ini, laporkan bug di crbug.com +yang menjelaskan kasus penggunaan Anda dan CC {blundell, vasilyt}@chromium.org. Kebijakan ini +tersedia hingga <ph name="PRODUCT_NAME" /> +versi 114, setelah itu dukungan untuk API ini akan dihapus tanpa syarat. + +CATATAN: Hanya proses perender yang baru dimulai yang akan menunjukkan perubahan pada +kebijakan ini saat browser berjalan.</translation> <translation id="6083631234867522991">Windows (klien Windows):</translation> <translation id="608788685013546076">Menetapkan ambang batas pergeseran puncak daya baterai dalam persen</translation> <translation id="6089679180657323464">Mengontrol setelan pengontrol diagnostik dan telemetri wilco.</translation> @@ -5683,6 +5710,15 @@ Jika kebijakan disetel ke warna hex yang valid, tema yang didasarkan pada warna tersebut akan otomatis dibuat dan diterapkan ke browser. Pengguna tidak akan dapat mengubah tema yang disetel oleh kebijakan ini. Jika kebijakan tidak disetel, pengguna akan dapat mengubah tema browser sesuai keinginan.</translation> +<translation id="6195356309340063061">Mengaktifkan <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> untuk daftar URL. + +Menyetel kebijakan ini akan menentukan URL mana yang akan ditawarkan oleh <ph name="PRODUCT_NAME" /> untuk memulai alur pengesahan bagi browser terkelola. Hal ini memungkinkan situs tersebut mendapatkan serangkaian sinyal kontekstual yang telah disahkan dari perangkat. +Kebijakan ini hanya dapat dikonfigurasi melalui halaman Chrome Enterprise Connectors di <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />. + +Jika kebijakan ini disetel ke kosong atau tidak disetel, tidak ada situs yang akan dapat memulai alur pengesahan tingkat browser dan memperoleh sinyal dari perangkat. Namun, jika kebijakan +<ph name="USER_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST" /> yang sesuai diaktifkan, alur pengesahan dapat dimulai untuk profil terkelola dan sinyal perangkat dapat dikumpulkan. + +Untuk informasi selengkapnya tentang pola <ph name="URL_LABEL" /> yang valid, lihat https://support.google.com/chrome/a?p=url_blocklist_filter_format.</translation> <translation id="6195802366906945965">Menentukan apakah pemverifikasi sertifikat bawaan akan digunakan untuk memverifikasi sertifikat server</translation> <translation id="6198947200418556248">Kebijakan ini tidak digunakan lagi. Jika Anda masih memerlukan perilaku cookie lama, gunakan <ph name="LEGACY_SAMESITE_COOKIE_BEHAVIOR_ENABLED_FOR_DOMAIN_LIST_POLICY_NAME" />. Mengizinkan Anda mengembalikan semua cookie ke perilaku <ph name="ATTRIBUTE_SAMESITE_NAME" /> lama. Pengembalian ke perilaku lama akan menyebabkan cookie yang tidak menentukan atribut <ph name="ATTRIBUTE_SAMESITE_NAME" /> dianggap sebagai "<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />", menghapus persyaratan bagi cookie "<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />" untuk membawa atribut "<ph name="ATTRIBUTE_SECURE_NAME" />", dan melewati perbandingan skema saat evaluasi jika dua situs adalah situs yang sama. Lihat penjelasan lengkapnya di https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies. @@ -7327,6 +7363,7 @@ Jika kebijakan disetel ke Nonaktif, pengumpulan data anonim yang menyertakan URL tidak akan diaktifkan. Jika kebijakan ini tidak disetel, pengguna akan dapat mengubah setelan ini secara manual.</translation> +<translation id="7585312329612243723">Mengaktifkan alur pengesahan <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> untuk daftar URL di Browser Terkelola</translation> <translation id="7587345076013230465">Minta pengguna memilih sertifikat klien setiap kali kebijakan pemilihan otomatis cocok dengan beberapa sertifikat di layar login</translation> <translation id="7587921466180902617">Aktifkan dogfood Screencast untuk pengguna Family Link</translation> <translation id="759957074386651883">Setelan Safe Browsing</translation>
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index f7706de2..3cc1843 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -3337,6 +3337,16 @@ Ga naar https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns voor gedetailleerde informatie over geldige <ph name="URL_LABEL" />-patronen. <ph name="WILDCARD_VALUE" /> is geen geaccepteerde waarde voor dit beleid.</translation> <translation id="4061590579642538878">Informatie over crashrapporten rapporteren.</translation> +<translation id="4062646759141042418">Zet <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> aan voor een lijst met URL's. + +Als je dit beleid instelt, geef je op welke URL's <ph name="PRODUCT_NAME" /> aanbiedt om het attestproces voor beheerde profielen te starten. Met de laatstgenoemde optie kunnen die websites een attest van contextbewuste signalen van het apparaat krijgen. +Je kunt dit beleid alleen instellen via de pagina Chrome Enterprise Connectors op de <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />. + +Als je dit beleid niet instelt of leeg laat, kan geen enkele website een attestproces op gebruikersniveau starten en signalen van het apparaat krijgen. Als het bijbehorende beleid <ph name="BROWSER_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST" /> wel wordt toegepast, kan het attestproces worden gestart voor de beheerde browser en apparaatsignalen. + +Voor <ph name="PRODUCT_OS_NAME" /> is dit beleid gerelateerd aan externe attesten, waarbij er automatisch certificaten worden gegenereerd en geüpload naar de server. Gebruik het beleid <ph name="DEVICE_LOGIN_SCREEN_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST_POLICY_NAME" /> om het attestproces op het inlogscherm van het apparaat te gebruiken. + +Ga naar https://support.google.com/chrome/a?p=url_blocklist_filter_format voor uitgebreide informatie over geldige <ph name="URL_LABEL" />-patronen.</translation> <translation id="4070039109671307724">Overig</translation> <translation id="4072225853834793549">Snelkoppelingen voor toegankelijkheid op het inlogscherm uitzetten</translation> <translation id="4075675819066819571">De plank aan de linkerkant van het scherm plaatsen</translation> @@ -4096,6 +4106,7 @@ Als je dit beleid instelt op True, wordt opheffing van systeemaudio-echo altijd aangezet. Als je dit beleid instelt op False of niet instelt, kan opheffing van systeemaudio-echo nog steeds worden aangezet op basis van het bijbehorende lanceringsplan maar wordt het niet afgedwongen door dit beleid.</translation> +<translation id="4800865664096110749">Het attestproces <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> aanzetten voor een lijst met URL's in beheerde profielen</translation> <translation id="4801512016965057443">Mobiele dataroaming toestaan</translation> <translation id="4801647366128872782">Definieert URL's die rapportage over verouderde technologie toestaan</translation> <translation id="4802744647065138872">Beperkt het aantal momentopnamen van gebruikersgegevens dat wordt bewaard voor gebruik bij een noodrollback.</translation> @@ -5406,6 +5417,14 @@ Als je dit beleid niet instelt, gebruikt <ph name="PRODUCT_NAME" /> de standaard cachedirectory. Gebruikers kunnen die instelling echter wijzigen met behulp van de opdrachtregel '--disk-cache-dir'. <ph name="PRODUCT_NAME" /> beheert de inhoud van de root-map van een volume. Als je gegevensverlies of andere fouten wilt voorkomen, moet je dit beleid niet instellen op de root-map of een directory die voor andere doeleinden wordt gebruikt. Bekijk de variabelen die je kunt gebruiken (https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables).</translation> +<translation id="6082391187598394288">Dit beleid kan tijdelijk worden gebruikt om ondersteuning voor de PPB_VideoDecoder(Dev) API gedwongen aan te zetten. + +Als je het beleid niet instelt of niet toepast, bepaalt de browser of de API wordt ondersteund. +Als je het beleid toepast, wordt de API ondersteund. + +Dit beleid kan worden gebruikt als de lopende beëindiging van ondersteuning voor deze API problemen aan het licht brengt. Als je het beleid moet gebruiken, dien je een bug in op crbug.com, met een cc naar {blundell, vasilyt}@chromium.org, waarin je je use case uitlegt. Het beleid is beschikbaar via <ph name="PRODUCT_NAME" /> versie 114, waarna support voor deze API onvoorwaardelijk is beëindigd. + +OPMERKING: Wijzigingen in dit beleid worden alleen weergegeven in onlangs gestarte weergaveprocessen terwijl de browser actief is.</translation> <translation id="6083631234867522991">Windows (Windows-clients):</translation> <translation id="608788685013546076">Drempel voor stroompiekverschuiving van batterij instellen in procenten</translation> <translation id="6089679180657323464">Hiermee beheer je de instellingen voor wilco DTC.</translation> @@ -5532,6 +5551,14 @@ Als je dit beleid instelt op een geldige hexadecimale kleur, wordt op basis van deze kleur automatisch een thema samengesteld en toegepast op de browser. Gebruikers kunnen het in het beleid ingestelde thema niet wijzigen. Als je dit beleid niet instelt, kunnen gebruikers het thema voor de browser naar eigen inzicht instellen.</translation> +<translation id="6195356309340063061">Zet <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> aan voor een lijst met URL's. + +Als je dit beleid instelt, geef je op welke URL's <ph name="PRODUCT_NAME" /> aanbiedt om het attestproces voor beheerde browsers te starten. Met de laatstgenoemde optie kunnen die websites een attest van contextbewuste signalen van het apparaat krijgen. +Je kunt dit beleid alleen instellen via de pagina Chrome Enterprise Connectors op de <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />. + +Als je dit beleid niet instelt of leeg laat, kan geen enkele website een attestproces op browserniveau starten en signalen van het apparaat krijgen. Als het bijbehorende beleid <ph name="USER_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST" /> wel wordt toegepast, kan het attestproces worden gestart voor het beheerde profiel en kunnen apparaatsignalen worden verzameld. + +Ga naar https://support.google.com/chrome/a?p=url_blocklist_filter_format voor uitgebreide informatie over geldige <ph name="URL_LABEL" />-patronen.</translation> <translation id="6195802366906945965">Bepaalt of de ingebouwde certificaatverificatie wordt gebruikt om servercertificaten te verifiëren</translation> <translation id="6198947200418556248">Dit beleid is beëindigd. Als je nog steeds verouderd cookiegedrag nodig hebt, gebruik je <ph name="LEGACY_SAMESITE_COOKIE_BEHAVIOR_ENABLED_FOR_DOMAIN_LIST_POLICY_NAME" />. Hiermee kun je alle cookies terugzetten op het verouderde gedrag van <ph name="ATTRIBUTE_SAMESITE_NAME" />. Als je het verouderde gedrag terugzet, worden cookies waarin geen <ph name="ATTRIBUTE_SAMESITE_NAME" />-kenmerk is opgegeven, als <ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" /> behandeld en wordt de vereiste weggenomen dat cookies van <ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" /> het kenmerk <ph name="ATTRIBUTE_SECURE_NAME" /> bevatten. De schemavergelijking wordt overgeslagen tijdens de controle of 2 sites dezelfde site zijn. Zie https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies voor een volledige beschrijving. @@ -7129,6 +7156,7 @@ Als je het beleid niet toepast, wordt de geanonimiseerde gegevensverzameling met URL-sleutel niet aangezet. Als je dit beleid niet instelt, kunnen gebruikers deze instelling handmatig wijzigen.</translation> +<translation id="7585312329612243723">Het attestproces <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> aanzetten voor een lijst met URL's in beheerde browsers</translation> <translation id="7587345076013230465">De gebruiker vragen om het clientcertificaat te selecteren als het beleid voor automatische selectie overeenkomt met meerdere certificaten op het inlogscherm</translation> <translation id="7587921466180902617">Dogfood-versie van Screencast aanzetten voor gebruikers van Family Link</translation> <translation id="759957074386651883">Safe Browsing-instellingen</translation>
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index 4be8a58..d77f15cf 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -3341,6 +3341,16 @@ Подробнее о допустимых шаблонах <ph name="URL_LABEL" />: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Значение <ph name="WILDCARD_VALUE" /> не поддерживается для этого правила.</translation> <translation id="4061590579642538878">Передача информации из отчетов о сбое</translation> +<translation id="4062646759141042418">Включить <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> для списка URL. + +Правило позволяет указать, каким URL <ph name="PRODUCT_NAME" /> будет предлагать пройти проверку управляемых профилей. Так выбранные сайты могут получать подтвержденный набор контекстных сигналов от устройства. +Это правило можно настроить только на странице Chrome Enterprise Connectors через <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />. + +Если правило не настроено или в качестве значения указана пустая строка, никакие сайты не могут проходить проверку на уровне пользователя и получать сигналы от устройства. Однако если включено правило <ph name="BROWSER_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST" />, то получить сигналы от устройства можно, начав проверку для управляемого браузера. + +В <ph name="PRODUCT_OS_NAME" /> это правило относится к удаленной проверке, во время которой автоматически генерируется сертификат, который затем загружается на сервер. Чтобы включить проверку на экране входа, используйте правило <ph name="DEVICE_LOGIN_SCREEN_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST_POLICY_NAME" />. + +Подробнее о допустимых шаблонах <ph name="URL_LABEL" />: https://support.google.com/chrome/a?p=url_blocklist_filter_format.</translation> <translation id="4070039109671307724">Другое</translation> <translation id="4072225853834793549">Не использовать быстрое включение специальных возможностей на экране входа</translation> <translation id="4075675819066819571">Расположить панель запуска с левой стороны экрана</translation> @@ -4097,6 +4107,7 @@ Если установлено значение True, эхоподавление системного звука всегда будет включено. Если это правило не настроено или для него установлено значение False, эхоподавление системного звука можно будет включить после официального запуска этой функции.</translation> +<translation id="4800865664096110749">Включение проверки <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> для списка URL в управляемых профилях</translation> <translation id="4801512016965057443">Разрешить мобильный интернет-роуминг</translation> <translation id="4801647366128872782">URL, для которых отправляются отчеты об устаревших функциях</translation> <translation id="4802744647065138872">Ограничение количества снимков пользовательских данных, которые хранятся для выполнения вынужденного отката версии</translation> @@ -5421,6 +5432,14 @@ Если правило не настроено, <ph name="PRODUCT_NAME" /> использует каталог по умолчанию, однако пользователи могут его изменить с помощью экспериментального параметра --disk-cache-dir. <ph name="PRODUCT_NAME" /> управляет содержимым корневого каталога тома, поэтому не указывайте в этом правиле корневой каталог или каталог, который используется в других целях. Это позволит избежать потери данных или возникновения ошибок. Список поддерживаемых переменных приведен здесь: https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables.</translation> +<translation id="6082391187598394288">Это правило можно временно использовать, чтобы принудительно включать поддержку PPB_VideoDecoder(Dev) API. + +Если правило отключено или не настроено, браузер автоматически определяет, поддерживается ли этот API. +Если правило включено, указанный API будет поддерживаться. + +Это правило можно использовать, если из-за прекращения поддержки API возникают проблемы. Если вам необходимо применить это правило, сообщите об ошибке на сайте crbug.com, объяснив, как оно будет использоваться. Также отправьте эту информацию на адреса blundell@chromium.org и vasilyt@chromium.org. Правило доступно в <ph name="PRODUCT_NAME" /> до версии 114. Затем поддержка указанного API была окончательно прекращена. + +Обратите внимание, что, пока браузер открыт, изменения в настройках этого правила будут влиять только на новые процессы обработки.</translation> <translation id="6083631234867522991">Windows (клиенты Windows):</translation> <translation id="608788685013546076">Указать пороговое значение заряда батареи в процентах при использовании режима пиковой нагрузки</translation> <translation id="6089679180657323464">Определяет настройки Wilco DTC</translation> @@ -5547,6 +5566,14 @@ Если в правиле указан допустимый шестнадцатеричный код цвета, на его основе автоматически формируется и применяется тема браузера. Пользователи не могут изменить тему, заданную в этом правиле. Если правило не настроено, пользователи могут изменить тему браузера.</translation> +<translation id="6195356309340063061">Включить <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> для списка URL. + +Правило позволяет указать, каким URL <ph name="PRODUCT_NAME" /> будет предлагать пройти проверку управляемых браузеров. Так выбранные сайты могут получать подтвержденный набор контекстных сигналов от устройства. +Это правило можно настроить только на странице Chrome Enterprise Connectors через <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />. + +Если правило не настроено или в качестве значения указана пустая строка, никакие сайты не могут проходить проверку на уровне браузера и получать сигналы от устройства. Однако если включено правило <ph name="USER_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST" />, то получить сигналы от устройства можно, начав проверку для управляемого профиля. + +Подробнее о допустимых шаблонах <ph name="URL_LABEL" />: https://support.google.com/chrome/a?p=url_blocklist_filter_format.</translation> <translation id="6195802366906945965">Определяет, будет ли использоваться встроенный инструмент верификации для проверки сертификатов сервера</translation> <translation id="6198947200418556248">Это правило больше не поддерживается. Если вам требуется ранее применявшееся поведение для файлов cookie, используйте правило <ph name="LEGACY_SAMESITE_COOKIE_BEHAVIOR_ENABLED_FOR_DOMAIN_LIST_POLICY_NAME" />. Позволяет восстановить ранее применявшееся поведение для всех файлов cookie с атрибутом <ph name="ATTRIBUTE_SAMESITE_NAME" />. В этом случае файлы cookie, в которых не указан атрибут <ph name="ATTRIBUTE_SAMESITE_NAME" />, будут обрабатываться как файлы с атрибутом <ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />. Кроме того, требование о наличии атрибута <ph name="ATTRIBUTE_SECURE_NAME" /> в файлах cookie с атрибутом <ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" /> будет снято, а сравнение протоколов при оценке двух одинаковых сайтов будет пропущено. Полное описание правила приведено здесь: https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies. @@ -7160,6 +7187,7 @@ При отключенном правиле эта информация не собирается. Если правило не настроено, пользователь может разрешить или запретить анонимный сбор данных о URL.</translation> +<translation id="7585312329612243723">Включение проверки <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> для списка URL в управляемых браузерах</translation> <translation id="7587345076013230465">Предлагать пользователю выбрать сертификат клиента, если правилу автоматического выбора соответствует несколько сертификатов на экране входа</translation> <translation id="7587921466180902617">Включить тестовую версию Screencast для пользователей Family Link</translation> <translation id="759957074386651883">Настройки Безопасного просмотра</translation>
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index 2a44eb9..65cf769 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -1377,6 +1377,7 @@ <translation id="2269319728625047531">เปิดใช้การแสดงการขอคำยินยอมให้ซิงค์ในระหว่างการลงชื่อเข้าใช้</translation> <translation id="2270747976331889601">เปิดใช้ฟีเจอร์ความปลอดภัย TLS 1.3 สำหรับ Trust Anchor ในพื้นที่</translation> <translation id="22754818344448444">อนุญาตให้ผู้ใช้เลือกเลย์เอาต์เทมเพลตเดสก์ที่จะโหลด</translation> +<translation id="2279381650184876122">ปิดใช้การรองรับ URL ข้อมูลใน SVGUseElement</translation> <translation id="2281496157391382819"> ควบคุมคำเตือนด้านความเป็นส่วนตัวของเซสชันผู้เยี่ยมชมที่มีการจัดการใน <ph name="PRODUCT_OS_NAME" /> หากตั้งค่านโยบายนี้เป็น "เท็จ" ระบบจะปิดใช้งานคำเตือนด้านความเป็นส่วนตัวในหน้าจอการเข้าสู่ระบบและการแจ้งเตือนการเรียกใช้อัตโนมัติในเซสชันผู้เยี่ยมชมที่มีการจัดการ @@ -2059,6 +2060,7 @@ การไม่ได้ตั้งค่านโยบาย (หรือตั้งค่าเป็น URL ที่ไม่ถูกต้อง) หมายความว่า <ph name="PRODUCT_NAME" /> จะไม่ใช้นโยบายนี้เป็นที่มาของกฎสำหรับการเปลี่ยนเบราว์เซอร์ หมายเหตุ: นโยบายนี้ชี้ไปยังไฟล์ XML ในรูปแบบเดียวกับนโยบาย <ph name="IEEM_SITELIST_POLICY" /> ของ <ph name="IE_PRODUCT_NAME" /> โดยจะโหลดกฎจากไฟล์ XML แต่ไม่แชร์กฎเหล่านั้นกับ <ph name="IE_PRODUCT_NAME" /> ดูข้อมูลเพิ่มเติมเกี่ยวกับนโยบาย <ph name="IEEM_SITELIST_POLICY" /> ของ <ph name="IE_PRODUCT_NAME" /> ได้ที่ https://docs.microsoft.com/internet-explorer/ie11-deploy-guide/what-is-enterprise-mode</translation> +<translation id="2940284205859074236">ใช้ตัวแสดงผล Skia สำหรับการแสดงผล PDF</translation> <translation id="2940653651012844682">รายการของการตั้งค่าบริการเครื่องมือเชื่อมต่อ Chrome Enterprise ที่จะใช้กับเครื่องมือเชื่อมต่อ <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" /> Enterprise ซึ่งจะเรียกใช้งานเมื่อเกิดการดำเนินการด้านความปลอดภัยใน Chrome โดยจะรวมถึงคำตัดสินในแง่ลบจากเครื่องมือเชื่อมต่อ Enterprise ของการวิเคราะห์ การใช้รหัสผ่านซ้ำ การนำทางไปยังหน้าที่ไม่ปลอดภัย และการดำเนินการอื่นๆ ของผู้ใช้ที่ละเอียดอ่อนต่อความปลอดภัย ช่อง <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> ระบุว่าผู้ให้บริการการรายงานใดที่สอดคล้องกับการตั้งค่า ส่วนช่อง <ph name="ENTERPRISE_CONNECTOR_ENABLED_EVENT_NAMES_FIELD" /> ระบุเหตุการณ์ที่เปิดใช้สำหรับผู้ให้บริการรายนี้ @@ -2349,6 +2351,7 @@ <translation id="3169872426103732947">แสดง URL เริ่มต้นและอนุญาตให้ผู้ใช้เปลี่ยนเป็น URL แบบเต็มได้</translation> <translation id="3171369832001535378">เทมเพลตชื่อโฮสต์เครือข่ายของอุปกรณ์</translation> <translation id="3173844121395372156">เราเลิกใช้งานและไม่รองรับนโยบายนี้แล้ว โปรดใช้นโยบาย "<ph name="NATIVE_MESSAGING_ALLOWLIST_POLICY_NAME" />" แทน</translation> +<translation id="3177537290334203187">ใช้ลักษณะการทำงานที่เป็นค่าเริ่มต้นเมื่อกำหนดว่าเว็บไซต์ต่างๆ จะส่งคำขอไปยังปลายทางเครือข่ายได้หรือไม่</translation> <translation id="3177802893484440532">ต้องใช้การตรวจสอบ OCSP/CRL ออนไลน์สำหรับ Trust Anchor ในพื้นที่</translation> <translation id="3179533009079100620">แสดงเครื่องมือเลือกโปรไฟล์</translation> <translation id="3180671894201217988">การตั้งค่านโยบายเป็น "เปิดใช้" หรือไม่ได้ตั้งค่าจะทำให้ซอฟต์แวร์ของบุคคลที่สามแทรกโค้ดปฏิบัติการลงในกระบวนการของ <ph name="PRODUCT_NAME" /> ไม่ได้ @@ -2378,6 +2381,7 @@ การไม่ตั้งค่า <ph name="DEFAULT_SEARCH_PROVIDER_NEW_TAB_URL_POLICY_NAME" /> จะทำให้ไม่มีการจัดเตรียมหน้าแท็บใหม่</translation> <translation id="3195103497550111266">หากตั้งค่านโยบายนี้เป็น <ph name="DEVICE_LTS_TAG_VALUE" /> จะอนุญาตให้อุปกรณ์รับข้อมูลอัปเดตเกี่ยวกับ LTS (การสนับสนุนระยะยาว)</translation> +<translation id="319608028525745507">เปิดใช้การรองรับ URL ข้อมูลใน SVGUseElement</translation> <translation id="3196585866522778760">โปรดทราบว่าจะมีการเลิกใช้งานและนำนโยบายนี้ออกใน <ph name="PRODUCT_OS_NAME" /> เวอร์ชัน 85 โปรดใช้ <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" /> แทน ระบุระยะเวลาก่อนตอบสนองการไม่มีความเคลื่อนไหวหลังจากไม่มีการป้อนข้อมูลจากผู้ใช้ ขณะที่เครื่องทำงานโดยใช้พลังงานแบตเตอรี่ @@ -3164,6 +3168,7 @@ หากไม่มีการตั้งค่านโยบายนี้ จะสามารถใช้ SPDY ได้</translation> <translation id="3887529334667818189">เส้นทางการท่องเว็บจะแสดงที่ chrome://history/journeys โดยค่าเริ่มต้น และผู้ใช้จะเปลี่ยนการแสดงเส้นทางการท่องเว็บได้</translation> +<translation id="3889458462150559611">อนุญาตให้เว็บไซต์ส่งคำขอในลักษณะที่ไม่ปลอดภัยไปยังปลายทางเครือข่ายใดก็ได้</translation> <translation id="388999630001435491">อนุญาตให้ "<ph name="PRODUCT_NAME" />" เชื่อมต่อกับอุปกรณ์ในที่อยู่ IP ส่วนตัวเท่านั้น</translation> <translation id="3891175633496805812">ปิดใช้ตัวควบคุมการวินิจฉัยพร้อมทั้งการวัดและส่งข้อมูลทางไกลของ Wilco</translation> <translation id="3891357445869647828">เปิดใช้งาน JavaScript</translation> @@ -3570,6 +3575,7 @@ การไม่ตั้งค่าจะให้เว็บไซต์ขอสิทธิ์เข้าถึงได้ แต่ผู้ใช้เปลี่ยนการตั้งค่านี้ได้</translation> <translation id="4275048399551500192">ไม่ต้องแสดงตัวควบคุมสื่อสำหรับเซสชัน <ph name="PRODUCT_NAME" /> ที่เริ่มต้นโดยอุปกรณ์อื่นๆ</translation> +<translation id="4282183301963493864">ปิดใช้ <ph name="PRODUCT_NAME" /> ในหน้าเว็บทุกหน้า</translation> <translation id="4282243913059705499">แสดงไอคอน "<ph name="PRODUCT_NAME" />" ในแถบเครื่องมือเสมอ</translation> <translation id="4285674129118156176">อนุญาตให้ผู้ใช้ที่ไม่ได้เป็นพาร์ทเนอร์ใช้ ARC</translation> <translation id="428948795004445932">อัตราที่ใช้ในการสุ่มตัวอย่างและรวบรวมข้อมูลเครือข่าย ค่าขั้นต่ำที่อนุญาตคือ 1 นาที @@ -3802,6 +3808,7 @@ ดูข้อมูลโดยละเอียดเกี่ยวกับรูปแบบ <ph name="URL_LABEL" /> ที่ถูกต้องได้ที่ https://support.google.com/chrome/a?p=url_blocklist_filter_format</translation> <translation id="449561952193478261">ไฟแบ็กไลต์ของแป้นพิมพ์เป็นสีน้ำเงิน</translation> <translation id="449784980858429908">ให้สิทธิ์เว็บไซต์โดยอัตโนมัติในการเชื่อมต่อกับพอร์ตอนุกรมทุกพอร์ต</translation> +<translation id="4498626728750662965">โปรแกรมอ่าน PDF ใช้ตัวแสดงผล Skia</translation> <translation id="4499376951770369935">การอัปเดต Chrome OS ได้รับการตั้งค่าเป็นเวอร์ชันที่ระบุไว้ในไฟล์ Manifest ของแอปคีออสก์</translation> <translation id="450080746522343150">บล็อกการดาวน์โหลดทั้งหมด</translation> <translation id="4501388411278568771">การอัปเกรด HTTPS อาจใช้ได้โดยขึ้นอยู่กับสถานะการเปิดตัวฟีเจอร์</translation> @@ -4221,6 +4228,7 @@ การไม่ตั้งค่านโยบายจะเชื่อมต่อ <ph name="PRODUCT_NAME" /> กับอุปกรณ์แคสต์เฉพาะในที่อยู่ RFC1918/RFC4193 เท่านั้น เว้นเสียแต่ว่ามีการเปิดใช้ฟีเจอร์ CastAllowAllIPs</translation> <translation id="489803897780524242">พารามิเตอร์ที่ควบคุมตำแหน่งข้อความค้นหาสำหรับผู้ให้บริการค้นหาในค่าเริ่มต้น</translation> <translation id="4899708173828500852">เปิดใช้ Google Safe Browsing</translation> +<translation id="4904462841601272815">เปิดใช้ <ph name="PRODUCT_NAME" /> ในหน้าเว็บทุกหน้า</translation> <translation id="4906194810004762807">อัตราการรีเฟรชสำหรับนโยบายอุปกรณ์</translation> <translation id="49093841899738146">หากตั้งค่านโยบายนี้เป็น "เปิดใช้" จะทำให้ <ph name="PRODUCT_NAME" /> รวบรวมบันทึกเหตุการณ์ WebRTC จากบริการของ Google เช่น Hangouts Meet และอัปโหลดบันทึกไปยัง Google ได้ บันทึกเหล่านี้มีข้อมูลการวินิจฉัยสำหรับแก้ไขข้อบกพร่องเกี่ยวกับการประชุมด้วยเสียงหรือการประชุมทางวิดีโอใน <ph name="PRODUCT_NAME" /> เช่น เวลาและขนาดของแพ็กเก็ต RTP, ผลป้อนกลับเกี่ยวกับความหนาแน่นในเครือข่าย ตลอดจนข้อมูลเมตาเกี่ยวกับระยะเวลาและคุณภาพของเสียงและเฟรมของวิดีโอ บันทึกเหล่านี้ไม่มีเนื้อหาเสียงหรือวิดีโอจากการประชุม เพื่อให้แก้ไขข้อบกพร่องได้ง่ายขึ้น Google อาจเชื่อมโยงบันทึกเหล่านี้ (โดยใช้รหัสเซสชัน) กับบันทึกอื่นๆ ที่บริการของ Google รวบรวมไว้เอง @@ -6103,6 +6111,7 @@ - หากตั้งค่านโยบายนี้เป็น "ปิดใช้" เบราว์เซอร์จะมีฟังก์ชันการทำงานที่จำกัด - หากตั้งค่านโยบายนี้เป็น "ปิดใช้" ผู้ดูแลระบบต้องแจ้งข้อมูลนี้กับผู้ใช้ปลายทางของอุปกรณ์</translation> +<translation id="6607983779935460461">การรองรับ URL ข้อมูลสำหรับ SVGUseElement</translation> <translation id="6609867253856597039">ตั้งค่าประสบการณ์ของผู้ใช้สำหรับฟีเจอร์ที่ปิดใช้</translation> <translation id="6614557704487944013">อนุญาตให้ผู้ใช้สามารถใช้เบราว์เซอร์ <ph name="LACROS_NAME" /> ได้</translation> <translation id="661610294649586421">ไม่อนุญาตคำขอ WebAuthn API ในเว็บไซต์ที่มีใบรับรอง TLS ไม่ถูกต้อง</translation> @@ -6697,6 +6706,7 @@ หากตั้งค่านโยบายนี้ ผู้ใช้จะเปลี่ยนหรือลบล้างไม่ได้ หากไม่ได้ตั้งค่านโยบายนี้ ปุ่มด้านซ้ายของเมาส์จะเป็นปุ่มหลักในขั้นต้น แต่ผู้ใช้จะสลับปุ่มได้ทุกเมื่อ</translation> +<translation id="7136237405361383549">ใช้ตัวแสดงผลที่เป็นค่าเริ่มต้นโดยอิงตามการกำหนดค่าการทดลองใช้ในวงจำกัด</translation> <translation id="7137460825181247519">นโยบายนี้เลิกใช้งานไปแล้วใน <ph name="PRODUCT_NAME" /> 83 โปรดใช้ <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> แทน การตั้งค่านโยบายเป็น "เปิดใช้" จะเปิดฟีเจอร์ Google Safe Browsing ของ Chrome ไว้เสมอ การตั้งค่านโยบายเป็น "ปิดใช้" จะปิด Google Safe Browsing ไว้ @@ -7271,6 +7281,13 @@ <translation id="7703041979684393741">ไม่อนุญาตให้รวบรวมบันทึกเหตุการณ์ของ WebRTC จากบริการของ Google</translation> <translation id="770339941914297201">ลักษณะการทำงานใหม่: แอป Chrome Kiosk จะอัปเดตโดยใช้ URL อัปเดตจากนโยบายเท่านั้น</translation> <translation id="7703737669292992839">ป้องกันกล่องโต้ตอบการเลือกไฟล์</translation> +<translation id="7703819160640109959">กำหนดว่าจะให้โปรแกรมอ่าน PDF ใน <ph name="PRODUCT_NAME" /> ใช้ตัวแสดงผล Skia หรือไม่ + +เมื่อเปิดใช้นโยบายนี้ โปรแกรมอ่าน PDF จะใช้ตัวแสดงผล Skia + +เมื่อปิดใช้นโยบายนี้ โปรแกรมอ่าน PDF จะใช้ตัวแสดงผล AGG ในปัจจุบัน + +เมื่อไม่ได้ตั้งค่านโยบายนี้ เบราว์เซอร์จะเลือกตัวแสดงผล PDF</translation> <translation id="7708934468069982537">เรานำนโยบายนี้ออกไปแล้วในเวอร์ชัน M58 หลังจากที่นำ DHE ออกจาก "<ph name="PRODUCT_NAME" />" หากไม่ได้ตั้งค่านโยบายหรือตั้งค่าเป็น "เท็จ" จะไม่มีการเปิดใช้ชุดการเข้ารหัส DHE ใน TLS หรืออาจตั้งค่าเป็น "จริง" เพื่อเปิดใช้ชุดการเข้ารหัส DHE และรักษาความเข้ากันได้กับเซิร์ฟเวอร์ที่ล้าสมัย ซึ่งเป็นมาตรการชั่วคราวและควรจะต้องมีการกำหนดค่าเซิร์ฟเวอร์ใหม่ @@ -7678,6 +7695,7 @@ <translation id="8091982561085048989">ธงบูลีนที่ระบุว่าควรใช้ IPP Everywhere เพื่อตั้งค่าเครื่องพิมพ์หรือไม่ ธงนี้ได้รับการรองรับใน <ph name="PRODUCT_OS_NAME" /> เวอร์ชัน 76 ขึ้นไป</translation> <translation id="8099880303030573137">ระยะหน่วงเวลาของการไม่ใช้งานเมื่อทำงานโดยใช้พลังงานแบตเตอรี่</translation> <translation id="8101381354936029836">กลุ่มขนาดเล็กของนโยบาย</translation> +<translation id="8102854005031553638">โปรแกรมอ่าน PDF ใช้ตัวแสดงผล AGG</translation> <translation id="8102913158860568230">การตั้งค่า mediastream เริ่มต้น</translation> <translation id="8104962233214241919">เลือกใบรับรองไคลเอ็นต์สำหรับไซต์เหล่านี้โดยอัตโนมัติ</translation> <translation id="8109762054721090517">เทมเพลตสำหรับ<ph name="IPP_ATTRIBUTE" /> <ph name="CLIENT_NAME_IPP_ATTRIBUTE" /> <ph name="INTERNET_PRINTING_PROTOCOL" /></translation> @@ -8443,6 +8461,9 @@ <translation id="8777369558049831576">แสดงช่องทำเครื่องหมาย "เปิดตลอดเวลา" ในกล่องโต้ตอบของโปรโตคอลภายนอก</translation> <translation id="8778320022586618010">เปิดใช้การรายงานสถานะกราฟิกของอุปกรณ์</translation> <translation id="8780039702448388726">ปิดใช้การรายงานข้อมูลเวอร์ชันอุปกรณ์</translation> +<translation id="8782203407766130175">นโยบายนี้เปิดใช้การรองรับ URL ข้อมูลของ SVGUseElement ซึ่งจะปิดใช้โดยค่าเริ่มต้นตั้งแต่ในเวอร์ชัน M119 เป็นต้นไป + หากตั้งค่านโยบายนี้เป็น "เปิดใช้" URL ข้อมูลจะใช้งานได้ต่อไปใน SVGUseElement + หากตั้งค่านโยบายนี้เป็น "ปิดใช้" หรือไม่ได้ตั้งค่าไว้ URL ข้อมูลจะใช้งานไม่ได้ใน SVGUseElement</translation> <translation id="8786409859071107656">การตั้งค่านโยบายเป็น "เปิดใช้" จะเปิดนโยบายการจัดการพลังงานของการแชร์พลังงานผ่าน USB อุปกรณ์บางเครื่องจะมีพอร์ต USB พอร์ตหนึ่งซึ่งมีไอคอนรูปสายฟ้าหรือรูปแบตเตอรี่สำหรับชาร์จอุปกรณ์โดยใช้แบตเตอรี่ของระบบ นโยบายนี้ส่งผลต่อลักษณะการชาร์จของพอร์ตนี้ขณะที่ระบบอยู่ในโหมดสลีปและโหมดปิดเครื่อง นโยบายนี้ไม่ส่งผลต่อพอร์ต USB อื่นๆ และลักษณะการชาร์จขณะที่ระบบทำงานอยู่ เมื่อพอร์ต USB จ่ายไฟเสมอ @@ -8511,6 +8532,9 @@ <translation id="8858642179038618439">บังคับใช้โหมดปลอดภัยของ YouTube</translation> <translation id="8860342862142842017">ปิดการบังคับใช้ความโปร่งใสของใบรับรองสำหรับรายการแฮช subjectPublicKeyInfo</translation> <translation id="8860894781631833477">ผู้ใช้จะกำหนดค่าเวอร์ชันการเผยแพร่ <ph name="PRODUCT_OS_NAME" /> ได้</translation> +<translation id="8862436312516745856">หากตั้งค่าเป็น "เปิดใช้" หรือไม่ได้ตั้งค่าไว้ <ph name="PRODUCT_NAME" /> จะได้รับอนุญาตในหน้าเว็บทุกหน้า + +หากตั้งค่าเป็น "ปิดใช้" <ph name="PRODUCT_NAME" /> จะใช้งานไม่ได้ในหน้าเว็บทุกหน้า</translation> <translation id="8864975621965365890">ระงับการแจ้งเรื่องการปฏิเสธ ซึ่งจะปรากฏขึ้นเมื่อไซต์แสดงผลโดย <ph name="PRODUCT_FRAME_NAME" /></translation> <translation id="8866430022832109569">การรายงานพื้นที่โฆษณาในแอป</translation> <translation id="886645881209114007">อนุญาตให้ผู้ใช้ใช้ <ph name="PLUGIN_VM_NAME" /> ใน <ph name="PRODUCT_OS_NAME" /> ได้</translation>
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb index f90eebc..0d629581 100644 --- a/components/policy/resources/policy_templates_tr.xtb +++ b/components/policy/resources/policy_templates_tr.xtb
@@ -3359,6 +3359,16 @@ Geçerli <ph name="URL_LABEL" /> kalıpları hakkında ayrıntılı bilgi için https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns adresine bakabilirsiniz. <ph name="WILDCARD_VALUE" />, bu politikada kabul edilen bir değer değildir.</translation> <translation id="4061590579642538878">Kilitlenme raporlarıyla ilgili bilgileri raporlama</translation> +<translation id="4062646759141042418">URL listesi için <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> politikasını etkinleştirin. + +Bu politika ayarlanırsa yönetilen profillerde onay akışını başlatmak için <ph name="PRODUCT_NAME" /> tarafından hangi URL'lerin sunulacağı belirtilir. İkincisi ise bu web sitelerinin, bağlama duyarlı onaylanmış sinyal grubunu cihazdan almasına olanak tanır. +Bu politika, yalnızca <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" /> içindeki Chrome Enterprise Connectors sayfasından yapılandırılabilir. + +Bu politikanın ayarlanmadan veya boş bırakılması hiçbir web sitesinin kullanıcı düzeyinde onay akışı başlatamayacağı ve cihazdan sinyal alamayacağı anlamına gelir. Ancak ilgili <ph name="BROWSER_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST" /> politikası etkinleştirilirse yönetilen tarayıcı için onay akışı başlatılabilir ve cihaz sinyalleri toplanabilir. + +<ph name="PRODUCT_OS_NAME" /> için bu politika, bir sertifikanın otomatik olarak oluşturulup sunucuya yüklendiği uzaktan onay işlemiyle ilgilidir. Onay akışının cihaz giriş ekranında kullanılması için lütfen <ph name="DEVICE_LOGIN_SCREEN_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST_POLICY_NAME" /> politikasını kullanın. + +Geçerli <ph name="URL_LABEL" /> kalıpları hakkında ayrıntılı bilgi için https://support.google.com/chrome/a?p=url_blocklist_filter_format adresine bakabilirsiniz.</translation> <translation id="4070039109671307724">Çeşitli</translation> <translation id="4072225853834793549">Oturum açma ekranında erişilebilirlik kısayollarını devre dışı bırak</translation> <translation id="4075675819066819571">Rafı ekranın sol tarafında konumlandır</translation> @@ -4135,6 +4145,7 @@ Bu politika Yanlış değerine ayarlanır veya ayarlanmadan bırakılırsa sistem ses yankısı giderme özelliği, kullanıma sunma planına göre hâlâ etkinleştirilebilir ancak bu politika tarafından zorunlu kılınmaz.</translation> +<translation id="4800865664096110749">Yönetilen Profillerde URL listesi için <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> onay akışını etkinleştir</translation> <translation id="4801512016965057443">Mobil veri dolaşımına izin ver</translation> <translation id="4801647366128872782">Eski teknoloji raporuna izin veren URL'leri belirtir</translation> <translation id="4802744647065138872">Acil geri alma durumunda kullanılmak üzere saklanan kullanıcı verilerinin anlık görüntü sayısını sınırlar.</translation> @@ -5457,6 +5468,15 @@ Ayarlanmazsa <ph name="PRODUCT_NAME" />, varsayılan önbellek dizinini kullanır, ancak kullanıcılar --disk-cache-dir komut satırı bayrağını kullanarak bu ayarı değiştirebilirler. <ph name="PRODUCT_NAME" />, birimin kök dizininin içeriğini yönetir. Bu nedenle veri kaybını veya diğer hataları önlemek için bu politikayı kök dizine veya başka amaçlarla kullanılan herhangi bir dizine ayarlamayın. Kullanabileceğiniz değişkenlere bakın (https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables).</translation> +<translation id="6082391187598394288">Bu politika, PPB_VideoDecoder(Dev) API desteğinin zorla etkinleştirilmesi için geçici olarak kullanılabilir. + +Politika ayarlanmadan bırakılırsa veya Devre Dışı değerine ayarlanırsa API'nin desteklenip desteklenmeyeceğine tarayıcı karar verir. +Politika, Etkin değerine ayarlanırsa API desteklenir. + +Bu politika, bu API'ye yönelik desteğin kaldırılma sürecinin sorun yaratması halinde kullanılabilir. Bu politikayı kullanmanız gerekirse lütfen crbug.com adresinden hata bildiriminde bulunun. Bildiriminizde, kullanım alanınızı açıklamayı ve CC bölümüne {blundell, vasilyt}@chromium.org adresini eklemeyi unutmayın. Bu politika en son <ph name="PRODUCT_NAME" /> 114 sürümüyle kullanılabilir. Bu API'ye yönelik destek 114 sürümünden sonra koşulsuz olarak kaldırılacaktır. + +NOT: Tarayıcı çalışırken bu politikada yapılan değişiklikleri yalnızca +yeni başlatılan oluşturucu işlemleri yansıtır.</translation> <translation id="6083631234867522991">Windows (Windows istemcileri):</translation> <translation id="608788685013546076">Güç tüketimi en üst düzeydeyken pil kullanımına geçme eşiği yüzdesini ayarla</translation> <translation id="6089679180657323464">Wilco teşhis ve telemetri denetleyicisi ayarlarını kontrol eder.</translation> @@ -5583,6 +5603,14 @@ Bu politika geçerli bir onaltılık renge ayarlanırsa otomatik olarak o renge dayalı bir tema oluşturularak tarayıcıya uygulanır. Kullanıcılar, politika tarafından ayarlanan temayı değiştiremez. Bu politika ayarlanmadan bırakılırsa kullanıcılar tarayıcılarının temasını istedikleri gibi değiştirebilir.</translation> +<translation id="6195356309340063061">URL listesi için <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> politikasını etkinleştirin. + +Bu politika ayarlanırsa yönetilen tarayıcılarda onay akışını başlatmak için <ph name="PRODUCT_NAME" /> tarafından hangi URL'lerin sunulacağı belirtilir. İkincisi ise bu web sitelerinin, bağlama duyarlı onaylanmış sinyal grubunu cihazdan almasına olanak tanır. +Bu politika, yalnızca <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" /> içindeki Chrome Enterprise Connectors sayfasından yapılandırılabilir. + +Bu politikanın ayarlanmadan veya boş bırakılması hiçbir web sitesinin tarayıcı düzeyinde onay akışı başlatamayacağı ve cihazdan sinyal alamayacağı anlamına gelir. Ancak ilgili <ph name="USER_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST" /> politikası etkinleştirilirse yönetilen profil için onay akışı başlatılabilir ve cihaz sinyalleri toplanabilir. + +Geçerli <ph name="URL_LABEL" /> kalıpları hakkında ayrıntılı bilgi için https://support.google.com/chrome/a?p=url_blocklist_filter_format adresine bakabilirsiniz.</translation> <translation id="6195802366906945965">Yerleşik sertifika doğrulayıcının sunucu sertifikalarını doğrulamak için kullanılıp kullanılmayacağını belirler.</translation> <translation id="6198947200418556248">Bu politika kullanımdan kaldırıldı. Eski çerez davranışına ihtiyacınız varsa lütfen <ph name="LEGACY_SAMESITE_COOKIE_BEHAVIOR_ENABLED_FOR_DOMAIN_LIST_POLICY_NAME" /> politikasını kullanın. Tüm çerezleri eski <ph name="ATTRIBUTE_SAMESITE_NAME" /> davranışına geri döndürmenize olanak tanır. Eski davranışa geri dönmek, <ph name="ATTRIBUTE_SAMESITE_NAME" /> özelliği belirtmeyen çerezlerin "<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />" gibi değerlendirilmesine neden olur, "<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />" çerezlerinin "<ph name="ATTRIBUTE_SECURE_NAME" />" özelliğini taşıma şartını ortadan kaldırır ve iki sitenin aynı URL'yi paylaşması durumunda, değerlendirirken şema karşılaştırmasını atlar. Tam açıklama için https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies adresine bakın. @@ -7205,6 +7233,7 @@ Politika, Devre Dışı değerine ayarlanırsa URL içeren veya URL'lerle ilişkili anonim veriler toplanmaz. Bu politika ayarlanmadan bırakılırsa kullanıcı bu ayarı manuel olarak değiştirebilir.</translation> +<translation id="7585312329612243723">Yönetilen Tarayıcılarda URL listesi için <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> onay akışını etkinleştir</translation> <translation id="7587345076013230465">Otomatik seçim politikası, oturum açma ekranında birden fazla sertifikayla eşleştiğinde kullanıcıdan istemci sertifikasını seçmesini iste</translation> <translation id="7587921466180902617">Family Link kullanıcıları için Ekran Kaydı test sürümünü etkinleştir</translation> <translation id="759957074386651883">Güvenli Tarama ayarları</translation>
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb index fb86369..7bafd5f 100644 --- a/components/policy/resources/policy_templates_uk.xtb +++ b/components/policy/resources/policy_templates_uk.xtb
@@ -3354,6 +3354,16 @@ Докладніше про дійсні шаблони <ph name="URL_LABEL" />-адрес можна дізнатися на сторінці https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> – недопустиме значення для цього правила.</translation> <translation id="4061590579642538878">Повідомляти дані звітів про аварійне завершення роботи.</translation> +<translation id="4062646759141042418">Увімкнути <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> для списку URL-адрес. + +За допомогою цього правила можна вказати, для яких URL-адрес <ph name="PRODUCT_NAME" /> пропонуватиме розпочати засвідчення в керованих профілях. Завдяки цій процедурі веб-сайти можуть отримувати від пристрою засвідчений набір сигналів з урахуванням контексту. +Це правило можна налаштувати лише на сторінці Chrome Enterprise Connectors через <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />. + +Якщо це правило не налаштувати або не вказати для нього значення, веб-сайти не зможуть розпочинати засвідчення на рівні користувача й отримувати сигнали від пристрою. Однак якщо відповідне правило <ph name="BROWSER_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST" /> увімкнено, то веб-сайти зможуть розпочинати засвідчення для керованого веб-переглядача й отримувати сигнали від пристрою. + +У <ph name="PRODUCT_OS_NAME" /> це правило пов’язане з віддаленим засвідченням, під час якого сертифікат автоматично створюватиметься й завантажуватиметься на сервер. Щоб увімкнути засвідчення на екрані входу пристрою, скористайтеся правилом <ph name="DEVICE_LOGIN_SCREEN_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST_POLICY_NAME" />. + +Докладніше про дійсні шаблони <ph name="URL_LABEL" />-адрес можна дізнатися на сторінці https://support.google.com/chrome/a?p=url_blocklist_filter_format.</translation> <translation id="4070039109671307724">Інше</translation> <translation id="4072225853834793549">Не вибирати швидке ввімкнення функцій спеціальних можливостей на екрані входу</translation> <translation id="4075675819066819571">Розташування полиці ліворуч на екрані</translation> @@ -4130,6 +4140,7 @@ Якщо для правила вибрати значення true, приглушення відлуння для системних звуків буде ввімкнено завжди. Якщо це правило не налаштувати або вибрати для нього значення false, приглушення відлуння можна буде ввімкнути після запуску цієї функції.</translation> +<translation id="4800865664096110749">Увімкнути засвідчення <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> для списку URL-адрес у керованих профілях</translation> <translation id="4801512016965057443">Дозволити роумінг мобільних даних</translation> <translation id="4801647366128872782">Визначає URL-адреси, за якими можна використовувати застарілі звіти про технології</translation> <translation id="4802744647065138872">Обмежує кількість знімків даних користувача, які зберігаються на випадок екстреного відкочування.</translation> @@ -5452,6 +5463,14 @@ Якщо його не налаштовано, <ph name="PRODUCT_NAME" /> використовує каталог для кешу за умовчанням, але користувачі можуть змінити цей параметр за допомогою правила командного рядка --disk-cache-dir. <ph name="PRODUCT_NAME" /> керує вмістом кореневого каталогу тому. Щоб уникнути втрат даних та інших помилок, не налаштовуйте для цього правила кореневий каталог або каталог, який використовується для інших цілей. Список можливих змінних доступний на сторінці https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables.</translation> +<translation id="6082391187598394288">Це правило можна застосовувати, щоб примусово вмикати підтримку PPB_VideoDecoder(Dev) API. + +Якщо це правило вимкнути або не налаштувати, веб-переглядач самостійно вирішуватиме, чи підтримуватиметься API. +Якщо ввімкнути це правило, API підтримуватиметься. + +Використовуйте це правило, щоб усунути проблеми, які можуть виникнути через припинення підтримки цього інтерфейсу API. Щоб скористатися цим правилом, залиште запит на сайті crbug.com. Опишіть сценарій застосування й надішліть копію листа на адресу {blundell, vasilyt}@chromium.org. Правило доступне в <ph name="PRODUCT_NAME" /> версії 114. У пізніших версіях підтримку цього інтерфейсу API було назавжди припинено. + +ПРИМІТКА: якщо веб-переглядач відкрито, внесені в правило зміни застосовуватимуться лише до нових процесів обробки.</translation> <translation id="6083631234867522991">Windows (клієнти Windows):</translation> <translation id="608788685013546076">Налаштовувати граничне значення зміни піку потужності акумулятора у відсотках</translation> <translation id="6089679180657323464">Керує налаштуваннями контролера діагностики й телеметрії Wilco.</translation> @@ -5578,6 +5597,14 @@ На основі вказаного кольору автоматично створюється тема й застосовується до веб-переглядача. Користувачі не зможуть змінювати визначену правилом тему. Якщо це правило не налаштувати, користувачі зможуть вибирати тему для веб-переглядача.</translation> +<translation id="6195356309340063061">Увімкнути <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> для списку URL-адрес. + +За допомогою цього правила можна вказати, для яких URL-адрес <ph name="PRODUCT_NAME" /> пропонуватиме розпочати засвідчення в керованих веб-переглядачах. Завдяки цій процедурі веб-сайти можуть отримувати від пристрою засвідчений набір сигналів з урахуванням контексту. +Це правило можна налаштувати лише на сторінці Chrome Enterprise Connectors через <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />. + +Якщо це правило не налаштувати або не вказати для нього значення, веб-сайти не зможуть розпочинати засвідчення на рівні веб-переглядача й отримувати сигнали від пристрою. Однак якщо відповідне правило <ph name="USER_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST" /> увімкнено, то веб-сайти зможуть розпочинати засвідчення для керованого профілю й отримувати сигнали від пристрою. + +Докладніше про дійсні шаблони <ph name="URL_LABEL" />-адрес можна дізнатися на сторінці https://support.google.com/chrome/a?p=url_blocklist_filter_format.</translation> <translation id="6195802366906945965">Визначає, чи перевіряти сертифікати сервера за допомогою вбудованого інструмента перевірки сертифікатів</translation> <translation id="6198947200418556248">Це правило більше не підтримується. Якщо вам потрібна застаріла поведінка для файлів cookie, скористайтеся правилом <ph name="LEGACY_SAMESITE_COOKIE_BEHAVIOR_ENABLED_FOR_DOMAIN_LIST_POLICY_NAME" />. Дозволяє налаштувати застарілу поведінку <ph name="ATTRIBUTE_SAMESITE_NAME" /> для всіх файлів cookie. Якщо повернутися до застарілої поведінки, файли cookie, у яких не вказано атрибут <ph name="ATTRIBUTE_SAMESITE_NAME" />, вважатимуться <ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />, вимога, згідно з якою файли cookie <ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" /> повинні мати атрибут <ph name="ATTRIBUTE_SECURE_NAME" />, скасується, а схема порівняння під час перевірки наявності атрибута same-site для двох сайтів пропускатиметься. Повний опис можна переглянути на сторінці https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies. @@ -7191,6 +7218,7 @@ Якщо вимкнути це правило, такі дані не збиратимуться. Якщо правило не налаштувати, користувач зможе змінити цей параметр вручну.</translation> +<translation id="7585312329612243723">Увімкнути засвідчення <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> для списку URL-адрес у керованих веб-переглядачах</translation> <translation id="7587345076013230465">Просити користувача вибрати сертифікат клієнта на екрані входу, коли правило автоматичного вибору відповідає декільком сертифікатам</translation> <translation id="7587921466180902617">Увімкнути версію функції "Запис екрана" для внутрішнього тестування для користувачів Family Link</translation> <translation id="759957074386651883">Налаштування Безпечного перегляду</translation>
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb index 78bc88cf..8d64ac98 100644 --- a/components/policy/resources/policy_templates_vi.xtb +++ b/components/policy/resources/policy_templates_vi.xtb
@@ -3358,6 +3358,17 @@ Để biết thông tin chi tiết về các mẫu <ph name="URL_LABEL" /> hợp lệ, vui lòng xem tại https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Chúng tôi không chấp nhận giá trị <ph name="WILDCARD_VALUE" /> đối với chính sách này.</translation> <translation id="4061590579642538878">Báo cáo thông tin về báo cáo sự cố.</translation> +<translation id="4062646759141042418">Bật <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> cho một danh sách URL. + +Việc đặt chính sách này sẽ chỉ định danh sách URL mà <ph name="PRODUCT_NAME" /> sẽ đề xuất bắt đầu quy trình chứng thực đối với hồ sơ được quản lý. Chính sách sau cho phép các trang web đó nhận được một bộ tín hiệu nhận biết theo bối cảnh đã qua chứng thực từ thiết bị. +Bạn chỉ có thể thiết lập chính sách này qua trang Chrome Enterprise Connectors trên <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />. + +Nếu bạn không đặt hoặc để trống chính sách này thì sẽ không có trang web nào có thể bắt đầu quy trình chứng thực ở cấp người dùng và nhận tín hiệu từ thiết bị. Tuy nhiên, nếu bạn bật chính sách +<ph name="BROWSER_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST" /> tương ứng thì các trang web có thể bắt đầu quy trình chứng thực đối với trình duyệt được quản lý và nhận tín hiệu từ thiết bị. + +Đối với <ph name="PRODUCT_OS_NAME" />, chính sách này có liên quan đến quy trình chứng thực từ xa, trong đó chứng chỉ được tạo tự động và tải lên máy chủ. Để sử dụng quy trình chứng thực trên màn hình đăng nhập của thiết bị, vui lòng sử dụng chính sách <ph name="DEVICE_LOGIN_SCREEN_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST_POLICY_NAME" />. + +Để biết thông tin chi tiết về các mẫu <ph name="URL_LABEL" /> hợp lệ, vui lòng xem tại https://support.google.com/chrome/a?p=url_blocklist_filter_format.</translation> <translation id="4070039109671307724">Khác</translation> <translation id="4072225853834793549">Tắt phím tắt hỗ trợ tiếp cận trên màn hình đăng nhập</translation> <translation id="4075675819066819571">Đặt giá ở bên trái màn hình</translation> @@ -4172,6 +4183,7 @@ Nếu bạn đặt chính sách này thành false (sai) hoặc không đặt, thì tính năng loại bỏ tiếng vọng âm thanh của hệ thống có thể vẫn bật tuỳ vào kế hoạch phát hành tính năng nhưng sẽ không được thực thi theo chính sách này.</translation> +<translation id="4800865664096110749">Bật quy trình chứng thực <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> cho một danh sách URL trên các Hồ sơ được quản lý</translation> <translation id="4801512016965057443">Cho phép chuyển vùng dữ liệu di động</translation> <translation id="4801647366128872782">Chỉ định các URL cho phép báo cáo công nghệ cũ</translation> <translation id="4802744647065138872">Giới hạn số lượng ảnh chụp nhanh dữ liệu người dùng được giữ lại để sử dụng trong trường hợp khôi phục khẩn cấp.</translation> @@ -5505,6 +5517,21 @@ Nếu bạn không đặt chính sách này, thì <ph name="PRODUCT_NAME" /> sẽ sử dụng thư mục bộ nhớ đệm mặc định. Tuy nhiên, người dùng có thể thay đổi tùy chọn cài đặt đó bằng cờ dòng lệnh --disk-cache-dir. <ph name="PRODUCT_NAME" /> sẽ quản lý nội dung của thư mục gốc trên ổ đĩa. Vì vậy, để tránh mất dữ liệu hoặc các lỗi khác, không đặt chính sách này thành thư mục gốc hoặc bất kỳ thư mục nào được dùng cho các mục đích khác. Hãy xem các biến bạn có thể sử dụng (https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables).</translation> +<translation id="6082391187598394288">Chính sách này có thể tạm thời được dùng để buộc bật chế độ hỗ trợ cho +API PPB_VideoDecoder(Dev). + +Khi bạn không đặt hoặc đặt chính sách này thành Tắt, trình duyệt sẽ quyết định liệu +API này có được hỗ trợ hay không. +Khi bạn đặt chính sách thành Bật, API này sẽ được hỗ trợ. + +Bạn có thể sử dụng chính sách này trong trường hợp quyết định đang diễn ra của chúng tôi về việc loại bỏ chế độ hỗ trợ cho API này +gặp vấn đề. Nếu bạn phải sử dụng chính sách này, vui lòng báo cáo lỗi trên crbug.com, +giải thích trường hợp sử dụng của bạn và CC {blundell, vasilyt}@chromium.org. Chính sách này +được cung cấp thông qua <ph name="PRODUCT_NAME" /> +phiên bản 114, sau đó, chế độ hỗ trợ cho API này đã bị loại bỏ vô điều kiện. + +LƯU Ý: Chỉ các quy trình kết xuất đồ hoạ mới bắt đầu mới thể hiện các thay đổi đối với +chính sách này trong khi trình duyệt đang chạy.</translation> <translation id="6083631234867522991">Windows (ứng dụng Windows):</translation> <translation id="608788685013546076">Đặt ngưỡng pin cho chế độ chuyển đổi điện năng cao điểm theo phần trăm</translation> <translation id="6089679180657323464">Kiểm soát các tùy chọn cài đặt của bộ điều khiển đo từ xa và chẩn đoán wilco.</translation> @@ -5631,6 +5658,15 @@ Việc đặt chính sách thành một màu hợp lệ theo hệ thập lục phân sẽ khiến giao diện dựa trên màu đó tự động được tạo và áp dụng cho trình duyệt. Người dùng sẽ không thể thay đổi giao diện được đặt theo chính sách này. Nếu bạn không đặt chính sách này, người dùng có thể thay đổi giao diện của trình duyệt theo ý muốn.</translation> +<translation id="6195356309340063061">Bật <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> cho một danh sách URL. + +Việc đặt chính sách này sẽ chỉ định danh sách URL mà <ph name="PRODUCT_NAME" /> sẽ đề xuất bắt đầu quy trình chứng thực đối với các trình duyệt được quản lý. Chính sách sau cho phép các trang web đó nhận được một bộ tín hiệu nhận biết theo bối cảnh đã qua chứng thực từ thiết bị. +Bạn chỉ có thể thiết lập chính sách này qua trang Chrome Enterprise Connectors trên <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" />. + +Nếu bạn không đặt hoặc để trống chính sách này thì sẽ không có trang web nào có thể bắt đầu quy trình chứng thực ở cấp trình duyệt và nhận tín hiệu từ thiết bị. Tuy nhiên, nếu bạn bật chính sách +<ph name="USER_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST" /> tương ứng thì các trang web có thể bắt đầu quy trình chứng thực đối với hồ sơ được quản lý và thu thập tín hiệu từ thiết bị. + +Để biết thông tin chi tiết về các mẫu <ph name="URL_LABEL" /> hợp lệ, vui lòng xem tại https://support.google.com/chrome/a?p=url_blocklist_filter_format.</translation> <translation id="6195802366906945965">Xác định xem trình xác minh chứng chỉ tích hợp sẵn có được dùng để xác minh chứng chỉ máy chủ hay không</translation> <translation id="6198947200418556248">Chính sách này không còn dùng nữa. Nếu vẫn cần hành vi cookie cũ, vui lòng sử dụng "<ph name="LEGACY_SAMESITE_COOKIE_BEHAVIOR_ENABLED_FOR_DOMAIN_LIST_POLICY_NAME" />". Cho phép bạn đưa tất cả cookie trở lại hành vi <ph name="ATTRIBUTE_SAMESITE_NAME" /> cũ. Việc trở lại hành vi cũ sẽ (1) khiến những cookie không chỉ định thuộc tính <ph name="ATTRIBUTE_SAMESITE_NAME" /> được coi như thể là "<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />", (2) bỏ yêu cầu cookie "<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />" phải mang thuộc tính "<ph name="ATTRIBUTE_SECURE_NAME" />" và (3) bỏ qua quy trình so sánh lược đồ khi đánh giá liệu hai trang web có phải là một hay không. Hãy truy cập https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies để xem mô tả đầy đủ. @@ -7245,6 +7281,7 @@ Khi bạn đặt chính sách này thành Tắt, tính năng thu thập dữ liệu ẩn danh nhập dưới dạng URL sẽ không hoạt động. Nếu bạn không đặt chính sách này, thì người dùng sẽ có thể thay đổi chế độ cài đặt này theo cách thủ công.</translation> +<translation id="7585312329612243723">Bật quy trình chứng thực <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> cho một danh sách URL trên các Trình duyệt được quản lý</translation> <translation id="7587345076013230465">Nhắc người dùng chọn chứng chỉ máy khách mỗi khi chính sách tự động chọn khớp với nhiều chứng chỉ trên màn hình đăng nhập</translation> <translation id="7587921466180902617">Bật thử nghiệm nội bộ Screencast cho người dùng Family Link</translation> <translation id="759957074386651883">Cài đặt Duyệt web an toàn</translation>
diff --git a/components/policy/resources/templates/policy_definitions/Extensions/ExtensionInstallForcelist.yaml b/components/policy/resources/templates/policy_definitions/Extensions/ExtensionInstallForcelist.yaml index 8091186f..1ecca2f 100644 --- a/components/policy/resources/templates/policy_definitions/Extensions/ExtensionInstallForcelist.yaml +++ b/components/policy/resources/templates/policy_definitions/Extensions/ExtensionInstallForcelist.yaml
@@ -8,9 +8,9 @@ This policy supersedes <ph name="EXTENSION_INSTALL_BLOCKLIST_POLICY_NAME">ExtensionInstallBlocklist</ph> policy. If a previously force-installed app or extension is removed from this list, <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> automatically uninstalls it. - On <ph name="MS_WIN_NAME">Microsoft® Windows®</ph> instances, apps and extensions from outside the Chrome Web Store can only be forced installed if the instance is joined to a <ph name="MS_AD_NAME">Microsoft® Active Directory®</ph> domain, running on Windows 10 Pro, or enrolled in Chrome Browser Cloud Management. + On <ph name="MS_WIN_NAME">Microsoft® Windows®</ph> instances, apps and extensions from outside the Chrome Web Store can only be forced installed if the instance is joined to a <ph name="MS_AD_NAME">Microsoft® Active Directory®</ph> domain, <ph name="MS_AAD_NAME">Microsoft® Azure® Active Directory®</ph>` or enrolled in `<ph name="CHROME_BROWSER_CLOUD_MANAGEMENT_NAME">Chrome Browser Cloud Management</ph>`. - On <ph name="MAC_OS_NAME">macOS</ph> instances, apps and extensions from outside the Chrome Web Store can only be force installed if the instance is managed via MDM, or joined to a domain via MCX. + On <ph name="MAC_OS_NAME">macOS</ph> instances, apps and extensions from outside the Chrome Web Store can only be force installed if the instance is managed via MDM, joined to a domain via MCX or enrolled in `<ph name="CHROME_BROWSER_CLOUD_MANAGEMENT_NAME">Chrome Browser Cloud Management</ph>` The source code of any extension may be altered by users through developer tools, potentially rendering the extension dysfunctional. If this is a concern, set the <ph name="DEVELOPER_TOOLS_DISABLED_POLICY_NAME">DeveloperToolsDisabled</ph> policy.
diff --git a/components/policy/resources/webui/policy.css b/components/policy/resources/webui/policy.css index 80e60cf..640e8e9 100644 --- a/components/policy/resources/webui/policy.css +++ b/components/policy/resources/webui/policy.css
@@ -27,6 +27,7 @@ #status-box-container { display: flex; + flex-wrap: wrap; } body > header {
diff --git a/components/policy/resources/webui/status_box.ts b/components/policy/resources/webui/status_box.ts index 438bc9b1..ade2605 100644 --- a/components/policy/resources/webui/status_box.ts +++ b/components/policy/resources/webui/status_box.ts
@@ -7,7 +7,6 @@ import {CustomElement} from 'chrome://resources/js/custom_element.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import {sanitizeInnerHtml} from 'chrome://resources/js/parse_html_subset.js'; -import {getRequiredElement} from 'chrome://resources/js/util_ts.js'; import {getTemplate} from './status_box.html.js'; @@ -63,8 +62,8 @@ */ private setLabelInnerHtmlAndShow( labelName: string, labelValue: string, needsToBeShown: boolean = true) { - const labelElement = getRequiredElement(labelName); - labelElement.innerHTML = sanitizeInnerHtml(` ${labelValue}`); + const labelElement = this.shadowRoot!.querySelector(labelName); + labelElement!.innerHTML = sanitizeInnerHtml(` ${labelValue}`); if (needsToBeShown) { labelElement!.parentElement!.hidden = false; }
diff --git a/components/policy/test_support/remote_commands_result_waiter.cc b/components/policy/test_support/remote_commands_result_waiter.cc index 0a54d9e2..25724e08 100644 --- a/components/policy/test_support/remote_commands_result_waiter.cc +++ b/components/policy/test_support/remote_commands_result_waiter.cc
@@ -15,7 +15,7 @@ RemoteCommandsResultWaiter::RemoteCommandsResultWaiter( RemoteCommandsState* remote_commands_state, - int command_id) + int64_t command_id) : remote_commands_state_(remote_commands_state), command_id_(command_id) { remote_commands_state_->AddObserver(this); } @@ -45,7 +45,7 @@ } void RemoteCommandsResultWaiter::OnRemoteCommandResultAvailable( - int command_id) { + int64_t command_id) { if (command_id_ == command_id) { run_loop_.Quit(); }
diff --git a/components/policy/test_support/remote_commands_result_waiter.h b/components/policy/test_support/remote_commands_result_waiter.h index 003f616..546d4e6 100644 --- a/components/policy/test_support/remote_commands_result_waiter.h +++ b/components/policy/test_support/remote_commands_result_waiter.h
@@ -5,6 +5,8 @@ #ifndef COMPONENTS_POLICY_TEST_SUPPORT_REMOTE_COMMANDS_RESULT_WAITER_H_ #define COMPONENTS_POLICY_TEST_SUPPORT_REMOTE_COMMANDS_RESULT_WAITER_H_ +#include <cstdint> + #include "base/memory/raw_ptr.h" #include "base/run_loop.h" #include "components/policy/proto/device_management_backend.pb.h" @@ -16,7 +18,7 @@ class RemoteCommandsResultWaiter : public RemoteCommandsState::Observer { public: RemoteCommandsResultWaiter(RemoteCommandsState* remote_commands_state, - int command_id); + int64_t command_id); ~RemoteCommandsResultWaiter() override; @@ -25,10 +27,10 @@ enterprise_management::RemoteCommandResult WaitAndGetResult(); private: - void OnRemoteCommandResultAvailable(int command_id) override; + void OnRemoteCommandResultAvailable(int64_t command_id) override; const raw_ptr<RemoteCommandsState> remote_commands_state_; - const int command_id_; + const int64_t command_id_; base::RunLoop run_loop_; };
diff --git a/components/policy/test_support/remote_commands_state.cc b/components/policy/test_support/remote_commands_state.cc index 4bc024c0..5c2a2737 100644 --- a/components/policy/test_support/remote_commands_state.cc +++ b/components/policy/test_support/remote_commands_state.cc
@@ -58,7 +58,7 @@ } bool RemoteCommandsState::GetRemoteCommandResult( - int id, + int64_t id, em::RemoteCommandResult* result) { base::AutoLock lock(lock_); if (command_results_.count(id) == 0) {
diff --git a/components/policy/test_support/remote_commands_state.h b/components/policy/test_support/remote_commands_state.h index 646ac731..2651f37 100644 --- a/components/policy/test_support/remote_commands_state.h +++ b/components/policy/test_support/remote_commands_state.h
@@ -5,6 +5,8 @@ #ifndef COMPONENTS_POLICY_TEST_SUPPORT_REMOTE_COMMANDS_STATE_H_ #define COMPONENTS_POLICY_TEST_SUPPORT_REMOTE_COMMANDS_STATE_H_ +#include <cstdint> + #include "base/containers/flat_map.h" #include "base/observer_list_threadsafe.h" #include "base/synchronization/lock.h" @@ -22,7 +24,7 @@ class Observer { public: // Called when a remote command result is available. - virtual void OnRemoteCommandResultAvailable(int command_id) = 0; + virtual void OnRemoteCommandResultAvailable(int64_t command_id) = 0; protected: virtual ~Observer() = default; @@ -56,13 +58,13 @@ // a command ID == |id|. // If no result is available, returns false. // Expected to be called by tests to poll the remote command results. - bool GetRemoteCommandResult(int id, em::RemoteCommandResult* result); + bool GetRemoteCommandResult(int64_t id, em::RemoteCommandResult* result); private: base::Lock lock_; // Maps a command ID to an execution result of that command on the client. - base::flat_map<int, em::RemoteCommandResult> command_results_ + base::flat_map<int64_t, em::RemoteCommandResult> command_results_ GUARDED_BY(lock_); // Queue of pending remote commands.
diff --git a/components/remote_cocoa/app_shim/immersive_mode_controller.mm b/components/remote_cocoa/app_shim/immersive_mode_controller.mm index 3592a6c..e7f7afd 100644 --- a/components/remote_cocoa/app_shim/immersive_mode_controller.mm +++ b/components/remote_cocoa/app_shim/immersive_mode_controller.mm
@@ -253,7 +253,6 @@ void ImmersiveModeController::Enable() { DCHECK(!enabled_); enabled_ = true; - immersive_mode_titlebar_view_controller_.get().hidden = YES; [browser_window_ addTitlebarAccessoryViewController: immersive_mode_titlebar_view_controller_];
diff --git a/components/remote_cocoa/app_shim/immersive_mode_tabbed_controller.mm b/components/remote_cocoa/app_shim/immersive_mode_tabbed_controller.mm index 8358eb5..853ce3a 100644 --- a/components/remote_cocoa/app_shim/immersive_mode_tabbed_controller.mm +++ b/components/remote_cocoa/app_shim/immersive_mode_tabbed_controller.mm
@@ -89,9 +89,7 @@ ObserveChildWindows(tab_window_); // The presence of a visible NSToolbar causes the titlebar to be revealed. - // Keep the titlebar hidden until the fullscreen transition is complete. NSToolbar* toolbar = [[[NSToolbar alloc] init] autorelease]; - toolbar.visible = NO; // Remove the baseline separator for macOS 10.15 and earlier. This has no // effect on macOS 11 and above. See
diff --git a/components/reporting/client/BUILD.gn b/components/reporting/client/BUILD.gn index 0c17d16..46c0bad 100644 --- a/components/reporting/client/BUILD.gn +++ b/components/reporting/client/BUILD.gn
@@ -57,8 +57,10 @@ "//components/reporting/storage:storage_module", "//components/reporting/storage:storage_module_interface", "//components/reporting/storage:storage_uploader_interface", + "//components/reporting/util:rate_limiter_interface", "//components/reporting/util:status", "//components/reporting/util:status_macros", + "//components/reporting/util:wrapped_rate_limiter", ] }
diff --git a/components/reporting/client/report_queue_impl.cc b/components/reporting/client/report_queue_impl.cc index f2ecde7..d1df9fbe 100644 --- a/components/reporting/client/report_queue_impl.cc +++ b/components/reporting/client/report_queue_impl.cc
@@ -43,6 +43,7 @@ // thread pool (no synchronization expected). void AddRecordToStorage(scoped_refptr<StorageModuleInterface> storage, Priority priority, + WrappedRateLimiter::AsyncAcquireCb acquire_cb, std::string dm_token, Destination destination, int64_t reserved_space, @@ -102,13 +103,40 @@ return; } record.set_timestamp_us(time_since_epoch_us); - if (!record_result.ok()) { - std::move(callback).Run(record_result.status()); + + const auto record_size = record.ByteSizeLong(); + + // Prepare `Storage::AddRecord` as a callback. + auto add_record_cb = base::BindOnce(&StorageModuleInterface::AddRecord, + storage, priority, std::move(record)); + + // Rate-limit event, if required. + if (!acquire_cb) { + // No rate limiter, just add resulting Record to the storage. + std::move(add_record_cb).Run(std::move(callback)); return; } - // Add resulting Record to the storage. - storage->AddRecord(priority, std::move(record), std::move(callback)); + // Add Record only if rate limiter approves. + acquire_cb.Run( + record_size, + base::BindOnce( + [](size_t record_size, + base::OnceCallback<void(StorageModuleInterface::EnqueueCallback + callback)> add_record_cb, + StorageModuleInterface::EnqueueCallback callback, bool acquired) { + if (!acquired) { + std::move(callback).Run( + Status(error::OUT_OF_RANGE, + base::StrCat({"Event size ", + base::NumberToString(record_size), + " rejected by rate limiter"}))); + return; + } + // Add resulting Record to the storage. + std::move(add_record_cb).Run(std::move(callback)); + }, + record_size, std::move(add_record_cb), std::move(callback))); } } // namespace @@ -147,9 +175,9 @@ base::ThreadPool::PostTask( FROM_HERE, {base::TaskPriority::BEST_EFFORT}, base::BindOnce(&AddRecordToStorage, storage_, priority, - config_->dm_token(), config_->destination(), - config_->reserved_space(), std::move(record_producer), - std::move(callback))); + config_->is_event_allowed_cb(), config_->dm_token(), + config_->destination(), config_->reserved_space(), + std::move(record_producer), std::move(callback))); } void ReportQueueImpl::Flush(Priority priority, FlushCallback callback) {
diff --git a/components/reporting/client/report_queue_impl.h b/components/reporting/client/report_queue_impl.h index 0d59125..76e115a5 100644 --- a/components/reporting/client/report_queue_impl.h +++ b/components/reporting/client/report_queue_impl.h
@@ -20,8 +20,10 @@ #include "components/reporting/proto/synced/record.pb.h" #include "components/reporting/proto/synced/record_constants.pb.h" #include "components/reporting/storage/storage_module_interface.h" +#include "components/reporting/util/rate_limiter_interface.h" #include "components/reporting/util/status.h" #include "components/reporting/util/statusor.h" +#include "components/reporting/util/wrapped_rate_limiter.h" #include "third_party/abseil-cpp/absl/types/optional.h" namespace reporting {
diff --git a/components/reporting/client/report_queue_impl_unittest.cc b/components/reporting/client/report_queue_impl_unittest.cc index 0bfb5b0a..23c2e2a6 100644 --- a/components/reporting/client/report_queue_impl_unittest.cc +++ b/components/reporting/client/report_queue_impl_unittest.cc
@@ -30,10 +30,13 @@ #include "third_party/abseil-cpp/absl/types/optional.h" using ::testing::_; +using ::testing::AllOf; +using ::testing::EndsWith; using ::testing::Eq; using ::testing::Invoke; using ::testing::MockFunction; using ::testing::NiceMock; +using ::testing::Property; using ::testing::Return; using ::testing::StrEq; using ::testing::WithArg; @@ -45,6 +48,11 @@ constexpr char kTestMessage[] = "TEST_MESSAGE"; +class MockRateLimiter : public RateLimiterInterface { + public: + MOCK_METHOD(bool, Acquire, (size_t event_size), (override)); +}; + // Creates a |ReportQueue| using |TestStorageModule| and // |TestEncryptionModule|. Allows access to the storage module for checking // stored values. @@ -104,13 +112,12 @@ // Enqueues a random string and ensures that the string arrives unaltered in the // |StorageModuleInterface|. TEST_F(ReportQueueImplTest, SuccessfulStringRecord) { - static constexpr char kTestString[] = "El-Chupacabra"; test::TestEvent<Status> a; - report_queue_->Enqueue(kTestString, priority_, a.cb()); + report_queue_->Enqueue(kTestMessage, priority_, a.cb()); const auto a_result = a.result(); EXPECT_OK(a_result) << a_result; EXPECT_THAT(test_storage_module()->priority(), Eq(priority_)); - EXPECT_THAT(test_storage_module()->record().data(), StrEq(kTestString)); + EXPECT_THAT(test_storage_module()->record().data(), StrEq(kTestMessage)); } // Enqueues a |base::Value| dictionary and ensures it arrives unaltered in the @@ -152,6 +159,57 @@ ASSERT_EQ(result_message.test(), test_message.test()); } +TEST_F(ReportQueueImplTest, SuccessfulProtoRecordWithRateLimiter) { + auto rate_limiter = std::make_unique<MockRateLimiter>(); + auto* const mock_rate_limiter = rate_limiter.get(); + StatusOr<std::unique_ptr<ReportQueueConfiguration>> config_result = + ReportQueueConfiguration::Create(dm_token_, destination_, + policy_check_callback_, + std::move(rate_limiter)); + + ASSERT_OK(config_result) << config_result.status(); + + test::TestEvent<StatusOr<std::unique_ptr<ReportQueue>>> report_queue_event; + ReportQueueImpl::Create(std::move(config_result.ValueOrDie()), + storage_module_, report_queue_event.cb()); + auto report_queue_result = report_queue_event.result(); + ASSERT_OK(report_queue_result) << report_queue_result.status(); + + report_queue_ = std::move(report_queue_result.ValueOrDie()); + + test::TestMessage test_message; + test_message.set_test(kTestMessage); + + // Fail Enqueue by rate limiter. + EXPECT_CALL(*mock_rate_limiter, Acquire(_)).WillOnce(Return(false)); + + test::TestEvent<Status> a; + report_queue_->Enqueue(std::make_unique<test::TestMessage>(test_message), + priority_, a.cb()); + const auto a_result = a.result(); + EXPECT_THAT(a_result, + AllOf(Property(&Status::error_code, Eq(error::OUT_OF_RANGE)), + Property(&Status::error_message, + EndsWith(" rejected by rate limiter")))) + << a_result; + + // Succeed Enqueue by rate limiter. + EXPECT_CALL(*mock_rate_limiter, Acquire(_)).WillOnce(Return(true)); + + test::TestEvent<Status> b; + report_queue_->Enqueue(std::make_unique<test::TestMessage>(test_message), + priority_, b.cb()); + const auto b_result = b.result(); + EXPECT_OK(b_result) << b_result; + + EXPECT_THAT(test_storage_module()->priority(), Eq(priority_)); + + test::TestMessage result_message; + ASSERT_TRUE( + result_message.ParseFromString(test_storage_module()->record().data())); + ASSERT_EQ(result_message.test(), test_message.test()); +} + TEST_F(ReportQueueImplTest, SuccessfulProtoRecordWithReservedSpace) { static constexpr int64_t kReservedSpace = 12345L; StatusOr<std::unique_ptr<ReportQueueConfiguration>> config_result = @@ -210,9 +268,8 @@ TEST_F(ReportQueueImplTest, EnqueueStringFailsOnPolicy) { EXPECT_CALL(mocked_policy_check_, Call()) .WillOnce(Return(Status(error::UNAUTHENTICATED, "Failing for tests"))); - static constexpr char kTestString[] = "El-Chupacabra"; test::TestEvent<Status> a; - report_queue_->Enqueue(std::string(kTestString), priority_, a.cb()); + report_queue_->Enqueue(std::string(kTestMessage), priority_, a.cb()); const auto result = a.result(); EXPECT_FALSE(result.ok()); EXPECT_THAT(result.error_code(), Eq(error::UNAUTHENTICATED)); @@ -284,10 +341,9 @@ // attaches actual one and ensures that the string arrives unaltered in the // |StorageModuleInterface|. TEST_F(ReportQueueImplTest, SuccessfulSpeculativeStringRecord) { - static constexpr char kTestString[] = "El-Chupacabra"; test::TestEvent<Status> a; auto speculative_report_queue = SpeculativeReportQueueImpl::Create(); - speculative_report_queue->Enqueue(std::string(kTestString), priority_, + speculative_report_queue->Enqueue(std::string(kTestMessage), priority_, a.cb()); // Enqueue would not end until actual queue is attached. @@ -300,7 +356,58 @@ task_environment_.RunUntilIdle(); EXPECT_THAT(test_storage_module()->priority(), Eq(priority_)); - EXPECT_THAT(test_storage_module()->record().data(), StrEq(kTestString)); + EXPECT_THAT(test_storage_module()->record().data(), StrEq(kTestMessage)); +} + +TEST_F(ReportQueueImplTest, SuccessfulSpeculativeStringRecordWithRateLimiter) { + auto rate_limiter = std::make_unique<MockRateLimiter>(); + auto* const mock_rate_limiter = rate_limiter.get(); + StatusOr<std::unique_ptr<ReportQueueConfiguration>> config_result = + ReportQueueConfiguration::Create(dm_token_, destination_, + policy_check_callback_, + std::move(rate_limiter)); + + ASSERT_OK(config_result) << config_result.status(); + + test::TestEvent<StatusOr<std::unique_ptr<ReportQueue>>> report_queue_event; + ReportQueueImpl::Create(std::move(config_result.ValueOrDie()), + storage_module_, report_queue_event.cb()); + auto report_queue_result = report_queue_event.result(); + ASSERT_OK(report_queue_result) << report_queue_result.status(); + + report_queue_ = std::move(report_queue_result.ValueOrDie()); + + EXPECT_CALL(*mock_rate_limiter, Acquire(_)).WillOnce(Return(false)); + + test::TestEvent<Status> a; + auto speculative_report_queue = SpeculativeReportQueueImpl::Create(); + speculative_report_queue->Enqueue(std::string(kTestMessage), priority_, + a.cb()); + + // Enqueue would not end until actual queue is attached. + speculative_report_queue->PrepareToAttachActualQueue().Run( + std::move(report_queue_)); + const auto a_result = a.result(); + EXPECT_THAT(a_result, + AllOf(Property(&Status::error_code, Eq(error::OUT_OF_RANGE)), + Property(&Status::error_message, + EndsWith(" rejected by rate limiter")))) + << a_result; + + EXPECT_CALL(*mock_rate_limiter, Acquire(_)).WillOnce(Return(true)); + + test::TestEvent<Status> b; + speculative_report_queue->Enqueue(std::string(kTestMessage), priority_, + b.cb()); + + const auto b_result = b.result(); + EXPECT_OK(b_result) << b_result; + + // Let everything ongoing to finish. + task_environment_.RunUntilIdle(); + + EXPECT_THAT(test_storage_module()->priority(), Eq(priority_)); + EXPECT_THAT(test_storage_module()->record().data(), StrEq(kTestMessage)); } TEST_F(ReportQueueImplTest, @@ -321,10 +428,9 @@ report_queue_ = std::move(report_queue_result.ValueOrDie()); - static constexpr char kTestString[] = "El-Chupacabra"; test::TestEvent<Status> a; auto speculative_report_queue = SpeculativeReportQueueImpl::Create(); - speculative_report_queue->Enqueue(std::string(kTestString), priority_, + speculative_report_queue->Enqueue(std::string(kTestMessage), priority_, a.cb()); // Enqueue would not end until actual queue is attached. @@ -337,7 +443,7 @@ task_environment_.RunUntilIdle(); EXPECT_THAT(test_storage_module()->priority(), Eq(priority_)); - EXPECT_THAT(test_storage_module()->record().data(), StrEq(kTestString)); + EXPECT_THAT(test_storage_module()->record().data(), StrEq(kTestMessage)); EXPECT_THAT(test_storage_module()->record().reserved_space(), Eq(kReservedSpace)); } @@ -370,7 +476,6 @@ } TEST_F(ReportQueueImplTest, SpeculativeQueueCreationFailedToCreate) { - static constexpr char kTestString[] = "record"; test::TestEvent<Status> test_event; { @@ -381,7 +486,7 @@ Status(error::UNKNOWN, "Failed for Test")); task_environment_.RunUntilIdle(); // Let `AttachActualQueue` finish. - speculative_report_queue->Enqueue(kTestString, Priority::IMMEDIATE, + speculative_report_queue->Enqueue(kTestMessage, Priority::IMMEDIATE, test_event.cb()); } // Destructs `speculative_report_queue` now, fails all pending Enqueues. @@ -392,12 +497,11 @@ } TEST_F(ReportQueueImplTest, SpeculativeQueueEnqueueAndCreationFailed) { - static constexpr char kTestString[] = "record"; test::TestEvent<Status> test_event; auto speculative_report_queue = SpeculativeReportQueueImpl::Create(); - speculative_report_queue->Enqueue(kTestString, Priority::IMMEDIATE, + speculative_report_queue->Enqueue(kTestMessage, Priority::IMMEDIATE, test_event.cb()); // Fail to attach queue after calling `Enqueue`.
diff --git a/components/reporting/metrics/fakes/fake_reporting_settings.cc b/components/reporting/metrics/fakes/fake_reporting_settings.cc index 39d6e41..3a0b62da 100644 --- a/components/reporting/metrics/fakes/fake_reporting_settings.cc +++ b/components/reporting/metrics/fakes/fake_reporting_settings.cc
@@ -85,8 +85,7 @@ void FakeReportingSettings::SetList(const std::string& path, const base::Value::List& list_value) { - const auto& [_, placed] = list_map_.emplace(path, list_value.Clone()); - DCHECK(placed); + list_map_.insert_or_assign(path, list_value.Clone()); if (base::Contains(settings_callbacks_map_, path)) { settings_callbacks_map_.at(path)->Notify(); }
diff --git a/components/saved_tab_groups/saved_tab_group_model.cc b/components/saved_tab_groups/saved_tab_group_model.cc index b1849ec1..cb10099 100644 --- a/components/saved_tab_groups/saved_tab_group_model.cc +++ b/components/saved_tab_groups/saved_tab_group_model.cc
@@ -391,8 +391,8 @@ } void SavedTabGroupModel::Reorder(const base::Uuid& id, int new_index) { - DCHECK_GE(new_index, 0); - DCHECK_LT(new_index, Count()); + CHECK_GE(new_index, 0); + CHECK_LT(new_index, Count()); absl::optional<int> index = GetIndexOf(id); CHECK(index.has_value());
diff --git a/components/search/ntp_features.cc b/components/search/ntp_features.cc index 1f2eec6..5675ef7 100644 --- a/components/search/ntp_features.cc +++ b/components/search/ntp_features.cc
@@ -53,6 +53,12 @@ "NtpRealboxMatchSearchboxTheme", base::FEATURE_DISABLED_BY_DEFAULT); +// Determines the behavior of the width of the realbox in relation to the width +// for secondary column. +BASE_FEATURE(kRealboxWidthBehavior, + "NtpRealboxWidthBehavior", + base::FEATURE_DISABLED_BY_DEFAULT); + // If enabled, the NTP "realbox" will have the same rounded corners as // searchbox. BASE_FEATURE(kRealboxRoundedCorners, @@ -367,6 +373,7 @@ "NtpHistoryClustersModuleCategoriesBoostlistParam"; const char kNtpHistoryClustersModuleMaxClustersParam[] = "NtpHistoryClustersModuleMaxClustersParam"; +const char kNtpRealboxWidthBehaviorParam[] = "NtpRealboxWidthBehaviorParam"; base::TimeDelta GetModulesLoadTimeout() { std::string param_value = base::GetFieldTrialParamValueByFeature(
diff --git a/components/search/ntp_features.h b/components/search/ntp_features.h index 5cb2d7c..496eae9c 100644 --- a/components/search/ntp_features.h +++ b/components/search/ntp_features.h
@@ -32,6 +32,7 @@ BASE_DECLARE_FEATURE(kRealboxMatchSearchboxTheme); BASE_DECLARE_FEATURE(kRealboxRoundedCorners); BASE_DECLARE_FEATURE(kRealboxUseGoogleGIcon); +BASE_DECLARE_FEATURE(kRealboxWidthBehavior); BASE_DECLARE_FEATURE(kNtpAlphaBackgroundCollections); BASE_DECLARE_FEATURE(kNtpChromeCartModule); BASE_DECLARE_FEATURE(kNtpDriveModule); @@ -171,6 +172,7 @@ // Parameter for setting the maximum number of candidate clusters for the // History Clusters Service to return. extern const char kNtpHistoryClustersModuleMaxClustersParam[]; +extern const char kNtpRealboxWidthBehaviorParam[]; // Returns the timeout after which the load of a module should be aborted. base::TimeDelta GetModulesLoadTimeout();
diff --git a/components/services/storage/public/cpp/quota_error_or.h b/components/services/storage/public/cpp/quota_error_or.h index 888e232..60b8ec2b 100644 --- a/components/services/storage/public/cpp/quota_error_or.h +++ b/components/services/storage/public/cpp/quota_error_or.h
@@ -31,11 +31,11 @@ // NOLINTNEXTLINE(google-explicit-constructor) constexpr DetailedQuotaError(QuotaError error) : quota_error(error) {} - bool operator==(const DetailedQuotaError& error) const { + constexpr bool operator==(const DetailedQuotaError& error) const { return std::tie(quota_error, sqlite_error) == std::tie(error.quota_error, error.sqlite_error); } - bool operator!=(const DetailedQuotaError& error) const { + constexpr bool operator!=(const DetailedQuotaError& error) const { return !operator==(error); }
diff --git a/components/strings/BUILD.gn b/components/strings/BUILD.gn index 7586c9b..cece9b8 100644 --- a/components/strings/BUILD.gn +++ b/components/strings/BUILD.gn
@@ -2,6 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/features.gni") import("//build/config/locales.gni") import("//components/feed/features.gni") import("//components/services/screen_ai/buildflags/features.gni") @@ -38,6 +39,7 @@ "enable_print_preview=$enable_print_preview", "enable_screen_ai_service=$enable_screen_ai_service", "enable_vr=$enable_vr", + "use_blink=$use_blink", ] outputs = [ "grit/components_strings.h" ]
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb index bd246e2..60cd404 100644 --- a/components/strings/components_strings_ar.xtb +++ b/components/strings/components_strings_ar.xtb
@@ -3310,6 +3310,7 @@ <translation id="9048662076076074925">24 × 36 بوصة</translation> <translation id="9049981332609050619">لقد حاولت الوصول إلى <ph name="DOMAIN" />, ولكن الخادم قدّم شهادة غير صالحة.</translation> <translation id="9050666287014529139">عبارة المرور</translation> +<translation id="9053840549256861041">سنطلق ميزة جديدة اسمها "قياس أداء الإعلانات" ضِمن ميزات الخصوصية في عرض الإعلانات. يشارك Chrome معلومات محدودة جدًا مع المواقع الإلكترونية، مثل وقت عرض الإعلان لك، لمساعدة المواقع الإلكترونية في قياس أداء الإعلانات.</translation> <translation id="9056953843249698117">Store</translation> <translation id="9062620674789239642">من المحتمل أن يكون قد تم نقل الملف أو تعديله أو حذفه.</translation> <translation id="9063398205799684336">ظرف Kaku 2</translation>
diff --git a/components/strings/components_strings_az.xtb b/components/strings/components_strings_az.xtb index 83d075f1..a7b570a 100644 --- a/components/strings/components_strings_az.xtb +++ b/components/strings/components_strings_az.xtb
@@ -1196,9 +1196,11 @@ <translation id="3927932062596804919">Rədd edin</translation> <translation id="393316646445601645">İnternet və telekom</translation> <translation id="3939773374150895049">CVC əvəzinə WebAuthn istifadə edilsin?</translation> +<translation id="3941630233824954464">Məcburi təkrar identifikasiyanı aktivləşdirin</translation> <translation id="3943857333388298514">Yapışdırın.</translation> <translation id="3946209740501886391">Həmişə bu saytda sual verin</translation> <translation id="3947595700203588284">Saytlar MIDI cihazlarına qoşulmaq üçün icazə istəyə bilər</translation> +<translation id="3948588869002647271">Bu tətbiq çatışmır, yaxud zədələnib</translation> <translation id="3949571496842715403">Server bunun <ph name="DOMAIN" /> olduğunu sübut edə bilmir; onun təhlükəsizlik sertifikatı Subyektiv Alternativ Adı göstərmir. Buna yanlış konfiqurasiya və ya hücumçu tərəfindən bağlantının blok edilməsi səbəb ola bilər.</translation> <translation id="3949601375789751990">Axtarış tarixçəsi burada görünür</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2199,6 +2201,7 @@ <translation id="6370022303958842211">Hesaba giriş (uğursuz giriş səbəbləri daxil olmaqla), çıxışlar, kilidlər və kilidi açmaq kimi cihaza giriş əməliyyatları</translation> <translation id="6374469231428023295">Yenidən cəhd edin</translation> <translation id="6374865374745447009">pəncərə idarəetməsi</translation> +<translation id="6376881782310775282">Bu tətbiqin tərtibat serveri ilə əlaqə saxlamaq olmur</translation> <translation id="6377268785556383139">"<ph name="SEARCH_TEXT" />" üçün 1 nəticə</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">Potensial ödəniş tutula bilər.</translation> @@ -3007,6 +3010,7 @@ <translation id="8286799286781881307">Administratorunuz tərəfindən icazə verilən tətbiqlər cihazınıza əlavə edilmiş bütün ekranları çəkə bilər. Bu məlumat lokal olaraq işlənə və ya təşkilatınızın serverlərinə yüklənə bilər.</translation> <translation id="8288807391153049143">Sertifikatı göstərin</translation> <translation id="8289355894181816810">Bunun mənasını bilmirsinizsə, şəbəkə administratorunuz ilə əlaqə saxlayın.</translation> +<translation id="8292520987784410870">Həmişə doğrulansın?</translation> <translation id="8293206222192510085">Əlfəcin əlavə edin</translation> <translation id="829335040383910391">səs</translation> <translation id="8294431847097064396">Mənbə</translation> @@ -3106,6 +3110,7 @@ <translation id="854892890027593466">Zərf C6/C5</translation> <translation id="8553387990086529628">Turistik məkanlar</translation> <translation id="8554010658308662631">Ardını yükləyin</translation> +<translation id="8554802735558319842">Paylaşılan cihazlarda təhlükəsizliyi artırmaq üçün avto doldurma ilə hər ödənişdə doğrulamanı aktiv edin.</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{İcazəni sıfırlayın}other{İcazələri sıfırlayın}}</translation> <translation id="8555010941760982128">Ödəniş zamanı bu koddan istifadə edin</translation> <translation id="8557066899867184262">CVC kartın arxasında yerləşir.</translation> @@ -3294,6 +3299,7 @@ <translation id="9048662076076074925">24 x 36 düym</translation> <translation id="9049981332609050619"><ph name="DOMAIN" /> domeninə giriş cəhdi etdiniz, amma server yanlış sertifikat təqdim etdi.</translation> <translation id="9050666287014529139">Parol ifadəsi</translation> +<translation id="9053840549256861041">"Reklam dəyərləndirməsi" adlı yeni reklam məxfiliyi funksiyasını işə salırıq. Reklam performansını dəyərləndirmək üçün Chrome reklamın göstərildiyi vaxt kimi məhdud məlumatları saytlar arasında paylaşır.</translation> <translation id="9056953843249698117">Mağaza</translation> <translation id="9062620674789239642">Köçürülmüş, redaktə edilmiş və ya silinmiş ola bilər.</translation> <translation id="9063398205799684336">Zərf Kaku 2</translation>
diff --git a/components/strings/components_strings_be.xtb b/components/strings/components_strings_be.xtb index f747bfd..2d26c72 100644 --- a/components/strings/components_strings_be.xtb +++ b/components/strings/components_strings_be.xtb
@@ -598,6 +598,7 @@ <translation id="2380886658946992094">Legal</translation> <translation id="2383455408879745299">Персаналізаваць інструменты спецыяльных магчымасцей у наладах Chrome</translation> <translation id="2384307209577226199">Стандартная карпаратыўная</translation> +<translation id="238459632961158867">Вэб-сайт</translation> <translation id="2385809941344967209">Абнавіць браўзер Chrome праз яго налады</translation> <translation id="2386255080630008482">Сертыфікат сервера адкліканы.</translation> <translation id="239293030466334554">Кабрыялеты</translation> @@ -1046,6 +1047,7 @@ <translation id="3566336457819493938">215 x 315 мм</translation> <translation id="3567778190852720481">Не ўдалося зарэгістраваць прыладу з дапамогай карпаратыўнага ўліковага запісу (карпаратыўны ўліковы запіс не адпавядае патрабаванням).</translation> <translation id="3567901620846335314">100 x 150 мм</translation> +<translation id="3568886473829759308">Увайсці на вэб-сайт, каб паглядзець інфармацыю, рэсурсы і паслугі, якія прапануюць кампаніі.</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" />, <ph name="COUNTRY" /></translation> <translation id="3575121482199441727">Дазволіць для гэтага сайта</translation> <translation id="3575168918110434329">A4x7</translation> @@ -1197,9 +1199,11 @@ <translation id="3927932062596804919">Адмовіць</translation> <translation id="393316646445601645">Інтэрнэт і тэлекамунікацыі</translation> <translation id="3939773374150895049">Выкарыстоўваць WebAuthn замест CVC?</translation> +<translation id="3941630233824954464">Уключыць абавязковую паўторную аўтэнтыфікацыю</translation> <translation id="3943857333388298514">Уставіць</translation> <translation id="3946209740501886391">Заўсёды пытацца на гэтым сайце</translation> <translation id="3947595700203588284">Сайт можа запытваць дазвол на падключэнне да прылад MIDI</translation> +<translation id="3948588869002647271">Праграма адсутнічае або пашкоджана</translation> <translation id="3949571496842715403">Серверу не ўдалося даказаць, што гэта <ph name="DOMAIN" />: у сертыфікаце бяспекі не ўказаны альтэрнатыўныя назвы суб'екта. Прычынай могуць быць няправільныя налады або зламыснік, які спрабуе перахапіць падключэнне.</translation> <translation id="3949601375789751990">Гісторыя прагляду сайтаў з'явіцца тут</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -1366,6 +1370,7 @@ <translation id="4300675098767811073">Некалькі дзірак справа</translation> <translation id="4302514097724775343">Каб пачаць гульню, дакраніцеся да дыназаўра</translation> <translation id="4304049446746819918">{0,plural, =1{Палітыка адміністратара не рэкамендуе перамяшчаць гэты файл сюды: <ph name="DESTINATION_NAME" />}one{Палітыка адміністратара не рэкамендуе перамяшчаць гэтыя файлы сюды: <ph name="DESTINATION_NAME" />}few{Палітыка адміністратара не рэкамендуе перамяшчаць гэтыя файлы сюды: <ph name="DESTINATION_NAME" />}many{Палітыка адміністратара не рэкамендуе перамяшчаць гэтыя файлы сюды: <ph name="DESTINATION_NAME" />}other{Палітыка адміністратара не рэкамендуе перамяшчаць гэтыя файлы сюды: <ph name="DESTINATION_NAME" />}}</translation> +<translation id="4304485328308299773">Пачытайце ацэнкі кліентамі прадуктаў, паслуг і іх уражанні, каб больш абгрунтавана разглядаць водгукі.</translation> <translation id="4305666528087210886">Не ўдалося атрымаць доступ да файла</translation> <translation id="4306529830550717874">Захаваць адрас?</translation> <translation id="4306812610847412719">буфер абмену</translation> @@ -1530,6 +1535,7 @@ <translation id="4724144314178270921">Сайт можа запытваць дазвол на прагляд тэксту і відарысаў у буферы абмену</translation> <translation id="4726672564094551039">Перазагрузіць палітыкі</translation> <translation id="4728558894243024398">Платформа</translation> +<translation id="4730977633786878901">Водгукі</translation> <translation id="4731638775147756694">Гэта праграма заблакіравана адміністратарам</translation> <translation id="4733082559415072992">Сайт <ph name="URL" /> запытвае дазвол на выкарыстанне звестак аб месцазнаходжанні прылады</translation> <translation id="4736491186715342415">Маторныя транспартныя сродкі</translation> @@ -2161,6 +2167,7 @@ <translation id="6284292079994426700">26 x 38 цаляў</translation> <translation id="6284517535531159884">Тып зыходнага матэрыялу для мадыфікацый</translation> <translation id="6285507000506177184">Кнопка "Кіраваць спампоўкамі ў Chrome". Каб кіраваць файламі, якія вы спампавалі ў браўзеры Chrome, націсніце Enter</translation> +<translation id="6287197303017372967">Будуйце маршруты да пунктаў прызначэння з пакрокавымі інструкцыямі з дапамогай функцыі навігацыі.</translation> <translation id="6289939620939689042">Колер старонкі</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> @@ -2184,6 +2191,7 @@ <translation id="633770708279464947">Значэнне <ph name="SECURE_DNS_SALT" /> з'яўляецца недапушчальным і не будзе выкарыстоўвацца.</translation> <translation id="6340739886198108203">Згодна з зададзенай адміністратарам палітыкай, не рэкамендуецца рабіць здымкі або відэазапісы экрана, калі паказваецца канфідэнцыяльнае змесціва:</translation> <translation id="6341434961864773665">{0,plural, =1{Палітыка адміністратара не рэкамендуе запампоўваць гэты файл сюды: <ph name="DESTINATION_NAME" />}one{Палітыка адміністратара не рэкамендуе запампоўваць гэтыя файлы сюды: <ph name="DESTINATION_NAME" />}few{Палітыка адміністратара не рэкамендуе запампоўваць гэтыя файлы сюды: <ph name="DESTINATION_NAME" />}many{Палітыка адміністратара не рэкамендуе запампоўваць гэтыя файлы сюды: <ph name="DESTINATION_NAME" />}other{Палітыка адміністратара не рэкамендуе запампоўваць гэтыя файлы сюды: <ph name="DESTINATION_NAME" />}}</translation> +<translation id="634500758737709758">Маршруты</translation> <translation id="6348220984832452017">Дзеючыя варыянты</translation> <translation id="6349101878882523185">Усталяваць праграму "<ph name="APP_NAME" />"</translation> <translation id="6353505687280762741">{COUNT,plural, =0{Няма}=1{1 пароль (для даменаў <ph name="DOMAIN_LIST" />, сінхранізаваны)}=2{2 паролі (для даменаў <ph name="DOMAIN_LIST" />, сінхранізаваны)}one{# пароль (для даменаў <ph name="DOMAIN_LIST" />, сінхранізаваны)}few{# паролі (для даменаў <ph name="DOMAIN_LIST" />, сінхранізаваны)}many{# пароляў (для даменаў <ph name="DOMAIN_LIST" />, сінхранізаваны)}other{# пароля (для даменаў <ph name="DOMAIN_LIST" />, сінхранізаваны)}}</translation> @@ -2196,6 +2204,7 @@ <translation id="6370022303958842211">Усе дзеянні, звязаныя з доступам да прылады, такія як уваход (у тым ліку прычыны, па якіх увайсці не ўдалося), выхад, блакіроўка і разблакіроўка</translation> <translation id="6374469231428023295">Паўтарыць спробу</translation> <translation id="6374865374745447009">кіраванне вокнамі</translation> +<translation id="6376881782310775282">Сервер распрацоўкі гэтай праграмы недаступны</translation> <translation id="6377268785556383139">1 вынік па запыце "<ph name="SEARCH_TEXT" />"</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">На сайце, на які вы збіраецеся перайсці, магчыма спагнанне сродкаў.</translation> @@ -2371,6 +2380,7 @@ <translation id="6823746213313229853">Размовы на радыё</translation> <translation id="6825578344716086703">Вы спрабавалі трапіць на дамен <ph name="DOMAIN" />, але сервер выдаў сертыфікат, падпісаны з выкарыстаннем ненадзейнага алгарытму (напрыклад, SHA-1). Гэта азначае, што прапанаваныя серверам уліковыя даныя бяспекі маглі быць падроблены і сервер можа быць не тым серверам, які вам патрэбны (магчыма, вы абменьваецеся данымі са зламыснікам).</translation> <translation id="6826993739343257035">Дазволіць AR?</translation> +<translation id="6828150717884939426">Выклікаць</translation> <translation id="6828866289116430505">Генетыка</translation> <translation id="6831043979455480757">Перакласці</translation> <translation id="683108308100148227">Схаваць элемент</translation> @@ -3004,6 +3014,7 @@ <translation id="8286799286781881307">Праграмы, якія атрымалі адпаведны дазвол ад адміністратараў, могуць атрымліваць доступ да інфармацыі з усіх экранаў, падключаных да вашай прылады. Гэта інфармацыя можа апрацоўвацца лакальна на вашай прыладзе або запампоўвацца на серверы вашай арганізацыі.</translation> <translation id="8288807391153049143">Паказаць сертыфікат</translation> <translation id="8289355894181816810">Калі вы не ўпэўненыя, што гэта значыць, звярніцеся да адміністратара сеткі.</translation> +<translation id="8292520987784410870">Заўсёды спраўджваць?</translation> <translation id="8293206222192510085">Дадаванне закладкі</translation> <translation id="829335040383910391">гук</translation> <translation id="8294431847097064396">Крыніца</translation> @@ -3095,6 +3106,7 @@ <translation id="8539500321752640291">Даць 2 дазволы?</translation> <translation id="8541158209346794904">Прылада Bluetooth</translation> <translation id="8541410041357371550">Гэты сайт выкарыстоўвае тэмы рэкламы з Chrome, каб паказваць вам больш рэлевантную рэкламу</translation> +<translation id="8541579497401304453">Звяжыцеся з кампаніяй па тэлефоне.</translation> <translation id="8542014550340843547">Тры скабы знізу</translation> <translation id="8542617028204211143">SRA0</translation> <translation id="8543181531796978784">Вы можаце <ph name="BEGIN_ERROR_LINK" />паведаміць аб праблеме<ph name="END_ERROR_LINK" /> або, калі ўсведамляеце рызыку для сваёй бяспекі, <ph name="BEGIN_LINK" />можаце наведаць гэты небяспечны сайт<ph name="END_LINK" />.</translation> @@ -3102,6 +3114,7 @@ <translation id="854892890027593466">Канверт C6/C5</translation> <translation id="8553387990086529628">Турыстычныя маршруты</translation> <translation id="8554010658308662631">Загрузіць больш</translation> +<translation id="8554802735558319842">Для дадатковай бяспекі на агульных прыладах уключайце праверку кожны раз пры аплаце з дапамогай аўтазапаўнення.</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{Скінуць дазвол}one{Скінуць дазволы}few{Скінуць дазволы}many{Скінуць дазволы}other{Скінуць дазволы}}</translation> <translation id="8555010941760982128">Выкарыстайце гэты код пры афармленні заказу</translation> <translation id="8557066899867184262">CVC знаходзіцца на адвароце карткі.</translation> @@ -3290,6 +3303,7 @@ <translation id="9048662076076074925">24 x 36 цаляў</translation> <translation id="9049981332609050619">Вы спрабавалі трапіць на дамен <ph name="DOMAIN" />, але сервер выдаў несапраўдны сертыфікат.</translation> <translation id="9050666287014529139">Фраза-пароль</translation> +<translation id="9053840549256861041">Мы запускаем новую функцыю захавання прыватнасці ў рэкламе, якая называецца "Вымярэнне эфектыўнасці рэкламы". Для ацэнкі эфектыўнасці рэкламы сайты могуць атрымліваць ад Chrome толькі вельмі абмежаваны аб'ём інфармацыі (напрыклад, звесткі пра тое, калі вам была паказана рэкламная аб'ява).</translation> <translation id="9056953843249698117">Крама</translation> <translation id="9062620674789239642">Магчыма, ён быў перамешчаны, зменены або выдалены.</translation> <translation id="9063398205799684336">Канверт Kaku 2</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb index 2d14597..3d3ee326b 100644 --- a/components/strings/components_strings_bn.xtb +++ b/components/strings/components_strings_bn.xtb
@@ -1201,9 +1201,11 @@ <translation id="3927932062596804919">অস্বীকার</translation> <translation id="393316646445601645">ইন্টারনেট ও টেলিকম</translation> <translation id="3939773374150895049">সিভিসি কোডের পরিবর্তে WebAuthn ব্যবহার করবেন?</translation> +<translation id="3941630233824954464">আবার যাচাই করার বাধ্যতামূলক প্রসেস চালু করুন</translation> <translation id="3943857333388298514">পেস্ট করুন</translation> <translation id="3946209740501886391">এই সাইটে সর্বদা জিজ্ঞাসা করুন</translation> <translation id="3947595700203588284">MIDI ডিভাইসের সাথে কানেক্ট করতে অনুমতি চাইতে পারে</translation> +<translation id="3948588869002647271">এই অ্যাপ্লিকেশন নেই বা ক্ষতিগ্রস্ত</translation> <translation id="3949571496842715403">এই সার্ভারটিকে <ph name="DOMAIN" /> হিসাবে প্রমাণ করা যায়নি; এটির নিরাপত্তা সার্টিফিকেটে সাবজেক্ট অল্টারনেটিভ নেম্স নির্দিষ্ট করা নেই। কনফিগারেশনের কোনও সমস্যা অথবা আপনার সংযোগে কোনও আক্রমণকারী আড়ি পাতার কারণে এটি হয়ে থাকতে পারে।</translation> <translation id="3949601375789751990">আপনার ব্রাউজিং এর ইতিহাস এখানে দেখা যায়</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2203,6 +2205,7 @@ <translation id="6370022303958842211">ডিভাইস অ্যাক্সেস অ্যাকশন যেমন লগ-ইন (লগ-ইন করা যায়নি এমন কারণ সহ), লগ-আউট, লক এবং আনলক</translation> <translation id="6374469231428023295">আবার চেষ্টা করুন</translation> <translation id="6374865374745447009">উইন্ডো ম্যানেজমেন্ট</translation> +<translation id="6376881782310775282">এই অ্যাপ্লিকেশনের ডেভেলপমেন্ট সার্ভারের সাথে যোগাযোগ করা যাচ্ছে না</translation> <translation id="6377268785556383139">'<ph name="SEARCH_TEXT" />'-এর জন্য ১টি ফলাফল</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">চালিয়ে গেলে চার্জ দিতে হতে পারে।</translation> @@ -3011,6 +3014,7 @@ <translation id="8286799286781881307">আপনার অ্যাডমিনিস্ট্রেটরের অনুমোদনপ্রাপ্ত অ্যাপ্লিকেশন, ডিভাইসে অ্যাটাচ থাকা সব স্ক্রিন থেকে ক্যাপচার করতে পারবে। এই তথ্য লোকালি প্রসেস করা অথবা আপনার সংস্থার সার্ভারে আপলোড করা হতে পারে।</translation> <translation id="8288807391153049143">সার্টিফিকেট দেখান</translation> <translation id="8289355894181816810">যদি আপনি এর অর্থের ব্যাপারে নিশ্চিত না হন তাহলে আপনার নেটওয়ার্ক প্রশাসকের সঙ্গে যোগাযোগ করুন৷</translation> +<translation id="8292520987784410870">সব সময় যাচাই করবেন?</translation> <translation id="8293206222192510085">বুকমার্ক যুক্ত করুন</translation> <translation id="829335040383910391">সাউন্ড</translation> <translation id="8294431847097064396">উৎস</translation> @@ -3110,6 +3114,7 @@ <translation id="854892890027593466">এনভেলপ C6/C5</translation> <translation id="8553387990086529628">পর্যটন স্থান</translation> <translation id="8554010658308662631">আরও লোড করুন</translation> +<translation id="8554802735558319842">শেয়ার করা ডিভাইসে অতিরিক্ত সুরক্ষার জন্য, প্রত্যেকবার অটোফিল ব্যবহার করে পেমেন্ট করার সময় যাচাইকরণ চালু করুন।</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{অনুমতি রিসেট করুন}one{অনুমতি রিসেট করুন}other{অনুমতি রিসেট করুন}}</translation> <translation id="8555010941760982128">চেকআউটের সময় এই কোড ব্যবহার করুন</translation> <translation id="8557066899867184262">আপনার কার্ডের পিছনে CVC ছবিটি আছে।</translation> @@ -3298,6 +3303,7 @@ <translation id="9048662076076074925">২৪ x ৩৬ ইঞ্চি</translation> <translation id="9049981332609050619">আপনি <ph name="DOMAIN" />-এ পৌছানোর প্রয়াস করছেন, কিন্তু সার্ভার একটি ভুল সার্টিফিকেট উপস্থাপন করেছে|</translation> <translation id="9050666287014529139">পাসফ্রেজ</translation> +<translation id="9053840549256861041">আমরা বিজ্ঞাপন পরিমাপ নামের নতুন বিজ্ঞাপন সম্পর্কিত গোপনীয়তা ফিচার চালু করছি। বিজ্ঞাপনের পারফর্ম্যান্স পরিমাপ করার জন্য সাহায্য করতে Chrome নানাবিধ সাইটের মধ্যে শুধুমাত্র খুব সীমিত তথ্য শেয়ার করে, যেমন কোনও বিজ্ঞাপন আপনাকে কখন দেখানো হয়েছিল।</translation> <translation id="9056953843249698117">Store</translation> <translation id="9062620674789239642">এটি হয়ত সরানো, এডিট করা বা মুছে ফেলা হয়েছে।</translation> <translation id="9063398205799684336">এনভেলপ কাকু ২</translation>
diff --git a/components/strings/components_strings_bs.xtb b/components/strings/components_strings_bs.xtb index a373f59..3fe8fd2 100644 --- a/components/strings/components_strings_bs.xtb +++ b/components/strings/components_strings_bs.xtb
@@ -3303,6 +3303,7 @@ <translation id="9048662076076074925">24 x 36 in</translation> <translation id="9049981332609050619">Pokušali ste pristupiti domeni <ph name="DOMAIN" />, ali je server prikazao nevažeću potvrdu.</translation> <translation id="9050666287014529139">Pristupni izraz</translation> +<translation id="9053840549256861041">Pokrećemo novu funkciju privatnosti pri izloženosti oglasima koja se naziva mjerenje oglasa. Da pomogne web lokacijama da izmjere performanse oglasa, Chrome dijeli samo veoma ograničene informacije među web lokacijama, npr., kada vam se prikaže oglas.</translation> <translation id="9056953843249698117">Trgovina</translation> <translation id="9062620674789239642">Moguće je da je premješten, uređen ili izbrisan.</translation> <translation id="9063398205799684336">Koverta Kaku 2</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb index a4dc3cf7..f64398e 100644 --- a/components/strings/components_strings_ca.xtb +++ b/components/strings/components_strings_ca.xtb
@@ -1200,9 +1200,11 @@ <translation id="3927932062596804919">Denega</translation> <translation id="393316646445601645">Internet i telecomunicacions</translation> <translation id="3939773374150895049">Vols utilitzar WebAuthn en lloc del CVC?</translation> +<translation id="3941630233824954464">Activa la reautenticació obligatòria</translation> <translation id="3943857333388298514">Enganxa</translation> <translation id="3946209740501886391">Pregunta sempre en aquest lloc</translation> <translation id="3947595700203588284">Pot demanar permís per connectar-se a dispositius MIDI</translation> +<translation id="3948588869002647271">Falta l'aplicació o està malmesa</translation> <translation id="3949571496842715403">Aquest servidor no ha pogut demostrar que sigui <ph name="DOMAIN" />, perquè el seu certificat de seguretat no especifica noms alternatius per a l'assumpte. Això pot ser a causa d'una configuració incorrecta o d'un atacant que intercepta la connexió.</translation> <translation id="3949601375789751990">Aquí es mostra l'historial de navegació</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2203,6 +2205,7 @@ <translation id="6370022303958842211">Accions d'accés al dispositiu, com ara inicis de sessió (inclosos els motius pels quals no s'ha pogut iniciar la sessió), tancaments de sessió, bloquejos i desbloquejos</translation> <translation id="6374469231428023295">Torna-ho a provar</translation> <translation id="6374865374745447009">gestió de finestres</translation> +<translation id="6376881782310775282">No es pot contactar amb el servidor de desenvolupament d'aquesta aplicació</translation> <translation id="6377268785556383139">1 resultat per a "<ph name="SEARCH_TEXT" />"</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">Aquest lloc web et pot fer càrrecs.</translation> @@ -3011,6 +3014,7 @@ <translation id="8286799286781881307">Les aplicacions autoritzades per l'administrador poden capturar totes les pantalles connectades al dispositiu. Aquesta informació es pot processar localment o penjar als servidors de la teva organització.</translation> <translation id="8288807391153049143">Mostra el certificat</translation> <translation id="8289355894181816810">Si no esteu segur de què significa això, contacteu amb l'administrador de la xarxa.</translation> +<translation id="8292520987784410870">Vols fer una verificació sempre?</translation> <translation id="8293206222192510085">Afegeix una adreça d'interès</translation> <translation id="829335040383910391">so</translation> <translation id="8294431847097064396">Font</translation> @@ -3110,6 +3114,7 @@ <translation id="854892890027593466">Sobre C6/C5</translation> <translation id="8553387990086529628">Destinacions turístiques</translation> <translation id="8554010658308662631">Carrega'n més</translation> +<translation id="8554802735558319842">Per millorar la seguretat en dispositius compartits, activa la verificació cada vegada que paguis amb l'emplenament automàtic.</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{Restableix el permís}other{Restableix els permisos}}</translation> <translation id="8555010941760982128">Utilitza aquest codi en el moment de tramitar la compra</translation> <translation id="8557066899867184262">El CVC es troba a la part posterior de la targeta.</translation> @@ -3298,6 +3303,7 @@ <translation id="9048662076076074925">24 x 36 polzades</translation> <translation id="9049981332609050619">Heu provat d'accedir a <ph name="DOMAIN" />, però el servidor ha presentat un certificat no vàlid.</translation> <translation id="9050666287014529139">Frase de contrasenya</translation> +<translation id="9053840549256861041">Estem llançant una nova funció de privadesa d'anuncis anomenada "mesurament d'anuncis". Chrome només comparteix informació molt limitada entre llocs web, com ara quan se t'ha mostrat un anunci, per ajudar els llocs web a mesurar el rendiment dels anuncis.</translation> <translation id="9056953843249698117">Botiga</translation> <translation id="9062620674789239642">És possible que s'hagi mogut, editat o suprimit.</translation> <translation id="9063398205799684336">Sobre Kaku 2</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb index c3e30b4..b857326 100644 --- a/components/strings/components_strings_cs.xtb +++ b/components/strings/components_strings_cs.xtb
@@ -1196,9 +1196,11 @@ <translation id="3927932062596804919">Odmítnout</translation> <translation id="393316646445601645">Internet a telekomunikace</translation> <translation id="3939773374150895049">Použít WebAuthn namísto CVC?</translation> +<translation id="3941630233824954464">Povolit povinné opětovné ověření</translation> <translation id="3943857333388298514">Vložit</translation> <translation id="3946209740501886391">Na tomto webu se vždy zeptat</translation> <translation id="3947595700203588284">Může žádat o připojení k zařízením MIDI</translation> +<translation id="3948588869002647271">Tato aplikace chybí nebo je poškozená</translation> <translation id="3949571496842715403">Server nedokázal prokázat, že patří doméně <ph name="DOMAIN" />. V jeho bezpečnostním certifikátu nejsou uvedeny alternativní názvy subjektu. Může to být způsobeno nesprávnou konfigurací nebo tím, že vaše připojení zachytává útočník.</translation> <translation id="3949601375789751990">Zde se zobrazuje vaše historie prohlížení</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2198,6 +2200,7 @@ <translation id="6370022303958842211">Akce s přístupem k zařízením, například přihlášení (včetně důvodů neúspěšného přihlášení), odhlášení, zamknutí a odemknutí</translation> <translation id="6374469231428023295">Zkusit znovu</translation> <translation id="6374865374745447009">správa oken</translation> +<translation id="6376881782310775282">Vývojový server pro tuto aplikaci není dostupný</translation> <translation id="6377268785556383139">1 výsledek pro dotaz <ph name="SEARCH_TEXT" /></translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">Pozor na možné poplatky na webu, který se chystáte navštívit</translation> @@ -2939,7 +2942,7 @@ <translation id="8118489163946903409">Platební metoda</translation> <translation id="8123046743443732598">Stolní počítače</translation> <translation id="8124639700796374294">Tlačítko přizpůsobení Chromu. Stisknutím klávesy Enter si můžete přizpůsobit vzhled prohlížeče</translation> -<translation id="8126056688005753476">Dobrodružné cestování</translation> +<translation id="8126056688005753476">Cestování za dobrodružstvím</translation> <translation id="8127301229239896662">Software <ph name="SOFTWARE_NAME" /> na počítači nebo v síti nebyl nainstalován správně. Požádejte administrátora IT o vyřešení tohoto problému.</translation> <translation id="8131740175452115882">Potvrdit</translation> <translation id="8148608574971654810">Verze PDF:</translation> @@ -3005,6 +3008,7 @@ <translation id="8286799286781881307">Aplikace autorizované administrátorem mohou zaznamenávat všechny obrazovky připojené k zařízení. Tyto informace se mohou zpracovávat místně nebo nahrávat na servery vaší organizace.</translation> <translation id="8288807391153049143">Zobrazit certifikát</translation> <translation id="8289355894181816810">Pokud nevíte, co dělat, obraťte se na svého správce sítě.</translation> +<translation id="8292520987784410870">Vždy ověřit?</translation> <translation id="8293206222192510085">Přidat záložku</translation> <translation id="829335040383910391">zvuk</translation> <translation id="8294431847097064396">Zdroj</translation> @@ -3058,7 +3062,7 @@ <translation id="8428634594422941299">Rozumím</translation> <translation id="8431194080598727332"><ph name="MANAGE_COOKIES_FOCUSED_FRIENDLY_MATCH_TEXT" />, stisknutím tabulátoru a poté klávesy Enter můžete spravovat nastavení souborů cookie v nastavení Chromu</translation> <translation id="8433057134996913067">Budete odhlášeni z většiny webů.</translation> -<translation id="8434840396568290395">Domácí zvířata</translation> +<translation id="8434840396568290395">Domácí mazlíčci</translation> <translation id="8437238597147034694">&Vrátit přesunutí zpět</translation> <translation id="8438786541497918448">Použít kameru a mikrofon?</translation> <translation id="8438923942245957911">Vaše organizace tento web nahlásila</translation> @@ -3104,6 +3108,7 @@ <translation id="854892890027593466">Obálka C6/C5</translation> <translation id="8553387990086529628">Turistické destinace</translation> <translation id="8554010658308662631">Načíst další</translation> +<translation id="8554802735558319842">Pro lepší zabezpečení na sdílených zařízeních zapněte ověření při každé platbě s použitím automatického vyplňování.</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{Resetovat oprávnění}few{Resetovat oprávnění}many{Resetovat oprávnění}other{Resetovat oprávnění}}</translation> <translation id="8555010941760982128">Při placení použijte tento kód</translation> <translation id="8557066899867184262">Kód CVC je uveden na zadní straně karty.</translation> @@ -3293,6 +3298,7 @@ <translation id="9048662076076074925">24 × 36 palců</translation> <translation id="9049981332609050619">Pokusili jste se přejít do domény <ph name="DOMAIN" />, ale server předložil certifikát, jehož platnost vypršela.</translation> <translation id="9050666287014529139">Heslová fráze</translation> +<translation id="9053840549256861041">Spouštíme novou funkci ochrany soukromí v reklamách nazvanou „měření reklam“. Chrome mezi weby sdílí jen velmi omezené informace – například kdy se vám zobrazila reklama, aby weby mohly měřit výkon reklam.</translation> <translation id="9056953843249698117">Obchod</translation> <translation id="9062620674789239642">Soubor mohl být přesunut, upraven nebo smazán.</translation> <translation id="9063398205799684336">Obálka Kaku 2</translation>
diff --git a/components/strings/components_strings_cy.xtb b/components/strings/components_strings_cy.xtb index d0bb936..0bd817f 100644 --- a/components/strings/components_strings_cy.xtb +++ b/components/strings/components_strings_cy.xtb
@@ -3303,6 +3303,7 @@ <translation id="9048662076076074925">24 x 36 modfedd</translation> <translation id="9049981332609050619">Gwnaethoch geisio cyrraedd <ph name="DOMAIN" />, ond cyflwynodd y gweinydd dystysgrif annilys.</translation> <translation id="9050666287014529139">Cyfrinymadrodd</translation> +<translation id="9053840549256861041">Rydym yn lansio nodwedd preifatrwydd hysbyseb newydd o'r enw mesur hysbysebion. Mae Chrome yn rhannu gwybodaeth gyfyngedig iawn rhwng gwefannau, megis pan ddangoswyd hysbyseb i chi, i helpu gwefannau i fesur perfformiad hysbysebion.</translation> <translation id="9056953843249698117">Siop</translation> <translation id="9062620674789239642">Mae'n bosib ei bod wedi'i symud, ei golygu neu ei dileu.</translation> <translation id="9063398205799684336">Amlen Kaku 2</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb index 82e76c56..f574aaa 100644 --- a/components/strings/components_strings_da.xtb +++ b/components/strings/components_strings_da.xtb
@@ -1200,9 +1200,11 @@ <translation id="3927932062596804919">Afvis</translation> <translation id="393316646445601645">Internet og telekommunikation</translation> <translation id="3939773374150895049">Vil du bruge WebAuthn i stedet for kontrolkoden?</translation> +<translation id="3941630233824954464">Aktivér obligatorisk fornyet godkendelse</translation> <translation id="3943857333388298514">Indsæt</translation> <translation id="3946209740501886391">Spørg altid på dette website</translation> <translation id="3947595700203588284">Websitet kan anmode om tilladelse til at oprette forbindelse til MIDI-enheder</translation> +<translation id="3948588869002647271">Appen mangler eller er beskadiget</translation> <translation id="3949571496842715403">Denne server kunne ikke bevise, at den er <ph name="DOMAIN" />, da sikkerhedscertifikatet ikke angiver alternative navne på emner. Dette kan skyldes en fejlkonfiguration, eller at en hacker har opfanget din forbindelse.</translation> <translation id="3949601375789751990">Din browserhistorik vises her</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2203,6 +2205,7 @@ <translation id="6370022303958842211">Handlinger i forbindelse med enhedsadgang som f.eks. loginforsøg (herunder mislykkede loginforsøg), logoutforsøg, låsninger og oplåsninger</translation> <translation id="6374469231428023295">Prøv igen</translation> <translation id="6374865374745447009">vinduesstyring</translation> +<translation id="6376881782310775282">Der kan ikke oprettes forbindelse til udviklingsserveren for denne app</translation> <translation id="6377268785556383139">1 resultat for "<ph name="SEARCH_TEXT" />"</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">Potentielle debiteringer forude</translation> @@ -3011,6 +3014,7 @@ <translation id="8286799286781881307">Programmer, der er godkendt af din administrator, kan tage screenshots af alle skærme, som er tilsluttet din enhed. Disse oplysninger kan behandles lokalt eller uploades til din organisations servere.</translation> <translation id="8288807391153049143">Vis certifikat</translation> <translation id="8289355894181816810">Kontakt din netværksadministrator, hvis du ikke er sikker på, hvad det betyder.</translation> +<translation id="8292520987784410870">Skal der altid kræves verificering?</translation> <translation id="8293206222192510085">Tilføj bogmærke</translation> <translation id="829335040383910391">lyd</translation> <translation id="8294431847097064396">Kilde</translation> @@ -3110,6 +3114,7 @@ <translation id="854892890027593466">Konvolut C6/C5</translation> <translation id="8553387990086529628">Turistmål</translation> <translation id="8554010658308662631">Indlæs flere</translation> +<translation id="8554802735558319842">Af hensyn til sikkerheden på delte enheder kan du vælge, at der skal kræves verificering, hver gang du betaler ved hjælp af Autofyld.</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{Nulstil tilladelse}one{Nulstil tilladelse}other{Nulstil tilladelser}}</translation> <translation id="8555010941760982128">Angiv denne kode ved betalingen</translation> <translation id="8557066899867184262">Kontrolkoden findes på bagsiden af kortet.</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb index f574104..192f5fa 100644 --- a/components/strings/components_strings_en-GB.xtb +++ b/components/strings/components_strings_en-GB.xtb
@@ -3303,6 +3303,7 @@ <translation id="9048662076076074925">24 in x 36 in</translation> <translation id="9049981332609050619">You attempted to reach <ph name="DOMAIN" />, but the server presented an invalid certificate.</translation> <translation id="9050666287014529139">Passphrase</translation> +<translation id="9053840549256861041">We're launching a new ads privacy feature called ads measurement. Chrome shares only very limited information between sites, such as when an ad was shown to you, to help sites measure the performance of ads.</translation> <translation id="9056953843249698117">Store</translation> <translation id="9062620674789239642">It may have been moved, edited or deleted.</translation> <translation id="9063398205799684336">Envelope Kaku 2</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb index 1dce3c8..aeacbf8 100644 --- a/components/strings/components_strings_es-419.xtb +++ b/components/strings/components_strings_es-419.xtb
@@ -1201,9 +1201,11 @@ <translation id="3927932062596804919">Rechazar</translation> <translation id="393316646445601645">Internet y telecomunicaciones</translation> <translation id="3939773374150895049">¿Deseas usar WebAuthn en lugar de CVC?</translation> +<translation id="3941630233824954464">Habilitar la reautenticación obligatoria</translation> <translation id="3943857333388298514">Pegar</translation> <translation id="3946209740501886391">Preguntar siempre en este sitio</translation> <translation id="3947595700203588284">Puede solicitar permiso para conectarse con dispositivos MIDI</translation> +<translation id="3948588869002647271">Esta aplicación está dañada o no está instalada</translation> <translation id="3949571496842715403">Este servidor no pudo probar que su dominio es <ph name="DOMAIN" />; su certificado de seguridad no especifica la extensión Nombres alternativos del asunto. Es posible que se deba a un error en la configuración o a que haya un atacante que está interceptando tu conexión.</translation> <translation id="3949601375789751990">Tu historial de navegación aparece aquí</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2204,6 +2206,7 @@ <translation id="6370022303958842211">Las acciones de acceso a dispositivos, como los accesos a la cuenta (incluidos los motivos fallidos), cierres de sesión, bloqueos y desbloqueos</translation> <translation id="6374469231428023295">Volver a intentar</translation> <translation id="6374865374745447009">administración de ventanas</translation> +<translation id="6376881782310775282">No se puede acceder al servidor de desarrollo de esta aplicación</translation> <translation id="6377268785556383139">1 resultado para "<ph name="SEARCH_TEXT" />"</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">Es posible que se cobren cargos.</translation> @@ -3012,6 +3015,7 @@ <translation id="8286799286781881307">Las apps autorizadas por el administrador pueden capturar todas las pantallas del dispositivo. Esta información se puede procesar de forma local o subir a los servidores de tu organización.</translation> <translation id="8288807391153049143">Mostrar certificado</translation> <translation id="8289355894181816810">Comunícate con el administrador de red si no entiendes bien lo que significa.</translation> +<translation id="8292520987784410870">¿Quieres realizar la verificación siempre?</translation> <translation id="8293206222192510085">Agregar Marcador</translation> <translation id="829335040383910391">sonido</translation> <translation id="8294431847097064396">Fuente</translation> @@ -3111,6 +3115,7 @@ <translation id="854892890027593466">Sobre C6/C5</translation> <translation id="8553387990086529628">Destinos turísticos</translation> <translation id="8554010658308662631">Cargar más</translation> +<translation id="8554802735558319842">Para mayor seguridad en los dispositivos compartidos, activa la verificación cada vez que pagues con la función Autocompletar.</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{Restablecer permiso}other{Restablecer permisos}}</translation> <translation id="8555010941760982128">Usa este código cuando confirmes la compra</translation> <translation id="8557066899867184262">El CVC se encuentra al dorso de tu tarjeta.</translation> @@ -3300,6 +3305,7 @@ <translation id="9048662076076074925">60.96 × 91.44 cm</translation> <translation id="9049981332609050619">Has intentado acceder a <ph name="DOMAIN" />, pero el servidor presentó un certificado no válido.</translation> <translation id="9050666287014529139">Frase de contraseña</translation> +<translation id="9053840549256861041">Lanzamos una nueva función de privacidad en los anuncios llamada medición de anuncios. Chrome solo comparte información muy limitada entre los sitios, como cuando se te mostró un anuncio, para ayudar a los sitios a medir el rendimiento de los anuncios.</translation> <translation id="9056953843249698117">Chrome Web Store</translation> <translation id="9062620674789239642">Es posible que se haya movido, editado o borrado.</translation> <translation id="9063398205799684336">Sobre Kaku n.º 2</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb index cac6a1e..ef56a8c 100644 --- a/components/strings/components_strings_es.xtb +++ b/components/strings/components_strings_es.xtb
@@ -1200,9 +1200,11 @@ <translation id="3927932062596804919">Denegar</translation> <translation id="393316646445601645">Internet y telecomunicaciones</translation> <translation id="3939773374150895049">¿Usar WebAuthn en lugar de CVC?</translation> +<translation id="3941630233824954464">Habilitar reautenticación obligatoria</translation> <translation id="3943857333388298514">Pegar</translation> <translation id="3946209740501886391">Preguntar siempre en este sitio web</translation> <translation id="3947595700203588284">Puede solicitar permiso para conectarse a dispositivos MIDI</translation> +<translation id="3948588869002647271">Falta esta aplicación o está dañada</translation> <translation id="3949571496842715403">Este servidor no ha podido demostrar que es <ph name="DOMAIN" />; su certificado de seguridad no especifica nombres alternativos del sujeto. Este problema puede deberse a una configuración incorrecta o a que un atacante ha interceptado la conexión.</translation> <translation id="3949601375789751990">Tu historial de navegación aparece aquí</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2203,6 +2205,7 @@ <translation id="6370022303958842211">Acciones de acceso a los dispositivos, como inicios de sesión (incluidos los motivos por los que ha fallado un inicio de sesión), cierres de sesión, bloqueos y desbloqueos</translation> <translation id="6374469231428023295">Reintentar</translation> <translation id="6374865374745447009">gestión de ventanas</translation> +<translation id="6376881782310775282">No se puede conectar con el servidor de desarrollo de esta aplicación</translation> <translation id="6377268785556383139">1 resultado para "<ph name="SEARCH_TEXT" />"</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">Es posible que se cobren cargos en el futuro.</translation> @@ -3011,6 +3014,7 @@ <translation id="8286799286781881307">Las aplicaciones autorizadas por tu administrador pueden hacer capturas de todas las pantallas que estén conectadas físicamente a tu dispositivo. Esta información puede procesarse de forma local o subirse a los servidores de tu organización.</translation> <translation id="8288807391153049143">Mostrar certificado</translation> <translation id="8289355894181816810">Si tienes alguna duda, ponte en contacto con el administrador de red.</translation> +<translation id="8292520987784410870">¿Verificar siempre?</translation> <translation id="8293206222192510085">Añadir marcador</translation> <translation id="829335040383910391">sonido</translation> <translation id="8294431847097064396">Origen</translation> @@ -3110,6 +3114,7 @@ <translation id="854892890027593466">Sobre C6/C5</translation> <translation id="8553387990086529628">Destinos turísticos</translation> <translation id="8554010658308662631">Cargar más</translation> +<translation id="8554802735558319842">Para una mayor seguridad en dispositivos compartidos, activa la verificación siempre que pagues con la función Autocompletar.</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{Restablecer permiso}other{Restablecer permisos}}</translation> <translation id="8555010941760982128">Usa este código al tramitar la compra</translation> <translation id="8557066899867184262">Puedes encontrar el CVC en el reverso de la tarjeta.</translation>
diff --git a/components/strings/components_strings_eu.xtb b/components/strings/components_strings_eu.xtb index 70b4db6..ff095f9 100644 --- a/components/strings/components_strings_eu.xtb +++ b/components/strings/components_strings_eu.xtb
@@ -3298,6 +3298,7 @@ <translation id="9048662076076074925">60,96 × 91,44 cm (24 × 36 in)</translation> <translation id="9049981332609050619"><ph name="DOMAIN" /> domeinura konektatzen saiatu zara, baina zerbitzariak balio ez duen ziurtagiria aurkeztu du.</translation> <translation id="9050666287014529139">Pasaesaldia</translation> +<translation id="9053840549256861041">Iragarkietarako pribatutasun-eginbide berri bat kaleratu dugu: iragarkien neurketa. Webguneei iragarkien errendimendua neurtzen laguntzeko informazio oso mugatua soilik partekatzen du Chrome-k webguneen artean; adibidez, noiz erakutsi dizuten iragarki bat.</translation> <translation id="9056953843249698117">Denda</translation> <translation id="9062620674789239642">Agian lekuz aldatu, editatu edo ezabatu egin da.</translation> <translation id="9063398205799684336">Kaku gutun-azala 2</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb index 796ca27..b7cf34c1 100644 --- a/components/strings/components_strings_fa.xtb +++ b/components/strings/components_strings_fa.xtb
@@ -3303,6 +3303,7 @@ <translation id="9048662076076074925">۳۶ × ۲۴ اینچ</translation> <translation id="9049981332609050619">شما سعی کردید به <ph name="DOMAIN" /> دسترسی داشته باشید، اما سرور یک گواهی نامعتبر را نشان داد.</translation> <translation id="9050666287014529139">گذرعبارت</translation> +<translation id="9053840549256861041">درحال راهاندازی ویژگی حریم خصوصی آگهی جدیدی به نام سنجش آگهی هستیم. Chrome فقط اطلاعات بسیار محدودی را بین سایتها همرسانی میکند (مثلاً زمان نمایش آگهی به شما) تا به سایتها کمک کند عملکرد آگهیها را اندازهگیری کنند.</translation> <translation id="9056953843249698117">فروشگاه</translation> <translation id="9062620674789239642">ممکن است جابهجا، ویرایش، یا حذف شده باشد.</translation> <translation id="9063398205799684336">پاکت کاکو ۲</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb index faf6cdec..95df3397 100644 --- a/components/strings/components_strings_fi.xtb +++ b/components/strings/components_strings_fi.xtb
@@ -3305,6 +3305,7 @@ <translation id="9048662076076074925">24 x 36 tuumaa</translation> <translation id="9049981332609050619">Yritit muodostaa yhteyden verkkotunnukseen <ph name="DOMAIN" />, mutta palvelin esitti virheellisen varmenteen.</translation> <translation id="9050666287014529139">Tunnuslause</translation> +<translation id="9053840549256861041">Julkaisemme uuden yksityisyyteen liittyvän mainosominaisuuden, jota kutsutaan mainosmittaukseksi. Chrome jakaa vain hyvin rajallisia tietoja sivustojen välillä (esimerkiksi sen, milloin mainos on näytetty sinulle), jotta sivustot voivat mitata mainosten tuloksia.</translation> <translation id="9056953843249698117">Kauppa</translation> <translation id="9062620674789239642">Sitä on voitu muokata tai se on voitu siirtää tai poistaa.</translation> <translation id="9063398205799684336">Kirjekuori Kaku 2</translation>
diff --git a/components/strings/components_strings_fr-CA.xtb b/components/strings/components_strings_fr-CA.xtb index 0b2a2f696..062191b 100644 --- a/components/strings/components_strings_fr-CA.xtb +++ b/components/strings/components_strings_fr-CA.xtb
@@ -1198,9 +1198,11 @@ <translation id="3927932062596804919">Refuser</translation> <translation id="393316646445601645">Internet et télécommunications</translation> <translation id="3939773374150895049">Utiliser WebAuthn au lieu du code CVC?</translation> +<translation id="3941630233824954464">Activer la réauthentification obligatoire</translation> <translation id="3943857333388298514">Coller</translation> <translation id="3946209740501886391">Toujours demander sur ce site</translation> <translation id="3947595700203588284">Les sites peuvent demander à se connecter à des appareils MIDI</translation> +<translation id="3948588869002647271">Cette application est manquante ou endommagée</translation> <translation id="3949571496842715403">Impossible de vérifier sur le serveur qu'il s'agit bien du domaine <ph name="DOMAIN" />, car son certificat de sécurité n'indique pas d'extension SAN (Subject Alternative Names). Cela peut être dû à une mauvaise configuration ou à l'interception de votre connexion par un pirate informatique.</translation> <translation id="3949601375789751990">Votre historique de navigation apparaît ici</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2200,6 +2202,7 @@ <translation id="6370022303958842211">Actions du programme Accès aux appareils telles que les connexions (y compris les raisons des échecs de la connexion), les déconnexions, les verrouillages et les déverrouillages</translation> <translation id="6374469231428023295">Réessayer</translation> <translation id="6374865374745447009">gestion des fenêtres</translation> +<translation id="6376881782310775282">Impossible d'accéder au serveur de développement de cette application</translation> <translation id="6377268785556383139">1 résultat trouvé pour « <ph name="SEARCH_TEXT" /> »</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">Possibilité de frais facturés plus tard.</translation> @@ -3008,6 +3011,7 @@ <translation id="8286799286781881307">Les applications autorisées par votre administrateur peuvent capturer tous les écrans connectés à votre appareil. Ces informations peuvent être traitées localement ou téléchargées sur les serveurs de votre organisation.</translation> <translation id="8288807391153049143">Afficher le certificat</translation> <translation id="8289355894181816810">Communiquez avec votre administrateur réseau si vous n'êtes pas certain de ce que cela signifie.</translation> +<translation id="8292520987784410870">Toujours vérifier?</translation> <translation id="8293206222192510085">Ajouter aux favoris</translation> <translation id="829335040383910391">Son</translation> <translation id="8294431847097064396">Source</translation> @@ -3107,6 +3111,7 @@ <translation id="854892890027593466">Enveloppe C6/C5</translation> <translation id="8553387990086529628">Destinations touristiques</translation> <translation id="8554010658308662631">Afficher plus</translation> +<translation id="8554802735558319842">Pour plus de sécurité sur les appareils partagés, activez la vérification à chaque fois que vous payez en utilisant le remplissage automatique.</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{Réinitialiser l'autorisation}one{Réinitialiser l'autorisation}other{Réinitialiser les autorisations}}</translation> <translation id="8555010941760982128">Utiliser ce code lors du paiement</translation> <translation id="8557066899867184262">Le code de vérification de carte (CVC) se trouve au dos de votre carte</translation> @@ -3295,6 +3300,7 @@ <translation id="9048662076076074925">24 po x 36 po</translation> <translation id="9049981332609050619">Vous avez essayé d'accéder à <ph name="DOMAIN" />, mais le serveur a présenté un certificat non valide.</translation> <translation id="9050666287014529139">Phrase de passe</translation> +<translation id="9053840549256861041">Nous lançons une nouvelle fonctionnalité de confidentialité des annonces appelée mesure des annonces. Chrome ne partage que des informations très limitées entre les sites, comme le moment où une annonce vous a été présentée, pour aider les sites à mesurer les performances des annonces.</translation> <translation id="9056953843249698117">Boutique</translation> <translation id="9062620674789239642">Il a peut-être été déplacé, modifié ou supprimé.</translation> <translation id="9063398205799684336">Enveloppe Kaku nᵒ 2</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb index 013ba3a..6036402 100644 --- a/components/strings/components_strings_fr.xtb +++ b/components/strings/components_strings_fr.xtb
@@ -3304,6 +3304,7 @@ <translation id="9048662076076074925">24 x 36 pouces</translation> <translation id="9049981332609050619">Vous avez tenté de contacter <ph name="DOMAIN" />, mais le certificat présenté par le serveur est incorrect.</translation> <translation id="9050666287014529139">Phrase secrète</translation> +<translation id="9053840549256861041">Nous lançons une nouvelle fonctionnalité de confidentialité des annonces : la mesure des annonces. Chrome ne partage que des informations très limitées entre les sites, comme le moment où une annonce vous a été présentée, afin d'aider les sites à mesurer les performances des annonces.</translation> <translation id="9056953843249698117">Google Store</translation> <translation id="9062620674789239642">Il a peut-être été déplacé, modifié ou supprimé.</translation> <translation id="9063398205799684336">Enveloppe Kaku 2</translation>
diff --git a/components/strings/components_strings_gl.xtb b/components/strings/components_strings_gl.xtb index 89c4db0..395806b3 100644 --- a/components/strings/components_strings_gl.xtb +++ b/components/strings/components_strings_gl.xtb
@@ -1200,9 +1200,11 @@ <translation id="3927932062596804919">Denegar</translation> <translation id="393316646445601645">Internet e telecomunicacións</translation> <translation id="3939773374150895049">Queres usar a autenticación web en lugar do CVC?</translation> +<translation id="3941630233824954464">Activar a reautenticación obrigatoria</translation> <translation id="3943857333388298514">Pegar</translation> <translation id="3946209740501886391">Preguntar sempre sobre este sitio</translation> <translation id="3947595700203588284">Pode pedirche permiso para conectarse aos dispositivos MIDI</translation> +<translation id="3948588869002647271">Esta aplicación está danada ou non está instalada</translation> <translation id="3949571496842715403">Este servidor non puido demostrar que é <ph name="DOMAIN" /> porque o seu certificado de seguranza non especifica nomes de asunto alternativos. É posible que isto se deba a un erro de configuración ou a que un pirata informático interceptase a túa conexión.</translation> <translation id="3949601375789751990">O teu historial de navegación aparece aquí</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2203,6 +2205,7 @@ <translation id="6370022303958842211">Accións de acceso ao dispositivo, como inicios de sesión (por exemplo, os motivos polo que non se puido iniciar sesión), peches de sesión, bloqueos e desbloqueos</translation> <translation id="6374469231428023295">Tentar de novo</translation> <translation id="6374865374745447009">xestión de ventás</translation> +<translation id="6376881782310775282">Non se puido contactar co servidor de desenvolvemento desta aplicación</translation> <translation id="6377268785556383139">1 resultado para "<ph name="SEARCH_TEXT" />"</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">Posibles cargos de agora en adiante.</translation> @@ -3011,6 +3014,7 @@ <translation id="8286799286781881307">As aplicacións que o teu administrador autorice poden facer capturas de todas as pantallas que estean conectadas ao dispositivo. Esta información pode procesarse de forma local ou cargarse nos servidores da túa organización.</translation> <translation id="8288807391153049143">Mostrar certificado</translation> <translation id="8289355894181816810">Ponte en contacto co administrador da túa rede se non estás seguro de que quere dicir isto.</translation> +<translation id="8292520987784410870">Queres facer sempre a verificación?</translation> <translation id="8293206222192510085">Engadir marcador</translation> <translation id="829335040383910391">son</translation> <translation id="8294431847097064396">Fonte</translation> @@ -3110,6 +3114,7 @@ <translation id="854892890027593466">Sobre C6/C5</translation> <translation id="8553387990086529628">Destinos turísticos</translation> <translation id="8554010658308662631">Cargar máis</translation> +<translation id="8554802735558319842">Para dispor de máis seguranza nos dispositivos compartidos, activa a verificación sempre que pagues mediante a función de autocompletar.</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{Restablecer permiso}other{Restablecer permisos}}</translation> <translation id="8555010941760982128">Usa este código ao tramitar a compra</translation> <translation id="8557066899867184262">O código CVC atópase na parte traseira da tarxeta</translation> @@ -3298,6 +3303,7 @@ <translation id="9048662076076074925">24 x 36 in</translation> <translation id="9049981332609050619">Intentaches acceder a <ph name="DOMAIN" />, pero o servidor presentou un certificado non válido.</translation> <translation id="9050666287014529139">Frase de acceso</translation> +<translation id="9053840549256861041">Imos lanzar unha nova función de privacidade nos anuncios chamada Medición de anuncios. Chrome só comparte información moi limitada entre os sitios (como, por exemplo, cando se che mostrou un anuncio) co fin de axudarlles a medir o rendemento dos anuncios.</translation> <translation id="9056953843249698117">Tenda</translation> <translation id="9062620674789239642">É posible que se movese, editase ou eliminase.</translation> <translation id="9063398205799684336">Sobre Kaku-2</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb index 7debbda..96e1da93 100644 --- a/components/strings/components_strings_gu.xtb +++ b/components/strings/components_strings_gu.xtb
@@ -1200,9 +1200,11 @@ <translation id="3927932062596804919">નકારો</translation> <translation id="393316646445601645">ઇન્ટરનેટ અને ટેલિકોમ</translation> <translation id="3939773374150895049">CVCને બદલે WebAuthnનો ઉપયોગ કરીએ?</translation> +<translation id="3941630233824954464">ફરજીયાત પુન:પ્રમાણીકરણ ચાલુ કરો</translation> <translation id="3943857333388298514">પેસ્ટ કરો</translation> <translation id="3946209740501886391">આ સાઇટ પર હંમેશાં પૂછો</translation> <translation id="3947595700203588284">MIDI ડિવાઇસ સાથે કનેક્ટ કરવાનું પૂછી શકે છે</translation> +<translation id="3948588869002647271">ઍપ્લિકેશન ખૂટે છે અથવા નુકસાન થયેલી છે</translation> <translation id="3949571496842715403">આ સર્વર સાબિત કરી શક્યું નથી કે તે <ph name="DOMAIN" /> છે; તેનું સુરક્ષા પ્રમાણપત્ર વિષય વૈકલ્પિક નામનો ઉલ્લેખ કરતું નથી. આ કોઈ ખોટી ગોઠવણીને કારણે અથવા કોઈ હુમલાખોર તમારા કનેક્શનને અટકાવતો હોવાને કારણે બન્યું હોઈ શકે.</translation> <translation id="3949601375789751990">તમારો બ્રાઉઝિંગ ઇતિહાસ અહીં દેખાય છે</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2203,6 +2205,7 @@ <translation id="6370022303958842211">ડિવાઇસના ઍક્સેસની ક્રિયાઓ જેમ કે લૉગ ઇન (લૉગ ઇન નિષ્ફ્ળ થવાના કારણો સહિત), લૉગ આઉટ, લૉક અને અનલૉક કરવાની ક્રિયાઓ</translation> <translation id="6374469231428023295">ફરી પ્રયાસ કરો</translation> <translation id="6374865374745447009">વિન્ડો મેનેજમેન્ટ</translation> +<translation id="6376881782310775282">આ ઍપ્લિકેશન માટેના ડેવલપમેન્ટ સર્વર સુધી પહોંચી શકાતું નથી</translation> <translation id="6377268785556383139">'<ph name="SEARCH_TEXT" />' માટે 1 પરિણામ</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">આગળ ઉપર શુલ્ક લાગવાની શક્યતા.</translation> @@ -3011,6 +3014,7 @@ <translation id="8286799286781881307">તમારા ઍડમિનિસ્ટ્રેટર દ્વારા અધિકૃત ઍપ્લિકેશનો તમારા ડિવાઇસ સાથે જોડાયેલ તમામ સ્ક્રીન કૅપ્ચર કરી શકે છે. આ માહિતી પર સ્થાનિક રીતે પ્રક્રિયા કરી શકાય છે અથવા તેને તમારી સંસ્થાના સર્વર પર અપલોડ કરી શકાય છે.</translation> <translation id="8288807391153049143">પ્રમાણપત્ર બતાવો</translation> <translation id="8289355894181816810">આ શું છે તે ખાતરીપૂર્વક જાણતા ન હો તો તમારા નેટવર્ક વ્યવસ્થાપકનો સંપર્ક કરો.</translation> +<translation id="8292520987784410870">હંમેશાં ચકાસીએ?</translation> <translation id="8293206222192510085">બુકમાર્ક ઉમેરો</translation> <translation id="829335040383910391">સાઉન્ડ</translation> <translation id="8294431847097064396">સ્રોત</translation> @@ -3110,6 +3114,7 @@ <translation id="854892890027593466">એન્વલપ C6/C5</translation> <translation id="8553387990086529628">પર્યટકો માટે હરવા-ફરવાના સ્થાનો</translation> <translation id="8554010658308662631">વધુ લોડ કરો</translation> +<translation id="8554802735558319842">શેર કરેલા ડિવાઇસ પર વધારાની સુરક્ષા માટે, જ્યારે પણ તમે ઑટોમૅટિક રીતે ભરવાની સુવિધાનો ઉપયોગ કરીને ચુકવણી કરો ત્યારે ચકાસણી ચાલુ કરો.</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{પરવાનગી રીસેટ કરો}one{પરવાનગી રીસેટ કરો}other{બધી પરવાનગી રીસેટ કરો}}</translation> <translation id="8555010941760982128">ચેકઆઉટ વખતે આ કોડનો ઉપયોગ કરો</translation> <translation id="8557066899867184262">CVC તમારા કાર્ડની પાછળ હોય છે.</translation> @@ -3298,6 +3303,7 @@ <translation id="9048662076076074925">24 x 36 ઇંચ</translation> <translation id="9049981332609050619">તમે <ph name="DOMAIN" /> સુધી પહોંચવાનો પ્રયાસ કર્યો, પરંતુ સર્વરે અમાન્ય પ્રમાણપત્ર પ્રસ્તુત કર્યું. </translation> <translation id="9050666287014529139">પાસફ્રેઝ</translation> +<translation id="9053840549256861041">અમે જાહેરાતની માપણી નામક નવી જાહેરાત સંબંધિત પ્રાઇવસી સુવિધા લૉન્ચ કરી રહ્યાં છીએ. Chrome સાઇટ વચ્ચે માત્ર ખૂબ જ મર્યાદિત માહિતી શેર કરે છે, જેમ કે જાહેરાતના પર્ફોર્મન્સની માપણી કરવામાં સાઇટની સહાય કરવા માટે જ્યારે તમને કોઈ જાહેરાત બતાવવામાં આવી હોય.</translation> <translation id="9056953843249698117">Store</translation> <translation id="9062620674789239642">તેને ખસેડવામાં આવી હોય, તેમાં ફેરફાર કરવામાં આવ્યો હોય કે તેને ડિલીટ કરવામાં આવી હોય તેવું બની શકે છે.</translation> <translation id="9063398205799684336">એન્વલપ કાકૂ 2</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb index 2c5d52a4..5bcff167 100644 --- a/components/strings/components_strings_hi.xtb +++ b/components/strings/components_strings_hi.xtb
@@ -3304,6 +3304,7 @@ <translation id="9048662076076074925">24 x 36 इंच</translation> <translation id="9049981332609050619">आपने <ph name="DOMAIN" /> पर पहुंचने की कोशिश की लेकिन सर्वर ने एक अमान्य प्रमाणपत्र पेश किया.</translation> <translation id="9050666287014529139">पासफ़्रेज़ (लंबा पासवर्ड)</translation> +<translation id="9053840549256861041">हम विज्ञापन देखने वाले की निजता बनाए रखने से जुड़ी एक नई सुविधा लॉन्च कर रहे हैं. इसका नाम है, विज्ञापन की परफ़ॉर्मेंस का आकलन. Chrome, साइटों के बीच सिर्फ़ कुछ ही जानकारी शेयर करता है. जैसे, आपको कोई विज्ञापन कब दिखाया गया, ताकि साइटों को विज्ञापनों की परफ़ॉर्मेंस का आकलन करने में मदद मिल सके.</translation> <translation id="9056953843249698117">Store</translation> <translation id="9062620674789239642">हो सकता है कि फ़ाइल को दूसरी जगह ले जाया गया हो, उसमें बदलाव किया गया हो या उसे मिटा दिया गया हो.</translation> <translation id="9063398205799684336">काकू 2 साइज़ का लिफ़ाफ़ा</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb index ef547d23..524e701 100644 --- a/components/strings/components_strings_hr.xtb +++ b/components/strings/components_strings_hr.xtb
@@ -3303,6 +3303,7 @@ <translation id="9048662076076074925">24 x 36 inča</translation> <translation id="9049981332609050619">Pokušali ste pristupiti domeni <ph name="DOMAIN" />, ali poslužitelj je prikazao nevažeći certifikat.</translation> <translation id="9050666287014529139">Zaporka</translation> +<translation id="9053840549256861041">Predstavljamo novu značajku zaštite privatnosti u online oglašavanju pod nazivom mjerenje oglasa. Chrome dijeli samo vrlo ograničene informacije među web-lokacijama, kao što je vrijeme prikazivanja oglasa, kako bi pomogao web-lokacijama u mjerenju izvedbe oglasa.</translation> <translation id="9056953843249698117">Trgovina</translation> <translation id="9062620674789239642">Možda je premještena, uređena ili izbrisana.</translation> <translation id="9063398205799684336">Omotnica Kaku 2</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb index 74d1bfd..aa2f189 100644 --- a/components/strings/components_strings_hu.xtb +++ b/components/strings/components_strings_hu.xtb
@@ -977,6 +977,7 @@ <translation id="3380864720620200369">Ügyfél-azonosító:</translation> <translation id="3381668585148405088">Vásárlás igazolása</translation> <translation id="3383566085871012386">Jelenlegi fontossági sorrend</translation> +<translation id="3384522979010096022">Szervezete nem engedélyezi a webhely megtekintését</translation> <translation id="3387261909427947069">Fizetési módok</translation> <translation id="3391030046425686457">Szállítási cím</translation> <translation id="3391482648489541560">fájlszerkesztés</translation>
diff --git a/components/strings/components_strings_hy.xtb b/components/strings/components_strings_hy.xtb index 069c98b..68061d1a 100644 --- a/components/strings/components_strings_hy.xtb +++ b/components/strings/components_strings_hy.xtb
@@ -1200,9 +1200,11 @@ <translation id="3927932062596804919">Մերժել</translation> <translation id="393316646445601645">Ինտերնետ և հեռահաղորդակցություն</translation> <translation id="3939773374150895049">Օգտագործե՞լ WebAuthn՝ CVC-ի փոխարեն</translation> +<translation id="3941630233824954464">Միացրեք պարտադիր վերաիսկորոշումը</translation> <translation id="3943857333388298514">Տեղադրել</translation> <translation id="3946209740501886391">Միշտ հարցնել այս կայքում</translation> <translation id="3947595700203588284">Կարող է հայցել MIDI սարքերին միանալու թույլտվություն</translation> +<translation id="3948588869002647271">Այս հավելվածը չկա կամ վնասված է</translation> <translation id="3949571496842715403">Այս սերվերը չկարողացավ ապացուցել, որ այն իրոք ներկայացնում է <ph name="DOMAIN" /> տիրույթը: Դրա անվտանգության վկայագիրը չի ներառում թեմայի այլընտրանքային անուններ։ Պատճառը կարող է լինել ինչպես սերվերի սխալ կազմաձևումը, այնպես էլ ձեր և սերվերի միջև կապուղու վրա հաքերային հարձակումն և գաղտնալսումը:</translation> <translation id="3949601375789751990">Ձեր այցելությունների պատմությունը կցուցադրվի այստեղ</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2204,6 +2206,7 @@ <translation id="6370022303958842211">Սարք մուտք գործելու գործողությունները, օր․՝ մուտքերը (ներառյալ չհաջողված մուտքերի ձախողման պատճառները), ելքերը, կողպումներն ու ապակողպումները</translation> <translation id="6374469231428023295">Փորձել կրկին</translation> <translation id="6374865374745447009">պատուհանների կառավարում</translation> +<translation id="6376881782310775282">Մշակման սերվերն այս հավելվածի համար անհասանելի է։</translation> <translation id="6377268785556383139">«<ph name="SEARCH_TEXT" />»-ի որոնման 1 արդյունք</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">Կարող են վճարներ գանձվել</translation> @@ -3012,6 +3015,7 @@ <translation id="8286799286781881307">Ադմինիստրատորի կողմից հաստատված հավելվածները կարող են տեսագրել ձեր սարքին միացված բոլոր էկրանները։ Այս տեղեկությունները կարող են մշակվել լոկալ եղանակով և վերբեռնվել ձեր կազմակերպության սերվերներ։</translation> <translation id="8288807391153049143">Ցուցադրել հավաստագիրը</translation> <translation id="8289355894181816810">Ճշտեք տեղեկությունները ցանցի ադմինիստրատորի հետ:</translation> +<translation id="8292520987784410870">Մի՞շտ ստուգել</translation> <translation id="8293206222192510085">Էջանիշի հավելում</translation> <translation id="829335040383910391">ձայն</translation> <translation id="8294431847097064396">Աղբյուր</translation> @@ -3111,6 +3115,7 @@ <translation id="854892890027593466">Envelope C6/C5</translation> <translation id="8553387990086529628">Ճամփորդական ուղղություններ</translation> <translation id="8554010658308662631">Բեռնել ավելին</translation> +<translation id="8554802735558319842">Լրացուցիչ անվտանգության համար ընդհանուր սարքերում միացրեք հաստատումը ամեն անգամ, երբ վճարում եք կատարում ինքնալրացման միջոցով։</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{Զրոյացնել թույլտվությունները}one{Զրոյացնել թույլտվությունները}other{Զրոյացնել թույլտվությունները}}</translation> <translation id="8555010941760982128">Օգտագործեք այս կոդը վճարման ժամանակ</translation> <translation id="8557066899867184262">CVC կոդը գրված է քարտի հակառակ կողմում։</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb index 190d649b..5ed5777 100644 --- a/components/strings/components_strings_id.xtb +++ b/components/strings/components_strings_id.xtb
@@ -3298,6 +3298,7 @@ <translation id="9048662076076074925">24 x 36 inci (60 x 91 cm)</translation> <translation id="9049981332609050619">Anda berupaya menjangkau <ph name="DOMAIN" />, tetapi server menyajikan sertifikat yang tidak valid.</translation> <translation id="9050666287014529139">Frasa sandi</translation> +<translation id="9053840549256861041">Kami meluncurkan fitur privasi iklan baru yang disebut pengukuran iklan. Chrome hanya membagikan informasi yang sangat terbatas antar situs, seperti kapan iklan ditampilkan kepada Anda, untuk membantu situs mengukur performa iklan.</translation> <translation id="9056953843249698117">Toko</translation> <translation id="9062620674789239642">File mungkin telah dipindahkan, diedit, atau dihapus.</translation> <translation id="9063398205799684336">Envelope Kaku 2</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb index db66c5f..8d65362 100644 --- a/components/strings/components_strings_it.xtb +++ b/components/strings/components_strings_it.xtb
@@ -1486,7 +1486,7 @@ <translation id="4607603470419975064">Pulsante Leggi i suggerimenti di Chrome, premi Invio per scoprire di più sulle funzionalità di Chrome</translation> <translation id="4607608436550361748">Leggi i suggerimenti di Chrome</translation> <translation id="460848736049414407">Bloccato dall'amministratore</translation> -<translation id="4610279718074907952">Questo sito fa parte di un gruppo definito da <ph name="SET_OWNER" />, che può vedere la tua attività</translation> +<translation id="4610279718074907952">Questo sito fa parte di un gruppo, definito da <ph name="SET_OWNER" />, che può vedere la tua attività</translation> <translation id="4617273035598175554">Software di grafica e animazione</translation> <translation id="4622292761762557753">Trasferisci comunque</translation> <translation id="4627675673814409125">Questo criterio non può essere impostato a livello di profilo Chrome e verrà ignorato.</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb index 09d815c..21275a3 100644 --- a/components/strings/components_strings_iw.xtb +++ b/components/strings/components_strings_iw.xtb
@@ -1198,9 +1198,11 @@ <translation id="3927932062596804919">דחייה</translation> <translation id="393316646445601645">אינטרנט וטלקום</translation> <translation id="3939773374150895049">האם להשתמש ב-WebAuthn במקום ב-CVC?</translation> +<translation id="3941630233824954464">הפעלת הדרישה לאימות מחדש</translation> <translation id="3943857333388298514">הדבקה</translation> <translation id="3946209740501886391">יש לשאול תמיד באתר הזה</translation> <translation id="3947595700203588284">האתר יכול לבקש הרשאה להתחבר אל מכשירי MIDI</translation> +<translation id="3948588869002647271">האפליקציה הזו חסרה או פגומה</translation> <translation id="3949571496842715403">השרת הזה לא הצליח להוכיח שהוא <ph name="DOMAIN" />; אישור האבטחה שלו לא מציין ערכי Subject Alternative Name. ייתכן שהסיבה לכך היא תצורה שגויה או תוקף המיירט את החיבור שלך.</translation> <translation id="3949601375789751990">היסטוריית הגלישה שלך מופיעה כאן</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2205,6 +2207,7 @@ <translation id="6370022303958842211">פעולות של גישה למכשירים כמו התחברות (כולל סיבות לכישלון של ניסיונות התחברות), התנתקות, נעילה וביטול נעילה</translation> <translation id="6374469231428023295">ניסיון נוסף</translation> <translation id="6374865374745447009">ניהול החלונות</translation> +<translation id="6376881782310775282">לא ניתן לגשת לשרת הפיתוח של האפליקציה הזו</translation> <translation id="6377268785556383139">תוצאה אחת בשביל '<ph name="SEARCH_TEXT" />'</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">ייתכנו חיובים באתר.</translation> @@ -3013,6 +3016,7 @@ <translation id="8286799286781881307">אפליקציות שאושרו על ידי האדמין יכולות לצלם ולהקליט את כל המסכים שמחוברים למכשיר שלך. אפשר לעבד את המידע הזה באופן מקומי או להעלות אותו לשרתים של הארגון שלך.</translation> <translation id="8288807391153049143">הצגת אישור</translation> <translation id="8289355894181816810">כדי לברר מה זה אומר, מומלץ לפנות למנהל הרשת.</translation> +<translation id="8292520987784410870">לדרוש אימות תמיד?</translation> <translation id="8293206222192510085">הוספת סימנייה</translation> <translation id="829335040383910391">צליל</translation> <translation id="8294431847097064396">מקור</translation> @@ -3112,6 +3116,7 @@ <translation id="854892890027593466">מעטפה – C6/C5</translation> <translation id="8553387990086529628">יעדים תיירותיים</translation> <translation id="8554010658308662631">טעינת פריטים נוספים</translation> +<translation id="8554802735558319842">כדי להוסיף שכבת אבטחה במכשירים משותפים, ניתן להפעיל דרישה לאימות בכל פעם שמשלמים באמצעות מילוי אוטומטי.</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{איפוס ההרשאה}one{איפוס ההרשאות}two{איפוס ההרשאות}other{איפוס ההרשאות}}</translation> <translation id="8555010941760982128">צריך להזין את הקוד הזה בקופה</translation> <translation id="8557066899867184262">קוד האימות נמצא בגב הכרטיס.</translation> @@ -3300,6 +3305,7 @@ <translation id="9048662076076074925">24x36 אינץ'</translation> <translation id="9049981332609050619">ניסית להגיע ל-<ph name="DOMAIN" />, אך השרת הציג אישור לא חוקי.</translation> <translation id="9050666287014529139">ביטוי סיסמה</translation> +<translation id="9053840549256861041">אנחנו משיקים תכונה חדשה לשמירה על פרטיות בפרסום שנקראת 'מדידת ביצועים של מודעות'. Chrome משתף מידע מוגבל מאוד בין אתרים, למשל מתי הוצגה לך מודעה, כדי לעזור לבעלי האתרים למדוד את הביצועים של המודעות.</translation> <translation id="9056953843249698117">חנות</translation> <translation id="9062620674789239642">ייתכן שהוא הועבר, עבר עריכה או נמחק.</translation> <translation id="9063398205799684336">מעטפה – Kaku 2</translation>
diff --git a/components/strings/components_strings_kk.xtb b/components/strings/components_strings_kk.xtb index a28949e..01b5a50 100644 --- a/components/strings/components_strings_kk.xtb +++ b/components/strings/components_strings_kk.xtb
@@ -3302,6 +3302,7 @@ <translation id="9048662076076074925">24 x 36 дюйм</translation> <translation id="9049981332609050619"><ph name="DOMAIN" /> доменіне қол жеткізуге әрекет еттіңіз, бірақ сервер жарамсыз сертификат ұсынды.</translation> <translation id="9050666287014529139">Құпия фраза</translation> +<translation id="9053840549256861041">Жарнама көрсеткіштерін өлшеу деп аталатын жаңа жарнамадағы құпиялық функциясын іске қосып жатырмыз. Chrome сайттардың жарнамалар өнімділігін өлшеуіне көмектесу үшін сайттар арасында (мысалы, сізге жарнама көрсетілген кезде) өте шектеулі ақпаратты ғана бөліседі.</translation> <translation id="9056953843249698117">Сақтау</translation> <translation id="9062620674789239642">Ол басқа орынға көшірілген, өзгертілген немесе жойылған болуы мүмкін.</translation> <translation id="9063398205799684336">Kaku 2 хатқалтасы</translation>
diff --git a/components/strings/components_strings_km.xtb b/components/strings/components_strings_km.xtb index e6ffc85..141f855e 100644 --- a/components/strings/components_strings_km.xtb +++ b/components/strings/components_strings_km.xtb
@@ -982,6 +982,7 @@ <translation id="3380864720620200369">លេខសម្គាល់អតិថិជន៖</translation> <translation id="3381668585148405088">ផ្ទៀងផ្ទាត់ការទិញរបស់អ្នក</translation> <translation id="3383566085871012386">លំដាប់អាទិភាពបច្ចុប្បន្ន</translation> +<translation id="3384522979010096022">ស្ថាប័នរបស់អ្នកមិនអនុញ្ញាតឱ្យអ្នកមើលគេហទំព័រនេះទេ</translation> <translation id="3387261909427947069">វិធីបង់ប្រាក់</translation> <translation id="3391030046425686457">អាសយដ្ឋានបញ្ជូន</translation> <translation id="3391482648489541560">ការកែឯកសារ</translation>
diff --git a/components/strings/components_strings_ky.xtb b/components/strings/components_strings_ky.xtb index 45c054f..66d0ba6 100644 --- a/components/strings/components_strings_ky.xtb +++ b/components/strings/components_strings_ky.xtb
@@ -1199,9 +1199,11 @@ <translation id="3927932062596804919">Четке кагуу</translation> <translation id="393316646445601645">Интернет жана телекоммуникация</translation> <translation id="3939773374150895049">CVC'нин ордуна WebAuthn колдонулсунбу?</translation> +<translation id="3941630233824954464">Милдеттүү түрдө кайра аныктыгын текшерүүнү иштетүү</translation> <translation id="3943857333388298514">Чаптоо</translation> <translation id="3946209740501886391">Бул сайтта ар дайым суралсын</translation> <translation id="3947595700203588284">MIDI түзмөктөрүнө туташууга уруксат сурай алат</translation> +<translation id="3948588869002647271">Бул колдонмо жок же бузулган</translation> <translation id="3949571496842715403">Бул сервер <ph name="DOMAIN" /> домени экендигин далилдей алган жок. Анын коопсуздук тастыктамасында альтернативдүү аталыштар көрсөтүлгөн эмес. Сервер туура эмес жөндөлгөн окшойт же кимдир-бирөө маалыматыңызды ортодон кармап калганга аракет кылып жатат.</translation> <translation id="3949601375789751990">Серептөө таржымалыңыз бул жерде көрүнөт</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2202,6 +2204,7 @@ <translation id="6370022303958842211">Түзмөктү колдонуу аракеттери, мисалы, ага кирүү (анын ичинде кире албай калуунун себептери), чыгуу, кулпулоо жана кулпусун ачуу</translation> <translation id="6374469231428023295">Кайталап көрүңүз</translation> <translation id="6374865374745447009">терезени тескөө</translation> +<translation id="6376881782310775282">Бул колдонмо үчүн иштеп чыгуу сервери жеткиликсиз</translation> <translation id="6377268785556383139">"<ph name="SEARCH_TEXT" />" сурамы боюнча 1 жыйынтык табылды</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">Акы алынышы мүмкүн.</translation> @@ -3010,6 +3013,7 @@ <translation id="8286799286781881307">Администраторуңуз уруксат берген колдонмолор түзмөгүңүзгө тиркелген бардык экрандарды сүрөткө тарта алат. Бул маалымат түзмөктө иштетилип же уюмдун серверлерине жүктөлүшү мүмкүн.</translation> <translation id="8288807391153049143">Тастыктаманы көрсөтүү</translation> <translation id="8289355894181816810">Бул эмне экендигин так билбесеңиз, тармак администраторуңузга кайрылыңыз.</translation> +<translation id="8292520987784410870">Ар дайым текшерилсинби?</translation> <translation id="8293206222192510085">Кыстарма кошуу</translation> <translation id="829335040383910391">добуш</translation> <translation id="8294431847097064396">Булак</translation> @@ -3109,6 +3113,7 @@ <translation id="854892890027593466">Конверт C6/C5</translation> <translation id="8553387990086529628">Туристтик жерлер</translation> <translation id="8554010658308662631">Дагы жүктөө</translation> +<translation id="8554802735558319842">Жалпы түзмөктөрдө коопсуздукту бекемдөө үчүн автотолтуруу функциясы менен төлөгөн сайын текшерүүнү күйгүзүңүз.</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{Уруксатты баштапкы абалга келтирүү}other{Уруксаттарды баштапкы абалга келтирүү}}</translation> <translation id="8555010941760982128">Бул кодду сатып алган нерселериңиздин акысын төлөп жатканда колдонуңуз</translation> <translation id="8557066899867184262">CVC карточкаңыздын артында жайгашкан.</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb index a798482..918a58d5 100644 --- a/components/strings/components_strings_lv.xtb +++ b/components/strings/components_strings_lv.xtb
@@ -3303,6 +3303,7 @@ <translation id="9048662076076074925">24 x 36 collas</translation> <translation id="9049981332609050619">Jūs centāties piekļūt <ph name="DOMAIN" />, bet serveris piedāvāja nederīgu sertifikātu.</translation> <translation id="9050666287014529139">Ieejas frāze</translation> +<translation id="9053840549256861041">Tiek izlaista jauna reklāmu konfidencialitātes funkcija, ko dēvē par reklāmu novērtēšanu. Lai palīdzētu vietnēs novērtēt reklāmu veiktspēju, Chrome starp dažādām vietnēm kopīgo tikai ļoti ierobežotu informāciju, piemēram, par laiku, kad jums tika parādīta noteikta reklāma.</translation> <translation id="9056953843249698117">Veikals</translation> <translation id="9062620674789239642">Iespējams, tas ir pārvietots, rediģēts vai izdzēsts.</translation> <translation id="9063398205799684336">Aploksne Kaku 2</translation>
diff --git a/components/strings/components_strings_mk.xtb b/components/strings/components_strings_mk.xtb index 91daeac..815a4dd 100644 --- a/components/strings/components_strings_mk.xtb +++ b/components/strings/components_strings_mk.xtb
@@ -1200,9 +1200,11 @@ <translation id="3927932062596804919">Одбиј</translation> <translation id="393316646445601645">Интернет и телекомуникации</translation> <translation id="3939773374150895049">Да се користи WebAuthn наместо CVC?</translation> +<translation id="3941630233824954464">Овозможете задолжителна повторна автентикација</translation> <translation id="3943857333388298514">Залепи</translation> <translation id="3946209740501886391">Прашувај секогаш на овој сајт</translation> <translation id="3947595700203588284">Може да прашува за да се поврзува со MIDI-уреди</translation> +<translation id="3948588869002647271">Апликацијава недостасува или е оштетена</translation> <translation id="3949571496842715403">Серверот не може да докаже дека е <ph name="DOMAIN" />; неговиот безбедносен сертификат не наведува алтернативни имиња на предметот. Тоа може да се должи на погрешна конфигурација или на напаѓач што го пресретнува поврзувањето.</translation> <translation id="3949601375789751990">Историјата на прелистување се појавува тука</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2203,6 +2205,7 @@ <translation id="6370022303958842211">Дејства за пристап до уредот како најавувања (вклучително со причините за неуспешни најавувања), одјавувања, заклучувања и отклучувања</translation> <translation id="6374469231428023295">Обидете се повторно</translation> <translation id="6374865374745447009">управување со прозорци</translation> +<translation id="6376881782310775282">Не може да се поврзе со серверот за програмери за апликацијава</translation> <translation id="6377268785556383139">1 резултат за „<ph name="SEARCH_TEXT" />“</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">Ако продолжите, може да произлезат трошоци.</translation> @@ -3011,6 +3014,7 @@ <translation id="8286799286781881307">Апликации овластени од администраторот може да ги снимаат сите екрани приложени на вашиот уред. Информацииве може да се обработат локално или да се прикачат на серверите на вашата организација.</translation> <translation id="8288807391153049143">Прикажи сертификат</translation> <translation id="8289355894181816810">Контактирајте со мрежниот администратор ако не сте сигурни што значи ова.</translation> +<translation id="8292520987784410870">Да се потврдува секогаш?</translation> <translation id="8293206222192510085">Додај обележувач</translation> <translation id="829335040383910391">звук</translation> <translation id="8294431847097064396">Извор</translation> @@ -3110,6 +3114,7 @@ <translation id="854892890027593466">Плик C6/C5</translation> <translation id="8553387990086529628">Туристички дестинации</translation> <translation id="8554010658308662631">Вчитај повеќе</translation> +<translation id="8554802735558319842">За дополнителна безбедност на споделените уреди, вклучете ја потврдата секогаш кога плаќате со автоматско пополнување.</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{Ресетирај ја дозволата}one{Ресетирај ги дозволите}other{Ресетирај ги дозволите}}</translation> <translation id="8555010941760982128">Користете го кодов при наплатата</translation> <translation id="8557066899867184262">CVC-бројот се наоѓа на задната страна на картичката.</translation> @@ -3298,6 +3303,7 @@ <translation id="9048662076076074925">24 x 36 инчи</translation> <translation id="9049981332609050619">Се обидовте да го добиете <ph name="DOMAIN" />, но серверот даде неважечки сертификат.</translation> <translation id="9050666287014529139">Пристапна фраза</translation> +<translation id="9053840549256861041">Воведуваме нова функција за приватност за реклами наречена „Мерење реклами“. Chrome споделува само многу ограничени податоци меѓу сајтовите, на пр., кога ви била прикажана дадена реклама, со цел да им помогне на сајтовите да ја мерат изведбата на рекламите.</translation> <translation id="9056953843249698117">Продавница</translation> <translation id="9062620674789239642">Можеби е преместена, изменета или избришана.</translation> <translation id="9063398205799684336">Плик Kaku 2</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb index 7e4e3d8..cefaf7c 100644 --- a/components/strings/components_strings_ml.xtb +++ b/components/strings/components_strings_ml.xtb
@@ -1199,9 +1199,11 @@ <translation id="3927932062596804919">നിരസിക്കൂ</translation> <translation id="393316646445601645">ഇന്റർനെറ്റും ടെലികോമും</translation> <translation id="3939773374150895049">CVC-യ്ക്ക് പകരം WebAuthn ഉപയോഗിക്കണോ?</translation> +<translation id="3941630233824954464">നിർബന്ധിതമായുള്ള വീണ്ടും പരിശോധിച്ചുറപ്പിക്കൽ പ്രവർത്തനക്ഷമമാക്കുക</translation> <translation id="3943857333388298514">ഒട്ടിക്കുക</translation> <translation id="3946209740501886391">ഈ സൈറ്റിൽ എല്ലായ്പ്പോഴും ചോദിക്കുക</translation> <translation id="3947595700203588284">MIDI ഉപകരണങ്ങളിലേക്ക് കണക്റ്റ് ചെയ്യാൻ ആവശ്യപ്പെടാം</translation> +<translation id="3948588869002647271">ഈ ആപ്പ് കാണുന്നില്ല അല്ലെങ്കിൽ തകരാറുണ്ട്</translation> <translation id="3949571496842715403">ഈ സെർവറിന് ഇത് <ph name="DOMAIN" /> ആണെന്ന് തെളിയിക്കാനായില്ല; അതിന്റെ സുരക്ഷാ സർട്ടിഫിക്കറ്റ് വിഷയേതര നാമങ്ങൾ വ്യക്തമാക്കുന്നില്ല. തെറ്റായ കോൺഫിഗറേഷൻ കാരണമോ ഒരു അക്രമി നിങ്ങളുടെ കണക്ഷനെ തടസ്സപ്പെടുത്തുന്നത് കൊണ്ടോ ആയിരിക്കാം ഇത് സംഭവിച്ചത്.</translation> <translation id="3949601375789751990">നിങ്ങളുടെ ബ്രൗസിംഗ് ചരിത്രം ഇവിടെ ദൃശ്യമാകും</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2202,6 +2204,7 @@ <translation id="6370022303958842211">ലോഗിനുകൾ, (പരാജയപ്പെട്ട ലോഗിനുകളുടെ കാരണങ്ങൾ ഉൾപ്പെടെ) ലോഗൗട്ടുകൾ, ലോക്കുകൾ, അൺലോക്കുകൾ പോലുള്ള ഉപകരണ ആക്സസ് പ്രവർത്തനങ്ങൾ</translation> <translation id="6374469231428023295">വീണ്ടും ശ്രമിക്കുക</translation> <translation id="6374865374745447009">വിൻഡോ മാനേജ് ചെയ്യൽ</translation> +<translation id="6376881782310775282">ഈ ആപ്പിന്റെ ഡെവലപ്മെന്റ് സെർവറിലേക്ക് എത്താനാകുന്നില്ല</translation> <translation id="6377268785556383139">'<ph name="SEARCH_TEXT" />' എന്നതിനായി ഒരു ഫലം</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">ഭാവിയില് നിരക്കുകള് ഈടാക്കാനിടയുണ്ട്.</translation> @@ -3008,6 +3011,7 @@ <translation id="8286799286781881307">നിങ്ങളുടെ അഡ്മിൻ അംഗീകരിച്ച ആപ്പുകൾക്ക് നിങ്ങളുടെ ഉപകരണത്തിൽ അറ്റാച്ച് ചെയ്തിരിക്കുന്ന എല്ലാ സ്ക്രീനുകളും ക്യാപ്ചർ ചെയ്യാനാകും. ഈ വിവരങ്ങൾ ലോക്കലായി പ്രോസസ് ചെയ്യാം അല്ലെങ്കിൽ നിങ്ങളുടെ ഓർഗനൈസേഷന്റെ സെർവറുകളിലേക്ക് അപ്ലോഡ് ചെയ്യാം.</translation> <translation id="8288807391153049143">സർട്ടിഫിക്കറ്റ് കാണിക്കുക</translation> <translation id="8289355894181816810">ഇത് അർത്ഥമാക്കുന്നത് എന്താണെന്ന് നിങ്ങൾക്ക് ഉറപ്പില്ലെങ്കിൽ നെറ്റ്വർക്ക് അഡ്മിനെ ബന്ധപ്പെടുക.</translation> +<translation id="8292520987784410870">എല്ലായ്പ്പോഴും പരിശോധിച്ചുറപ്പിക്കണോ?</translation> <translation id="8293206222192510085">ബുക്ക്മാര്ക്ക് ചേര്ക്കുക</translation> <translation id="829335040383910391">ശബ്ദം</translation> <translation id="8294431847097064396">ഉറവിടം</translation> @@ -3107,6 +3111,7 @@ <translation id="854892890027593466">Envelope C6/C5</translation> <translation id="8553387990086529628">വിനോദസഞ്ചാര കേന്ദ്രങ്ങൾ</translation> <translation id="8554010658308662631">കൂടുതൽ ലോഡ് ചെയ്യുക</translation> +<translation id="8554802735558319842">പങ്കിട്ട ഉപകരണങ്ങളിൽ അധിക സുരക്ഷയ്ക്കായി, സ്വയമേവ പൂരിപ്പിക്കൽ ഉപയോഗിച്ച് പണമടയ്ക്കുമ്പോഴെല്ലാം പരിശോധിച്ചുറപ്പിക്കൽ ഓണാക്കുക.</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{അനുമതി റീസെറ്റ് ചെയ്യുക}other{അനുമതികൾ റീസെറ്റ് ചെയ്യുക}}</translation> <translation id="8555010941760982128">ചെക്കൗട്ട് ചെയ്യുമ്പോൾ ഈ കോഡ് ഉപയോഗിക്കുക</translation> <translation id="8557066899867184262">കാർഡിന് പിന്നിലാണ് CVC രേഖപ്പെടുത്തിയിരിക്കുന്നത്.</translation> @@ -3295,6 +3300,7 @@ <translation id="9048662076076074925">24 x 36 ഇഞ്ച്</translation> <translation id="9049981332609050619">നിങ്ങള് <ph name="DOMAIN" /> എന്നതില് എത്താന് ശ്രമിച്ചു, പക്ഷേ സെര്വര് ഒരു അസാധുവായ സര്ട്ടിഫിക്കറ്റ് അവതരിപ്പിച്ചു.</translation> <translation id="9050666287014529139">പാസ്ഫ്രെയ്സ്</translation> +<translation id="9053840549256861041">പരസ്യ മെഷർമെന്റ് എന്ന പരസ്യ സ്വകാര്യതയുമായി ബന്ധപ്പെട്ട പുതിയ ഫീച്ചർ ഞങ്ങൾ ലോഞ്ച് ചെയ്യുന്നു. പരസ്യങ്ങളുടെ പ്രകടനം അളക്കാൻ സൈറ്റുകളെ സഹായിക്കുന്നതിന്, എപ്പോഴാണ് പരസ്യം നിങ്ങളെ കാണിച്ചത് എന്നത് പോലുള്ള, വളരെ പരിമിതമായ വിവരങ്ങൾ മാത്രമേ Chrome സൈറ്റുകൾക്കിടയിൽ പങ്കിടുന്നുള്ളൂ.</translation> <translation id="9056953843249698117">Store</translation> <translation id="9062620674789239642">ഇത് നീക്കുകയോ എഡിറ്റ് ചെയ്യുകയോ ഇല്ലാതാക്കുകയോ ചെയ്തിരിക്കാം.</translation> <translation id="9063398205799684336">Envelope Kaku 2</translation>
diff --git a/components/strings/components_strings_mn.xtb b/components/strings/components_strings_mn.xtb index 62d50dd..11638bb 100644 --- a/components/strings/components_strings_mn.xtb +++ b/components/strings/components_strings_mn.xtb
@@ -1201,9 +1201,11 @@ <translation id="3927932062596804919">Татгалзах</translation> <translation id="393316646445601645">Интернэт, телеком</translation> <translation id="3939773374150895049">Карт баталгаажуулалтын кодын оронд WebAuthn-г ашиглах уу?</translation> +<translation id="3941630233824954464">Зайлшгүй дахин баталгаажуулахыг идэвхжүүлэх</translation> <translation id="3943857333388298514">Хуулан буулгах</translation> <translation id="3946209740501886391">Энэ сайтаас үргэлж асуух</translation> <translation id="3947595700203588284">MIDI төхөөрөмжүүдэд холбогдохыг хүсэх боломжтой</translation> +<translation id="3948588869002647271">Энэ аппликэйшн байхгүй эсвэл гэмтэлтэй байна</translation> <translation id="3949571496842715403">Энэ серверийн аюулгүй байдлын сертификат Субъектийн Хувилбар Нэрийг тодорхойлдоггүй тул энэ нь <ph name="DOMAIN" /> болохоо баталж чадсангүй. Энэ нь тохиргоо буруу хийгдсэнээс эсвэл халдагч таны холболтод саад учруулснаас шалтгаалж болно.</translation> <translation id="3949601375789751990">Таны хайлтын түүх энд харагдана</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2203,6 +2205,7 @@ <translation id="6370022303958842211">Нэвтрэлт (амжилтгүй болсон нэвтрэлтийн шалтгааныг оруулаад), гаралт, түгжээ болон түгжээг тайлах зэрэг төхөөрөмжийн хандалтын үйлдлүүд</translation> <translation id="6374469231428023295">Дахин оролдоно уу</translation> <translation id="6374865374745447009">цонхны менежмент</translation> +<translation id="6376881782310775282">Энэ аппликэйшний хөгжүүлэлтийн сервер холбогдох боломжгүй байна</translation> <translation id="6377268785556383139">'<ph name="SEARCH_TEXT" />'-н 1 илэрц</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">Төлбөр гарч болзошгүй.</translation> @@ -3011,6 +3014,7 @@ <translation id="8286799286781881307">Таны администраторын зөвшөөрсөн аппликэйшнүүд төхөөрөмжид тань залгасан бүх дэлгэцийн зургийг авах боломжтой. Энэ мэдээллийг дотоодод боловсруулах эсвэл танай байгууллагын серверүүдэд байршуулах боломжтой.</translation> <translation id="8288807391153049143">Гэрчилгээг харуулах</translation> <translation id="8289355894181816810">Хэрэв та үүнийг юу гэсэн үг болохыг сайн мэдэхгүй байгаа бол сүлжээнийхээ админтай холбоо барина уу.</translation> +<translation id="8292520987784410870">Үргэлж баталгаажуулах уу?</translation> <translation id="8293206222192510085">Хадгалагдсан хуудас нэмэх</translation> <translation id="829335040383910391">дуу чимээ</translation> <translation id="8294431847097064396">Эх сурвалж</translation> @@ -3110,6 +3114,7 @@ <translation id="854892890027593466">Дугтуй C6/C5</translation> <translation id="8553387990086529628">Жуулчдын очих газар</translation> <translation id="8554010658308662631">Илүү ихийг ачаалах</translation> +<translation id="8554802735558319842">Дундын төхөөрөмжүүдийн нэмэлт аюулгүй байдлын үүднээс та автоматаар бөглөх хэсгийг ашиглан төлөх бүрдээ баталгаажуулахыг асаана уу.</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{Зөвшөөрлийг шинэчлэх}other{Зөвшөөрлүүдийг шинэчлэх}}</translation> <translation id="8555010941760982128">Тооцоо хийхдээ энэ кодыг ашиглаарай</translation> <translation id="8557066899867184262">Карт баталгаажуулалтын код таны картын ард байрладаг.</translation> @@ -3298,6 +3303,7 @@ <translation id="9048662076076074925">24 x 36 инч</translation> <translation id="9049981332609050619">Та <ph name="DOMAIN" /> рүү хүрэхийг оролдсон хэдий ч серверээс хүчингүй гэрчилгээ өгсөн байна.</translation> <translation id="9050666287014529139">Нэвтрэх хэллэг</translation> +<translation id="9053840549256861041">Бид зарын хэмжилт нэртэй зарын нууцлалын шинэ онцлогийг эхлүүлж байна. Chrome сайтуудад зарын гүйцэтгэлийг хэмжихэд туслахын тулд зарыг танд хэзээ харуулсан зэрэг зөвхөн маш хязгаарлагдмал мэдээллийг сайтуудын хооронд хуваалцана.</translation> <translation id="9056953843249698117">Дэлгүүр</translation> <translation id="9062620674789239642">Үүнийг зөөсөн, зассан эсвэл устгасан байж болзошгүй.</translation> <translation id="9063398205799684336">Каку дугтуй 2</translation>
diff --git a/components/strings/components_strings_my.xtb b/components/strings/components_strings_my.xtb index 25e56d39..7f7de97 100644 --- a/components/strings/components_strings_my.xtb +++ b/components/strings/components_strings_my.xtb
@@ -3305,6 +3305,7 @@ <translation id="9048662076076074925">၂၄ x ၃၆ လက်မ</translation> <translation id="9049981332609050619">သင်သည် <ph name="DOMAIN" />ကို လက်လှမ်းမှီရန် ကြိုးစားခဲ့သည်၊ သို့သော် ဆာဗာက မမှန်သည့် လက်မှတ်ကို တင်ပြခဲ့သည်။</translation> <translation id="9050666287014529139">စကားစုဝှက်</translation> +<translation id="9053840549256861041">ကြော်ငြာတိုင်းတာခြင်းဟု ခေါ်သည့် ကြော်ငြာဆိုင်ရာ အချက်အလက်လုံခြုံမှု အင်္ဂါရပ်အသစ်ကို စတင်နေပါသည်။ ကြော်ငြာစွမ်းဆောင်ရည် တိုင်းတာရာတွင် ကူညီရန် သင့်ထံ ကြော်ငြာပြသောအခါကဲ့သို့ ဝဘ်ဆိုက်များအကြားရှိ အချက်အလက်အနည်းငယ်မျှကိုသာ Chrome က မျှဝေသည်။</translation> <translation id="9056953843249698117">စတိုး</translation> <translation id="9062620674789239642">၎င်းကို ဖယ်ရှား၊ ပြင်ဆင် သို့မဟုတ် ဖျက်ပစ် လိုက်ခြင်းဖြစ်နိုင်ပါသည်။</translation> <translation id="9063398205799684336">Kaku 2 စာအိတ်</translation>
diff --git a/components/strings/components_strings_ne.xtb b/components/strings/components_strings_ne.xtb index 0acfaae3..ee0f8e1 100644 --- a/components/strings/components_strings_ne.xtb +++ b/components/strings/components_strings_ne.xtb
@@ -1197,9 +1197,11 @@ <translation id="3927932062596804919">अस्वीकार गर्नुहोस्</translation> <translation id="393316646445601645">इन्टरनेट तथा टेलिकम</translation> <translation id="3939773374150895049">CVC को सट्टामा WebAuthn प्रयोग गर्ने हो?</translation> +<translation id="3941630233824954464">अनिवार्य रूपमा पुनः प्रमाणीकरण गर्नु पर्ने सुविधा अन गर्नुहोस्</translation> <translation id="3943857333388298514">टाँस्नुहोस्</translation> <translation id="3946209740501886391">यस साइटमा सधैं सोध्नुहोस्</translation> <translation id="3947595700203588284">MIDI डिभाइसहरूमा कनेक्ट हुने अनुमति माग्न सक्छ</translation> +<translation id="3948588869002647271">यो एप उपलब्ध छैन वा बिग्रेको छ</translation> <translation id="3949571496842715403">यस सर्भरले यो <ph name="DOMAIN" /> हो भन्ने प्रमाणित गर्न सकेन; यसको सुरक्षा प्रमाणपत्रले Subject Alternative Names को उल्लेख गर्दैन। यो कुनै त्रुटिपूर्ण कन्फिगुरेसन वा कुनै आक्रमणकारीले तपाईंको जडानलाई अवरोध गरेकोले हुनसक्छ।</translation> <translation id="3949601375789751990">तपाईंको ब्राउजिङ इतिहास यहाँ देखिन्छ</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2200,6 +2202,7 @@ <translation id="6370022303958842211">लग इन (यसअन्तर्गत लग इन नहुनुको कारण पनि समावेश हुन्छ), लग आउट, लक तथा अनलकलगायतका डिभाइस एक्सेससम्बन्धी कार्यहरू</translation> <translation id="6374469231428023295">फेरि प्रयास गर्नुहोस्</translation> <translation id="6374865374745447009">विन्डो व्यवस्थापन</translation> +<translation id="6376881782310775282">यो एप विकास गर्न प्रयोग गरिने सर्भरमा कनेक्ट गर्न सकिएन</translation> <translation id="6377268785556383139">'<ph name="SEARCH_TEXT" />' को १ परिणाम</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">यो साइटले तपाईंलाई झुक्याएर शुल्कहरू लिन सक्छ।</translation> @@ -3008,6 +3011,7 @@ <translation id="8286799286781881307">तपाईंका एड्मिनले अनुमति दिएका एपहरूले तपाईंको डिभाइसमा एट्याच भएका सबै स्क्रिनहरू क्याप्चर गर्न सक्छ। यो जानकारी डिभाइसभित्रै प्रोसेस गर्न वा तपाईंको सङ्गठनका सर्भरहरूमा अपलोड गर्न सकिन्छ।</translation> <translation id="8288807391153049143">प्रमाणपत्र देखाउनुहोस्</translation> <translation id="8289355894181816810">यसको अर्थ के हो भनेर निश्चित हुन नसकेमा तपाईंको नेटवर्क प्रशासकलाई सम्पर्क गर्नुहोस् ।</translation> +<translation id="8292520987784410870">सधैँ पुष्टि गर्ने हो?</translation> <translation id="8293206222192510085">बुकमार्क थप्नुहोस्</translation> <translation id="829335040383910391">ध्वनि</translation> <translation id="8294431847097064396">स्रोत</translation> @@ -3107,6 +3111,7 @@ <translation id="854892890027593466">Envelope C6/C5</translation> <translation id="8553387990086529628">पर्यटकीय गन्तव्यहरू</translation> <translation id="8554010658308662631">थप लोड गर्नुहोस्</translation> +<translation id="8554802735558319842">साझा डिभाइसहरूमा सुरक्षाको अतिरिक्त तह थप्न तपाईंले हरेक पटक अटोफिल सुविधा प्रयोग गरी भुक्तानी गर्दा पुष्टि गर्नु पर्ने बनाउनुहोस्।</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{अनुमति रिसेट गर्नुहोस्}other{अनुमति रिसेट गर्नुहोस्}}</translation> <translation id="8555010941760982128">चेक आउट गर्दा यो कोड प्रयोग गर्नुहोस्</translation> <translation id="8557066899867184262">उक्त CVC तपाईंको कार्डको पछाडितिर छ।</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb index efd2c9a..f9f323ff 100644 --- a/components/strings/components_strings_nl.xtb +++ b/components/strings/components_strings_nl.xtb
@@ -1195,9 +1195,11 @@ <translation id="3927932062596804919">Weigeren</translation> <translation id="393316646445601645">Internet en telecom</translation> <translation id="3939773374150895049">WebAuthn gebruiken in plaats van CVC?</translation> +<translation id="3941630233824954464">Verplicht opnieuw verifiëren aanzetten</translation> <translation id="3943857333388298514">Plak</translation> <translation id="3946209740501886391">Altijd vragen op deze site</translation> <translation id="3947595700203588284">Kan vragen of deze site verbinding mag maken met MIDI-apparaten</translation> +<translation id="3948588869002647271">Deze app ontbreekt of is beschadigd</translation> <translation id="3949571496842715403">Deze server kan niet bewijzen dat dit <ph name="DOMAIN" /> is. In het bijbehorende beveiligingscertificaat worden geen 'Subject Alternative Names' gespecificeerd. Dit kan worden veroorzaakt door een verkeerde configuratie of door een aanvaller die je verbinding heeft onderschept.</translation> <translation id="3949601375789751990">Je browsegeschiedenis zie je hier</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2197,6 +2199,7 @@ <translation id="6370022303958842211">Acties voor apparaattoegang, zoals inloggen (waaronder redenen voor mislukte logins), uitloggen, vergrendelen en ontgrendelen</translation> <translation id="6374469231428023295">Opnieuw proberen</translation> <translation id="6374865374745447009">vensterbeheer</translation> +<translation id="6376881782310775282">De ontwikkelserver voor deze app kan niet worden bereikt</translation> <translation id="6377268785556383139">Eén resultaat voor '<ph name="SEARCH_TEXT" />'</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">Er worden later mogelijk kosten in rekening gebracht.</translation> @@ -3005,6 +3008,7 @@ <translation id="8286799286781881307">Apps die zijn geautoriseerd door je beheerder kunnen alle schermen vastleggen die zijn verbonden met je apparaat. Deze informatie kan lokaal worden verwerkt of geüpload naar de servers van je organisatie.</translation> <translation id="8288807391153049143">Certificaat bekijken</translation> <translation id="8289355894181816810">Neem contact op met je netwerkbeheerder als je niet zeker weet wat dit betekent.</translation> +<translation id="8292520987784410870">Altijd verifiëren?</translation> <translation id="8293206222192510085">Bookmark toevoegen</translation> <translation id="829335040383910391">geluid</translation> <translation id="8294431847097064396">Bron</translation> @@ -3104,6 +3108,7 @@ <translation id="854892890027593466">Envelop C6/C5</translation> <translation id="8553387990086529628">Toeristische bestemmingen</translation> <translation id="8554010658308662631">Meer laden</translation> +<translation id="8554802735558319842">Zet voor extra beveiliging op gedeelde apparaten verificatie aan elke keer dat je betaalt met automatisch invullen.</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{Recht resetten}other{Rechten resetten}}</translation> <translation id="8555010941760982128">Gebruik deze code bij het betalen</translation> <translation id="8557066899867184262">De CVC-code staat op de achterkant van je pas.</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb index 79c163a..510df8c 100644 --- a/components/strings/components_strings_no.xtb +++ b/components/strings/components_strings_no.xtb
@@ -979,6 +979,7 @@ <translation id="3380864720620200369">Klient-ID:</translation> <translation id="3381668585148405088">Bekreft kjøpet</translation> <translation id="3383566085871012386">Gjeldende forrangrekkefølge</translation> +<translation id="3384522979010096022">Organisasjonen din tillater deg ikke å se dette nettstedet</translation> <translation id="3387261909427947069">Betalingsmåter</translation> <translation id="3391030046425686457">Leveringsadresse</translation> <translation id="3391482648489541560">filredigering</translation>
diff --git a/components/strings/components_strings_or.xtb b/components/strings/components_strings_or.xtb index 5536d2b..18931a7 100644 --- a/components/strings/components_strings_or.xtb +++ b/components/strings/components_strings_or.xtb
@@ -1197,9 +1197,11 @@ <translation id="3927932062596804919">ଅସ୍ଵୀକାର</translation> <translation id="393316646445601645">ଇଣ୍ଟରନେଟ ଏବଂ ଟେଲିକମ</translation> <translation id="3939773374150895049">CVC ପରିବର୍ତ୍ତେ WebAuthn ବ୍ୟବହାର କରିବେ?</translation> +<translation id="3941630233824954464">ବାଧ୍ୟତାମୂଳକ ପୁଣି-ପ୍ରମାଣୀକରଣକୁ ସକ୍ଷମ କରନ୍ତୁ</translation> <translation id="3943857333388298514">ପେଷ୍ଟ କରନ୍ତୁ</translation> <translation id="3946209740501886391">ସର୍ବଦା ଏହି ସାଇଟ୍ରେ ପଚାରନ୍ତୁ</translation> <translation id="3947595700203588284">MIDI ଡିଭାଇସଗୁଡ଼ିକ ସହ ସଂଯୋଗ କରିବାକୁ ସାଇଟ୍ ପଚାରିପାରେ</translation> +<translation id="3948588869002647271">ଏହି ଆପ୍ଲିକେସନ ଉପଲବ୍ଧ ନାହିଁ କିମ୍ବା ନଷ୍ଟ ହୋଇଯାଇଛି</translation> <translation id="3949571496842715403">ଏହା ଏକ <ph name="DOMAIN" /> ବୋଲି ଏହି ସର୍ଭର୍ ପ୍ରମାଣ କରିପାରିଲା ନାହିଁ; ଏହାର ସୁରକ୍ଷା ସାର୍ଟିଫିକେଟ୍ ବିଷୟର ବିକଳ୍ପ ନାମକୁ ନିର୍ଦ୍ଧିଷ୍ଟ କରେନାହିଁ। ଏହା ଏକ ଭୁଲ୍ କନଫିଗ୍ରେସନ୍ କିମ୍ବା ଜଣେ ଆକ୍ରମଣକାରୀଙ୍କ ଦ୍ୱାରା ଆପଣଙ୍କର ସଂଯୋଗକୁ ପ୍ରତିରୋଧ କରୁଥିବା କାରଣରୁ ହୋଇପାରେ।</translation> <translation id="3949601375789751990">ଆପଣଙ୍କର ବ୍ରାଉଜିଂ ଇତିବୃତ୍ତି ଏଠାରେ ଦେଖାଦିଏ</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2200,6 +2202,7 @@ <translation id="6370022303958842211">ଲଗଇନ (ବିଫଳ ଲଗଇନର କାରଣଗୁଡ଼ିକ ସମେତ), ଲଗଆଉଟ, ଲକ ଓ ଅନଲକ ପରି ଡିଭାଇସ ଆକ୍ସେସ ଆକ୍ସନଗୁଡ଼ିକ</translation> <translation id="6374469231428023295">ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ</translation> <translation id="6374865374745447009">ୱିଣ୍ଡୋ ପରିଚାଳନା</translation> +<translation id="6376881782310775282">ଏହି ଆପ୍ଲିକେସନ ପାଇଁ ଡେଭେଲପମେଣ୍ଟ ସର୍ଭର ସହ କଣ୍ଟାକ୍ଟ କରାଯାଇପାରିବ ନାହିଁ</translation> <translation id="6377268785556383139">'<ph name="SEARCH_TEXT" />' ପାଇଁ 1ଟି ଫଳାଫଳ</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">ଆଗକୁ ସମ୍ଭବତଃ ଶୁଳ୍କ ଦେବାକୁ ପଡ଼ିପାରେ।</translation> @@ -3008,6 +3011,7 @@ <translation id="8286799286781881307">ଆପଣଙ୍କ ଆଡମିନିଷ୍ଟ୍ରେଟରଙ୍କ ଦ୍ୱାରା ଅନୁମତି ଦିଆଯାଇଥିବା ଆପ୍ଲିକେସନଗୁଡ଼ିକ, ଆପଣଙ୍କ ଡିଭାଇସ ସହ ଆଟାଚ ହୋଇଥିବା ସମସ୍ତ ସ୍କ୍ରିନକୁ କେପଚର କରିପାରିବ। ଏହି ସୂଚନାକୁ ସ୍ଥାନୀୟ ଭାବେ ପ୍ରକ୍ରିୟାନ୍ୱିତ କରାଯାଇପାରିବ କିମ୍ବା ଆପଣଙ୍କ ସଂସ୍ଥାର ସର୍ଭରଗୁଡ଼ିକରେ ଅପଲୋଡ କରାଯାଇପାରିବ।</translation> <translation id="8288807391153049143">ସାର୍ଟିଫିକେଟ୍ ଦେଖାନ୍ତୁ</translation> <translation id="8289355894181816810">ଯଦି ଆପଣ ସୁନିଶ୍ଚିତ ନୁହନ୍ତି ଯେ ଏହାର ଅର୍ଥ କ'ଣ, ତେବେ ଆପଣଙ୍କର ନେଟ୍ୱାର୍କ ଆଡ୍ମିନିଷ୍ଟ୍ରେଟର୍ଙ୍କ ସହିତ ଯୋଗାଯୋଗ କରନ୍ତୁ।</translation> +<translation id="8292520987784410870">ସର୍ବଦା ଯାଞ୍ଚ କରିବେ?</translation> <translation id="8293206222192510085">ବୁକ୍ମାର୍କ ଯୋଗ କରନ୍ତୁ</translation> <translation id="829335040383910391">ସାଉଣ୍ଡ</translation> <translation id="8294431847097064396">ଉତ୍ସ</translation> @@ -3107,6 +3111,7 @@ <translation id="854892890027593466">ଏନଭେଲପ C6/C5</translation> <translation id="8553387990086529628">ପର୍ଯ୍ୟଟନ ସ୍ଥଳଗୁଡ଼ିକ</translation> <translation id="8554010658308662631">ଅଧିକ ଲୋଡ କରନ୍ତୁ</translation> +<translation id="8554802735558319842">ସେୟାର କରାଯାଇଥିବା ଡିଭାଇସଗୁଡ଼ିକରେ ଅତିରିକ୍ତ ସୁରକ୍ଷା ପାଇଁ, ଅଟୋଫିଲ ବ୍ୟବହାର କରି ଆପଣ ପ୍ରତ୍ୟେକ ଥର ପେମେଣ୍ଟ କରିବା ସମୟରେ ଯାଞ୍ଚକରଣକୁ ଚାଲୁ କରନ୍ତୁ।</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{ଅନୁମତିକୁ ରିସେଟ୍ କରନ୍ତୁ}other{ଅନୁମତିଗୁଡ଼ିକୁ ରିସେଟ୍ କରନ୍ତୁ}}</translation> <translation id="8555010941760982128">ଚେକଆଉଟ ସମୟରେ ଏହି କୋଡକୁ ବ୍ୟବହାର କରନ୍ତୁ</translation> <translation id="8557066899867184262">CVC ଆପଣଙ୍କ କାର୍ଡର ପଛପଟେ ଅଛି।</translation>
diff --git a/components/strings/components_strings_pa.xtb b/components/strings/components_strings_pa.xtb index ef66b0b1..ac0cc1c 100644 --- a/components/strings/components_strings_pa.xtb +++ b/components/strings/components_strings_pa.xtb
@@ -1197,9 +1197,11 @@ <translation id="3927932062596804919">ਅਸਵੀਕਾਰ ਕਰੋ</translation> <translation id="393316646445601645">ਇੰਟਰਨੈੱਟ ਅਤੇ ਟੈਲੀਕਾਮ</translation> <translation id="3939773374150895049">ਕੀ CVC ਦੀ ਬਜਾਏ WebAuthn ਨੂੰ ਵਰਤਣਾ ਹੈ?</translation> +<translation id="3941630233824954464">ਮੁੜ-ਪ੍ਰਮਾਣੀਕਰਨ ਦੀ ਲਾਜ਼ਮੀ ਪ੍ਰਕਿਰਿਆ ਚਾਲੂ ਕਰੋ</translation> <translation id="3943857333388298514">ਪੇਸਟ ਕਰੋ</translation> <translation id="3946209740501886391">ਹਮੇਸ਼ਾ ਇਸ ਸਾਈਟ 'ਤੇ ਪੁੱਛੋ</translation> <translation id="3947595700203588284">ਸਾਈਟ MIDI ਡੀਵਾਈਸਾਂ ਨਾਲ ਕਨੈਕਟ ਕਰਨ ਲਈ ਪੁੱਛ ਸਕਦੀ ਹੈ</translation> +<translation id="3948588869002647271">ਇਹ ਐਪਲੀਕੇਸ਼ਨ ਜਾਂ ਤਾਂ ਮੌਜੂਦ ਨਹੀਂ ਹੈ ਜਾਂ ਖਰਾਬ ਹੈ</translation> <translation id="3949571496842715403">ਇਹ ਸਰਵਰ ਇਹ ਸਾਬਤ ਨਹੀਂ ਕਰ ਸਕਿਆ ਕਿ ਇਹ <ph name="DOMAIN" /> ਹੈ; ਇਸਦੇ ਸੁਰੱਖਿਆ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਅਧੀਨ ਫੇਰਵਾਂ ਨਾਮ ਸਪਸ਼ਟ ਨਹੀਂ ਕੀਤੇ ਗਏ ਹਨ। ਇਹ ਇੱਕ ਗਲਤ ਸੰਰੂਪਣ ਕਾਰਨ ਹੋ ਸਕਦਾ ਹੈ ਜਾਂ ਕੋਈ ਹਮਲਾਵਰ ਤੁਹਾਡੇ ਕਨੈਕਸ਼ਨ ਨੂੰ ਰਾਹ ਵਿੱਚ ਰੋਕ ਰਿਹਾ ਹੈ।</translation> <translation id="3949601375789751990">ਤੁਹਾਡਾ ਬ੍ਰਾਊਜ਼ਿੰਗ ਇਤਿਹਾਸ ਇੱਥੇ ਦਿਖਾਈ ਦਿੰਦਾ ਹੈ</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2199,6 +2201,7 @@ <translation id="6370022303958842211">ਡੀਵਾਈਸ ਪਹੁੰਚ ਸੰਬੰਧੀ ਕਾਰਵਾਈਆਂ ਜਿਵੇਂ ਕਿ ਲੌਗ-ਇਨ (ਅਸਫਲ ਲੌਗ-ਇਨ ਕਾਰਨਾਂ ਸਮੇਤ), ਲੌਗ-ਆਊਟ, ਲਾਕ ਅਤੇ ਅਣਲਾਕ</translation> <translation id="6374469231428023295">ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ</translation> <translation id="6374865374745447009">ਵਿੰਡੋ ਪ੍ਰਬੰਧਨ</translation> +<translation id="6376881782310775282">ਇਸ ਐਪਲੀਕੇਸ਼ਨ ਲਈ ਵਿਕਾਸ ਸਰਵਰ ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ</translation> <translation id="6377268785556383139">'<ph name="SEARCH_TEXT" />' ਲਈ 1 ਨਤੀਜਾ</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">ਇਸ ਸਾਈਟ 'ਤੇ ਜਾਣ ਕਰਕੇ ਸੰਭਾਵਿਤ ਤੌਰ 'ਤੇ ਖਰਚਾ ਪੈ ਸਕਦਾ ਹੈ।</translation> @@ -3007,6 +3010,7 @@ <translation id="8286799286781881307">ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਅਧਿਕਾਰਿਤ ਐਪਲੀਕੇਸ਼ਨਾਂ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨਾਲ ਜੋੜਾਬੱਧ ਕੀਤੀਆਂ ਸਾਰੀਆਂ ਸਕ੍ਰੀਨਾਂ ਨੂੰ ਕੈਪਚਰ ਕਰ ਸਕਦੀਆਂ ਹਨ। ਇਸ ਜਾਣਕਾਰੀ 'ਤੇ ਸਥਾਨਕ ਤੌਰ 'ਤੇ ਪ੍ਰਕਿਰਿਆ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ ਜਾਂ ਤੁਹਾਡੀ ਸੰਸਥਾ ਦੇ ਸਰਵਰਾਂ 'ਤੇ ਅੱਪਲੋਡ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।</translation> <translation id="8288807391153049143">ਪ੍ਰਮਾਣ-ਪੱਤਰ ਦਿਖਾਓ</translation> <translation id="8289355894181816810">ਜੇਕਰ ਤੁਸੀਂ ਨਿਸ਼ਚਿਤ ਨਹੀਂ ਹੋ ਕਿ ਇਸਦਾ ਕੀ ਮਤਲਬ ਹੈ ਤਾਂ ਆਪਣੇ ਨੈਟਵਰਕ ਪ੍ਰਬੰਧਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।</translation> +<translation id="8292520987784410870">ਕੀ ਹਮੇਸ਼ਾਂ ਪੁਸ਼ਟੀ ਕਰਨੀ ਹੈ?</translation> <translation id="8293206222192510085">ਬੁੱਕਮਾਰਕ ਸ਼ਾਮਿਲ ਕਰੋ</translation> <translation id="829335040383910391">ਧੁਨੀ</translation> <translation id="8294431847097064396">ਸ੍ਰੋਤ</translation> @@ -3106,6 +3110,7 @@ <translation id="854892890027593466">C6/C5 ਆਕਾਰ ਦਾ ਲਿਫ਼ਾਫ਼ਾ</translation> <translation id="8553387990086529628">ਘੁੰਮਣ-ਫਿਰਨ ਦੀਆਂ ਥਾਵਾਂ</translation> <translation id="8554010658308662631">ਹੋਰ ਲੋਡ ਕਰੋ</translation> +<translation id="8554802735558319842">ਸਾਂਝੇ ਡੀਵਾਈਸਾਂ 'ਤੇ ਵਾਧੂ ਸੁਰੱਖਿਆ ਲਈ, ਜਦੋਂ ਵੀ ਤੁਸੀਂ ਆਟੋਫਿਲ ਦੀ ਵਰਤੋਂ ਕਰ ਕੇ ਭੁਗਤਾਨ ਕਰਦੇ ਹੋ, ਤਾਂ ਹਰ ਵਾਰ ਪੁਸ਼ਟੀਕਰਨ ਚਾਲੂ ਕਰੋ।</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{ਇਜਾਜ਼ਤ ਨੂੰ ਰੀਸੈੱਟ ਕਰੋ}one{ਇਜਾਜ਼ਤ ਨੂੰ ਰੀਸੈੱਟ ਕਰੋ}other{ਇਜਾਜ਼ਤਾਂ ਨੂੰ ਰੀਸੈੱਟ ਕਰੋ}}</translation> <translation id="8555010941760982128">ਚੈੱਕ-ਆਊਟ 'ਤੇ ਇਸ ਕੋਡ ਦੀ ਵਰਤੋਂ ਕਰੋ</translation> <translation id="8557066899867184262">CVC ਤੁਹਾਡੇ ਕਾਰਡ ਦੇ ਪਿੱਛੇ ਮੌਜੂਦ ਹੈ।</translation> @@ -3294,6 +3299,7 @@ <translation id="9048662076076074925">24 x 36 ਇੰਚ</translation> <translation id="9049981332609050619">ਤੁਸੀਂ <ph name="DOMAIN" /> ਤੱਕ ਪਹੁੰਚਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ, ਪਰ ਸਰਵਰ ਨੇ ਇੱਕ ਅਵੈਧ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਪੇਸ਼ ਕੀਤਾ।</translation> <translation id="9050666287014529139">ਪਾਸਫਰੇਜ਼</translation> +<translation id="9053840549256861041">ਅਸੀਂ ਵਿਗਿਆਪਨ ਪਰਦੇਦਾਰੀ ਸੰਬੰਧੀ ਨਵੀਂ ਵਿਸ਼ੇਸ਼ਤਾ ਲਾਂਚ ਕਰ ਰਹੇ ਹਾਂ ਜਿਨ੍ਹਾਂ ਨੂੰ ਵਿਗਿਆਪਨ ਮਾਪ ਕਹਿੰਦੇ ਹਨ। Chrome ਸਾਈਟਾਂ ਵਿਚਾਲੇ ਬਹੁਤ ਹੀ ਸੀਮਤ ਜਾਣਕਾਰੀ ਨੂੰ ਸਾਂਝਾ ਕਰਦਾ ਹੈ, ਜਿਵੇਂ ਕਿ ਜਦੋਂ ਤੁਹਾਨੂੰ ਕੋਈ ਵਿਗਿਆਪਨ ਦਿਖਾਇਆ ਗਿਆ ਸੀ, ਤਾਂ ਜੋ ਵਿਗਿਆਪਨਾਂ ਦੀ ਕਾਰਗੁਜ਼ਾਰੀ ਦਾ ਮੁਲਾਂਕਣ ਕਰਨ ਵਿੱਚ ਸਾਈਟਾਂ ਦੀ ਮਦਦ ਕੀਤੀ ਜਾ ਸਕੇ।</translation> <translation id="9056953843249698117">ਸਟੋਰ</translation> <translation id="9062620674789239642">ਸ਼ਾਇਦ ਇਸ ਨੂੰ ਬਾਹਰ ਲਿਜਾਇਆ, ਸੰਪਾਦਿਤ ਕੀਤਾ ਜਾਂ ਮਿਟਾਇਆ ਜਾ ਚੁੱਕਾ ਹੈ।</translation> <translation id="9063398205799684336">ਕਾਕੂ 2 ਆਕਾਰ ਦਾ ਲਿਫ਼ਾਫ਼ਾ</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb index 14f6b6b..73db538 100644 --- a/components/strings/components_strings_pl.xtb +++ b/components/strings/components_strings_pl.xtb
@@ -1371,7 +1371,7 @@ <translation id="4300675098767811073">Wiele otworów z prawej strony</translation> <translation id="4302514097724775343">Kliknij dinozaura, by zacząć grać</translation> <translation id="4304049446746819918">{0,plural, =1{Zgodnie z zasadą administratora nie zaleca się przenoszenia tego pliku, jeśli miejscem docelowym jest <ph name="DESTINATION_NAME" />}few{Zgodnie z zasadą administratora nie zaleca się przenoszenia tych plików, jeśli miejscem docelowym jest <ph name="DESTINATION_NAME" />}many{Zgodnie z zasadą administratora nie zaleca się przenoszenia tych plików, jeśli miejscem docelowym jest <ph name="DESTINATION_NAME" />}other{Zgodnie z zasadą administratora nie zaleca się przenoszenia tych plików, jeśli miejscem docelowym jest <ph name="DESTINATION_NAME" />}}</translation> -<translation id="4304485328308299773">Zapoznaj się z ocenami produktów, usług lub doświadczeń klientów, aby podejmować lepsze decyzje na podstawie opinii.</translation> +<translation id="4304485328308299773">Zapoznaj się z ocenami i recenzjami produktów i usług, aby podejmować lepsze decyzje na podstawie opinii klientów.</translation> <translation id="4305666528087210886">Nie udało się uzyskać dostępu do pliku</translation> <translation id="4306529830550717874">Zapisać adres?</translation> <translation id="4306812610847412719">schowek</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb index 553a150..47d0133f 100644 --- a/components/strings/components_strings_ro.xtb +++ b/components/strings/components_strings_ro.xtb
@@ -979,6 +979,7 @@ <translation id="3380864720620200369">Cod de client:</translation> <translation id="3381668585148405088">Confirmă achiziția</translation> <translation id="3383566085871012386">Ordinea de prioritate actuală</translation> +<translation id="3384522979010096022">Organizația ta nu îți permite să vezi acest site</translation> <translation id="3387261909427947069">Metode de plată</translation> <translation id="3391030046425686457">Adresă de livrare</translation> <translation id="3391482648489541560">Editarea fișierelor</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb index d2ec53f1..42196ad 100644 --- a/components/strings/components_strings_ru.xtb +++ b/components/strings/components_strings_ru.xtb
@@ -1199,9 +1199,11 @@ <translation id="3927932062596804919">Запретить</translation> <translation id="393316646445601645">Интернет и телекоммуникации</translation> <translation id="3939773374150895049">Использовать WebAuthn вместо CVC-кода?</translation> +<translation id="3941630233824954464">Включить обязательную повторную аутентификацию</translation> <translation id="3943857333388298514">Вставить</translation> <translation id="3946209740501886391">Всегда спрашивать на этом сайте</translation> <translation id="3947595700203588284">Разрешено отправлять запрос на подключение к MIDI-устройствам</translation> +<translation id="3948588869002647271">Это приложение отсутствует или повреждено.</translation> <translation id="3949571496842715403">Сервер не может подтвердить связь с доменом <ph name="DOMAIN" />. В его сертификате безопасности не указаны альтернативные варианты имен. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные.</translation> <translation id="3949601375789751990">История просмотров появится здесь</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2202,6 +2204,7 @@ <translation id="6370022303958842211">Действия, связанные с доступом к устройству, например вход в систему (в том числе неудачные попытки), выход из системы, блокировка и разблокировка</translation> <translation id="6374469231428023295">Повторить</translation> <translation id="6374865374745447009">управление окнами</translation> +<translation id="6376881782310775282">Сервер разработки для этого приложения недоступен.</translation> <translation id="6377268785556383139">1 результат поиска по запросу "<ph name="SEARCH_TEXT" />"</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">Возможное списание средств</translation> @@ -3010,6 +3013,7 @@ <translation id="8286799286781881307">Приложения, одобренные администратором, могут получать доступ к информации со всех экранов, подключенных к вашему устройству. Такие сведения обрабатываются локально или загружаются на серверы вашей организации.</translation> <translation id="8288807391153049143">Показать сертификат</translation> <translation id="8289355894181816810">Уточните информацию у администратора сети.</translation> +<translation id="8292520987784410870">Всегда выполнять проверку?</translation> <translation id="8293206222192510085">Добавление закладки</translation> <translation id="829335040383910391">звук</translation> <translation id="8294431847097064396">Источник</translation> @@ -3109,6 +3113,7 @@ <translation id="854892890027593466">Конверт C6/C5</translation> <translation id="8553387990086529628">Туристические направления</translation> <translation id="8554010658308662631">Ещё</translation> +<translation id="8554802735558319842">Чтобы ещё надежнее защитить общие устройства, включайте проверку каждый раз, когда платите с использованием функции автозаполнения.</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{Сбросить разрешение}one{Сбросить все разрешения}few{Сбросить все разрешения}many{Сбросить все разрешения}other{Сбросить все разрешения}}</translation> <translation id="8555010941760982128">Укажите этот код при оформлении заказа</translation> <translation id="8557066899867184262">CVC-код указан на обратной стороне карты.</translation> @@ -3297,6 +3302,7 @@ <translation id="9048662076076074925">24 x 36 дюймов</translation> <translation id="9049981332609050619">Вы попытались открыть <ph name="DOMAIN" />, однако представленный сервером сертификат недействителен.</translation> <translation id="9050666287014529139">Кодовая фраза</translation> +<translation id="9053840549256861041">Мы запускаем новую функцию конфиденциальности в рекламе. Теперь для оценки эффективности рекламы сайты будут получать от Chrome только определенные данные, например сведения о времени, когда вам была показана реклама.</translation> <translation id="9056953843249698117">Магазин</translation> <translation id="9062620674789239642">Возможно, он был перемещен, изменен или удален.</translation> <translation id="9063398205799684336">Конверт Kaku 2</translation>
diff --git a/components/strings/components_strings_si.xtb b/components/strings/components_strings_si.xtb index cafe6e6c..0c163ffa 100644 --- a/components/strings/components_strings_si.xtb +++ b/components/strings/components_strings_si.xtb
@@ -1200,9 +1200,11 @@ <translation id="3927932062596804919">ප්රතික්ෂේප කරන්න</translation> <translation id="393316646445601645">අන්තර්ජාලය සහ විදුලි සන්නිවේදන</translation> <translation id="3939773374150895049">CVC වෙනුවට WebAuthn භාවිත කරන්නද?</translation> +<translation id="3941630233824954464">අනිවාර්ය යළි සත්යාපනය සබල කරන්න</translation> <translation id="3943857333388298514">අලවන්න</translation> <translation id="3946209740501886391">මෙම අඩවියේදී සැමවිටම විමසන්න</translation> <translation id="3947595700203588284">අඩවි MIDI උපාංග වෙත සම්බන්ධ වීමට ඉල්ලිය හැකිය</translation> +<translation id="3948588869002647271">මෙම යෙදුම අස්ථානගත වී හෝ හානි වී ඇත</translation> <translation id="3949571496842715403">මෙම සේවාදායකයට එය <ph name="DOMAIN" /> බව සනාථ කිරීමට නොහැකි විය; එහි ආරක්ෂක සහතිකය විෂයට විකල්ප නම් සඳහන් කරන්නේ නැත. මෙය වැරදි වින්යාස කිරීමක් හෝ ප්රහාරකයකු ඔබේ සබැඳුමට බාධා කිරීමක් නිසා විය හැකිය.</translation> <translation id="3949601375789751990">ඔබගේ බ්රවුස් කිරීමේ ඉතිහාසය මෙහි දිස් වේ</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2203,6 +2205,7 @@ <translation id="6370022303958842211">පිවිසුම් (අසාර්ථක පිවිසුම් හේතු ඇතුළුව), පිටවීම්, අගුළු දැමීම්, සහ අගුළු හැරීම් වැනි උපාංග ප්රවේශ ක්රියා</translation> <translation id="6374469231428023295">නැවත උත්සහ කරන්න</translation> <translation id="6374865374745447009">කවුළු කළමනාකරණය</translation> +<translation id="6376881782310775282">මෙම යෙදුම සඳහා සංවර්ධන සේවාදායකය වෙත ළඟා විය නොහැක</translation> <translation id="6377268785556383139">'<ph name="SEARCH_TEXT" />' සඳහා 1 ප්රතිඵලයක්</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">ඉදිරියට තිබිය හැකි ගාස්තු.</translation> @@ -3011,6 +3014,7 @@ <translation id="8286799286781881307">ඔබේ පරිපාලක විසින් අවසර දී ඇති යෙදුම්වලට ඔබේ උපාංගයට අමුණා ඇති සියලු තිර ග්රහණය කර ගත හැක. මෙම තොරතුරු ස්ථානීයව සැකසීමට හෝ ඔබේ සංවිධානයේ සේවාදායක වෙත උඩුගත කිරීමට හැක.</translation> <translation id="8288807391153049143">සහතිකය පෙන්වන්න</translation> <translation id="8289355894181816810">ඔබට මෙහි තේරුම පිළිබඳ අවිශ්වාස නම් ඔබේ ජාල පරිපාලක සබඳ කරගන්න.</translation> +<translation id="8292520987784410870">සැම විට ම සත්යාපනය කරන්න ද?</translation> <translation id="8293206222192510085">පිටුසන එක් කරන්න</translation> <translation id="829335040383910391">ශබ්දය</translation> <translation id="8294431847097064396">මූලාශ්රය</translation> @@ -3110,6 +3114,7 @@ <translation id="854892890027593466">ලියුම් කවරය C6/C5</translation> <translation id="8553387990086529628">සංචාරක ගමනාන්ත</translation> <translation id="8554010658308662631">තව පූරණය කරන්න</translation> +<translation id="8554802735558319842">බෙදා ගත් උපාංගවල අමතර ආරක්ෂාව සඳහා, ඔබ ස්වයං පිරවීම භාවිතයෙන් ගෙවන සෑම අවස්ථාවකම සත්යාපනය ක්රියාත්මක කරන්න.</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{අවසරය යළි සකසන්න}one{අවසර යළි සකසන්න}other{අවසර යළි සකසන්න}}</translation> <translation id="8555010941760982128">ගෙවා පිටවීමේදී මෙම කේතය භාවිත කරන්න</translation> <translation id="8557066899867184262">CVC ඔබේ කාඩ්පත පිටුපස පිහිටා ඇත.</translation> @@ -3298,6 +3303,7 @@ <translation id="9048662076076074925">අඟ 24 x 36</translation> <translation id="9049981332609050619">ඔබ <ph name="DOMAIN" /> වෙත පිවිසීමට උත්සාහ කර තිබේ, නමුත් සර්වරය ඉදිරිපත් කළේ වැරදි සහතිකයකි.</translation> <translation id="9050666287014529139">රහස්වැකිය</translation> +<translation id="9053840549256861041">අපි දැන්වීම් මැනීම නමින් නව දැන්වීම් පෞද්ගලිකත්ව විශේෂාංගයක් දියත් කරන්නෙමු. දැන් Chrome අඩවිවලට දැන්වීම්වල කාර්ය සාධනය මැනීමට උදවු කිරීම සඳහා, ඔබට දැන්වීමක් පෙන්වූ විට වැනි, ඉතා සීමිත තොරතුරු පමණක් අඩවි අතර බෙදා ගනී.</translation> <translation id="9056953843249698117">හල</translation> <translation id="9062620674789239642">එය ගෙන ගොස්, සංස්කරණය කර හෝ මකා තිබීමට හැකිය.</translation> <translation id="9063398205799684336">ලියුම් කවරය කකු 2</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb index 4e588de4..a9f885d 100644 --- a/components/strings/components_strings_sk.xtb +++ b/components/strings/components_strings_sk.xtb
@@ -976,6 +976,7 @@ <translation id="3380864720620200369">ID klienta:</translation> <translation id="3381668585148405088">Overenie nákupu</translation> <translation id="3383566085871012386">Aktuálne poradie uprednostnenia</translation> +<translation id="3384522979010096022">Vaša organizácia vám nepovoľuje tento web zobraziť</translation> <translation id="3387261909427947069">Spôsoby platby</translation> <translation id="3391030046425686457">Doručovacia adresa</translation> <translation id="3391482648489541560">úprava súborov</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb index e6ecabb2..a249ab7 100644 --- a/components/strings/components_strings_sl.xtb +++ b/components/strings/components_strings_sl.xtb
@@ -1200,9 +1200,11 @@ <translation id="3927932062596804919">Ne dovoli</translation> <translation id="393316646445601645">Internet in telekomunikacije</translation> <translation id="3939773374150895049">Želite namesto kode CVC uporabiti WebAuthn?</translation> +<translation id="3941630233824954464">Omogočanje obveznega vnovičnega preverjanja pristnosti</translation> <translation id="3943857333388298514">Prilepi</translation> <translation id="3946209740501886391">Vedno vprašaj na tem spletnem mestu</translation> <translation id="3947595700203588284">Lahko zahteva vzpostavitev povezave z napravami MIDI.</translation> +<translation id="3948588869002647271">Ta aplikacija manjka ali je poškodovana</translation> <translation id="3949571496842715403">Strežniku ni uspelo dokazati, da je <ph name="DOMAIN" />; njegovo varnostno potrdilo ne določa nadomestnih imen SAN (Subject Alternative Name). Razlog za to je morda napačna konfiguracija ali napadalčevo prestrezanje povezave.</translation> <translation id="3949601375789751990">Tu je prikazana zgodovina brskanja</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2203,6 +2205,7 @@ <translation id="6370022303958842211">Dejanja dostopa do naprave, kot so prijave (vključno z neuspešnimi razlogi za prijavo), odjave, zaklepanja in odklepanja.</translation> <translation id="6374469231428023295">Vnovični poskus</translation> <translation id="6374865374745447009">upravljanje oken</translation> +<translation id="6376881782310775282">Strežnika za razvoj za to aplikacijo ni mogoče doseči</translation> <translation id="6377268785556383139">1 rezultat za »<ph name="SEARCH_TEXT" />«</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">Morda bo prišlo do bremenitev.</translation> @@ -3011,6 +3014,7 @@ <translation id="8286799286781881307">Aplikacije, ki jih je pooblastil skrbnik, lahko zajamejo vsebino vseh zaslonov, priključenih na napravo. Te podatke je mogoče obdelati lokalno ali naložiti v strežnike organizacije.</translation> <translation id="8288807391153049143">Prikaz potrdila</translation> <translation id="8289355894181816810">Če niste prepričani, kaj to pomeni, se obrnite na skrbnika omrežja.</translation> +<translation id="8292520987784410870">Želite vedno preveriti?</translation> <translation id="8293206222192510085">Dodaj zaznamek</translation> <translation id="829335040383910391">zvok</translation> <translation id="8294431847097064396">Vir</translation> @@ -3110,6 +3114,7 @@ <translation id="854892890027593466">Kuverta C6/C5</translation> <translation id="8553387990086529628">Turistične destinacije</translation> <translation id="8554010658308662631">Naloži več</translation> +<translation id="8554802735558319842">Zaradi dodatne varnosti v napravah v skupni rabi vklopite preverjanje pristnosti vsakič, ko plačate s samodejnim izpolnjevanjem.</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{Ponastavi dovoljenje}one{Ponastavi dovoljenja}two{Ponastavi dovoljenja}few{Ponastavi dovoljenja}other{Ponastavi dovoljenja}}</translation> <translation id="8555010941760982128">Na blagajni uporabite to kodo</translation> <translation id="8557066899867184262">CVC je na zadnji strani kartice.</translation> @@ -3298,6 +3303,7 @@ <translation id="9048662076076074925">24 x 36 palcev</translation> <translation id="9049981332609050619">Skušali ste dostopati do domene <ph name="DOMAIN" />, vendar je strežnik predložil neveljavno potrdilo.</translation> <translation id="9050666287014529139">Geslo</translation> +<translation id="9053840549256861041">Uvajamo novo funkcijo za zasebnost pri oglaševanju, ki se imenuje merjenje oglasov. Chrome deli samo zelo omejene podatke s spletnimi mesti, na primer takrat, ko vam je bil prikazan oglas, da bi spletnim mestom pomagal meriti uspešnost oglasov.</translation> <translation id="9056953843249698117">Trgovina</translation> <translation id="9062620674789239642">Morda je premaknjena, urejena ali izbrisana.</translation> <translation id="9063398205799684336">Kuverta Kaku 2</translation>
diff --git a/components/strings/components_strings_sq.xtb b/components/strings/components_strings_sq.xtb index cfab30f..8bb69ba 100644 --- a/components/strings/components_strings_sq.xtb +++ b/components/strings/components_strings_sq.xtb
@@ -1200,9 +1200,11 @@ <translation id="3927932062596804919">Refuzo</translation> <translation id="393316646445601645">Interneti dhe telekomunikacioni</translation> <translation id="3939773374150895049">Të përdoret WebAuthn në vend të CVC?</translation> +<translation id="3941630233824954464">Aktivizo rivërtetimin e detyrueshëm</translation> <translation id="3943857333388298514">Ngjite</translation> <translation id="3946209740501886391">Gjithmonë pyet në këtë faqe</translation> <translation id="3947595700203588284">Mund të kërkojë të lidhet me pajisjet MIDI</translation> +<translation id="3948588869002647271">Ky aplikacion mungon ose është i dëmtuar</translation> <translation id="3949571496842715403">Ky server nuk mund të provonte se është <ph name="DOMAIN" />; certifikata e tij e sigurisë nuk specifikon "Emrat alternativë të subjektit". Kjo mund të shkaktohet nga një keqkonfigurim ose nga një sulmues që po ndërhyn në lidhjen tënde.</translation> <translation id="3949601375789751990">Historiku yt i shfletimit shfaqet këtu</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2202,6 +2204,7 @@ <translation id="6370022303958842211">Veprimet e qasjes te pajisja si p.sh. identifikimet (duke përfshirë arsyet e dështimit të identifikimit), daljet, kyçjet dhe shkyçjet</translation> <translation id="6374469231428023295">Provo përsëri</translation> <translation id="6374865374745447009">menaxhimi i dritareve</translation> +<translation id="6376881782310775282">Serveri i zhvillimit për këtë aplikacion është i paarritshëm</translation> <translation id="6377268785556383139">1 rezultat për "<ph name="SEARCH_TEXT" />"</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">Tarifime të mundshme përpara.</translation> @@ -3010,6 +3013,7 @@ <translation id="8286799286781881307">Aplikacionet e autorizuara nga administratori mund të regjistrojnë të gjitha ekranet e lidhura me pajisjen tënde. Këto informacione mund të përpunohen në nivel lokal ose mund të ngarkohen në serverët e organizatës sate.</translation> <translation id="8288807391153049143">Shfaq certifikatën</translation> <translation id="8289355894181816810">Kontakto me administratorin e rrjetit nëse nuk je i sigurt se çfarë do të thotë kjo.</translation> +<translation id="8292520987784410870">Të verifikohen gjithmonë?</translation> <translation id="8293206222192510085">Shto një faqeshënues</translation> <translation id="829335040383910391">tingulli</translation> <translation id="8294431847097064396">Burimi</translation> @@ -3109,6 +3113,7 @@ <translation id="854892890027593466">Zarf C6/C5</translation> <translation id="8553387990086529628">Destinacionet turistike</translation> <translation id="8554010658308662631">Ngarko më shumë</translation> +<translation id="8554802735558319842">Për më shumë siguri në pajisjet e ndara, aktivizo verifikimin sa herë që paguan duke përdorur plotësimin automatik.</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{RIvendos lejen}other{Rivendos lejet}}</translation> <translation id="8555010941760982128">Përdor këtë kod në përfundim të blerjes</translation> <translation id="8557066899867184262">Kodi CVC ndodhet në pjesën e pasme të kartës.</translation> @@ -3297,6 +3302,7 @@ <translation id="9048662076076074925">24 x 36 inç</translation> <translation id="9049981332609050619">Tentove të gjeje <ph name="DOMAIN" />, por serveri paraqiti një certifikatë të pavlefshme.</translation> <translation id="9050666287014529139">Shprehje kalimi</translation> +<translation id="9053840549256861041">Ne po prezantojmë një veçori të re të privatësisë së reklamave që quajtur matja e reklamave. Chrome ndan vetëm informacione shumë të kufizuara mes sajteve, si p.sh. kur të është shfaqur një reklamë, për t'i ndihmuar sajtet të matin performancën e reklamave.</translation> <translation id="9056953843249698117">Dyqani</translation> <translation id="9062620674789239642">Ai mund të jetë zhvendosur, modifikuar ose fshirë.</translation> <translation id="9063398205799684336">Zarf Kaku 2</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb index c26e728..d717386 100644 --- a/components/strings/components_strings_sw.xtb +++ b/components/strings/components_strings_sw.xtb
@@ -1200,9 +1200,11 @@ <translation id="3927932062596804919">Kataza</translation> <translation id="393316646445601645">Intaneti na mawasiliano ya simu</translation> <translation id="3939773374150895049">Ungependa kutumia WebAuthn badala ya CVC?</translation> +<translation id="3941630233824954464">Washa uthibitishaji mpya wa lazima</translation> <translation id="3943857333388298514">Bandika</translation> <translation id="3946209740501886391">Uliza kwenye tovuti hii kila wakati</translation> <translation id="3947595700203588284">Inaweza kuomba ruhusa ya kuunganisha kwenye vifaa vya MIDI</translation> +<translation id="3948588869002647271">Programu hii haipo au imeharibika</translation> <translation id="3949571496842715403">Seva hii haikuweza kuthibitisha kuwa ni <ph name="DOMAIN" />; cheti chake cha usalama hakibainishi Majina Mbadala ya Mada. Hii inaweza kusababishwa na uwekaji mipangilio usiofaa au muunganisho wako kukatwa na mvamizi.</translation> <translation id="3949601375789751990">Historia yako ya kuvinjari itaonekana hapa</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2009,7 +2011,7 @@ <translation id="5884465125445718607">Bahasha ya muundo wa Kichina ya ukubwa wa #6</translation> <translation id="5887400589839399685">Kadi imehifadhiwa</translation> <translation id="5887687176710214216">Ilitembelewa mara ya mwisho jana</translation> -<translation id="5895138241574237353">Zzima na uwashe</translation> +<translation id="5895138241574237353">Zima na uwashe</translation> <translation id="5895187275912066135">Kilitolewa</translation> <translation id="5901630391730855834">Manjano</translation> <translation id="5903264686717710770">Kichwa:</translation> @@ -2203,6 +2205,7 @@ <translation id="6370022303958842211">Vitendo vya ufikiaji wa kifaa kama vile matukio ya kuingia katika akaunti (ikiwa ni pamoja na sababu za kushindwa kuingia katika akaunti), kuondoka katika akaunti, kufunga na kufungua</translation> <translation id="6374469231428023295">Jaribu Tena</translation> <translation id="6374865374745447009">udhibiti wa dirisha</translation> +<translation id="6376881782310775282">Seva ya usanidi programu wa programu hii haiwezi kufikiwa</translation> <translation id="6377268785556383139">Imepata tokeo 1 la '<ph name="SEARCH_TEXT" />'</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">Huenda ukatozwa gharama.</translation> @@ -3009,6 +3012,7 @@ <translation id="8286799286781881307">Programu zilizoidhinishwa na msimamizi wako zinaweza kurekodi skrini zote zilizoambatishwa kwenye kifaa chako. Maelezo haya yanaweza kuchakatwa kwenye kifaa au kupakiwa kwenye seva za shirika lako.</translation> <translation id="8288807391153049143">Onyesha cheti</translation> <translation id="8289355894181816810">Wasiliana na msimamizi wako wa mtandao iwapo huna uhakika kile ambacho hiki kinamaanisha.</translation> +<translation id="8292520987784410870">Ithibitishe wakati wote?</translation> <translation id="8293206222192510085">Ongeza Alamisho</translation> <translation id="829335040383910391">sauti</translation> <translation id="8294431847097064396">Chanzo</translation> @@ -3106,6 +3110,7 @@ <translation id="854892890027593466">Bahasha ya ukubwa wa C6 au C5</translation> <translation id="8553387990086529628">Vivutio vya watalii</translation> <translation id="8554010658308662631">Pakia zaidi</translation> +<translation id="8554802735558319842">Kwa usalama zaidi kwenye vifaa vilivyoshirikishwa, washa uthibitishaji kila unapolipa kwa kutumia kipengele cha kujaza kiotomatiki.</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{Badilisha ruhusa}other{Badilisha ruhusa}}</translation> <translation id="8555010941760982128">Tumia kuponi hii wakati wa kulipa</translation> <translation id="8557066899867184262">CVC inapatikana nyuma ya kadi yako.</translation> @@ -3295,6 +3300,7 @@ <translation id="9048662076076074925">Inchi 24 x 36</translation> <translation id="9049981332609050619">Ulijaribu kufikia <ph name="DOMAIN" />, lakini seva iliwasilisha cheti batili.</translation> <translation id="9050666287014529139">Kaulisiri</translation> +<translation id="9053840549256861041">Tunazindua kipengele kipya cha faragha ya matangazo kinachoitwa upimaji wa matangazo. Chrome hushiriki maelezo machache tu kati ya tovuti, kama vile wakati ulipoonyeshwa tangazo, ili kusaidia tovuti kupima utendaji wa matangazo.</translation> <translation id="9056953843249698117">Duka</translation> <translation id="9062620674789239642">Huenda imehamishwa, imebadilishwa au imefutwa.</translation> <translation id="9063398205799684336">Bahasha ya muundo wa Kaku ya ukubwa 2</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb index 14d93aef..d2ddc44 100644 --- a/components/strings/components_strings_ta.xtb +++ b/components/strings/components_strings_ta.xtb
@@ -1194,9 +1194,11 @@ <translation id="3927932062596804919">மறு</translation> <translation id="393316646445601645">இணையம் & தொலைத்தொடர்பு</translation> <translation id="3939773374150895049">CVCக்கு பதிலாக WebAuthnனைப் பயன்படுத்தவா?</translation> +<translation id="3941630233824954464">கட்டாய மறு அடையாளச் சரிபார்ப்பை இயக்கும்</translation> <translation id="3943857333388298514">ஒட்டு</translation> <translation id="3946209740501886391">இந்தத் தளத்தில் எப்போதும் கேள்</translation> <translation id="3947595700203588284">MIDI சாதனங்களுடன் இணைய முயலும்போது அனுமதி கேட்க வேண்டும்</translation> +<translation id="3948588869002647271">இந்த ஆப்ஸ் காணவில்லை அல்லது சேதமடைந்துள்ளது</translation> <translation id="3949571496842715403">இது <ph name="DOMAIN" /> தான் என்பதை, இந்தச் சேவையகத்தால் உறுதிப்படுத்த முடியவில்லை; பொருள் மாற்றுப் பெயர்களை அதன் பாதுகாப்புச் சான்றிதழ் குறிப்பிடவில்லை. இது தவறான உள்ளமைவினால் ஏற்பட்டிருக்கலாம் அல்லது தீங்கிழைப்பவர் உங்கள் இணைப்பில் குறுக்கிட்டிருக்கலாம்.</translation> <translation id="3949601375789751990">உலாவல் வரலாறு இங்கே தோன்றும்</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2195,6 +2197,7 @@ <translation id="6370022303958842211">உள்நுழைதல் (உள்நுழைய முடியாமல் போனதற்கான காரணங்கள் உட்பட), வெளியேறுதல், லாக் செய்தல், அன்லாக் செய்தல் போன்ற சாதன அணுகல் செயல்கள்</translation> <translation id="6374469231428023295">மீண்டும் முயலவும்</translation> <translation id="6374865374745447009">சாளரங்களை நிர்வகித்தல்</translation> +<translation id="6376881782310775282">இந்த ஆப்ஸுக்கான டெவெலப்மண்ட் சேவையகத்தைத் தொடர்புகொள்ள முடியவில்லை</translation> <translation id="6377268785556383139">'<ph name="SEARCH_TEXT" />'க்கு 1 முடிவு உள்ளது</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">கட்டணங்கள் விதிக்கப்படச் சாத்தியமுள்ளது.</translation> @@ -3003,6 +3006,7 @@ <translation id="8286799286781881307">உங்கள் சாதனத்தில் இணைப்பட்டுள்ள திரைகள் அனைத்தையும் உங்கள் நிர்வாகி அங்கீகரித்துள்ள ஆப்ஸ் படமெடுக்கும். இந்தத் தகவலைச் சாதனத்திற்குள்ளேயே செயலாக்கலாம் அல்லது உங்கள் நிறுவனத்தின் சேவையகங்களில் பதிவேற்றலாம்.</translation> <translation id="8288807391153049143">சான்றிதழைக் காட்டும்</translation> <translation id="8289355894181816810">இதன் பொருள் உங்களுக்குத் தெரியவில்லையெனில் உங்கள் நெட்வொர்க் நிர்வாகியைத் தொடர்புகொள்ளவும்.</translation> +<translation id="8292520987784410870">எப்போதும் சரிபார்க்கவா?</translation> <translation id="8293206222192510085">புக்மார்க்கைச் சேர்</translation> <translation id="829335040383910391">ஒலி</translation> <translation id="8294431847097064396">மூலம்</translation> @@ -3102,6 +3106,7 @@ <translation id="854892890027593466">என்வெலப் C6/C5</translation> <translation id="8553387990086529628">சுற்றுலா செல்லுமிடங்கள்</translation> <translation id="8554010658308662631">மேலும் ஏற்று</translation> +<translation id="8554802735558319842">பலர் பயன்படுத்தும் சாதனங்களில் கூடுதல் பாதுகாப்பிற்கு, தன்னிரப்பியைப் பயன்படுத்திக் கட்டணம் செலுத்தும் ஒவ்வொரு முறைக்கும் சரிபார்ப்பை இயக்கவும்.</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{அனுமதியை மீட்டமை}other{அனுமதிகளை மீட்டமை}}</translation> <translation id="8555010941760982128">செக்-அவுட்டின்போது இந்தக் குறியீட்டைப் பயன்படுத்துங்கள்</translation> <translation id="8557066899867184262">உங்கள் கார்டின் பின்புறத்தில் CVC எண் இருக்கும்.</translation> @@ -3290,6 +3295,7 @@ <translation id="9048662076076074925">24 x 36 இன்ச்</translation> <translation id="9049981332609050619">நீங்கள் <ph name="DOMAIN" /> ஐ அடைய முயற்சி செய்தீர்கள், ஆனால் சேவையகம் ஒரு செல்லாத சான்றிதழை வழங்கியது.</translation> <translation id="9050666287014529139">கடவுச்சொற்றொடர்</translation> +<translation id="9053840549256861041">விளம்பரம் தொடர்பான புதிய தனியுரிமை அம்சமான 'விளம்பர தொடர்பான அளவீடு' என்பதை அறிமுகப்படுத்துகிறோம். தளங்களுக்கு இடையே Chrome மிகக் குறைவான தகவல்களையே பகிர்ந்துகொள்கிறது. (எ.கா. விளம்பரங்களின் செயல்திறனை அளவிட உதவுவதற்காக உங்களுக்கு விளம்பரம் எப்போது காட்டப்பட்டது எனும் விவரம்).</translation> <translation id="9056953843249698117">ஸ்டோர்</translation> <translation id="9062620674789239642">அது நகர்த்தப்பட்டிருக்கலாம், திருத்தப்பட்டிருக்கலாம் அல்லது நீக்கப்பட்டிருக்கலாம்.</translation> <translation id="9063398205799684336">என்வெலப் காகு 2</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb index 769c4620..38ec09d 100644 --- a/components/strings/components_strings_te.xtb +++ b/components/strings/components_strings_te.xtb
@@ -3305,6 +3305,7 @@ <translation id="9048662076076074925">24 x 36 అంగుళాలు</translation> <translation id="9049981332609050619">మీరు <ph name="DOMAIN" />ను చేరుకోవడానికి ప్రయత్నించారు, కానీ సర్వర్ ఒక చెల్లుబాటులో లేని ప్రమాణపత్రంను అందించింది.</translation> <translation id="9050666287014529139">రహస్య పదబంధం</translation> +<translation id="9053840549256861041">మేము యాడ్ల విషయంలో, యాడ్ మెజర్మెంట్ అనే కొత్త గోప్యతా ఫీచర్ను లాంచ్ చేస్తున్నాము. Chrome సైట్ల మధ్య చాలా పరిమిత సమాచారాన్ని మాత్రమే షేర్ చేస్తుంది, అంటే మీకు యాడ్ చూపబడినప్పుడు, యాడ్ల పనితీరును కొలవడానికి సైట్లకు సహాయం చేస్తుంది.</translation> <translation id="9056953843249698117">స్టోర్</translation> <translation id="9062620674789239642">ఇది తరలించబడి గానీ, ఎడిట్ చేసి గానీ లేదా తొలగించబడి ఉండవచ్చు.</translation> <translation id="9063398205799684336">ఎన్వలప్ కాకు 2</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb index ae6affe..cddd8cdd 100644 --- a/components/strings/components_strings_th.xtb +++ b/components/strings/components_strings_th.xtb
@@ -979,6 +979,7 @@ <translation id="3380864720620200369">รหัสลูกค้า:</translation> <translation id="3381668585148405088">ยืนยันการซื้อของคุณ</translation> <translation id="3383566085871012386">ลำดับที่มีความสำคัญสูงกว่าในปัจจุบัน</translation> +<translation id="3384522979010096022">องค์กรไม่อนุญาตให้ดูเว็บไซต์นี้</translation> <translation id="3387261909427947069">วิธีการชำระเงิน</translation> <translation id="3391030046425686457">ที่อยู่สำหรับจัดส่ง</translation> <translation id="3391482648489541560">การแก้ไขไฟล์</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb index 528c28a..82f9501 100644 --- a/components/strings/components_strings_tr.xtb +++ b/components/strings/components_strings_tr.xtb
@@ -1200,9 +1200,11 @@ <translation id="3927932062596804919">Reddet</translation> <translation id="393316646445601645">İnternet ve telekom</translation> <translation id="3939773374150895049">CVC yerine WebAuthn kullanılsın mı?</translation> +<translation id="3941630233824954464">Zorunlu yeniden kimlik doğrulamayı etkinleştir</translation> <translation id="3943857333388298514">Yapıştır</translation> <translation id="3946209740501886391">Bu sitede her zaman sor</translation> <translation id="3947595700203588284">MIDI cihazlarına bağlanmak isteyebilir</translation> +<translation id="3948588869002647271">Bu uygulama eksik veya bozuk</translation> <translation id="3949571496842715403">Bu sunucu <ph name="DOMAIN" /> olduğunu kanıtlayamadı. Güvenlik sertifikasında Konu Diğer Adları belirtilmiyor. Bu durum, bir yanlış yapılandırmadan veya bağlantınıza müdahale eden bir saldırgandan kaynaklanıyor olabilir.</translation> <translation id="3949601375789751990">Göz atma geçmişiniz burada görünür</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2203,6 +2205,7 @@ <translation id="6370022303958842211">Giriş yapma (başarısız giriş denemeleri dahil), çıkış yapma, kilitleme ve kilit açma gibi cihaz erişimi işlemleri</translation> <translation id="6374469231428023295">Tekrar Dene</translation> <translation id="6374865374745447009">pencere yönetimi</translation> +<translation id="6376881782310775282">Bu uygulamanın geliştirme sunucusuna erişilemiyor</translation> <translation id="6377268785556383139">"<ph name="SEARCH_TEXT" />" için bulunan 1 sonuç gösteriliyor</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">Devam etmeniz halinde ödeme yapmanız gerekebilir.</translation> @@ -3011,11 +3014,12 @@ <translation id="8286799286781881307">Yöneticiniz tarafından yetkilendirilen uygulamalar, cihazınıza bağlı tüm ekranlarda ekran görüntüsü alabilir. Bu bilgiler yerel olarak işlenebilir veya kuruluşunuzun sunucularına yüklenebilir.</translation> <translation id="8288807391153049143">Sertifikayı göster</translation> <translation id="8289355894181816810">Bunun ne anlama geldiğini bilmiyorsanız ağ yöneticinizle bağlantı kurun.</translation> +<translation id="8292520987784410870">Her zaman doğrulansın mı?</translation> <translation id="8293206222192510085">Yer İşareti Ekle</translation> <translation id="829335040383910391">ses</translation> <translation id="8294431847097064396">Kaynak</translation> <translation id="8296205692406981542">Bölgesel parklar ve bahçeler</translation> -<translation id="8297545700510100061">Çerezler ve diğer site verileri sizi hatırlamamız için kullanılır, örneğin oturumunuzu açmak veya reklamları kişiselleştirmek için. Çerezlerin tüm siteler için nasıl yönetileceğini <ph name="SETTINGS" /> sayfasından öğrenebilirsiniz.</translation> +<translation id="8297545700510100061">Çerezler ve diğer site verileri sizi hatırlamak için kullanılır, örneğin oturumunuzu açmak veya reklamları kişiselleştirmek için. Çerezlerin tüm siteler için nasıl yönetileceğini <ph name="SETTINGS" /> sayfasından öğrenebilirsiniz.</translation> <translation id="8298115750975731693">Kullandığınız kablosuz bağlantı ağı (<ph name="WIFI_NAME" />) <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> adresini ziyaret etmenizi gerektiriyor olabilir.</translation> <translation id="8303854710873047864">"<ph name="SECTION" />" bölümü gösterildi</translation> <translation id="830498451218851433">Ortadan katlama</translation> @@ -3110,6 +3114,7 @@ <translation id="854892890027593466">Zarf C6/C5</translation> <translation id="8553387990086529628">Turistik yerler</translation> <translation id="8554010658308662631">Daha fazla yükle</translation> +<translation id="8554802735558319842">Paylaşılan cihazlarda daha fazla güvenlik için otomatik doldurma özelliğini kullanarak her ödeme yapacağınız zaman doğrulamayı açın.</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{İzni sıfırla}other{İzinleri sıfırla}}</translation> <translation id="8555010941760982128">Ödeme sırasında bu kodu kullanın</translation> <translation id="8557066899867184262">CVC, kartınızın arkasında bulunur.</translation> @@ -3299,6 +3304,7 @@ <translation id="9048662076076074925">24 x 36 inç</translation> <translation id="9049981332609050619"><ph name="DOMAIN" /> alan adına erişmeye çalıştınız, ancak sunucu geçersiz bir sertifika sağladı.</translation> <translation id="9050666287014529139">Parola</translation> +<translation id="9053840549256861041">Reklam ölçümü adı verilen yeni bir reklam gizliliği özelliğini kullanıma sunuyoruz. Chrome sitelerin gösterdikleri reklamların performansını ölçmesine yardımcı olmak için siteler arasında çok sınırlı bilgi (ör. bir reklamın size gösterildiği saat) paylaşır.</translation> <translation id="9056953843249698117">Mağaza</translation> <translation id="9062620674789239642">Taşınmış veya silinmiş olabilir.</translation> <translation id="9063398205799684336">Zarf Kaku 2</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb index d4f86b8a..41bf9116 100644 --- a/components/strings/components_strings_uk.xtb +++ b/components/strings/components_strings_uk.xtb
@@ -1200,9 +1200,11 @@ <translation id="3927932062596804919">Відмовити</translation> <translation id="393316646445601645">Інтернет і телекомунікація</translation> <translation id="3939773374150895049">Використовувати веб-автентифікацію замість коду CVC?</translation> +<translation id="3941630233824954464">Увімкнути обов’язкову повторну автентифікацію</translation> <translation id="3943857333388298514">Вставити</translation> <translation id="3946209740501886391">Завжди запитувати на цьому сайті</translation> <translation id="3947595700203588284">Може просити дозвіл підключатися до пристроїв MIDI</translation> +<translation id="3948588869002647271">Цей додаток відсутній або пошкоджений</translation> <translation id="3949571496842715403">Цей сервер не зміг довести, що він – домен <ph name="DOMAIN" />. У його сертифікаті безпеки не вказано альтернативні імена. Імовірні причини: неправильна конфігурація або хтось намагається перехопити ваше з’єднання.</translation> <translation id="3949601375789751990">Тут відображається ваша історія веб-перегляду</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2203,6 +2205,7 @@ <translation id="6370022303958842211">Дії, пов’язані з доступом на пристрої, як-от входи (зокрема причини невдалих спроб входу), виходи, блокування й розблокування</translation> <translation id="6374469231428023295">Повторити спробу</translation> <translation id="6374865374745447009">керування вікнами</translation> +<translation id="6376881782310775282">Немає зв’язку із сервером розробки цього додатка</translation> <translation id="6377268785556383139">1 результат для запиту "<ph name="SEARCH_TEXT" />"</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">Можливе стягнення плати.</translation> @@ -3011,6 +3014,7 @@ <translation id="8286799286781881307">Додатки, авторизовані адміністратором, можуть записувати всі екрани, які підключено до вашого пристрою. Цю інформацію може бути оброблено локально або додано на сервери вашої організації.</translation> <translation id="8288807391153049143">Показати сертифікат</translation> <translation id="8289355894181816810">Зверніться до адміністратора своєї мережі, якщо ви не знаєте, що це означає.</translation> +<translation id="8292520987784410870">Завжди підтверджувати?</translation> <translation id="8293206222192510085">Додати закладку</translation> <translation id="829335040383910391">звук</translation> <translation id="8294431847097064396">Джерело</translation> @@ -3110,6 +3114,7 @@ <translation id="854892890027593466">Конверт C6/C5</translation> <translation id="8553387990086529628">Туристичні райони</translation> <translation id="8554010658308662631">Більше</translation> +<translation id="8554802735558319842">Щоб посилити безпеку спільних пристроїв, увімкніть підтвердження щоразу, коли ви сплачуєте за допомогою автозаповнення.</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{Скинути дозвіл}one{Скинути дозволи}few{Скинути дозволи}many{Скинути дозволи}other{Скинути дозволи}}</translation> <translation id="8555010941760982128">Використайте цей код під час оплати</translation> <translation id="8557066899867184262">Код CVC розташований на зворотному боці картки.</translation> @@ -3299,6 +3304,7 @@ <translation id="9048662076076074925">24 x 36 дюйм.</translation> <translation id="9049981332609050619">Ви пробували зв’язатися з доменом <ph name="DOMAIN" />, але сервер надав недійсний сертифікат.</translation> <translation id="9050666287014529139">Парольна фраза</translation> +<translation id="9053840549256861041">Ми запускаємо нову функцію конфіденційності в рекламі – вимірювання ефективності реклами. Веб-переглядач Chrome надає сайтам доступ лише до суворо обмежених даних (наприклад, до інформації про те, коли вам показувалось оголошення), на основі яких вимірюється ефективність реклами.</translation> <translation id="9056953843249698117">Магазин</translation> <translation id="9062620674789239642">Можливо, його переміщено, змінено або видалено.</translation> <translation id="9063398205799684336">Конверт Kaku 2</translation>
diff --git a/components/strings/components_strings_uz.xtb b/components/strings/components_strings_uz.xtb index 043244c..b305aa1 100644 --- a/components/strings/components_strings_uz.xtb +++ b/components/strings/components_strings_uz.xtb
@@ -1195,9 +1195,11 @@ <translation id="3927932062596804919">Taqiqlash</translation> <translation id="393316646445601645">Internet va telekom</translation> <translation id="3939773374150895049">CVC oʻrniga WebAuthn ishlatilsinmi?</translation> +<translation id="3941630233824954464">Majburiy qayta autentifikatsiyani yoqish</translation> <translation id="3943857333388298514">Joylash</translation> <translation id="3946209740501886391">Bu saytda har doim so‘ralsin</translation> <translation id="3947595700203588284">MIDI qurilmarga ulanish uchun ruxsat soʻrashi mumkin</translation> +<translation id="3948588869002647271">Bu ilova yoʻq yoki buzilgan</translation> <translation id="3949571496842715403">Bu server <ph name="DOMAIN" />; domeni ekanligini tasdiqlay olmadi. Uning xavfsizlik sertifikatida muqobil nomlar mavzusi ko‘rsatilmagan. Server noto‘g‘ri sozlangan yoki kimdir ma’lumotlaringizni o‘g‘irlashga urinayotgan bo‘lishi mumkin.</translation> <translation id="3949601375789751990">Brauzer tarixi shu yerda turadi</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2197,6 +2199,7 @@ <translation id="6370022303958842211">Tizimga kirish (turli sabablar bilan kirilmagani ham), chiqish, qulflash va qulfdan chiqarish kabi qurilmadagi ruxsat amallari</translation> <translation id="6374469231428023295">Qaytadan</translation> <translation id="6374865374745447009">oyna boshqaruvi</translation> +<translation id="6376881782310775282">Bu ilovani ishlab chiqish serveriga ulanmadi</translation> <translation id="6377268785556383139">“<ph name="SEARCH_TEXT" />” uchun bitta natija</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">Trafik uchun haq olinishi mumkin.</translation> @@ -3005,6 +3008,7 @@ <translation id="8286799286781881307">Administratoringiz tomonidan ruxsat etilgan ilovalar qurilmangizga biriktirilgan barcha ekranlarni yozib olishi mumkin. Ushbu maʼlumot qurilmada qayta ishlanishi yoki tashkilotingiz serverlariga yuklanishi mumkin.</translation> <translation id="8288807391153049143">Sertifikatni ko‘rsatish</translation> <translation id="8289355894181816810">Bu nimalagini tushunmasangiz, tarmoq administratori bilan bog‘laning.</translation> +<translation id="8292520987784410870">Doim tasdiqlansinmi?</translation> <translation id="8293206222192510085">Xatcho‘p qo‘shish</translation> <translation id="829335040383910391">tovush</translation> <translation id="8294431847097064396">Manba</translation> @@ -3104,6 +3108,7 @@ <translation id="854892890027593466">Envelope C6/C5</translation> <translation id="8553387990086529628">Turistik manzillar</translation> <translation id="8554010658308662631">Yana yuklash</translation> +<translation id="8554802735558319842">Umumiy qurilmalarni yanada ishonchli himoya qilish uchun har safar avtomatik kiritish orqali toʻlov qilganingizda tasdiqlashni yoqing.</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{Ruxsatni tiklash}other{Ruxsatlarni tiklash}}</translation> <translation id="8555010941760982128">Hisob-kitob vaqtida ushbu kodni kiriting</translation> <translation id="8557066899867184262">CVC kod kartangizning orqa tomonida joylashgan.</translation> @@ -3292,6 +3297,7 @@ <translation id="9048662076076074925">24 x 36 in</translation> <translation id="9049981332609050619">Siz <ph name="DOMAIN" /> domenini ochmoqchi bo‘ldingiz, lekin server taqdim qilgan sertifikat haqiqiy emas.</translation> <translation id="9050666287014529139">Kodli ibora</translation> +<translation id="9053840549256861041">Biz reklamada yangi maxfiylik funksiyasini ishga tushiryapmiz. Chrome reklama samaradorligini hisoblashda saytlarga yordam berish uchun reklama qachon koʻrsatilgani kabi cheklangan axborotni sayt va ilovalarga ulashadi.</translation> <translation id="9056953843249698117">Doʻkon</translation> <translation id="9062620674789239642">Fayl boshqa joyga koʻchirilgan, tahrirlangan yoki oʻchirib yuborilgan boʻlishi mumkin.</translation> <translation id="9063398205799684336">Envelope Kaku 2</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb index f8647d8..c4679996 100644 --- a/components/strings/components_strings_vi.xtb +++ b/components/strings/components_strings_vi.xtb
@@ -1200,9 +1200,11 @@ <translation id="3927932062596804919">Từ chối</translation> <translation id="393316646445601645">Internet và viễn thông</translation> <translation id="3939773374150895049">Sử dụng WebAuthn thay cho CVC?</translation> +<translation id="3941630233824954464">Bật tuỳ chọn xác thực lại bắt buộc</translation> <translation id="3943857333388298514">Dán</translation> <translation id="3946209740501886391">Luôn hỏi trên trang web này</translation> <translation id="3947595700203588284">Trang web có thể yêu cầu kết nối với thiết bị MIDI</translation> +<translation id="3948588869002647271">Ứng dụng này bị thiếu hoặc hỏng</translation> <translation id="3949571496842715403">Máy chủ này không thể chứng minh được đó là <ph name="DOMAIN" />; chứng chỉ bảo mật của máy chủ không chỉ định Tên thay thế đối tượng. Điều này có thể do cấu hình sai hoặc có kẻ tấn công chặn kết nối của bạn.</translation> <translation id="3949601375789751990">Lịch sử duyệt web của bạn xuất hiện ở đây</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2203,6 +2205,7 @@ <translation id="6370022303958842211">Các hành động truy cập thiết bị như đăng nhập (kể cả lý do đăng nhập không thành công), đăng xuất, khoá và mở khoá</translation> <translation id="6374469231428023295">Thử lại</translation> <translation id="6374865374745447009">quản lý cửa sổ</translation> +<translation id="6376881782310775282">Không thể truy cập máy chủ phát triển của ứng dụng này</translation> <translation id="6377268785556383139">1 kết quả cho '<ph name="SEARCH_TEXT" />'</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">Nếu tiếp tục, bạn có thể bị tính phí.</translation> @@ -3011,6 +3014,7 @@ <translation id="8286799286781881307">Các ứng dụng được quản trị viên uỷ quyền có thể chụp ảnh mọi màn hình gắn với thiết bị của bạn. Thông tin này có thể được xử lý trên máy tính hoặc được tải lên máy chủ của tổ chức.</translation> <translation id="8288807391153049143">Hiển thị chứng chỉ</translation> <translation id="8289355894181816810">Hãy liên hệ với quản trị viên mạng của bạn nếu bạn không chắc chắn về điều này có ý nghĩa gì.</translation> +<translation id="8292520987784410870">Luôn xác minh?</translation> <translation id="8293206222192510085">Thêm Dấu trang</translation> <translation id="829335040383910391">âm thanh</translation> <translation id="8294431847097064396">Nguồn</translation> @@ -3110,6 +3114,7 @@ <translation id="854892890027593466">Phong bì C6/C5</translation> <translation id="8553387990086529628">Điểm đến du lịch</translation> <translation id="8554010658308662631">Tải thêm</translation> +<translation id="8554802735558319842">Để tăng cường bảo mật cho thiết bị dùng chung, hãy bật tuỳ chọn xác minh mỗi khi bạn thanh toán bằng tính năng tự động điền.</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{Đặt lại quyền}other{Đặt lại quyền}}</translation> <translation id="8555010941760982128">Sử dụng mã này khi thanh toán</translation> <translation id="8557066899867184262">CVC nằm ở mặt sau thẻ của bạn.</translation> @@ -3299,6 +3304,7 @@ <translation id="9048662076076074925">24 x 36 inch</translation> <translation id="9049981332609050619">Bạn đã cố truy cập vào <ph name="DOMAIN" />, nhưng máy chủ cho biết chứng chỉ không hợp lệ.</translation> <translation id="9050666287014529139">Cụm mật khẩu</translation> +<translation id="9053840549256861041">Chúng tôi sắp ra mắt tính năng mới về quyền riêng tư trong quảng cáo có tên là đo lường quảng cáo. Chrome chỉ chia sẻ một số ít thông tin giữa các trang web, chẳng hạn như thời điểm quảng cáo hiển thị với bạn, nhằm giúp các trang web đo lường hiệu suất của quảng cáo.</translation> <translation id="9056953843249698117">Cửa hàng</translation> <translation id="9062620674789239642">Tệp này có thể đã bị di chuyển, chỉnh sửa hoặc xóa.</translation> <translation id="9063398205799684336">Phong bì Kaku 2</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb index 6afe89e..a5bf532 100644 --- a/components/strings/components_strings_zh-CN.xtb +++ b/components/strings/components_strings_zh-CN.xtb
@@ -1196,9 +1196,11 @@ <translation id="3927932062596804919">拒绝</translation> <translation id="393316646445601645">互联网与电信</translation> <translation id="3939773374150895049">要改用 WebAuthn 来取代银行卡验证码 (CVC) 吗?</translation> +<translation id="3941630233824954464">启用强制性身份重新验证</translation> <translation id="3943857333388298514">粘贴</translation> <translation id="3946209740501886391">在该网站上一律询问</translation> <translation id="3947595700203588284">可以询问能否连接到 MIDI 设备</translation> +<translation id="3948588869002647271">此应用不存在或已损坏</translation> <translation id="3949571496842715403">此服务器无法证实它就是 <ph name="DOMAIN" /> - 它的安全证书没有指定主题备用名称。这可能是因为某项配置有误或某个攻击者拦截了您的连接。</translation> <translation id="3949601375789751990">您的浏览记录会显示在此处</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2198,6 +2200,7 @@ <translation id="6370022303958842211">设备访问操作,例如登录(包括登录失败的原因)、退出、锁定和解锁</translation> <translation id="6374469231428023295">重试</translation> <translation id="6374865374745447009">窗口管理</translation> +<translation id="6376881782310775282">无法访问此应用的开发服务器</translation> <translation id="6377268785556383139">1 个与“<ph name="SEARCH_TEXT" />”相符的搜索结果</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">可能产生费用。</translation> @@ -3006,6 +3009,7 @@ <translation id="8286799286781881307">已获管理员授权的应用可截取/录制与设备连接的所有屏幕。所得信息可在本地处理,也可上传到贵组织的服务器。</translation> <translation id="8288807391153049143">显示证书</translation> <translation id="8289355894181816810">如果您不确定这是什么意思,请与您的网络管理员联系。</translation> +<translation id="8292520987784410870">一律验证?</translation> <translation id="8293206222192510085">添加书签</translation> <translation id="829335040383910391">声音</translation> <translation id="8294431847097064396">来源</translation> @@ -3105,6 +3109,7 @@ <translation id="854892890027593466">C6/C5 信封</translation> <translation id="8553387990086529628">旅游目的地</translation> <translation id="8554010658308662631">加载更多</translation> +<translation id="8554802735558319842">为了提高共用设备的安全性,请开启此设置让系统在您每次使用自动填充功能付款时都进行验证。</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{重置这项权限}other{重置这些权限}}</translation> <translation id="8555010941760982128">结账时请使用此促销代码</translation> <translation id="8557066899867184262">银行卡验证码 (CVC) 位于银行卡背面。</translation>
diff --git a/components/strings/components_strings_zh-HK.xtb b/components/strings/components_strings_zh-HK.xtb index a279fb20..9cb4f5c 100644 --- a/components/strings/components_strings_zh-HK.xtb +++ b/components/strings/components_strings_zh-HK.xtb
@@ -1199,9 +1199,11 @@ <translation id="3927932062596804919">拒絕</translation> <translation id="393316646445601645">互聯網和電訊公司</translation> <translation id="3939773374150895049">要使用 WebAuthn 取代 CVC 嗎?</translation> +<translation id="3941630233824954464">啟用強制重新驗證</translation> <translation id="3943857333388298514">貼上</translation> <translation id="3946209740501886391">在此網站上一律詢問</translation> <translation id="3947595700203588284">可要求連接 MIDI 裝置</translation> +<translation id="3948588869002647271">此應用程式遺失或已毀損</translation> <translation id="3949571496842715403">此伺服器無法證明所屬網域為 <ph name="DOMAIN" />;其安全性憑證沒有指定主體替代名稱。這可能是因為設定錯誤,或有攻擊者攔截您的連線。</translation> <translation id="3949601375789751990">您的瀏覽記錄會在這裡顯示</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2202,6 +2204,7 @@ <translation id="6370022303958842211">裝置存取動作,例如登入 (包括失敗的登入原因)、登出、鎖定和解鎖</translation> <translation id="6374469231428023295">再試一次</translation> <translation id="6374865374745447009">視窗管理</translation> +<translation id="6376881782310775282">無法連接此應用程式的開發伺服器</translation> <translation id="6377268785556383139">有 1 個同「<ph name="SEARCH_TEXT" />」相關嘅搜尋結果</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">稍後可能會收費。</translation> @@ -3010,6 +3013,7 @@ <translation id="8286799286781881307">經管理員授權後,應用程式就可擷取連接至裝置的所有螢幕畫面。這些資料可在本機處理,或上載至機構的伺服器。</translation> <translation id="8288807391153049143">顯示憑證</translation> <translation id="8289355894181816810">如果您不確定這是什麼意思,請與網絡管理員聯絡。</translation> +<translation id="8292520987784410870">要一律驗證嗎?</translation> <translation id="8293206222192510085">新增書籤</translation> <translation id="829335040383910391">音效</translation> <translation id="8294431847097064396">來源</translation> @@ -3109,6 +3113,7 @@ <translation id="854892890027593466">C6/C5 信封</translation> <translation id="8553387990086529628">旅遊勝地</translation> <translation id="8554010658308662631">載入更多</translation> +<translation id="8554802735558319842">如要進一步提高共用裝置的安全性,請開啟每次透過自動填入付款時進行驗證。</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{重設權限}other{重設權限}}</translation> <translation id="8555010941760982128">結帳時請使用此宣傳代碼</translation> <translation id="8557066899867184262">信用卡驗證碼 (CVC) 位於信用卡背面。</translation> @@ -3297,7 +3302,7 @@ <translation id="9048662076076074925">24 x 36 吋</translation> <translation id="9049981332609050619">您嘗試連線至 <ph name="DOMAIN" />,但伺服器提供的憑證無效。</translation> <translation id="9050666287014529139">複雜密碼</translation> -<translation id="9053840549256861041">我們即將推出名為「廣告評估」的全新廣告隱私權功能。Chrome 只會在網站之間分享相當有限的資訊 (例如向使用者放送廣告的時段),協助網站評估廣告成效。</translation> +<translation id="9053840549256861041">我們即將推出名為「廣告成效評估」的全新廣告私隱功能。Chrome 只會在網站間分享非常有限的資料 (例如向使用者放送廣告的時段),讓網站評估廣告成效。</translation> <translation id="9056953843249698117">商店</translation> <translation id="9062620674789239642">此檔案可能已被移動、編輯或刪除。</translation> <translation id="9063398205799684336">Kaku 2 信封</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb index f5b8fe9..cf978ca 100644 --- a/components/strings/components_strings_zh-TW.xtb +++ b/components/strings/components_strings_zh-TW.xtb
@@ -1199,9 +1199,11 @@ <translation id="3927932062596804919">拒絕</translation> <translation id="393316646445601645">網際網路與電信</translation> <translation id="3939773374150895049">要使用 WebAuthn 取代信用卡驗證碼嗎?</translation> +<translation id="3941630233824954464">啟用強制重新驗證</translation> <translation id="3943857333388298514">貼上</translation> <translation id="3946209740501886391">一律詢問你是否接受這個網站的要求</translation> <translation id="3947595700203588284">可以要求連線至 MIDI 裝置</translation> +<translation id="3948588869002647271">這個應用程式遺失或已毀損</translation> <translation id="3949571496842715403">這個伺服器無法證明所屬網域為 <ph name="DOMAIN" />;其安全性憑證未指定主體別名。這可能是因為設定錯誤,或是有攻擊者攔截你的連線所致。</translation> <translation id="3949601375789751990">你的瀏覽記錄會顯示在這裡</translation> <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation> @@ -2202,6 +2204,7 @@ <translation id="6370022303958842211">裝置存取動作,例如登入 (包括登入失敗原因)、登出、鎖定和解鎖</translation> <translation id="6374469231428023295">再試一次</translation> <translation id="6374865374745447009">視窗管理</translation> +<translation id="6376881782310775282">無法連上這個應用程式的開發伺服器</translation> <translation id="6377268785556383139">有 1 個與「<ph name="SEARCH_TEXT" />」相符的搜尋結果</translation> <translation id="6380497234672085559">A0</translation> <translation id="6383221683286411806">你要造訪的網站可能會誘導使用者支付額外額外費用。</translation> @@ -3010,6 +3013,7 @@ <translation id="8286799286781881307">應用程式在取得管理員的授權後,就可以擷取連接到裝置的所有螢幕畫面。這項資訊可能會在本機上處理,也可能會上傳到貴機構的伺服器。</translation> <translation id="8288807391153049143">顯示憑證</translation> <translation id="8289355894181816810">如果你不確定這代表什麼意思,請與網路管理員聯絡。</translation> +<translation id="8292520987784410870">一律驗證?</translation> <translation id="8293206222192510085">新增書籤</translation> <translation id="829335040383910391">音訊</translation> <translation id="8294431847097064396">來源</translation> @@ -3109,6 +3113,7 @@ <translation id="854892890027593466">Envelope C6/C5</translation> <translation id="8553387990086529628">旅遊勝地</translation> <translation id="8554010658308662631">載入更多</translation> +<translation id="8554802735558319842">為了提升共用裝置的的安全性,請設定系統在每次透過自動填入功能付款時都進行驗證。</translation> <translation id="8554912124839363479">{NUM_PERMISSIONS,plural, =1{重設權限}other{重設權限}}</translation> <translation id="8555010941760982128">結帳時請使用這個促銷代碼</translation> <translation id="8557066899867184262">信用卡驗證碼位於信用卡背面。</translation>
diff --git a/components/strings/components_strings_zu.xtb b/components/strings/components_strings_zu.xtb index 5f65554..d0363cc 100644 --- a/components/strings/components_strings_zu.xtb +++ b/components/strings/components_strings_zu.xtb
@@ -3300,6 +3300,7 @@ <translation id="9048662076076074925">U-24 x 36 phakathi</translation> <translation id="9049981332609050619">Uzame ukufika ku-<ph name="DOMAIN" />, kodwa iseva iphrezente isitifiketi esingavumelekile.</translation> <translation id="9050666287014529139">Umushwana wokungena</translation> +<translation id="9053840549256861041">Sethula isakhi esisha sobumfihlo besikhangiso esibizwa ngokuthi yisilinganiso sesikhangiso. I-Chrome manje yabelana ngolwazi olukhawulelwe kuphela phakathi kwamasayithi, njengalapho uboniswa khona isikhangiso, ukuze usize amasayithi alinganise ukusebenza kwezikhangiso.</translation> <translation id="9056953843249698117">Isitolo</translation> <translation id="9062620674789239642">Kungenzeka lihanjisiwe, lihleliwe, lisusiwe.</translation> <translation id="9063398205799684336">Imvilophu ye-Kaku 2</translation>
diff --git a/components/sync/engine/model_type_worker.cc b/components/sync/engine/model_type_worker.cc index 23b9b995..e087635 100644 --- a/components/sync/engine/model_type_worker.cc +++ b/components/sync/engine/model_type_worker.cc
@@ -619,7 +619,6 @@ // other types wait for the cycle to complete before applying any updates. // Note that the initial sync technically isn't started/done yet but by the // time this value is persisted to disk on the model thread it will be. - model_type_state_.set_initial_sync_done_deprecated(true); if (cycle_done) { model_type_state_.set_initial_sync_state( sync_pb::ModelTypeState_InitialSyncState_INITIAL_SYNC_DONE);
diff --git a/components/sync/model/client_tag_based_model_type_processor.cc b/components/sync/model/client_tag_based_model_type_processor.cc index b3c07097..eba17dc 100644 --- a/components/sync/model/client_tag_based_model_type_processor.cc +++ b/components/sync/model/client_tag_based_model_type_processor.cc
@@ -172,7 +172,6 @@ if (CommitOnlyTypes().Has(type_)) { // For commit-only types, no updates are expected. - model_type_state.set_initial_sync_done_deprecated(true); model_type_state.set_initial_sync_state( sync_pb::ModelTypeState_InitialSyncState_INITIAL_SYNC_UNNECESSARY); OnFullUpdateReceived(model_type_state, UpdateResponseDataList(),
diff --git a/components/sync/protocol/autofill_specifics.proto b/components/sync/protocol/autofill_specifics.proto index eff1632c..ee40460 100644 --- a/components/sync/protocol/autofill_specifics.proto +++ b/components/sync/protocol/autofill_specifics.proto
@@ -114,6 +114,7 @@ optional string address_home_zip = 11; optional string address_home_country = 12; optional string address_home_landmark = 67; + optional string address_home_between_streets = 69; // Additional address fields for i18n. optional string address_home_street_address = 17; @@ -134,6 +135,7 @@ optional VerificationStatus address_home_zip_status = 45; optional VerificationStatus address_home_country_status = 46; optional VerificationStatus address_home_landmark_status = 68; + optional VerificationStatus address_home_between_streets_status = 70; optional VerificationStatus address_home_street_address_status = 47; optional VerificationStatus address_home_sorting_code_status = 48; optional VerificationStatus address_home_dependent_locality_status = 49;
diff --git a/components/sync/protocol/contact_info_specifics.proto b/components/sync/protocol/contact_info_specifics.proto index 646699f..cbd9d846 100644 --- a/components/sync/protocol/contact_info_specifics.proto +++ b/components/sync/protocol/contact_info_specifics.proto
@@ -117,6 +117,7 @@ optional StringToken address_zip = 19; optional StringToken address_country = 20; optional StringToken address_landmark = 41; + optional StringToken address_between_streets = 42; // Additional address fields for i18n. // Includes all of the lines of a street address, including newlines, e.g.
diff --git a/components/sync/protocol/model_type_state.proto b/components/sync/protocol/model_type_state.proto index 8ca4b85b..dc5197bb 100644 --- a/components/sync/protocol/model_type_state.proto +++ b/components/sync/protocol/model_type_state.proto
@@ -52,12 +52,10 @@ // data to the server using the new encryption key. optional string encryption_key_name = 3; - // This flag is set to true when the first download cycle is complete. The - // ModelTypeProcessor should not attempt to commit any items until this - // flag is set. // Deprecated in M113 and replaced by `initial_sync_state`. - // TODO(crbug.com/1423338): Fully remove this field after a grace period, once - // we're confident `initial_sync_state` won't get reverted. + // As of M115, this is not populated anymore, but existing values are still + // migrated to `initial_sync_state`. + // TODO(crbug.com/1423338): Fully remove this field after a migration period. optional bool initial_sync_done_deprecated = 4 [deprecated = true]; // Indicates the status of "initial sync", i.e. whether the first download
diff --git a/components/sync/protocol/model_type_state_helper.cc b/components/sync/protocol/model_type_state_helper.cc index f565ad8..78c4a41 100644 --- a/components/sync/protocol/model_type_state_helper.cc +++ b/components/sync/protocol/model_type_state_helper.cc
@@ -33,6 +33,9 @@ bool MigrateLegacyInitialSyncDone(sync_pb::ModelTypeState& model_type_state, ModelType type) { + // TODO(crbug.com/1423338): This migration logic was added in M113. Remove it + // after a grace period of a year or so (M124ish). + if (model_type_state.has_initial_sync_state()) { // Already migrated; nothing to do here. return false;
diff --git a/components/sync/protocol/proto_visitors.h b/components/sync/protocol/proto_visitors.h index 50c3c02..3d1da88 100644 --- a/components/sync/protocol/proto_visitors.h +++ b/components/sync/protocol/proto_visitors.h
@@ -226,6 +226,7 @@ VISIT(address_home_zip); VISIT(address_home_country); VISIT(address_home_landmark); + VISIT(address_home_between_streets); VISIT(address_home_street_address); VISIT(address_home_sorting_code); VISIT(address_home_dependent_locality); @@ -240,6 +241,7 @@ VISIT_ENUM(address_home_zip_status); VISIT_ENUM(address_home_country_status); VISIT_ENUM(address_home_landmark_status); + VISIT_ENUM(address_home_between_streets_status); VISIT_ENUM(address_home_street_address_status); VISIT_ENUM(address_home_sorting_code_status); VISIT_ENUM(address_home_dependent_locality_status); @@ -343,6 +345,7 @@ VISIT(address_apt_num); VISIT(address_floor); VISIT(address_landmark); + VISIT(address_between_streets); VISIT(phone_home_whole_number); VISIT(birthdate_day); VISIT(birthdate_month);
diff --git a/components/sync_preferences/dual_layer_user_pref_store.cc b/components/sync_preferences/dual_layer_user_pref_store.cc index 9d87ada..3aa6dae 100644 --- a/components/sync_preferences/dual_layer_user_pref_store.cc +++ b/components/sync_preferences/dual_layer_user_pref_store.cc
@@ -160,7 +160,8 @@ base::Value::Dict DualLayerUserPrefStore::GetValues() const { base::Value::Dict values = local_pref_store_->GetValues(); - for (auto [pref_name, account_value] : account_pref_store_->GetValues()) { + + for (const std::string& pref_name : GetPrefNamesInAccountStore()) { const base::Value* value = nullptr; // GetValue() will merge the value if needed. GetValue(pref_name, &value); @@ -437,7 +438,7 @@ } // Clear all synced preferences from the account store. - for (auto [pref_name, pref_value] : account_pref_store_->GetValues()) { + for (const std::string& pref_name : GetPrefNamesInAccountStore()) { if (!IsPrefKeySyncable(pref_name)) { // The write flags only affect persistence, and the account store is in // memory only. @@ -561,4 +562,42 @@ account_pref_store_observer_.initialization_succeeded(); } +std::vector<std::string> DualLayerUserPrefStore::GetPrefNamesInAccountStore() + const { + std::vector<std::string> keys; + + if (!pref_model_associator_client_) { + return keys; + } + + // GetValues() returns a dict which is set using SetByDottedPaths(). That + // means, a key "a.b.c" is presented as: `{'a': {'b': {'c': ... }}}`. This + // util recurses over the nested dicts with keys being joined with a dot, till + // the string forms a valid pref name, for eg. it will recurse with keys, "a", + // "a.b", and then "a.b.c" which was the original key. + auto recurse_and_insert = [&](const std::string& key, + const base::Value& value, + auto& recurse_and_insert_ref) -> void { + // Checks if `key` is a pref name using syncable pref database. This is + // different from IsPrefKeySyncable() which checks whether or not a pref + // should synced right now based on enabled ModelTypes. + // TODO(crbug.com/1446256): Consider renaming IsPrefKeySyncable() to + // ShouldSyncPrefKey() to make intent more clear. + if (pref_model_associator_client_->GetSyncablePrefsDatabase() + .IsPreferenceSyncable(key)) { + keys.push_back(key); + } else if (value.is_dict()) { + for (auto [k, v] : value.GetDict()) { + recurse_and_insert_ref(key + "." + k, v, recurse_and_insert_ref); + } + } + }; + + for (auto [key, value] : account_pref_store_->GetValues()) { + recurse_and_insert(key, value, recurse_and_insert); + } + + return keys; +} + } // namespace sync_preferences
diff --git a/components/sync_preferences/dual_layer_user_pref_store.h b/components/sync_preferences/dual_layer_user_pref_store.h index e978264..2db1e2c3 100644 --- a/components/sync_preferences/dual_layer_user_pref_store.h +++ b/components/sync_preferences/dual_layer_user_pref_store.h
@@ -142,6 +142,9 @@ base::Value value, uint32_t flags) const; + // Get all prefs currently present in the account store. + std::vector<std::string> GetPrefNamesInAccountStore() const; + // The two underlying pref stores, scoped to this device/profile and to the // user's signed-in account, respectively. const scoped_refptr<PersistentPrefStore> local_pref_store_;
diff --git a/components/sync_preferences/dual_layer_user_pref_store_unittest.cc b/components/sync_preferences/dual_layer_user_pref_store_unittest.cc index 0c39d59a..2b40402 100644 --- a/components/sync_preferences/dual_layer_user_pref_store_unittest.cc +++ b/components/sync_preferences/dual_layer_user_pref_store_unittest.cc
@@ -22,11 +22,11 @@ namespace { -constexpr char kPref1[] = "pref1"; -constexpr char kPref2[] = "pref2"; -constexpr char kPref3[] = "pref3"; -constexpr char kPrefName[] = "pref"; -constexpr char kPriorityPrefName[] = "priority-pref"; +constexpr char kPref1[] = "regular.pref1"; +constexpr char kPref2[] = "regular.pref2"; +constexpr char kPref3[] = "regular.pref3"; +constexpr char kPrefName[] = "regular.pref"; +constexpr char kPriorityPrefName[] = "priority.pref"; constexpr char kNonExistentPrefName[] = "nonexistent-pref"; constexpr char kNonSyncablePrefName[] = "nonsyncable-pref"; @@ -44,7 +44,7 @@ const std::vector<std::pair<std::string, std::string>>& values) { base::Value::Dict dict; for (const auto& [key, value] : values) { - dict.Set(key, value); + dict.SetByDottedPath(key, value); } return base::Value(std::move(dict)); } @@ -83,6 +83,17 @@ return testing::AssertionSuccess(); } +testing::AssertionResult ValueInDictByDottedPathIs( + const base::Value::Dict& dict, + const std::string& key, + const base::Value& expected_value) { + if (const base::Value* actual_value = dict.FindByDottedPath(key); + actual_value && *actual_value == expected_value) { + return testing::AssertionSuccess(); + } + return testing::AssertionFailure(); +} + class MockPrefStoreObserver : public PrefStore::Observer { public: ~MockPrefStoreObserver() override = default; @@ -351,10 +362,12 @@ base::Value::Dict expected_values; // For the pref that exists in both stores, the account value should take // precedence. - expected_values.Set(kPref1, "account_value1"); + expected_values.SetByDottedPath(kPref1, "account_value1"); // For the prefs that only exist in one store, their value should be returned. - expected_values.Set(kPref2, "local_value2"); - expected_values.Set(kPref3, "account_value3"); + expected_values.SetByDottedPath(kPref2, "local_value2"); + expected_values.SetByDottedPath(kPref3, "account_value3"); + // TODO(crbug.com/1446256): Also set expectations for GetValue() since + // GetValues() isn't used outside of tests and may not test the real codepath. EXPECT_EQ(store()->GetValues(), expected_values); } @@ -996,8 +1009,8 @@ } // Uses GetValues(). { - ASSERT_TRUE(store()->GetValues().contains(kPref1)); - EXPECT_EQ(*store()->GetValues().Find(kPref1), account_value); + EXPECT_TRUE( + ValueInDictByDottedPathIs(store()->GetValues(), kPref1, account_value)); } // List prefs. @@ -1024,8 +1037,8 @@ } // Uses GetValues(). { - ASSERT_TRUE(store()->GetValues().contains(kPref2)); - EXPECT_EQ(*store()->GetValues().Find(kPref2), account_list); + EXPECT_TRUE( + ValueInDictByDottedPathIs(store()->GetValues(), kPref2, account_list)); } // Dictionary prefs. @@ -1056,8 +1069,8 @@ } // Uses GetValues(). { - ASSERT_TRUE(store()->GetValues().contains(kPref3)); - EXPECT_EQ(*store()->GetValues().Find(kPref3), account_dict); + EXPECT_TRUE( + ValueInDictByDottedPathIs(store()->GetValues(), kPref3, account_dict)); } // The local and the account stores are left untouched. EXPECT_TRUE( @@ -1105,8 +1118,8 @@ } // Uses GetValues(). { - ASSERT_TRUE(store()->GetValues().contains(kPref1)); - EXPECT_EQ(*store()->GetValues().Find(kPref1), merged_list); + EXPECT_TRUE( + ValueInDictByDottedPathIs(store()->GetValues(), kPref1, merged_list)); } // The local and the account stores are left untouched. @@ -1148,8 +1161,8 @@ } // Uses GetValues(). { - ASSERT_TRUE(store()->GetValues().contains(kPref1)); - EXPECT_EQ(*store()->GetValues().Find(kPref1), merged_dict); + EXPECT_TRUE( + ValueInDictByDottedPathIs(store()->GetValues(), kPref1, merged_dict)); } // The local and the account stores are left untouched. @@ -1186,8 +1199,8 @@ } // Uses GetValues(). { - ASSERT_TRUE(store()->GetValues().contains(kPref1)); - EXPECT_EQ(*store()->GetValues().Find(kPref1), merged_value); + EXPECT_TRUE( + ValueInDictByDottedPathIs(store()->GetValues(), kPref1, merged_value)); } // The local and the account stores are left untouched.
diff --git a/components/vector_icons/BUILD.gn b/components/vector_icons/BUILD.gn index 085c572f..2f551e3c 100644 --- a/components/vector_icons/BUILD.gn +++ b/components/vector_icons/BUILD.gn
@@ -166,6 +166,7 @@ "settings.icon", "settings_chrome_refresh.icon", "settings_outline.icon", + "shopping_bag.icon", "sms.icon", "submenu_arrow.icon", "submenu_arrow_chrome_refresh.icon",
diff --git a/components/vector_icons/shopping_bag.icon b/components/vector_icons/shopping_bag.icon new file mode 100644 index 0000000..47f83aa --- /dev/null +++ b/components/vector_icons/shopping_bag.icon
@@ -0,0 +1,59 @@ +// 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. + +CANVAS_DIMENSIONS, 10, +MOVE_TO, 1.4f, 13.4f, +CUBIC_TO, 1.07f, 13.4f, 0.78f, 13.28f, 0.55f, 13.05f, +CUBIC_TO, 0.32f, 12.82f, 0.2f, 12.53f, 0.2f, 12.2f, +V_LINE_TO, 4.6f, +CUBIC_TO, 0.2f, 4.27f, 0.32f, 3.98f, 0.55f, 3.75f, +CUBIC_TO, 0.78f, 3.52f, 1.07f, 3.4f, 1.4f, 3.4f, +H_LINE_TO, 2.6f, +V_LINE_TO, 3.13f, +CUBIC_TO, 2.6f, 2.48f, 2.81f, 1.9f, 3.23f, 1.4f, +CUBIC_TO, 3.67f, 0.9f, 4.21f, 0.63f, 4.87f, 0.6f, +CUBIC_TO, 5.57f, 0.57f, 6.16f, 0.79f, 6.65f, 1.27f, +CUBIC_TO, 7.15f, 1.73f, 7.4f, 2.31f, 7.4f, 3, +V_LINE_TO, 3.4f, +H_LINE_TO, 8.6f, +CUBIC_TO, 8.93f, 3.4f, 9.22f, 3.52f, 9.45f, 3.75f, +CUBIC_TO, 9.68f, 3.98f, 9.8f, 4.27f, 9.8f, 4.6f, +V_LINE_TO, 12.2f, +CUBIC_TO, 9.8f, 12.53f, 9.68f, 12.82f, 9.45f, 13.05f, +CUBIC_TO, 9.22f, 13.28f, 8.93f, 13.4f, 8.6f, 13.4f, +H_LINE_TO, 1.4f, +CLOSE, +MOVE_TO, 1.4f, 12.2f, +H_LINE_TO, 8.6f, +V_LINE_TO, 4.6f, +H_LINE_TO, 7.4f, +V_LINE_TO, 5.6f, +CUBIC_TO, 7.4f, 5.77f, 7.34f, 5.91f, 7.22f, 6.03f, +CUBIC_TO, 7.11f, 6.14f, 6.97f, 6.2f, 6.8f, 6.2f, +CUBIC_TO, 6.63f, 6.2f, 6.49f, 6.14f, 6.37f, 6.03f, +CUBIC_TO, 6.26f, 5.91f, 6.2f, 5.77f, 6.2f, 5.6f, +V_LINE_TO, 4.6f, +H_LINE_TO, 3.8f, +V_LINE_TO, 5.6f, +CUBIC_TO, 3.8f, 5.77f, 3.74f, 5.91f, 3.62f, 6.03f, +CUBIC_TO, 3.51f, 6.14f, 3.37f, 6.2f, 3.2f, 6.2f, +CUBIC_TO, 3.03f, 6.2f, 2.89f, 6.14f, 2.77f, 6.03f, +CUBIC_TO, 2.66f, 5.91f, 2.6f, 5.77f, 2.6f, 5.6f, +V_LINE_TO, 4.6f, +H_LINE_TO, 1.4f, +V_LINE_TO, 12.2f, +CLOSE, +MOVE_TO, 3.8f, 3.4f, +H_LINE_TO, 6.2f, +V_LINE_TO, 3, +CUBIC_TO, 6.2f, 2.67f, 6.08f, 2.38f, 5.85f, 2.15f, +CUBIC_TO, 5.62f, 1.92f, 5.33f, 1.8f, 5, 1.8f, +CUBIC_TO, 4.67f, 1.8f, 4.38f, 1.92f, 4.15f, 2.15f, +CUBIC_TO, 3.92f, 2.38f, 3.8f, 2.67f, 3.8f, 3, +V_LINE_TO, 3.4f, +CLOSE, +MOVE_TO, 1.4f, 12.2f, +V_LINE_TO, 4.6f, +V_LINE_TO, 12.2f, +CLOSE
diff --git a/components/viz/common/gpu/dawn_context_provider.cc b/components/viz/common/gpu/dawn_context_provider.cc index eaf748e49..79d77072 100644 --- a/components/viz/common/gpu/dawn_context_provider.cc +++ b/components/viz/common/gpu/dawn_context_provider.cc
@@ -37,7 +37,7 @@ wgpu::BackendType GetDefaultBackendType() { #if BUILDFLAG(IS_WIN) - return wgpu::BackendType::D3D12; + return wgpu::BackendType::D3D11; #elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) return wgpu::BackendType::Vulkan; #elif BUILDFLAG(IS_MAC) @@ -69,6 +69,10 @@ DawnContextProvider::~DawnContextProvider() = default; wgpu::Device DawnContextProvider::CreateDevice(wgpu::BackendType type) { +#if DCHECK_IS_ON() + instance_.EnableBackendValidation(true); +#endif + instance_.DiscoverDefaultAdapters(); DawnProcTable backend_procs = dawn::native::GetProcs(); dawnProcSetProcs(&backend_procs);
diff --git a/components/viz/host/gpu_host_impl.cc b/components/viz/host/gpu_host_impl.cc index 173d9f1..7b05b2a 100644 --- a/components/viz/host/gpu_host_impl.cc +++ b/components/viz/host/gpu_host_impl.cc
@@ -33,6 +33,10 @@ #include "base/android/build_info.h" #endif +#if BUILDFLAG(IS_CHROMEOS_LACROS) +#include "base/system/sys_info.h" +#endif + #if BUILDFLAG(IS_WIN) #include "ui/gfx/win/rendering_window_manager.h" #elif BUILDFLAG(IS_MAC) @@ -420,6 +424,13 @@ std::string build_fp = base::android::BuildInfo::GetInstance()->android_build_fp(); shader_prefix_key_ += "-" + build_fp; +#elif BUILDFLAG(IS_CHROMEOS_LACROS) + // ChromeOS can update independently of Lacros and the GPU driver + // information is not enough to ensure blob compatibility. See + // crbug.com/1444684 + std::string chromeos_version = base::SysInfo::OperatingSystemName() + " " + + base::SysInfo::OperatingSystemVersion(); + shader_prefix_key_ += "-" + chromeos_version; #endif }
diff --git a/components/viz/service/display_embedder/skia_output_device_dcomp.cc b/components/viz/service/display_embedder/skia_output_device_dcomp.cc index 76e5fe44..668301e 100644 --- a/components/viz/service/display_embedder/skia_output_device_dcomp.cc +++ b/components/viz/service/display_embedder/skia_output_device_dcomp.cc
@@ -83,7 +83,9 @@ CHECK(representation_); if (!access_) { access_ = representation_->BeginScopedReadAccess(); - CHECK(access_); + if (!access_) { + return absl::nullopt; + } } return access_->GetDCLayerOverlayImage(); }
diff --git a/content/browser/attribution_reporting/attribution_config.cc b/content/browser/attribution_reporting/attribution_config.cc index 556ebd7..97e5800 100644 --- a/content/browser/attribution_reporting/attribution_config.cc +++ b/content/browser/attribution_reporting/attribution_config.cc
@@ -15,7 +15,7 @@ return false; } - if (max_destinations_per_source_site_reporting_origin <= 0) { + if (max_destinations_per_source_site_reporting_site <= 0) { return false; }
diff --git a/content/browser/attribution_reporting/attribution_config.h b/content/browser/attribution_reporting/attribution_config.h index a49d936e..0638181 100644 --- a/content/browser/attribution_reporting/attribution_config.h +++ b/content/browser/attribution_reporting/attribution_config.h
@@ -32,7 +32,7 @@ int64_t max_attribution_reporting_origins = 10; // Maximum number of attributions for a given <source site, destination - // site, reporting origin> in `time_window`. + // site, reporting site> in `time_window`. int64_t max_attributions = 100; // When adding new members, the corresponding `Validate()` definition and @@ -123,8 +123,8 @@ // Controls the maximum number of distinct attribution destinations that can // be in storage at any time for sources with the same <source site, reporting - // origin>. - int max_destinations_per_source_site_reporting_origin = 100; + // site>. + int max_destinations_per_source_site_reporting_site = 100; RateLimitConfig rate_limit; EventLevelLimit event_level_limit;
diff --git a/content/browser/attribution_reporting/attribution_debug_report.cc b/content/browser/attribution_reporting/attribution_debug_report.cc index 314bea3..7efdc48 100644 --- a/content/browser/attribution_reporting/attribution_debug_report.cc +++ b/content/browser/attribution_reporting/attribution_debug_report.cc
@@ -274,7 +274,7 @@ switch (data_type) { case DebugDataType::kSourceDestinationLimit: SetLimit(data_body, - result.max_destinations_per_source_site_reporting_origin); + result.max_destinations_per_source_site_reporting_site); break; case DebugDataType::kSourceStorageLimit: SetLimit(data_body, result.max_sources_per_origin);
diff --git a/content/browser/attribution_reporting/attribution_debug_report_unittest.cc b/content/browser/attribution_reporting/attribution_debug_report_unittest.cc index 6290bc16..7248e6f1 100644 --- a/content/browser/attribution_reporting/attribution_debug_report_unittest.cc +++ b/content/browser/attribution_reporting/attribution_debug_report_unittest.cc
@@ -47,7 +47,7 @@ StoreSourceResult( StorableSource::Result::kInsufficientUniqueDestinationCapacity, /*min_fake_report_time=*/absl::nullopt, - /*max_destinations_per_source_site_reporting_origin=*/3))); + /*max_destinations_per_source_site_reporting_site=*/3))); EXPECT_FALSE(AttributionDebugReport::Create( TriggerBuilder().Build(), @@ -66,7 +66,7 @@ StoreSourceResult( StorableSource::Result::kInsufficientUniqueDestinationCapacity, /*min_fake_report_time=*/absl::nullopt, - /*max_destinations_per_source_site_reporting_origin=*/3)); + /*max_destinations_per_source_site_reporting_site=*/3)); ASSERT_TRUE(report); static constexpr char kExpectedJsonString[] = R"([{ @@ -86,7 +86,7 @@ TEST(AttributionDebugReportTest, WithinFencedFrame_NoDebugReport) { AttributionConfig config; - config.max_destinations_per_source_site_reporting_origin = 3; + config.max_destinations_per_source_site_reporting_site = 3; EXPECT_FALSE(AttributionDebugReport::Create( SourceBuilder() @@ -97,7 +97,7 @@ StoreSourceResult( StorableSource::Result::kInsufficientUniqueDestinationCapacity, /*min_fake_report_time=*/absl::nullopt, - /*max_destinations_per_source_site_reporting_origin=*/3))); + /*max_destinations_per_source_site_reporting_site=*/3))); EXPECT_FALSE(AttributionDebugReport::Create( TriggerBuilder() @@ -113,14 +113,14 @@ TEST(AttributionDebugReportTest, SourceDebugging) { const struct { StorableSource::Result result; - absl::optional<int> max_destinations_per_source_site_reporting_origin; + absl::optional<int> max_destinations_per_source_site_reporting_site; absl::optional<int> max_sources_per_origin; absl::optional<uint64_t> debug_key; const char* expected_report_body_without_cookie; const char* expected_report_body_with_cookie; } kTestCases[] = { {StorableSource::Result::kSuccess, - /*max_destinations_per_source_site_reporting_origin=*/absl::nullopt, + /*max_destinations_per_source_site_reporting_site=*/absl::nullopt, /*max_sources_per_origin=*/absl::nullopt, /*debug_key=*/absl::nullopt, /*expected_report_body_without_cookie=*/nullptr, @@ -133,7 +133,7 @@ "type": "source-success" }])json"}, {StorableSource::Result::kInternalError, - /*max_destinations_per_source_site_reporting_origin=*/absl::nullopt, + /*max_destinations_per_source_site_reporting_site=*/absl::nullopt, /*max_sources_per_origin=*/absl::nullopt, /*debug_key=*/456, /*expected_report_body_without_cookie=*/nullptr, @@ -148,7 +148,7 @@ "type": "source-unknown-error" }])json"}, {StorableSource::Result::kInsufficientSourceCapacity, - /*max_destinations_per_source_site_reporting_origin=*/absl::nullopt, + /*max_destinations_per_source_site_reporting_site=*/absl::nullopt, /*max_sources_per_origin=*/10, /*debug_key=*/absl::nullopt, /*expected_report_body_without_cookie=*/nullptr, @@ -163,13 +163,13 @@ "type": "source-storage-limit" }])json"}, {StorableSource::Result::kProhibitedByBrowserPolicy, - /*max_destinations_per_source_site_reporting_origin=*/absl::nullopt, + /*max_destinations_per_source_site_reporting_site=*/absl::nullopt, /*max_sources_per_origin=*/absl::nullopt, /*debug_key=*/absl::nullopt, /*expected_report_body_without_cookie=*/nullptr, /*expected_report_body_with_cookie=*/nullptr}, {StorableSource::Result::kInsufficientUniqueDestinationCapacity, - /*max_destinations_per_source_site_reporting_origin=*/3, + /*max_destinations_per_source_site_reporting_site=*/3, /*max_sources_per_origin=*/absl::nullopt, /*debug_key=*/absl::nullopt, /*expected_report_body_without_cookie=*/ @@ -193,7 +193,7 @@ "type": "source-destination-limit" }])json"}, {StorableSource::Result::kSuccessNoised, - /*max_destinations_per_source_site_reporting_origin=*/absl::nullopt, + /*max_destinations_per_source_site_reporting_site=*/absl::nullopt, /*max_sources_per_origin=*/absl::nullopt, /*debug_key=*/absl::nullopt, /*expected_report_body_without_cookie=*/nullptr, @@ -207,7 +207,7 @@ "type": "source-noised" }])json"}, {StorableSource::Result::kExcessiveReportingOrigins, - /*max_destinations_per_source_site_reporting_origin=*/absl::nullopt, + /*max_destinations_per_source_site_reporting_site=*/absl::nullopt, /*max_sources_per_origin=*/absl::nullopt, /*debug_key=*/789, /*expected_report_body_without_cookie=*/nullptr, @@ -235,7 +235,7 @@ StoreSourceResult( test_case.result, /*min_fake_report_time=*/absl::nullopt, - test_case.max_destinations_per_source_site_reporting_origin, + test_case.max_destinations_per_source_site_reporting_site, test_case.max_sources_per_origin)); const char* expected_report_body = is_debug_cookie_set ? test_case.expected_report_body_with_cookie @@ -265,7 +265,7 @@ StoreSourceResult( StorableSource::Result::kSuccessNoised, /*min_fake_report_time=*/absl::nullopt, - /*max_destinations_per_source_site_reporting_origin=*/ + /*max_destinations_per_source_site_reporting_site=*/ absl::nullopt, /*max_sources_per_origin=*/absl::nullopt));
diff --git a/content/browser/attribution_reporting/attribution_interop_parser.cc b/content/browser/attribution_reporting/attribution_interop_parser.cc index 63d6e39..e7b513a 100644 --- a/content/browser/attribution_reporting/attribution_interop_parser.cc +++ b/content/browser/attribution_reporting/attribution_interop_parser.cc
@@ -135,9 +135,8 @@ ParseInt(dict, "max_sources_per_origin", config.max_sources_per_origin, required); - ParseInt(dict, "max_destinations_per_source_site_reporting_origin", - config.max_destinations_per_source_site_reporting_origin, - required); + ParseInt(dict, "max_destinations_per_source_site_reporting_site", + config.max_destinations_per_source_site_reporting_site, required); int rate_limit_time_window; if (ParseInt(dict, "rate_limit_time_window", rate_limit_time_window,
diff --git a/content/browser/attribution_reporting/attribution_interop_parser_unittest.cc b/content/browser/attribution_reporting/attribution_interop_parser_unittest.cc index 24f9cc2..241135a8 100644 --- a/content/browser/attribution_reporting/attribution_interop_parser_unittest.cc +++ b/content/browser/attribution_reporting/attribution_interop_parser_unittest.cc
@@ -582,9 +582,9 @@ {R"json({})json", false, AttributionConfig()}, {R"json({"max_sources_per_origin":"100"})json", false, AttributionConfig{.max_sources_per_origin = 100}}, - {R"json({"max_destinations_per_source_site_reporting_origin":"100"})json", + {R"json({"max_destinations_per_source_site_reporting_site":"100"})json", false, - AttributionConfig{.max_destinations_per_source_site_reporting_origin = + AttributionConfig{.max_destinations_per_source_site_reporting_site = 100}}, {R"json({"rate_limit_time_window":"30"})json", false, AttributionConfig{.rate_limit = {.time_window = base::Days(30)}}}, @@ -631,7 +631,7 @@ AttributionConfig{.aggregate_limit = {.delay_span = base::TimeDelta()}}}, {R"json({ "max_sources_per_origin":"10", - "max_destinations_per_source_site_reporting_origin":"10", + "max_destinations_per_source_site_reporting_site":"10", "rate_limit_time_window":"10", "rate_limit_max_source_registration_reporting_origins":"20", "rate_limit_max_attribution_reporting_origins":"15", @@ -650,7 +650,7 @@ true, AttributionConfig{ .max_sources_per_origin = 10, - .max_destinations_per_source_site_reporting_origin = 10, + .max_destinations_per_source_site_reporting_site = 10, .rate_limit = {.time_window = base::Days(10), .max_source_registration_reporting_origins = 20, .max_attribution_reporting_origins = 15, @@ -685,7 +685,7 @@ TEST(AttributionInteropParserTest, InvalidConfigPositiveIntegers) { const char* const kFields[] = { "max_sources_per_origin", - "max_destinations_per_source_site_reporting_origin", + "max_destinations_per_source_site_reporting_site", "rate_limit_time_window", "rate_limit_max_source_registration_reporting_origins", "rate_limit_max_attribution_reporting_origins",
diff --git a/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc b/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc index 8f48d4a3..f47714f7 100644 --- a/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc +++ b/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc
@@ -2738,7 +2738,7 @@ protected: void ConfigureStorageDelegate( ConfigurableStorageDelegate& delegate) const override { - delegate.set_max_destinations_per_source_site_reporting_origin(1); + delegate.set_max_destinations_per_source_site_reporting_site(1); } };
diff --git a/content/browser/attribution_reporting/attribution_report_network_sender_unittest.cc b/content/browser/attribution_reporting/attribution_report_network_sender_unittest.cc index 1f3c25c..54099b6 100644 --- a/content/browser/attribution_reporting/attribution_report_network_sender_unittest.cc +++ b/content/browser/attribution_reporting/attribution_report_network_sender_unittest.cc
@@ -795,7 +795,7 @@ StoreSourceResult( StorableSource::Result::kInsufficientUniqueDestinationCapacity, /*min_fake_report_time=*/absl::nullopt, - /*max_destinations_per_source_site_reporting_origin=*/3)); + /*max_destinations_per_source_site_reporting_site=*/3)); ASSERT_TRUE(report); base::MockCallback<AttributionReportSender::DebugReportSentCallback> callback; @@ -828,7 +828,7 @@ StoreSourceResult( StorableSource::Result::kInsufficientUniqueDestinationCapacity, /*min_fake_report_time=*/absl::nullopt, - /*max_destinations_per_source_site_reporting_origin=*/3)); + /*max_destinations_per_source_site_reporting_site=*/3)); ASSERT_TRUE(report); base::MockCallback<AttributionReportSender::DebugReportSentCallback> callback;
diff --git a/content/browser/attribution_reporting/attribution_src_browsertest.cc b/content/browser/attribution_reporting/attribution_src_browsertest.cc index 0b96b2e..b665775 100644 --- a/content/browser/attribution_reporting/attribution_src_browsertest.cc +++ b/content/browser/attribution_reporting/attribution_src_browsertest.cc
@@ -566,9 +566,9 @@ JsReplace("createAttributionSrcImg($1);", register_url))); register_response1->WaitForRequest(); - ASSERT_EQ(register_response1->http_request()->headers.at( - "Attribution-Reporting-Eligible"), - "event-source, trigger"); + ExpectValidAttributionReportingEligibleHeaderForImg( + register_response1->http_request()->headers.at( + "Attribution-Reporting-Eligible")); ASSERT_FALSE(base::Contains(register_response1->http_request()->headers, "Attribution-Reporting-Support")); @@ -580,9 +580,9 @@ // Ensure that redirect requests also contain the header. register_response2->WaitForRequest(); - ASSERT_EQ(register_response2->http_request()->headers.at( - "Attribution-Reporting-Eligible"), - "event-source, trigger"); + ExpectValidAttributionReportingEligibleHeaderForImg( + register_response2->http_request()->headers.at( + "Attribution-Reporting-Eligible")); ASSERT_FALSE(base::Contains(register_response2->http_request()->headers, "Attribution-Reporting-Support")); } @@ -1192,9 +1192,9 @@ JsReplace("createAttributionSrcImg($1);", register_url))); register_response1->WaitForRequest(); - ASSERT_EQ(register_response1->http_request()->headers.at( - "Attribution-Reporting-Eligible"), - "event-source, trigger"); + ExpectValidAttributionReportingEligibleHeaderForImg( + register_response1->http_request()->headers.at( + "Attribution-Reporting-Eligible")); ASSERT_FALSE(base::Contains(register_response1->http_request()->headers, "Attribution-Reporting-Support")); @@ -1207,9 +1207,9 @@ // Ensure that redirect requests also don't contain the // Attribution-Reporting-Support header. register_response2->WaitForRequest(); - ASSERT_EQ(register_response2->http_request()->headers.at( - "Attribution-Reporting-Eligible"), - "event-source, trigger"); + ExpectValidAttributionReportingEligibleHeaderForImg( + register_response2->http_request()->headers.at( + "Attribution-Reporting-Eligible")); ASSERT_FALSE(base::Contains(register_response2->http_request()->headers, "Attribution-Reporting-Support")); }
diff --git a/content/browser/attribution_reporting/attribution_storage_delegate.cc b/content/browser/attribution_reporting/attribution_storage_delegate.cc index 7b3fa12..e7d0075 100644 --- a/content/browser/attribution_reporting/attribution_storage_delegate.cc +++ b/content/browser/attribution_reporting/attribution_storage_delegate.cc
@@ -51,10 +51,10 @@ } } -int AttributionStorageDelegate::GetMaxDestinationsPerSourceSiteReportingOrigin() +int AttributionStorageDelegate::GetMaxDestinationsPerSourceSiteReportingSite() const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - return config_.max_destinations_per_source_site_reporting_origin; + return config_.max_destinations_per_source_site_reporting_site; } AttributionConfig::RateLimitConfig AttributionStorageDelegate::GetRateLimits()
diff --git a/content/browser/attribution_reporting/attribution_storage_delegate.h b/content/browser/attribution_reporting/attribution_storage_delegate.h index b7645253..5a8db35 100644 --- a/content/browser/attribution_reporting/attribution_storage_delegate.h +++ b/content/browser/attribution_reporting/attribution_storage_delegate.h
@@ -92,8 +92,8 @@ // Returns the maximum number of distinct attribution destinations that can // be in storage at any time for sources with the same <source site, - // reporting origin>. - int GetMaxDestinationsPerSourceSiteReportingOrigin() const; + // reporting site>. + int GetMaxDestinationsPerSourceSiteReportingSite() const; // Returns the rate limits for capping contributions per window. AttributionConfig::RateLimitConfig GetRateLimits() const;
diff --git a/content/browser/attribution_reporting/attribution_storage_sql.cc b/content/browser/attribution_reporting/attribution_storage_sql.cc index 5175883..a764ef7 100644 --- a/content/browser/attribution_reporting/attribution_storage_sql.cc +++ b/content/browser/attribution_reporting/attribution_storage_sql.cc
@@ -691,7 +691,7 @@ return StoreSourceResult( StorableSource::Result::kInsufficientSourceCapacity, /*min_fake_report_time=*/absl::nullopt, - /*max_destinations_per_source_site_reporting_origin=*/absl::nullopt, + /*max_destinations_per_source_site_reporting_site=*/absl::nullopt, delegate_->GetMaxSourcesPerOrigin()); } @@ -703,7 +703,7 @@ return StoreSourceResult( StorableSource::Result::kInsufficientUniqueDestinationCapacity, /*min_fake_report_time=*/absl::nullopt, - delegate_->GetMaxDestinationsPerSourceSiteReportingOrigin()); + delegate_->GetMaxDestinationsPerSourceSiteReportingSite()); case RateLimitResult::kError: return StoreSourceResult(StorableSource::Result::kInternalError); }
diff --git a/content/browser/attribution_reporting/attribution_storage_sql.h b/content/browser/attribution_reporting/attribution_storage_sql.h index bda68295..b583149 100644 --- a/content/browser/attribution_reporting/attribution_storage_sql.h +++ b/content/browser/attribution_reporting/attribution_storage_sql.h
@@ -44,11 +44,11 @@ class CONTENT_EXPORT AttributionStorageSql : public AttributionStorage { public: // Version number of the database. - static constexpr int kCurrentVersionNumber = 53; + static constexpr int kCurrentVersionNumber = 54; // Earliest version which can use a `kCurrentVersionNumber` database // without failing. - static constexpr int kCompatibleVersionNumber = 53; + static constexpr int kCompatibleVersionNumber = 54; // Latest version of the database that cannot be upgraded to // `kCurrentVersionNumber` without razing the database.
diff --git a/content/browser/attribution_reporting/attribution_storage_sql_migrations.cc b/content/browser/attribution_reporting/attribution_storage_sql_migrations.cc index 0ea591d..3aecdc0 100644 --- a/content/browser/attribution_reporting/attribution_storage_sql_migrations.cc +++ b/content/browser/attribution_reporting/attribution_storage_sql_migrations.cc
@@ -8,10 +8,13 @@ #include "base/metrics/histogram_functions.h" #include "base/time/time.h" #include "content/browser/attribution_reporting/attribution_storage_sql.h" +#include "content/browser/attribution_reporting/sql_utils.h" +#include "net/base/schemeful_site.h" #include "sql/database.h" #include "sql/meta_table.h" #include "sql/statement.h" #include "sql/transaction.h" +#include "url/origin.h" namespace content { @@ -136,6 +139,91 @@ return true; } +bool To54(sql::Database& db) { + static constexpr char kRateLimitTableSql[] = + "CREATE TABLE new_rate_limits(" + "id INTEGER PRIMARY KEY NOT NULL," + "scope INTEGER NOT NULL," + "source_id INTEGER NOT NULL," + "source_site TEXT NOT NULL," + "destination_site TEXT NOT NULL," + "context_origin TEXT NOT NULL," + "reporting_origin TEXT NOT NULL," + "reporting_site TEXT NOT NULL," + "time INTEGER NOT NULL," + "source_expiry_or_attribution_time INTEGER NOT NULL)"; + if (!db.Execute(kRateLimitTableSql)) { + return false; + } + + static constexpr char kPopulateSql[] = + "INSERT INTO new_rate_limits SELECT " + "id,scope,source_id,source_site,destination_site,context_origin," + "reporting_origin,'',time,source_expiry_or_attribution_time " + "FROM rate_limits"; + if (!db.Execute(kPopulateSql)) { + return false; + } + + if (!db.Execute("DROP TABLE rate_limits")) { + return false; + } + + if (!db.Execute("ALTER TABLE new_rate_limits RENAME TO rate_limits")) { + return false; + } + + static constexpr char kGetReportingOriginSql[] = + "SELECT id,reporting_origin FROM rate_limits"; + sql::Statement get_statement(db.GetUniqueStatement(kGetReportingOriginSql)); + + static constexpr char kSetReportingSiteSql[] = + "UPDATE rate_limits SET reporting_site=? WHERE id=?"; + sql::Statement set_statement(db.GetUniqueStatement(kSetReportingSiteSql)); + + while (get_statement.Step()) { + int64_t id = get_statement.ColumnInt64(0); + auto reporting_origin = DeserializeOrigin(get_statement.ColumnString(1)); + + set_statement.Reset(/*clear_bound_vars=*/true); + set_statement.BindString(0, + net::SchemefulSite(reporting_origin).Serialize()); + set_statement.BindInt64(1, id); + if (!set_statement.Run()) { + return false; + } + } + if (!get_statement.Succeeded()) { + return false; + } + + static constexpr char kRateLimitSourceSiteReportingSiteIndexSql[] = + "CREATE INDEX rate_limit_source_site_reporting_site_idx " + "ON rate_limits(source_site,reporting_site)" + "WHERE scope=0"; + if (!db.Execute(kRateLimitSourceSiteReportingSiteIndexSql)) { + return false; + } + + static constexpr char kRateLimitReportingOriginIndexSql[] = + "CREATE INDEX rate_limit_reporting_origin_idx " + "ON rate_limits(scope,destination_site,source_site)"; + if (!db.Execute(kRateLimitReportingOriginIndexSql)) { + return false; + } + + static constexpr char kRateLimitTimeIndexSql[] = + "CREATE INDEX rate_limit_time_idx ON rate_limits(time)"; + if (!db.Execute(kRateLimitTimeIndexSql)) { + return false; + } + + static constexpr char kRateLimitImpressionIdIndexSql[] = + "CREATE INDEX rate_limit_source_id_idx " + "ON rate_limits(source_id)"; + return db.Execute(kRateLimitImpressionIdIndexSql); +} + } // namespace bool UpgradeAttributionStorageSqlSchema(sql::Database& db, @@ -148,12 +236,13 @@ static_assert(AttributionStorageSql::kDeprecatedVersionNumber + 1 == 52, "Remove migration(s) below."); - bool ok = MaybeMigrate(db, meta_table, 52, &To53); + bool ok = MaybeMigrate(db, meta_table, 52, &To53) && // + MaybeMigrate(db, meta_table, 53, &To54); if (!ok) { return false; } - static_assert(AttributionStorageSql::kCurrentVersionNumber == 53, + static_assert(AttributionStorageSql::kCurrentVersionNumber == 54, "Add migration(s) above."); if (base::ThreadTicks::IsSupported()) {
diff --git a/content/browser/attribution_reporting/attribution_storage_sql_migrations_unittest.cc b/content/browser/attribution_reporting/attribution_storage_sql_migrations_unittest.cc index e8f8e77..9fa5f2620 100644 --- a/content/browser/attribution_reporting/attribution_storage_sql_migrations_unittest.cc +++ b/content/browser/attribution_reporting/attribution_storage_sql_migrations_unittest.cc
@@ -249,4 +249,44 @@ histograms.ExpectTotalCount("Conversions.Storage.MigrationTime", 1); } +TEST_F(AttributionStorageSqlMigrationsTest, MigrateVersion53ToCurrent) { + base::HistogramTester histograms; + LoadDatabase(GetVersionFilePath(53), DbPath()); + + // Verify pre-conditions. + { + sql::Database db; + ASSERT_TRUE(db.Open(DbPath())); + + sql::Statement s( + db.GetUniqueStatement("SELECT reporting_origin FROM rate_limits")); + ASSERT_TRUE(s.Step()); + ASSERT_EQ("https://a.r.test", s.ColumnString(0)); + } + MigrateDatabase(); + + // Verify schema is current. + { + sql::Database db; + ASSERT_TRUE(db.Open(DbPath())); + + CheckVersionNumbers(&db); + + // Compare normalized schemas + EXPECT_EQ(NormalizeSchema(GetCurrentSchema()), + NormalizeSchema(db.GetSchema())); + + // Verify that data is preserved across the migration. + sql::Statement s( + db.GetUniqueStatement("SELECT reporting_site FROM rate_limits")); + ASSERT_TRUE(s.Step()); + ASSERT_EQ("https://r.test", s.ColumnString(0)); + ASSERT_FALSE(s.Step()); + } + + // DB creation histograms should be recorded. + histograms.ExpectTotalCount("Conversions.Storage.CreationTime", 0); + histograms.ExpectTotalCount("Conversions.Storage.MigrationTime", 1); +} + } // namespace content
diff --git a/content/browser/attribution_reporting/attribution_storage_sql_query_plans_unittest.cc b/content/browser/attribution_reporting/attribution_storage_sql_query_plans_unittest.cc index 5f3bc04..5ec15ea 100644 --- a/content/browser/attribution_reporting/attribution_storage_sql_query_plans_unittest.cc +++ b/content/browser/attribution_reporting/attribution_storage_sql_query_plans_unittest.cc
@@ -134,8 +134,6 @@ const auto plan = GetPlan(attribution_queries::kGetRateLimitDataKeysSql, SqlFullScanReason::kIntentional); ASSERT_TRUE(plan.has_value()); - EXPECT_THAT(plan.value(), - UsesCoveringIndex("rate_limit_source_site_reporting_origin_idx")); } TEST_F(AttributionSqlQueryPlanTest, kCountReportsForDestinationSql) { @@ -202,8 +200,8 @@ const auto plan = GetPlan(attribution_queries::kRateLimitSourceAllowedSql); ASSERT_TRUE(plan.has_value()); EXPECT_THAT(plan.value(), - UsesIndex("rate_limit_source_site_reporting_origin_idx", - {"scope", "source_site", "reporting_origin"})); + UsesIndex("rate_limit_source_site_reporting_site_idx", + {"source_site", "reporting_site"})); } TEST_F(AttributionSqlQueryPlanTest, kRateLimitSelectReportingOriginsSql) {
diff --git a/content/browser/attribution_reporting/attribution_storage_sql_unittest.cc b/content/browser/attribution_reporting/attribution_storage_sql_unittest.cc index 433b66b..bfa010e 100644 --- a/content/browser/attribution_reporting/attribution_storage_sql_unittest.cc +++ b/content/browser/attribution_reporting/attribution_storage_sql_unittest.cc
@@ -354,7 +354,7 @@ // [impression_origin_idx], [sources_by_source_time], // [reports_by_report_time], [reports_by_source_id_report_type], // [reports_by_trigger_time], [reports_by_reporting_origin], - // [rate_limit_source_site_reporting_origin_idx], + // [rate_limit_source_site_reporting_site_idx], // [rate_limit_reporting_origin_idx], [rate_limit_time_idx], // [rate_limit_impression_id_idx], [sources_by_destination_site], and the // meta table index.
diff --git a/content/browser/attribution_reporting/attribution_storage_unittest.cc b/content/browser/attribution_reporting/attribution_storage_unittest.cc index 87df3151..33242ee 100644 --- a/content/browser/attribution_reporting/attribution_storage_unittest.cc +++ b/content/browser/attribution_reporting/attribution_storage_unittest.cc
@@ -1309,8 +1309,8 @@ } TEST_F(AttributionStorageTest, - MaxDestinationsPerSource_ScopedToSourceSiteAndReportingOrigin) { - delegate()->set_max_destinations_per_source_site_reporting_origin(3); + MaxDestinationsPerSource_ScopedToSourceSiteAndReportingSite) { + delegate()->set_max_destinations_per_source_site_reporting_site(3); const auto store_source = [&](const char* source_origin, const char* reporting_origin, @@ -1348,13 +1348,17 @@ store_source("https://s2.test", "https://a.r.test", "https://d5.test"); EXPECT_THAT(storage()->GetActiveSources(), SizeIs(5)); - // This should succeed because the reporting origin is different. + // This should fail because the reporting site is already present. store_source("https://s1.test", "https://b.r.test", "https://d5.test"); + EXPECT_THAT(storage()->GetActiveSources(), SizeIs(5)); + + // This should succeed because the reporting site is different. + store_source("https://s1.test", "https://a.r1.test", "https://d5.test"); EXPECT_THAT(storage()->GetActiveSources(), SizeIs(6)); } TEST_F(AttributionStorageTest, DestinationLimit_ApplyLimit) { - delegate()->set_max_destinations_per_source_site_reporting_origin(1); + delegate()->set_max_destinations_per_source_site_reporting_site(1); delegate()->set_delete_expired_sources_frequency(base::Milliseconds(10)); const base::TimeDelta expiry = base::Milliseconds(5); @@ -1410,7 +1414,7 @@ TEST_F(AttributionStorageTest, MaxAttributionDestinationsPerSource_AppliesToNavigationSources) { - delegate()->set_max_destinations_per_source_site_reporting_origin(1); + delegate()->set_max_destinations_per_source_site_reporting_site(1); storage()->StoreSource( SourceBuilder() .SetDestinationSites( @@ -1427,7 +1431,7 @@ TEST_F(AttributionStorageTest, MaxAttributionDestinationsPerSource_CountsAllSourceTypes) { - delegate()->set_max_destinations_per_source_site_reporting_origin(1); + delegate()->set_max_destinations_per_source_site_reporting_site(1); storage()->StoreSource( SourceBuilder() .SetDestinationSites( @@ -1442,14 +1446,14 @@ .Build()); EXPECT_EQ(result.status, StorableSource::Result::kInsufficientUniqueDestinationCapacity); - EXPECT_EQ(result.max_destinations_per_source_site_reporting_origin, 1); + EXPECT_EQ(result.max_destinations_per_source_site_reporting_site, 1); EXPECT_THAT(storage()->GetActiveSources(), SizeIs(1)); } TEST_F(AttributionStorageTest, MaxAttributionDestinationsPerSource_CountsUnexpiredSources) { - delegate()->set_max_destinations_per_source_site_reporting_origin(1); + delegate()->set_max_destinations_per_source_site_reporting_site(1); delegate()->set_delete_expired_rate_limits_frequency(base::Milliseconds(10)); const base::TimeDelta expiry = base::Milliseconds(5); @@ -1485,7 +1489,7 @@ TEST_F(AttributionStorageTest, MaxAttributionDestinationsPerSource_SourceWithTooManyDestinations) { - delegate()->set_max_destinations_per_source_site_reporting_origin(1); + delegate()->set_max_destinations_per_source_site_reporting_site(1); storage()->StoreSource( SourceBuilder()
diff --git a/content/browser/attribution_reporting/attribution_test_utils.cc b/content/browser/attribution_reporting/attribution_test_utils.cc index 1161ff3..4916aa8 100644 --- a/content/browser/attribution_reporting/attribution_test_utils.cc +++ b/content/browser/attribution_reporting/attribution_test_utils.cc
@@ -38,8 +38,10 @@ #include "content/public/browser/attribution_data_model.h" #include "net/base/net_errors.h" #include "net/base/schemeful_site.h" +#include "net/http/structured_headers.h" #include "services/network/public/cpp/trigger_verification.h" #include "services/network/public/cpp/trigger_verification_test_utils.h" +#include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/numeric/int128.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "url/gurl.h" @@ -1171,4 +1173,51 @@ << ",type=" << r.GetType() << "}"; } +namespace { + +void CheckAttributionReportingEligibleHeader( + const std::string& header, + const std::vector<std::string>& required_keys, + const std::vector<std::string>& prohibited_keys) { + auto dict = net::structured_headers::ParseDictionary(header); + EXPECT_TRUE(dict.has_value()); + if (!dict.has_value()) { + return; + } + + for (const auto& key : required_keys) { + EXPECT_TRUE(dict->contains(key)) << key; + } + + for (const auto& key : prohibited_keys) { + EXPECT_FALSE(dict->contains(key)) << key; + } +} + +} // namespace + +void ExpectValidAttributionReportingEligibleHeaderForEventBeacon( + const std::string& header) { + CheckAttributionReportingEligibleHeader( + header, + /*required_keys=*/{"event-source"}, + /*prohibited_keys=*/{"navigation-source", "trigger"}); +} + +void ExpectValidAttributionReportingEligibleHeaderForImg( + const std::string& header) { + CheckAttributionReportingEligibleHeader( + header, + /*required_keys=*/{"event-source", "trigger"}, + /*prohibited_keys=*/{"navigation-source"}); +} + +void ExpectValidAttributionReportingEligibleHeaderForNavigation( + const std::string& header) { + CheckAttributionReportingEligibleHeader( + header, + /*required_keys=*/{"navigation-source"}, + /*prohibited_keys=*/{"event-source", "trigger"}); +} + } // namespace content
diff --git a/content/browser/attribution_reporting/attribution_test_utils.h b/content/browser/attribution_reporting/attribution_test_utils.h index d55fea7c..c215eead 100644 --- a/content/browser/attribution_reporting/attribution_test_utils.h +++ b/content/browser/attribution_reporting/attribution_test_utils.h
@@ -737,6 +737,13 @@ std::ostream& operator<<(std::ostream&, const OsRegistration&); +void ExpectValidAttributionReportingEligibleHeaderForEventBeacon( + const std::string& header); +void ExpectValidAttributionReportingEligibleHeaderForImg( + const std::string& header); +void ExpectValidAttributionReportingEligibleHeaderForNavigation( + const std::string& header); + } // namespace content #endif // CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_TEST_UTILS_H_
diff --git a/content/browser/attribution_reporting/attributions_browsertest.cc b/content/browser/attribution_reporting/attributions_browsertest.cc index a343d767..3c2ae22 100644 --- a/content/browser/attribution_reporting/attributions_browsertest.cc +++ b/content/browser/attribution_reporting/attributions_browsertest.cc
@@ -596,9 +596,9 @@ // Verify the navigation redirects contain the eligibility header. register_response1->WaitForRequest(); - EXPECT_EQ(register_response1->http_request()->headers.at( - "Attribution-Reporting-Eligible"), - "navigation-source"); + ExpectValidAttributionReportingEligibleHeaderForNavigation( + register_response1->http_request()->headers.at( + "Attribution-Reporting-Eligible")); EXPECT_FALSE(base::Contains(register_response1->http_request()->headers, "Attribution-Reporting-Support")); @@ -610,9 +610,9 @@ // Ensure that redirect requests also contain the header. register_response2->WaitForRequest(); - ASSERT_EQ(register_response2->http_request()->headers.at( - "Attribution-Reporting-Eligible"), - "navigation-source"); + ExpectValidAttributionReportingEligibleHeaderForNavigation( + register_response2->http_request()->headers.at( + "Attribution-Reporting-Eligible")); ASSERT_FALSE(base::Contains(register_response2->http_request()->headers, "Attribution-Reporting-Support")); } @@ -1234,9 +1234,9 @@ // Verify the navigation redirects contain the eligibility header. register_response1->WaitForRequest(); - ASSERT_EQ(register_response1->http_request()->headers.at( - "Attribution-Reporting-Eligible"), - "navigation-source"); + ExpectValidAttributionReportingEligibleHeaderForNavigation( + register_response1->http_request()->headers.at( + "Attribution-Reporting-Eligible")); ASSERT_FALSE(base::Contains(register_response1->http_request()->headers, "Attribution-Reporting-Support")); @@ -1249,9 +1249,9 @@ // Ensure that redirect requests also don't contain the // Attribution-Reporting-Support header. register_response2->WaitForRequest(); - EXPECT_EQ(register_response2->http_request()->headers.at( - "Attribution-Reporting-Eligible"), - "navigation-source"); + ExpectValidAttributionReportingEligibleHeaderForNavigation( + register_response2->http_request()->headers.at( + "Attribution-Reporting-Eligible")); EXPECT_FALSE(base::Contains(register_response2->http_request()->headers, "Attribution-Reporting-Support")); }
diff --git a/content/browser/attribution_reporting/rate_limit_table.cc b/content/browser/attribution_reporting/rate_limit_table.cc index 632d0bfb..a040f71 100644 --- a/content/browser/attribution_reporting/rate_limit_table.cc +++ b/content/browser/attribution_reporting/rate_limit_table.cc
@@ -63,20 +63,22 @@ "destination_site TEXT NOT NULL," "context_origin TEXT NOT NULL," "reporting_origin TEXT NOT NULL," + "reporting_site TEXT NOT NULL," "time INTEGER NOT NULL," "source_expiry_or_attribution_time INTEGER NOT NULL)"; if (!db->Execute(kRateLimitTableSql)) { return false; } - static_assert(static_cast<int>(Scope::kAttribution) == 1, - "update `scope=1` clause below"); + static_assert(static_cast<int>(Scope::kSource) == 0, + "update `scope=0` clause below"); // Optimizes calls to `SourceAllowedForDestinationLimit()`. - static constexpr char kRateLimitSourceSiteReportingOriginIndexSql[] = - "CREATE INDEX rate_limit_source_site_reporting_origin_idx " - "ON rate_limits(scope,source_site,reporting_origin)"; - if (!db->Execute(kRateLimitSourceSiteReportingOriginIndexSql)) { + static constexpr char kRateLimitSourceSiteReportingSiteIndexSql[] = + "CREATE INDEX rate_limit_source_site_reporting_site_idx " + "ON rate_limits(source_site,reporting_site)" + "WHERE scope=0"; + if (!db->Execute(kRateLimitSourceSiteReportingSiteIndexSql)) { return false; } @@ -153,8 +155,8 @@ static constexpr char kStoreRateLimitSql[] = "INSERT INTO rate_limits" "(scope,source_id,source_site,destination_site,context_origin," - "reporting_origin,time,source_expiry_or_attribution_time)" - "VALUES(?,?,?,?,?,?,?,?)"; + "reporting_origin,reporting_site,time,source_expiry_or_attribution_time)" + "VALUES(?,?,?,?,?,?,?,?,?)"; sql::Statement statement( db->GetCachedStatement(SQL_FROM_HERE, kStoreRateLimitSql)); @@ -163,8 +165,10 @@ statement.BindString(2, common_info.source_site().Serialize()); statement.BindString(4, context_origin.Serialize()); statement.BindString(5, common_info.reporting_origin().Serialize()); - statement.BindTime(6, source.source_time()); - statement.BindTime(7, source_expiry_or_attribution_time); + statement.BindString( + 6, net::SchemefulSite(common_info.reporting_origin()).Serialize()); + statement.BindTime(7, source.source_time()); + statement.BindTime(8, source_expiry_or_attribution_time); const base::flat_set<net::SchemefulSite>* destination_sites = &source.destination_sites().destinations(); @@ -213,7 +217,8 @@ statement.BindString( 0, net::SchemefulSite(attribution_info.context_origin).Serialize()); statement.BindString(1, common_info.source_site().Serialize()); - statement.BindString(2, common_info.reporting_origin().Serialize()); + statement.BindString( + 2, net::SchemefulSite(common_info.reporting_origin()).Serialize()); statement.BindTime(3, min_timestamp); if (!statement.Step()) { @@ -253,10 +258,11 @@ const CommonSourceInfo& common_info = source.common_info(); statement.BindString(0, common_info.source_site().Serialize()); - statement.BindString(1, common_info.reporting_origin().Serialize()); + statement.BindString( + 1, net::SchemefulSite(common_info.reporting_origin()).Serialize()); statement.BindTime(2, source_time); - const int limit = delegate_->GetMaxDestinationsPerSourceSiteReportingOrigin(); + const int limit = delegate_->GetMaxDestinationsPerSourceSiteReportingSite(); DCHECK_GT(limit, 0); base::flat_set<net::SchemefulSite> destination_sites =
diff --git a/content/browser/attribution_reporting/rate_limit_table_unittest.cc b/content/browser/attribution_reporting/rate_limit_table_unittest.cc index 9caf9e9..23757863 100644 --- a/content/browser/attribution_reporting/rate_limit_table_unittest.cc +++ b/content/browser/attribution_reporting/rate_limit_table_unittest.cc
@@ -292,14 +292,14 @@ RateLimitResult::kAllowed}, {RateLimitInput::Attribution("https://b.s1.test", "https://b.d1.test", - "https://a.r.test", now), + "https://b.r.test", now), RateLimitResult::kAllowed}, // This is not allowed because - // <https://s1.test, https://d1.test, https://a.r.test> already has the + // <https://s1.test, https://d1.test, https://r.test> already has the // maximum of 2 attributions. {RateLimitInput::Attribution("https://b.s1.test", "https://b.d1.test", - "https://a.r.test", now), + "https://b.r.test", now), RateLimitResult::kNotAllowed}, // This is allowed because the source site is different. @@ -312,9 +312,9 @@ "https://a.r.test", now), RateLimitResult::kAllowed}, - // This is allowed because the reporting origin is different. + // This is allowed because the reporting site is different. {RateLimitInput::Attribution("https://a.s1.test", "https://d2.test", - "https://b.r.test", now), + "https://r2.test", now), RateLimitResult::kAllowed}, }; @@ -923,7 +923,7 @@ } TEST_F(RateLimitTableTest, SourceAllowedForDestinationLimit) { - delegate_.set_max_destinations_per_source_site_reporting_origin(2); + delegate_.set_max_destinations_per_source_site_reporting_site(2); const base::Time now = base::Time::Now(); const base::TimeDelta expiry = base::Milliseconds(30);
diff --git a/content/browser/attribution_reporting/sql_queries.h b/content/browser/attribution_reporting/sql_queries.h index 2356341..69547b5e 100644 --- a/content/browser/attribution_reporting/sql_queries.h +++ b/content/browser/attribution_reporting/sql_queries.h
@@ -166,14 +166,14 @@ "WHERE scope=1 " "AND destination_site=? " "AND source_site=? " - "AND reporting_origin=? " + "AND reporting_site=? " "AND time>?"; inline constexpr const char kRateLimitSourceAllowedSql[] = "SELECT destination_site FROM rate_limits " "WHERE scope=0 " "AND source_site=? " - "AND reporting_origin=? " + "AND reporting_site=? " "AND source_expiry_or_attribution_time>?"; inline constexpr const char kRateLimitSelectReportingOriginsSql[] =
diff --git a/content/browser/attribution_reporting/store_source_result.cc b/content/browser/attribution_reporting/store_source_result.cc index 0609ece6..4a095b3 100644 --- a/content/browser/attribution_reporting/store_source_result.cc +++ b/content/browser/attribution_reporting/store_source_result.cc
@@ -14,14 +14,14 @@ StoreSourceResult::StoreSourceResult( attribution_reporting::mojom::StoreSourceResult status, absl::optional<base::Time> min_fake_report_time, - absl::optional<int> max_destinations_per_source_site_reporting_origin, + absl::optional<int> max_destinations_per_source_site_reporting_site, absl::optional<int> max_sources_per_origin) : status(status), min_fake_report_time(min_fake_report_time), - max_destinations_per_source_site_reporting_origin( - max_destinations_per_source_site_reporting_origin), + max_destinations_per_source_site_reporting_site( + max_destinations_per_source_site_reporting_site), max_sources_per_origin(max_sources_per_origin) { - DCHECK(!max_destinations_per_source_site_reporting_origin.has_value() || + DCHECK(!max_destinations_per_source_site_reporting_site.has_value() || status == attribution_reporting::mojom::StoreSourceResult:: kInsufficientUniqueDestinationCapacity); DCHECK(!max_sources_per_origin.has_value() ||
diff --git a/content/browser/attribution_reporting/store_source_result.h b/content/browser/attribution_reporting/store_source_result.h index c8343c1..ebe0516 100644 --- a/content/browser/attribution_reporting/store_source_result.h +++ b/content/browser/attribution_reporting/store_source_result.h
@@ -16,7 +16,7 @@ explicit StoreSourceResult( attribution_reporting::mojom::StoreSourceResult status, absl::optional<base::Time> min_fake_report_time = absl::nullopt, - absl::optional<int> max_destinations_per_source_site_reporting_origin = + absl::optional<int> max_destinations_per_source_site_reporting_site = absl::nullopt, absl::optional<int> max_sources_per_origin = absl::nullopt); @@ -36,7 +36,7 @@ // Only populated in case of // `attribution_reporting::mojom::StoreSourceResult::kInsufficientUniqueDestinationCapacity`. - absl::optional<int> max_destinations_per_source_site_reporting_origin; + absl::optional<int> max_destinations_per_source_site_reporting_site; // Only populated in case of // `attribution_reporting::mojom::StoreSourceResult::kInsufficientSourceCapacity`.
diff --git a/content/browser/attribution_reporting/test/configurable_storage_delegate.cc b/content/browser/attribution_reporting/test/configurable_storage_delegate.cc index 4db3df32..dfead185 100644 --- a/content/browser/attribution_reporting/test/configurable_storage_delegate.cc +++ b/content/browser/attribution_reporting/test/configurable_storage_delegate.cc
@@ -29,7 +29,7 @@ ConfigurableStorageDelegate::ConfigurableStorageDelegate() : AttributionStorageDelegate(AttributionConfig{ .max_sources_per_origin = std::numeric_limits<int>::max(), - .max_destinations_per_source_site_reporting_origin = + .max_destinations_per_source_site_reporting_site = std::numeric_limits<int>::max(), .rate_limit = { @@ -186,9 +186,9 @@ } void ConfigurableStorageDelegate:: - set_max_destinations_per_source_site_reporting_origin(int max) { + set_max_destinations_per_source_site_reporting_site(int max) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - config_.max_destinations_per_source_site_reporting_origin = max; + config_.max_destinations_per_source_site_reporting_site = max; } void ConfigurableStorageDelegate::set_aggregatable_budget_per_source(
diff --git a/content/browser/attribution_reporting/test/configurable_storage_delegate.h b/content/browser/attribution_reporting/test/configurable_storage_delegate.h index a48cd53..68f2726 100644 --- a/content/browser/attribution_reporting/test/configurable_storage_delegate.h +++ b/content/browser/attribution_reporting/test/configurable_storage_delegate.h
@@ -57,7 +57,7 @@ void set_max_reports_per_destination(AttributionReport::Type, int max); - void set_max_destinations_per_source_site_reporting_origin(int max); + void set_max_destinations_per_source_site_reporting_site(int max); void set_aggregatable_budget_per_source(int64_t max);
diff --git a/content/browser/bluetooth/OWNERS b/content/browser/bluetooth/OWNERS index 3610b9e..fc2b272 100644 --- a/content/browser/bluetooth/OWNERS +++ b/content/browser/bluetooth/OWNERS
@@ -1,2 +1,3 @@ reillyg@chromium.org chengweih@chromium.org +mattreynolds@chromium.org
diff --git a/content/browser/client_hints/client_hints.cc b/content/browser/client_hints/client_hints.cc index af902215..1eee468 100644 --- a/content/browser/client_hints/client_hints.cc +++ b/content/browser/client_hints/client_hints.cc
@@ -1147,6 +1147,31 @@ third_party_url, response_headers, type, true); } + // Note that if Sec-CH-UA-Reduced or Sec-CH-UA-Full is persisted for an + // embedded frame and the response has a valid origin trial token, we should + // append the hint to Accept-CH cache instead of overwrite existing Accept-CH + // cache. + // + // TODO(crbug.com/1258063): Delete this call when the UserAgentReduction + // Origin Trial is finished. + if (!frame_tree_node->IsMainFrame()) { + // If embedded frame has no valid origin trial token, then stop update the + // Accept-CH cache. + if (!enabled_hints.IsEnabled(WebClientHintsType::kUAReduced) && + !enabled_hints.IsEnabled(WebClientHintsType::kFullUserAgent)) { + return absl::nullopt; + } + + // Add existing client hints to the enabled hints which contains the origin + // trial client hints to update the Accept-CH cache. + blink::EnabledClientHints existing_hints; + DCHECK(delegate); + delegate->GetAllowedClientHintsFromSource(origin, &existing_hints); + for (const WebClientHintsType type : existing_hints.GetEnabledHints()) { + enabled_hints.SetIsEnabled(type, true); + } + } + const std::vector<WebClientHintsType> persisted_hints = enabled_hints.GetEnabledHints(); DCHECK(frame_tree_node);
diff --git a/content/browser/client_hints/client_hints_unittest.cc b/content/browser/client_hints/client_hints_unittest.cc index 5aa2e55..436cdc10 100644 --- a/content/browser/client_hints/client_hints_unittest.cc +++ b/content/browser/client_hints/client_hints_unittest.cc
@@ -310,7 +310,7 @@ absl::nullopt, "sec-ch-ua-full", sub_frame_node, - absl::make_optional(ClientHintsVector{}), + absl::nullopt, {}}, {"Response with valid origin trial for main frame", kValidOriginTrialToken, @@ -361,4 +361,54 @@ } } +TEST_F(ClientHintsTest, SubFrameOptInOriginTrail) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitWithFeatures({blink::features::kUserAgentClientHint}, + {}); + + GURL url = GURL(ClientHintsTest::kOriginUrl); + contents()->NavigateAndCommit(url); + FrameTree& frame_tree = contents()->GetPrimaryFrameTree(); + FrameTreeNode* main_frame_node = frame_tree.root(); + AddOneChildNode(); + FrameTreeNode* sub_frame_node = main_frame_node->child_at(0); + + blink::UserAgentMetadata ua_metadata; + MockClientHintsControllerDelegate delegate(ua_metadata); + + // Persist existing hint to accept-ch cache. + ClientHintsVector existing_hints = ClientHintsVector{ + WebClientHintsType::kUAPlatform, WebClientHintsType::kUABitness}; + delegate.PersistClientHints(url::Origin::Create(url), + main_frame_node->GetParentOrOuterDocument(), + existing_hints); + auto response_headers = + base::MakeRefCounted<net::HttpResponseHeaders>("HTTP/1.1 200 OK\n"); + std::string accept_ch_str = "sec-ch-ua-full"; + + // Without valid origin trial token for sub_frame_node, it should not + // overwrite existing hints. + auto actual_updated_hints = ParseAndPersist( + url, response_headers.get(), accept_ch_str, sub_frame_node, &delegate); + + EXPECT_EQ(absl::nullopt, actual_updated_hints); + blink::EnabledClientHints current_hints; + delegate.GetAllowedClientHintsFromSource(url::Origin::Create(url), + ¤t_hints); + EXPECT_EQ(existing_hints, current_hints.GetEnabledHints()); + + // With valid origin trial token for sub_frame_node, it should append origin + // trial client hints to existing client hints cache. + response_headers->SetHeader("Origin-Trial", kValidOriginTrialToken); + actual_updated_hints = ParseAndPersist( + url, response_headers.get(), accept_ch_str, sub_frame_node, &delegate); + auto expect_update_hints = ClientHintsVector{ + WebClientHintsType::kUAPlatform, WebClientHintsType::kUABitness, + WebClientHintsType::kFullUserAgent}; + EXPECT_EQ(expect_update_hints, actual_updated_hints); + delegate.GetAllowedClientHintsFromSource(url::Origin::Create(url), + ¤t_hints); + EXPECT_EQ(expect_update_hints, current_hints.GetEnabledHints()); +} + } // namespace content
diff --git a/content/browser/client_hints/critical_client_hints_throttle.cc b/content/browser/client_hints/critical_client_hints_throttle.cc index 4850d3e..a2e086c 100644 --- a/content/browser/client_hints/critical_client_hints_throttle.cc +++ b/content/browser/client_hints/critical_client_hints_throttle.cc
@@ -177,6 +177,7 @@ for (auto modified_header : modified_headers.GetHeaderVector()) { if (!initial_request_headers_.HasHeader(modified_header.key)) { LogCriticalCHStatus(CriticalCHRestart::kNavigationRestarted); + delegate_->DidRestartForCriticalClientHint(); delegate_->RestartWithURLResetAndFlags(/*additional_load_flags=*/0); return; }
diff --git a/content/browser/fenced_frame/fenced_frame_browsertest.cc b/content/browser/fenced_frame/fenced_frame_browsertest.cc index f3c5f22..72f9c8f 100644 --- a/content/browser/fenced_frame/fenced_frame_browsertest.cc +++ b/content/browser/fenced_frame/fenced_frame_browsertest.cc
@@ -20,6 +20,7 @@ #include "components/ukm/test_ukm_recorder.h" #include "content/browser/attribution_reporting/attribution_manager.h" #include "content/browser/attribution_reporting/attribution_os_level_manager.h" +#include "content/browser/attribution_reporting/attribution_test_utils.h" #include "content/browser/attribution_reporting/test/mock_content_browser_client.h" #include "content/browser/back_forward_cache_browsertest.h" #include "content/browser/fenced_frame/fenced_frame.h" @@ -4982,9 +4983,9 @@ } // Verify the request contains the eligibility header. if (step.expect_attribution_reporting_allowed) { - EXPECT_EQ(response.http_request()->headers.at( - "Attribution-Reporting-Eligible"), - "event-source"); + ExpectValidAttributionReportingEligibleHeaderForEventBeacon( + response.http_request()->headers.at( + "Attribution-Reporting-Eligible")); } else { EXPECT_FALSE(base::Contains(response.http_request()->headers, "Attribution-Reporting-Eligible")); @@ -5512,9 +5513,9 @@ // Verify the request has the correct content. EXPECT_EQ(reporting_response.http_request()->content, event_data); // Verify the request contains the eligibility header. - EXPECT_EQ(reporting_response.http_request()->headers.at( - "Attribution-Reporting-Eligible"), - "event-source"); + ExpectValidAttributionReportingEligibleHeaderForEventBeacon( + reporting_response.http_request()->headers.at( + "Attribution-Reporting-Eligible")); EXPECT_FALSE(base::Contains(reporting_response.http_request()->headers, "Attribution-Reporting-Support")); } @@ -5600,9 +5601,8 @@ EXPECT_EQ(response.http_request()->content, event_data); EXPECT_EQ(response.http_request()->method, net::test_server::HttpMethod::METHOD_POST); - EXPECT_EQ( - response.http_request()->headers.at("Attribution-Reporting-Eligible"), - "event-source"); + ExpectValidAttributionReportingEligibleHeaderForEventBeacon( + response.http_request()->headers.at("Attribution-Reporting-Eligible")); EXPECT_TRUE( base::Contains(response.http_request()->headers, "Content-Length")); EXPECT_TRUE( @@ -5637,9 +5637,9 @@ // Check that the content body was stripped. EXPECT_TRUE(redirect_response.http_request()->content.empty()); // These extra request headers were not stripped. - EXPECT_EQ(redirect_response.http_request()->headers.at( - "Attribution-Reporting-Eligible"), - "event-source"); + ExpectValidAttributionReportingEligibleHeaderForEventBeacon( + redirect_response.http_request()->headers.at( + "Attribution-Reporting-Eligible")); EXPECT_FALSE(base::Contains(response.http_request()->headers, "Attribution-Reporting-Support")); } @@ -5733,9 +5733,9 @@ "Content-Type")); EXPECT_TRUE( base::Contains(reporting_response.http_request()->headers, "Origin")); - EXPECT_EQ(reporting_response.http_request()->headers.at( - "Attribution-Reporting-Eligible"), - "event-source"); + ExpectValidAttributionReportingEligibleHeaderForEventBeacon( + reporting_response.http_request()->headers.at( + "Attribution-Reporting-Eligible")); EXPECT_FALSE(base::Contains(reporting_response.http_request()->headers, "Attribution-Reporting-Support")); @@ -5764,9 +5764,9 @@ // Check that the content body was stripped. EXPECT_TRUE(redirect_response.http_request()->content.empty()); // These extra request headers were not stripped. - EXPECT_EQ(redirect_response.http_request()->headers.at( - "Attribution-Reporting-Eligible"), - "event-source"); + ExpectValidAttributionReportingEligibleHeaderForEventBeacon( + redirect_response.http_request()->headers.at( + "Attribution-Reporting-Eligible")); EXPECT_FALSE(base::Contains(reporting_response.http_request()->headers, "Attribution-Reporting-Support")); } @@ -5938,9 +5938,8 @@ // Verify the request contains the eligibility header. response.WaitForRequest(); EXPECT_EQ(response.http_request()->content, event_data); - EXPECT_EQ( - response.http_request()->headers.at("Attribution-Reporting-Eligible"), - "event-source"); + ExpectValidAttributionReportingEligibleHeaderForEventBeacon( + response.http_request()->headers.at("Attribution-Reporting-Eligible")); EXPECT_EQ( response.http_request()->headers.at("Attribution-Reporting-Support"), "os, web"); @@ -6018,9 +6017,9 @@ { reporting_response.WaitForRequest(); EXPECT_EQ(reporting_response.http_request()->content, event_data); - EXPECT_EQ(reporting_response.http_request()->headers.at( - "Attribution-Reporting-Eligible"), - "event-source"); + ExpectValidAttributionReportingEligibleHeaderForEventBeacon( + reporting_response.http_request()->headers.at( + "Attribution-Reporting-Eligible")); EXPECT_EQ(reporting_response.http_request()->headers.at( "Attribution-Reporting-Support"), "web"); @@ -6436,9 +6435,8 @@ EXPECT_EQ(response.http_request()->content, config.message); } // Verify the request contains the eligibility header. - EXPECT_EQ( - response.http_request()->headers.at("Attribution-Reporting-Eligible"), - "navigation-source"); + ExpectValidAttributionReportingEligibleHeaderForNavigation( + response.http_request()->headers.at("Attribution-Reporting-Eligible")); EXPECT_FALSE(base::Contains(response.http_request()->headers, "Attribution-Reporting-Support")); response.Done();
diff --git a/content/browser/idle/OWNERS b/content/browser/idle/OWNERS index 562b9fc3..ccdc548f 100644 --- a/content/browser/idle/OWNERS +++ b/content/browser/idle/OWNERS
@@ -1,3 +1,5 @@ ayui@chromium.org +chengweih@chromium.org jsbell@chromium.org +mattreynolds@chromium.org reillyg@chromium.org
diff --git a/content/browser/interest_group/ad_auction_service_impl_unittest.cc b/content/browser/interest_group/ad_auction_service_impl_unittest.cc index 8a8b244f..b347c3c9 100644 --- a/content/browser/interest_group/ad_auction_service_impl_unittest.cc +++ b/content/browser/interest_group/ad_auction_service_impl_unittest.cc
@@ -1131,14 +1131,14 @@ "trustedBiddingSignalsUrl": "%s/interest_group/new_trusted_bidding_signals_url.json", "trustedBiddingSignalsKeys": ["new_key"], -"ads": [{"renderUrl": "%s/new_ad_render_url", +"ads": [{"renderURL": "%s/new_ad_render_url", "sizeGroup": "group_new", "metadata": {"new_a": "b"}, "buyerReportingId": "new_brid", "buyerAndSellerReportingId": "new_shrid", "adRenderId": "123abc" }], -"adComponents": [{"renderUrl": "https://example.com/component_url", +"adComponents": [{"renderURL": "https://example.com/component_url", "sizeGroup": "group_new", "metadata": {"new_c": "d"}, "adRenderId": "456def" @@ -1271,7 +1271,7 @@ TEST_F(AdAuctionServiceImplTest, UpdatePartialPerformsMerge) { network_responder_->RegisterUpdateResponse( kUpdateUrlPath, base::StringPrintf(R"({ -"ads": [{"renderUrl": "%s/new_ad_render_url", +"ads": [{"renderURL": "%s/new_ad_render_url", "metadata": {"new_a": "b"} }] })", @@ -1326,7 +1326,7 @@ // The update shouldn't change the expiration time of the interest group. TEST_F(AdAuctionServiceImplTest, UpdateDoesntChangeExpiration) { network_responder_->RegisterUpdateResponse(kUpdateUrlPath, R"({ -"ads": [{"renderUrl": "https://example.com/new_render" +"ads": [{"renderURL": "https://example.com/new_render" }] })"); @@ -1419,7 +1419,7 @@ base::StringPrintf(R"({ "name": "%s", "owner": "%s", -"ads": [{"renderUrl": "%s/new_ad_render_url" +"ads": [{"renderURL": "%s/new_ad_render_url" }] })", kInterestGroupName, kOriginStringA, kOriginStringA)); @@ -1473,11 +1473,11 @@ network_responder_->RegisterUpdateResponse(kUpdateUrlPath, R"({ "unsupportedField": "InInterestGroup", "ads": [{ - "renderUrl": "https://example.com/new_render", + "renderURL": "https://example.com/new_render", "unsupportedField": "InAd" }], "adComponents": [{ - "renderUrl": "https://example.com/new_component", + "renderURL": "https://example.com/new_component", "unsupportedField": "InAdComponent" }] })"); @@ -1519,7 +1519,7 @@ TEST_F(AdAuctionServiceImplTest, NoUpdateIfOptionalNameDoesntMatch) { network_responder_->RegisterUpdateResponse(kUpdateUrlPath, R"({ "name": "boats", -"ads": [{"renderUrl": "https://example.com/new_render" +"ads": [{"renderURL": "https://example.com/new_render" }] })"); @@ -1558,7 +1558,7 @@ network_responder_->RegisterUpdateResponse( kUpdateUrlPath, base::StringPrintf(R"({ "owner": "%s", -"ads": [{"renderUrl": "%s/new_ad_render_url" +"ads": [{"renderURL": "%s/new_ad_render_url" }] })", kOriginStringB, kOriginStringA)); @@ -1723,10 +1723,10 @@ constexpr char kGroupName1[] = "group1"; constexpr char kGroupName2[] = "group2"; network_responder_->RegisterUpdateResponse(kUpdateUrlPath, R"({ -"ads": [{"renderUrl": "https://example.com/new_render1"}] +"ads": [{"renderURL": "https://example.com/new_render1"}] })"); network_responder_->RegisterUpdateResponse(kUpdateUrlPath2, R"({ -"ads": [{"renderUrl": "https://example.com/new_render2"}] +"ads": [{"renderURL": "https://example.com/new_render2"}] })"); blink::InterestGroup interest_group = CreateInterestGroup(); @@ -1795,7 +1795,7 @@ // Both interest groups can share the same update logic and path (they just // use different origins). network_responder_->RegisterUpdateResponse(kUpdateUrlPath, R"({ -"ads": [{"renderUrl": "https://example.com/new_render" +"ads": [{"renderURL": "https://example.com/new_render" }] })"); @@ -1862,7 +1862,7 @@ // All interest groups can share the same update logic and path (they just // use different origins). network_responder_->RegisterUpdateResponse(kUpdateUrlPath, R"({ -"ads": [{"renderUrl": "https://example.com/new_render" +"ads": [{"renderURL": "https://example.com/new_render" }] })"); @@ -1972,13 +1972,13 @@ "https://example.com/render"); } -// The `ads` field is valid, but the ad `renderUrl` field is an invalid +// The `ads` field is valid, but the ad `renderURL` field is an invalid // URL. The entire update should get cancelled, since updates are atomic. TEST_F(AdAuctionServiceImplTest, UpdateInvalidFieldCancelsAllUpdates) { network_responder_->RegisterUpdateResponse( kUpdateUrlPath, base::StringPrintf(R"({ "biddingLogicUrl": "%s/interest_group/new_bidding_logic.js", -"ads": [{"renderUrl": "https://invalid^&", +"ads": [{"renderURL": "https://invalid^&", "metadata": {"new_a": "b"} }] })", @@ -2140,7 +2140,7 @@ // run in a separate process) crashing, so the update doesn't happen. TEST_F(AdAuctionServiceImplTest, UpdateJSONParserCrash) { network_responder_->RegisterUpdateResponse(kUpdateUrlPath, R"({ -"ads": [{"renderUrl": "https://example.com/new_render" +"ads": [{"renderURL": "https://example.com/new_render" }] })"); @@ -2205,7 +2205,7 @@ TEST_F(AdAuctionServiceImplTest, UpdateBlockedByContentBrowserClient) { NavigateAndCommit(kUrlNoUpdate); network_responder_->RegisterUpdateResponse(kUpdateUrlPath, R"({ -"ads": [{"renderUrl": "https://example.com/new_render" +"ads": [{"renderURL": "https://example.com/new_render" }] })"); @@ -2306,7 +2306,7 @@ TEST_F(AdAuctionServiceImplTest, UpdateDuringInterestGroupExpirationNoDbMaintenence) { constexpr char kServerResponse[] = R"({ -"ads": [{"renderUrl": "https://example.com/new_render"}] +"ads": [{"renderURL": "https://example.com/new_render"}] })"; network_responder_->RegisterDeferredUpdateResponse(kUpdateUrlPath); @@ -2381,7 +2381,7 @@ TEST_F(AdAuctionServiceImplTest, UpdateDuringInterestGroupExpirationWithDbMaintenence) { constexpr char kServerResponse[] = R"({ -"ads": [{"renderUrl": "https://example.com/new_render"}] +"ads": [{"renderURL": "https://example.com/new_render"}] })"; network_responder_->RegisterDeferredUpdateResponse(kUpdateUrlPath); @@ -2493,7 +2493,7 @@ // Join() time. TEST_F(AdAuctionServiceImplTest, DoesntChangeGroupsWithNoUpdateUrl) { network_responder_->RegisterUpdateResponse(kUpdateUrlPath, R"({ -"ads": [{"renderUrl": "https://example.com/new_render" +"ads": [{"renderURL": "https://example.com/new_render" }] })"); @@ -2528,7 +2528,7 @@ // stats shouldn't change. TEST_F(AdAuctionServiceImplTest, UpdateDoesntChangeBrowserSignals) { network_responder_->RegisterUpdateResponse(kUpdateUrlPath, R"({ -"ads": [{"renderUrl": "https://example.com/new_render" +"ads": [{"renderURL": "https://example.com/new_render" }] })"); blink::InterestGroupKey originA_group_key(kOriginA, kInterestGroupName); @@ -2589,7 +2589,7 @@ // Advance after time limit. Update should work. TEST_F(AdAuctionServiceImplTest, UpdateRateLimitedAfterSuccessfulUpdate) { network_responder_->RegisterUpdateResponse(kUpdateUrlPath, R"({ -"ads": [{"renderUrl": "https://example.com/new_render" +"ads": [{"renderURL": "https://example.com/new_render" }] })"); @@ -2621,7 +2621,7 @@ // Change the update response and try updating again. network_responder_->RegisterUpdateResponse(kUpdateUrlPath, R"({ -"ads": [{"renderUrl": "https://example.com/new_render" +"ads": [{"renderURL": "https://example.com/new_render" }] })"); UpdateInterestGroupNoFlush(); @@ -2713,7 +2713,7 @@ // Change the update response and try updating again. network_responder_->RegisterUpdateResponse(kUpdateUrlPath, R"({ -"ads": [{"renderUrl": "https://example.com/new_render" +"ads": [{"renderURL": "https://example.com/new_render" }] })"); UpdateInterestGroupNoFlush(); @@ -2804,7 +2804,7 @@ // Change the update response and try updating again. network_responder_->RegisterUpdateResponse(kUpdateUrlPath, R"({ -"ads": [{"renderUrl": "https://example.com/new_render" +"ads": [{"renderURL": "https://example.com/new_render" }] })"); UpdateInterestGroupNoFlush(); @@ -2895,7 +2895,7 @@ // Change the update response and try updating again. network_responder_->RegisterUpdateResponse(kUpdateUrlPath, R"({ -"ads": [{"renderUrl": "https://example.com/new_render" +"ads": [{"renderURL": "https://example.com/new_render" }] })"); UpdateInterestGroupNoFlush(); @@ -2931,7 +2931,7 @@ TEST_F(AdAuctionServiceImplTest, DisconnectedAndSuccessInFlightTogether) { // Create 2 interest groups belonging to the same owner. const std::string kServerResponse1 = R"({ -"ads": [{"renderUrl": "https://example.com/new_render"}] +"ads": [{"renderURL": "https://example.com/new_render"}] })"; network_responder_->RegisterDeferredUpdateResponse(kUpdateUrlPath); @@ -2988,7 +2988,7 @@ // Now, try to update both interest groups. Both should now succeed. const std::string kServerResponse2 = R"({ -"ads": [{"renderUrl": "https://example.com/new_render2"}] +"ads": [{"renderURL": "https://example.com/new_render2"}] })"; network_responder_->RegisterUpdateResponse(kUpdateUrlPath, kServerResponse1); network_responder_->RegisterUpdateResponse(kUpdateUrlPath2, kServerResponse2); @@ -3020,7 +3020,7 @@ // Fire off many updates rapidly in a loop. Only one update should happen. TEST_F(AdAuctionServiceImplTest, UpdateRateLimitedTightLoop) { network_responder_->RegisterUpdateResponse(kUpdateUrlPath, R"({ -"ads": [{"renderUrl": "https://example.com/new_render" +"ads": [{"renderURL": "https://example.com/new_render" }] })"); @@ -3066,16 +3066,16 @@ // kOriginA's update will be deferred, whereas kOriginB's and kOriginC's // updates will be allowed to proceed immediately. constexpr char kServerResponseA[] = R"({ -"ads": [{"renderUrl": "https://example.com/new_render"}] +"ads": [{"renderURL": "https://example.com/new_render"}] })"; network_responder_->RegisterDeferredUpdateResponse(kUpdateUrlPath); network_responder_->RegisterUpdateResponse(kUpdateUrlPathB, R"({ -"ads": [{"renderUrl": "https://example.com/new_render" +"ads": [{"renderURL": "https://example.com/new_render" }] })"); network_responder_->RegisterUpdateResponse(kUpdateUrlPathC, R"({ -"ads": [{"renderUrl": "https://example.com/new_render" +"ads": [{"renderURL": "https://example.com/new_render" }] })"); @@ -3216,7 +3216,7 @@ manager_->set_max_parallel_updates_for_testing(2); network_responder_->RegisterUpdateResponse(kUpdateUrlPath, R"({ -"ads": [{"renderUrl": "https://example.com/new_render" +"ads": [{"renderURL": "https://example.com/new_render" }] })"); @@ -3291,7 +3291,7 @@ manager_->set_max_parallel_updates_for_testing(2); network_responder_->RegisterUpdateResponse(kUpdateUrlPath, R"({ -"ads": [{"renderUrl": "https://example.com/new_render" +"ads": [{"renderURL": "https://example.com/new_render" }] })"); network_responder_->FailUpdateRequestWithError(kUpdateUrlPath2, @@ -3402,12 +3402,12 @@ // kOriginA's update will be deferred, whereas kOriginB's // update will be allowed to proceed immediately. constexpr char kServerResponseA[] = R"({ -"ads": [{"renderUrl": "https://example.com/new_render"}] +"ads": [{"renderURL": "https://example.com/new_render"}] })"; network_responder_->RegisterDeferredUpdateResponse(kUpdateUrlPath); network_responder_->RegisterUpdateResponse(kUpdateUrlPathB, R"({ -"ads": [{"renderUrl": "https://example.com/new_render" +"ads": [{"renderURL": "https://example.com/new_render" }] })"); @@ -3508,7 +3508,7 @@ // Now, try updating kOriginB. The update should complete successfully. network_responder_->RegisterUpdateResponse(kUpdateUrlPathB, R"({ -"ads": [{"renderUrl": "https://example.com/newer_render" +"ads": [{"renderURL": "https://example.com/newer_render" }] })"); @@ -3546,12 +3546,12 @@ // kOriginA's update will be deferred, whereas kOriginB's // update will be allowed to proceed immediately. constexpr char kServerResponseA[] = R"({ -"ads": [{"renderUrl": "https://example.com/new_render"}] +"ads": [{"renderURL": "https://example.com/new_render"}] })"; network_responder_->RegisterDeferredUpdateResponse(kUpdateUrlPath); network_responder_->RegisterUpdateResponse(kUpdateUrlPathB, R"({ -"ads": [{"renderUrl": "https://example.com/new_render" +"ads": [{"renderURL": "https://example.com/new_render" }] })"); @@ -3669,7 +3669,7 @@ EXPECT_EQ(1, GetJoinCount(kOriginC, kInterestGroupName)); network_responder_->RegisterUpdateResponse(kUpdateUrlPathC, R"({ -"ads": [{"renderUrl": "https://example.com/newer_render" +"ads": [{"renderURL": "https://example.com/newer_render" }] })"); UpdateInterestGroupNoFlush(); @@ -3707,11 +3707,11 @@ manager_->set_max_update_round_duration_for_testing(kMaxUpdateRoundDuration); network_responder_->RegisterUpdateResponse(kUpdateUrlPath, R"({ -"ads": [{"renderUrl": "https://example.com/new_render" +"ads": [{"renderURL": "https://example.com/new_render" }] })"); network_responder_->RegisterUpdateResponse(kUpdateUrlPathB, R"({ -"ads": [{"renderUrl": "https://example.com/new_render" +"ads": [{"renderURL": "https://example.com/new_render" }] })"); @@ -3822,7 +3822,7 @@ // update will be allowed to proceed immediately. The last group's update will // fail. constexpr char kServerResponse[] = R"({ -"ads": [{"renderUrl": "https://example.com/render2"}] +"ads": [{"renderURL": "https://example.com/render2"}] })"; network_responder_->RegisterUpdateResponse(kUpdateUrlPath, kServerResponse); network_responder_->FailUpdateRequestWithError(kUpdateUrlPath2, @@ -3972,7 +3972,7 @@ // Now, try updating kOriginB. The update should complete successfully. network_responder_->RegisterUpdateResponse(kUpdateUrlPathB, R"({ -"ads": [{"renderUrl": "https://example.com/render3" +"ads": [{"renderURL": "https://example.com/render3" }] })"); @@ -4188,7 +4188,7 @@ )"; network_responder_->RegisterUpdateResponse(kUpdateUrlPath, R"({ -"ads": [{"renderUrl": "https://example.com/new_render" +"ads": [{"renderURL": "https://example.com/new_render" }] })"); @@ -4247,7 +4247,7 @@ )"; network_responder_->RegisterUpdateResponse(kUpdateUrlPath, R"({ -"ads": [{"renderUrl": "https://example.com/new_render" +"ads": [{"renderURL": "https://example.com/new_render" }] })"); @@ -4298,7 +4298,7 @@ )"; network_responder_->RegisterUpdateResponse(kUpdateUrlPath, R"({ -"ads": [{"renderUrl": "https://example.com/new_render" +"ads": [{"renderURL": "https://example.com/new_render" }] })"); @@ -4357,7 +4357,7 @@ )"; network_responder_->RegisterUpdateResponse(kUpdateUrlPath, R"({ -"ads": [{"renderUrl": "https://example.com/new_render" +"ads": [{"renderURL": "https://example.com/new_render" }] })"); @@ -4437,12 +4437,12 @@ )"; network_responder_->RegisterUpdateResponse(kUpdateUrlPath, R"({ -"ads": [{"renderUrl": "https://example.com/new_render" +"ads": [{"renderURL": "https://example.com/new_render" }] })"); network_responder_->RegisterUpdateResponse(kUpdateUrlPathC, R"({ -"ads": [{"renderUrl": "https://example.com/new_render" +"ads": [{"renderURL": "https://example.com/new_render" }] })"); @@ -4551,12 +4551,12 @@ )"; network_responder_->RegisterUpdateResponse(kUpdateUrlPath, R"({ -"ads": [{"renderUrl": "https://example.com/new_render" +"ads": [{"renderURL": "https://example.com/new_render" }] })"); network_responder_->RegisterUpdateResponse(kUpdateUrlPathC, R"({ -"ads": [{"renderUrl": "https://example.com/new_render" +"ads": [{"renderURL": "https://example.com/new_render" }] })"); @@ -4676,7 +4676,7 @@ TEST_F(AdAuctionServiceImplTest, UpdateSupportsDeprecatedNames) { network_responder_->RegisterUpdateResponse(kUpdateUrlPath, R"({ "ads": [{ - "renderUrl": "https://example.com/new_render" + "renderURL": "https://example.com/new_render" }], "sellerCapabilities": { "*": ["interestGroupCounts", "latencyStats"] @@ -4718,7 +4718,7 @@ TEST_F(AdAuctionServiceImplTest, UpdateIgnoresUnknownEnumFields) { network_responder_->RegisterUpdateResponse(kUpdateUrlPath, R"({ "ads": [{ - "renderUrl": "https://example.com/new_render" + "renderURL": "https://example.com/new_render" }], "sellerCapabilities": { "https://example.test": ["non-valid-capability"] @@ -4744,7 +4744,7 @@ GetInterestGroupsForOwner(kOriginA); ASSERT_EQ(groups.size(), 1u); - // The unknown enum values are ignored, and renderUrl is updated. + // The unknown enum values are ignored, and renderURL is updated. const auto& group = groups[0].interest_group; ASSERT_TRUE(group.ads.has_value()); ASSERT_EQ(group.ads->size(), 1u); @@ -4752,6 +4752,112 @@ "https://example.com/new_render"); } +TEST_F(AdAuctionServiceImplTest, UpdateRenamedFields) { + blink::InterestGroup initial_interest_group = CreateInterestGroup(); + initial_interest_group.update_url = kUpdateUrlA; + JoinInterestGroupAndFlush(initial_interest_group); + + // Update priority (which is *not* being renamed) in addition to target field + // to update -- this way, if the update fails, the test can observe that + // priority wasn't updated. + + blink::InterestGroup updated_interest_group_ads = CreateInterestGroup(); + updated_interest_group_ads.update_url = kUpdateUrlA; + updated_interest_group_ads.priority = 1.0; + updated_interest_group_ads.ads.emplace(); + blink::InterestGroup::Ad ad( + /*render_url=*/GURL("https://example.com/render"), + /*metadata=*/absl::nullopt); + updated_interest_group_ads.ads->emplace_back(std::move(ad)); + + blink::InterestGroup updated_interest_group_ad_components = + CreateInterestGroup(); + updated_interest_group_ad_components.update_url = kUpdateUrlA; + updated_interest_group_ad_components.priority = 1.0; + updated_interest_group_ad_components.ad_components.emplace(); + blink::InterestGroup::Ad ad_component( + /*render_url=*/GURL("https://example.com/render"), + /*metadata=*/absl::nullopt); + updated_interest_group_ad_components.ad_components->emplace_back( + std::move(ad_component)); + + blink::InterestGroup updated_interest_group_bidding_logic_url = + CreateInterestGroup(); + updated_interest_group_bidding_logic_url.update_url = kUpdateUrlA; + updated_interest_group_bidding_logic_url.priority = 1.0; + updated_interest_group_bidding_logic_url.bidding_url = + GURL(base::StringPrintf("%s/bidding.js", kOriginStringA)); + + struct TestCase { + const std::string update_contents; + const blink::InterestGroup& expected_group; + } kTestCases[] = { + // *** + // ads renderURL + // *** + {R"("ads": [{"renderUrl": "https://example.com/render"}])", + updated_interest_group_ads}, + {R"("ads": [{"renderUrl": "https://example.com/render", + "renderURL": "https://example.com/render"}])", + updated_interest_group_ads}, + {R"("ads": [{"renderUrl": "https://example.com/render", + "renderURL": "https://example.com/render2"}])", + initial_interest_group}, + {R"("ads": [{}])", initial_interest_group}, + // *** + // adComponents renderURL + // *** + {R"("adComponents": [{"renderUrl": "https://example.com/render"}])", + updated_interest_group_ad_components}, + {R"("adComponents": [{"renderUrl": "https://example.com/render", + "renderURL": "https://example.com/render"}])", + updated_interest_group_ad_components}, + {R"("adComponents": [{"renderUrl": "https://example.com/render", + "renderURL": "https://example.com/render2"}])", + initial_interest_group}, + {R"("adComponents": [{}])", initial_interest_group}, + // *** + // biddingLogicURL + // *** + {base::StringPrintf(R"("biddingLogicUrl": "%s/bidding.js")", + kOriginStringA), + updated_interest_group_bidding_logic_url}, + {base::StringPrintf(R"("biddingLogicURL": "%s/bidding.js")", + kOriginStringA), + updated_interest_group_bidding_logic_url}, + {base::StringPrintf(R"("biddingLogicUrl": "%s/bidding.js",)" + R"("biddingLogicURL": "%s/bidding.js")", + kOriginStringA, kOriginStringA), + updated_interest_group_bidding_logic_url}, + {base::StringPrintf(R"("biddingLogicUrl": "%s/bidding.js",)" + R"("biddingLogicURL": "%s/bidding2.js")", + kOriginStringA, kOriginStringA), + initial_interest_group}, + }; + + for (const auto& test_case : kTestCases) { + SCOPED_TRACE(test_case.update_contents); + + network_responder_->RegisterUpdateResponse( + kUpdateUrlPath, base::StringPrintf(R"({ + "priority": 1.0, + %s +})", + test_case.update_contents.c_str())); + UpdateInterestGroupNoFlush(); + task_environment()->RunUntilIdle(); + + std::vector<StorageInterestGroup> groups = + GetInterestGroupsForOwner(kOriginA); + ASSERT_EQ(groups.size(), 1u); + EXPECT_TRUE( + groups[0].interest_group.IsEqualForTesting(test_case.expected_group)); + + // Reset for the next iteration. + JoinInterestGroupAndFlush(initial_interest_group); + } +} + // When sending reports, the next report request is feteched after the previous // report request completed (`max_active_report_requests_` is set to 1 in this // test). Reporting should continue even after the page navigated away. Timeout
diff --git a/content/browser/interest_group/auction_runner_unittest.cc b/content/browser/interest_group/auction_runner_unittest.cc index 5d22e4e..4fe29ffb 100644 --- a/content/browser/interest_group/auction_runner_unittest.cc +++ b/content/browser/interest_group/auction_runner_unittest.cc
@@ -218,7 +218,7 @@ constexpr char kBidScript[] = R"( const seller = "%s"; const bid = %s; - const renderUrl = "%s"; + const renderURL = "%s"; const numAdComponents = %i; const interestGroupOwner = "%s"; const interestGroupName = "%s"; @@ -236,17 +236,17 @@ trustedBiddingSignals, browserSignals) { let result = {ad: {"bidKey": "data for " + bid, "groupName": interestGroupName, - "renderUrl": "data for " + renderUrl, + "renderURL": "data for " + renderURL, "seller": seller}, bid: bid, bidCurrency: 'USD', - render: renderUrl, + render: renderURL, // Only need to allow component auction participation when // `topLevelSeller` is populated. allowComponentAuction: "topLevelSeller" in browserSignals}; if (interestGroup.adComponents) { - result.adComponents = [interestGroup.adComponents[0].renderUrl]; - result.ad.adComponentsUrl = interestGroup.adComponents[0].renderUrl; + result.adComponents = [interestGroup.adComponents[0].renderURL]; + result.ad.adComponentsUrl = interestGroup.adComponents[0].renderURL; } if (interestGroup.name !== interestGroupName) @@ -262,7 +262,7 @@ throw new Error("Unexpected updateUrl"); if (interestGroup.ads.length != 1) throw new Error("wrong interestGroup.ads length"); - if (interestGroup.ads[0].renderUrl != renderUrl) + if (interestGroup.ads[0].renderURL != renderURL) throw new Error("wrong interestGroup.ads URL"); if (numAdComponents == 0) { if (interestGroup.adComponents !== undefined) @@ -271,9 +271,9 @@ if (interestGroup.adComponents.length !== numAdComponents) throw new Error("Wrong adComponents length"); for (let i = 0; i < numAdComponents; ++i) { - if (interestGroup.adComponents[i].renderUrl != - renderUrl.slice(0, -1) + "-component" + (i+1) + ".com/") { - throw new Error("Wrong adComponents renderUrl"); + if (interestGroup.adComponents[i].renderURL != + renderURL.slice(0, -1) + "-component" + (i+1) + ".com/") { + throw new Error("Wrong adComponents renderURL"); } } } @@ -376,8 +376,8 @@ throw new Error("wrong topWindowHostname"); if (sellerSignals.interestGroupOwner !== interestGroupOwner) throw new Error("wrong interestGroupOwner"); - if (sellerSignals.renderUrl !== renderUrl) - throw new Error("wrong renderUrl"); + if (sellerSignals.renderURL !== renderURL) + throw new Error("wrong renderURL"); if (sellerSignals.bid !== bid) { throw new Error("wrong bid, bidder:" + bid + " seller:" + sellerSignals.bid); @@ -419,8 +419,8 @@ if (browserSignals.interestGroupOwner !== interestGroupOwner) throw new Error("wrong browserSignals.interestGroupOwner"); - if (browserSignals.renderUrl !== renderUrl) - throw new Error("wrong browserSignals.renderUrl"); + if (browserSignals.renderURL !== renderURL) + throw new Error("wrong browserSignals.renderURL"); if (browserSignals.bid !== bid) throw new Error("wrong browserSignals.bid"); if (browserSignals.seller != seller) @@ -504,14 +504,14 @@ let result = { ad: {}, bid: %d, - render: interestGroup.ads[0].renderUrl, + render: interestGroup.ads[0].renderURL, allowComponentAuction: true }; if (interestGroup.adComponents) { result.adComponents = [ - interestGroup.ads[0].renderUrl + "1", - interestGroup.ads[0].renderUrl + "2", + interestGroup.ads[0].renderURL + "1", + interestGroup.ads[0].renderURL + "2", ]; } @@ -592,10 +592,10 @@ throw new Error("wrong data for bid:" + JSON.stringify(adMetadata) + "/" + bid); } - if (adMetadata.renderUrl !== ("data for " + browserSignals.renderUrl)) { - throw new Error("wrong data for renderUrl:" + + if (adMetadata.renderURL !== ("data for " + browserSignals.renderURL)) { + throw new Error("wrong data for renderURL:" + JSON.stringify(adMetadata) + "/" + - browserSignals.renderUrl); + browserSignals.renderURL); } let components = browserSignals.adComponents; if (adMetadata.adComponentsUrl) { @@ -939,7 +939,7 @@ forDebuggingOnly.reportAdAuctionWin( debugWinReportUrl + postAuctionSignalsPlaceholder + '&bid=' + bid); return {ad: [], bid: bid, bidCurrency: 'USD', - render: interestGroup.ads[0].renderUrl}; + render: interestGroup.ads[0].renderURL}; } function reportWin( auctionSignals, perBuyerSignals, sellerSignals, browserSignals) { @@ -3815,7 +3815,7 @@ bucket: {baseValue: 'highest-scoring-other-bid'}, value: 2 + 1000 * inBid, }); - return {bid: inBid, render: interestGroup.ads[0].renderUrl, + return {bid: inBid, render: interestGroup.ads[0].renderURL, allowComponentAuction: true}; } @@ -3992,7 +3992,7 @@ bucket: {baseValue: 'highest-scoring-other-bid'}, value: 2 + 1000 * inBid, }); - return {bid: inBid, render: interestGroup.ads[0].renderUrl, + return {bid: inBid, render: interestGroup.ads[0].renderURL, allowComponentAuction: true}; } @@ -4180,7 +4180,7 @@ interestGroup, auctionSignals, perBuyerSignals, trustedBiddingSignals, browserSignals) { return {bid: inBid, bidCurrency: 'USD', - render: interestGroup.ads[0].renderUrl, + render: interestGroup.ads[0].renderURL, allowComponentAuction: true}; } @@ -4245,7 +4245,7 @@ "https://loss.example.com/?rejectReason=${rejectReason}&bid=" + inBid); return {bid: inBid, bidCurrency: 'USD', - render: interestGroup.ads[0].renderUrl, + render: interestGroup.ads[0].renderURL, allowComponentAuction: true}; } @@ -4522,7 +4522,7 @@ const char kBidder1Script[] = R"( function generateBid(interestGroup, auctionSignals, perBuyerSignals, trustedBiddingSignals, browserSignals) { - return {bid: 1, render: interestGroup.ads[0].renderUrl, + return {bid: 1, render: interestGroup.ads[0].renderURL, allowComponentAuction: true}; } @@ -4533,7 +4533,7 @@ const char kBidder2Script[] = R"( function generateBid(interestGroup, auctionSignals, perBuyerSignals, trustedBiddingSignals, browserSignals) { - return {bid: 2, render: interestGroup.ads[0].renderUrl, + return {bid: 2, render: interestGroup.ads[0].renderURL, allowComponentAuction: true}; } )"; @@ -4669,7 +4669,7 @@ function generateBid(interestGroup, auctionSignals, perBuyerSignals, trustedBiddingSignals, browserSignals) { privateAggregation.sendHistogramReport({bucket: 1n, value: 2}); - return {ad: [], bid: 2, render: interestGroup.ads[0].renderUrl, + return {ad: [], bid: 2, render: interestGroup.ads[0].renderURL, allowComponentAuction: true}; } @@ -4789,7 +4789,7 @@ const char kBidScript[] = R"( function generateBid(interestGroup, auctionSignals, perBuyerSignals, trustedBiddingSignals, browserSignals) { - return {ad: [], bid: 2, render: interestGroup.ads[0].renderUrl, + return {ad: [], bid: 2, render: interestGroup.ads[0].renderURL, allowComponentAuction: true}; } @@ -6318,12 +6318,12 @@ kBidder2SignalsJson); // scoreAd() that only accepts bids where the scoring signals of the - // `renderUrl` is "accept". + // `renderURL` is "accept". auction_worklet::AddJavascriptResponse(&url_loader_factory_, kSellerUrl, std::string(R"( function scoreAd(adMetadata, bid, auctionConfig, trustedScoringSignals, browserSignals) { - let signal = trustedScoringSignals.renderUrl[browserSignals.renderUrl]; + let signal = trustedScoringSignals.renderUrl[browserSignals.renderURL]; if (browserSignals.dataVersion !== 2) { throw new Error(`wrong dataVersion (${browserSignals.dataVersion})`); } @@ -8547,7 +8547,7 @@ return { ad: 0, bid: trustedBiddingSignals['key' + interestGroup.name], - render: interestGroup.ads[0].renderUrl + render: interestGroup.ads[0].renderURL }; } @@ -9603,7 +9603,7 @@ base::TimeDelta(), }, - // HTTPS render URL that's not in the list of allowed renderUrls. + // HTTPS render URL that's not in the list of allowed renderURLs. { "Bid render ad must have a valid URL and size (if specified)", 1, @@ -11894,7 +11894,7 @@ 'arbitrary', {bucket: 100n, value: 200}); privateAggregation.reportContributionForEvent( 'click', {bucket: 101n, value: 201}); - return {bid: bid, render: interestGroup.ads[0].renderUrl}; + return {bid: bid, render: interestGroup.ads[0].renderURL}; } function reportWin( @@ -12034,7 +12034,7 @@ bucket: {baseValue: 'bid-reject-reason', offset: 0n}, value: 3 + 100 * bid, }); - return {bid: bid, render: interestGroup.ads[0].renderUrl}; + return {bid: bid, render: interestGroup.ads[0].renderURL}; } function reportWin( @@ -12203,7 +12203,7 @@ bucket: {baseValue: 'bid-reject-reason', offset: 0n}, value: 3 + 100 * bid, }); - return {bid: bid, render: interestGroup.ads[0].renderUrl}; + return {bid: bid, render: interestGroup.ads[0].renderURL}; } function reportWin( @@ -12369,7 +12369,7 @@ bucket: BigInt(3 + 100 * bid), value: {baseValue: 'bid-reject-reason', offset: 0}, }); - return {bid: bid, render: interestGroup.ads[0].renderUrl}; + return {bid: bid, render: interestGroup.ads[0].renderURL}; } function reportWin( @@ -12509,7 +12509,7 @@ interestGroup, auctionSignals, perBuyerSignals, trustedBiddingSignals, browserSignals) { reportContributionForEvent(); - return {bid: bid, render: interestGroup.ads[0].renderUrl}; + return {bid: bid, render: interestGroup.ads[0].renderURL}; } function reportWin( @@ -13674,7 +13674,7 @@ interestGroup, auctionSignals, perBuyerSignals, trustedBiddingSignals, browserSignals) { return {bid: bid, - render: interestGroup.ads[0].renderUrl, + render: interestGroup.ads[0].renderURL, adCost: bid + 1}; } @@ -13720,7 +13720,7 @@ browserSignals) { // Return an adCost that requires more bits of precision than allowed. return {bid: bid, - render: interestGroup.ads[0].renderUrl, + render: interestGroup.ads[0].renderURL, adCost: bid}; } @@ -13787,7 +13787,7 @@ interestGroup, auctionSignals, perBuyerSignals, trustedBiddingSignals, browserSignals) { // Return an adCost that requires more bits of exponent than allowed. - return {bid: bid, render: interestGroup.ads[0].renderUrl, adCost: 2**256}; + return {bid: bid, render: interestGroup.ads[0].renderURL, adCost: 2**256}; } function reportWin( @@ -13852,7 +13852,7 @@ interestGroup, auctionSignals, perBuyerSignals, trustedBiddingSignals, browserSignals) { return {bid: 1, - render: interestGroup.ads[0].renderUrl, + render: interestGroup.ads[0].renderURL, modelingSignals: 0xF23}; } @@ -13907,7 +13907,7 @@ interestGroup, auctionSignals, perBuyerSignals, trustedBiddingSignals, browserSignals) { return {bid: 1, - render: interestGroup.ads[0].renderUrl}; + render: interestGroup.ads[0].renderURL}; } function reportWin( @@ -13970,7 +13970,7 @@ interestGroup, auctionSignals, perBuyerSignals, trustedBiddingSignals, browserSignals) { return {bid: 1, - render: interestGroup.ads[0].renderUrl}; + render: interestGroup.ads[0].renderURL}; } function reportWin( @@ -14053,7 +14053,7 @@ interestGroup, auctionSignals, perBuyerSignals, trustedBiddingSignals, browserSignals) { return {bid: 1, - render: interestGroup.ads[0].renderUrl}; + render: interestGroup.ads[0].renderURL}; } function reportWin( @@ -14109,7 +14109,7 @@ browserSignals) { // Return a bid that requires more bits of precision than allowed. return {bid: %f, - render: interestGroup.ads[0].renderUrl}; + render: interestGroup.ads[0].renderURL}; } function reportWin( @@ -14174,7 +14174,7 @@ browserSignals) { // Return a bid that requires more bits of precision than allowed. return {bid: %f, - render: interestGroup.ads[0].renderUrl}; + render: interestGroup.ads[0].renderURL}; } function reportWin( @@ -14261,7 +14261,7 @@ browserSignals) { // Return an score that requires more bits of precision than allowed. return {bid: %f, - render: interestGroup.ads[0].renderUrl}; + render: interestGroup.ads[0].renderURL}; } function reportWin( @@ -16240,7 +16240,7 @@ 'https://bidder1-debug-win-reporting.com/?reason=${rejectReason}'); return { bid: 1, - render: interestGroup.ads[0].renderUrl + render: interestGroup.ads[0].renderURL }; } @@ -16257,7 +16257,7 @@ 'https://bidder2-debug-win-reporting.com/?reason=${rejectReason}'); return { bid: 2, - render: interestGroup.ads[0].renderUrl + render: interestGroup.ads[0].renderURL }; } @@ -16328,7 +16328,7 @@ 'https://bidder-debug-loss-reporting.com/?reason=${rejectReason}'); return { bid: 1, - render: interestGroup.ads[0].renderUrl + render: interestGroup.ads[0].renderURL }; } @@ -17286,7 +17286,7 @@ trustedBiddingSignals, browserSignals) { return {ad: {}, bid: interestGroup.ads.length, - render: interestGroup.ads.pop().renderUrl, + render: interestGroup.ads.pop().renderURL, allowComponentAuction: true}; } )"; @@ -17411,7 +17411,7 @@ trustedBiddingSignals, browserSignals) { return {ad: {}, bid: interestGroup.ads.length, - render: interestGroup.ads.pop().renderUrl, + render: interestGroup.ads.pop().renderURL, allowComponentAuction: true}; } )";
diff --git a/content/browser/interest_group/interest_group_browsertest.cc b/content/browser/interest_group/interest_group_browsertest.cc index 555f8f1..d7af465 100644 --- a/content/browser/interest_group/interest_group_browsertest.cc +++ b/content/browser/interest_group/interest_group_browsertest.cc
@@ -133,7 +133,7 @@ base::Value::List list; for (const auto& ad : ads) { base::Value::Dict entry; - entry.Set("renderUrl", ad.render_url.spec()); + entry.Set("renderURL", ad.render_url.spec()); if (ad.size_group) { entry.Set("sizeGroup", std::move(ad.size_group.value())); } @@ -2506,11 +2506,11 @@ owner: $1, unsupportedField: 'In group', ads: [{ - renderUrl: $2, + renderURL: $2, unsupportedField: 'In ad', }], adComponents: [{ - renderUrl: $2, + renderURL: $2, unsupportedField: 'In ad component', }] }, @@ -2884,7 +2884,7 @@ EXPECT_EQ( base::StringPrintf( "TypeError: Failed to execute 'joinAdInterestGroup' on 'Navigator': " - "biddingLogicUrl 'https://invalid^&' for AuctionAdInterestGroup with " + "biddingLogicURL 'https://invalid^&' for AuctionAdInterestGroup with " "owner '%s' and name 'cars' cannot be resolved to a valid URL.", origin_string.c_str()), EvalJs(shell(), JsReplace(R"( @@ -3112,7 +3112,7 @@ EXPECT_EQ( base::StringPrintf( "TypeError: Failed to execute 'joinAdInterestGroup' on 'Navigator': " - "ad renderUrl 'https://invalid^&' for AuctionAdInterestGroup with " + "ad renderURL 'https://invalid^&' for AuctionAdInterestGroup with " "owner '%s' and name 'cars' cannot be resolved to a valid URL.", origin_string.c_str()), EvalJs(shell(), JsReplace(R"( @@ -3122,7 +3122,7 @@ { name: 'cars', owner: $1, - ads: [{renderUrl:"https://invalid^&"}], + ads: [{renderURL:"https://invalid^&"}], }, /*joinDurationSec=*/1); } catch (e) { @@ -3158,7 +3158,7 @@ { name: 'cars', owner: $1, - ads: [{renderUrl:"https://test.com", metadata:x}], + ads: [{renderURL:"https://test.com", metadata:x}], }, /*joinDurationSec=*/1); } catch (e) { @@ -3216,7 +3216,7 @@ { name: 'cars', owner: $1, - ads: [{renderUrl: "https://test.com", sizeGroup: ""}], + ads: [{renderURL: "https://test.com", sizeGroup: ""}], }, /*joinDurationSec=*/1); } catch (e) { @@ -3249,7 +3249,7 @@ { name: 'cars', owner: $1, - ads: [{renderUrl: "https://test.com", sizeGroup: "nonexistent"}], + ads: [{renderURL: "https://test.com", sizeGroup: "nonexistent"}], }, /*joinDurationSec=*/1); } catch (e) { @@ -3283,7 +3283,7 @@ { name: 'cars', owner: $1, - ads: [{renderUrl: "https://test.com", sizeGroup: "nonexistent"}], + ads: [{renderURL: "https://test.com", sizeGroup: "nonexistent"}], adSizes: {"size_1": {"width": "50px", "height": "50px"}}, sizeGroups: {"group_1": ["size_1"]}, }, @@ -3317,7 +3317,7 @@ { name: 'cars', owner: $1, - ads: [{renderUrl: "https://test.com", sizeGroup: "group_1"}], + ads: [{renderURL: "https://test.com", sizeGroup: "group_1"}], sizeGroups: {"group_1": ["nonexistent"]}, }, /*joinDurationSec=*/1); @@ -3350,7 +3350,7 @@ { name: 'cars', owner: $1, - adComponents: [{renderUrl: "https://test.com", sizeGroup: ""}], + adComponents: [{renderURL: "https://test.com", sizeGroup: ""}], }, /*joinDurationSec=*/1); } catch (e) { @@ -3384,7 +3384,7 @@ { name: 'cars', owner: $1, - adComponents: [{renderUrl: "https://test.com", sizeGroup: "nonexistent"}], + adComponents: [{renderURL: "https://test.com", sizeGroup: "nonexistent"}], }, /*joinDurationSec=*/1); } catch (e) { @@ -3418,7 +3418,7 @@ { name: 'cars', owner: $1, - adComponents: [{renderUrl: "https://test.com", sizeGroup: "nonexistent"}], + adComponents: [{renderURL: "https://test.com", sizeGroup: "nonexistent"}], adSizes: {"size_1": {"width": "50px", "height": "50px"}}, sizeGroups: {"group_1": ["size_1"]}, }, @@ -3452,7 +3452,7 @@ { name: 'cars', owner: $1, - adComponents: [{renderUrl: "https://test.com", sizeGroup: "group_1"}], + adComponents: [{renderURL: "https://test.com", sizeGroup: "group_1"}], sizeGroups: {"group_1": ["nonexistent"]}, }, /*joinDurationSec=*/1); @@ -3630,6 +3630,139 @@ WaitForAccessObserved({}); } +IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTest, + JoinInterestGroupRenamedFields) { + const GURL kAdUrl("https://example.com/render"); + GURL url = https_server_->GetURL("a.test", "/echo"); + url::Origin origin = url::Origin::Create(url); + std::string origin_string = origin.Serialize(); + ASSERT_TRUE(NavigateToURL(shell(), url)); + + const blink::InterestGroup kExpectedGroupAds = + blink::TestInterestGroupBuilder(/*owner=*/origin, /*name=*/"cars") + .SetAds({{{kAdUrl, /*metadata=*/absl::nullopt}}}) + .Build(); + + const blink::InterestGroup kExpectedGroupAdComponents = + blink::TestInterestGroupBuilder(/*owner=*/origin, /*name=*/"cars") + .SetAdComponents({{{kAdUrl, /*metadata=*/absl::nullopt}}}) + .Build(); + + const blink::InterestGroup kExpectedGroupBiddingLogicUrl = + blink::TestInterestGroupBuilder(/*owner=*/origin, /*name=*/"cars") + .SetBiddingUrl( + GURL(base::StringPrintf("%s/bidding.js", origin_string.c_str()))) + .Build(); + + struct TestCases { + const std::string join_dict_contents; + const std::string result; + const absl::optional<blink::InterestGroup> expected_group; + } kTestCases[] = { + // *** + // ads renderURL + // *** + {R"(ads: [{renderUrl: 'https://example.com/render'}])", "done", + kExpectedGroupAds}, + {R"(ads: [{renderUrl: 'https://example.com/render', + renderURL: 'https://example.com/render'}])", + "done", kExpectedGroupAds}, + {R"(ads: [{renderUrl: 'https://example.com/render', + renderURL: 'https://example.com/render2'}])", + "TypeError: Failed to execute 'joinAdInterestGroup' on 'Navigator': ad " + "renderUrl doesn't have the same value as ad renderURL (" + "'https://example.com/render' vs 'https://example.com/render2')", + absl::nullopt}, + {R"(ads: [{}])", + "TypeError: Failed to execute 'joinAdInterestGroup' on " + "'Navigator': Missing required field ad renderURL", + absl::nullopt}, + // *** + // adComponents renderURL + // *** + {R"(adComponents: [{renderUrl: 'https://example.com/render'}])", "done", + kExpectedGroupAdComponents}, + {R"(adComponents: [{renderUrl: 'https://example.com/render', + renderURL: 'https://example.com/render'}])", + "done", kExpectedGroupAdComponents}, + {R"(adComponents: [{renderUrl: 'https://example.com/render', + renderURL: 'https://example.com/render2'}])", + "TypeError: Failed to execute 'joinAdInterestGroup' on 'Navigator': ad " + "component renderUrl doesn't have the same value as ad component " + "renderURL ('https://example.com/render' vs " + "'https://example.com/render2')", + absl::nullopt}, + {R"(adComponents: [{}])", + "TypeError: Failed to execute 'joinAdInterestGroup' on " + "'Navigator': Missing required field ad component renderURL", + absl::nullopt}, + // *** + // biddingLogicURL + // *** + {base::StringPrintf(R"(biddingLogicUrl: '%s/bidding.js')", + origin_string.c_str()), + "done", kExpectedGroupBiddingLogicUrl}, + {base::StringPrintf(R"(biddingLogicURL: '%s/bidding.js')", + origin_string.c_str()), + "done", kExpectedGroupBiddingLogicUrl}, + {base::StringPrintf(R"(biddingLogicUrl: '%s/bidding.js',)" + R"(biddingLogicURL: '%s/bidding.js')", + origin_string.c_str(), origin_string.c_str()), + "done", kExpectedGroupBiddingLogicUrl}, + {base::StringPrintf(R"(biddingLogicUrl: '%s/bidding.js',)" + R"(biddingLogicURL: '%s/bidding2.js')", + origin_string.c_str(), origin_string.c_str()), + base::StringPrintf( + "TypeError: Failed to execute 'joinAdInterestGroup' on 'Navigator': " + "interest group biddingLogicUrl doesn't have the same value as " + "interest group biddingLogicURL ('%s/bidding.js' vs " + "'%s/bidding2.js')", + origin_string.c_str(), origin_string.c_str()), + absl::nullopt}, + }; + + for (const auto& test_case : kTestCases) { + SCOPED_TRACE(test_case.join_dict_contents); + EXPECT_EQ(test_case.result, + EvalJs(shell(), + base::StringPrintf(R"( +(async function() { + try { + await navigator.joinAdInterestGroup( + { + name: 'cars', + owner: '%s', + %s + }, + /*joinDurationSec=*/1); + } catch (e) { + return e.toString(); + } + return 'done'; +})())", + origin_string.c_str(), + test_case.join_dict_contents.c_str()))); + + // Check that the database has also been updated. + absl::optional<StorageInterestGroup> maybe_interest_group = + GetInterestGroup(/*owner=*/origin, + /*name=*/"cars"); + if (test_case.expected_group) { + ASSERT_TRUE(maybe_interest_group); + maybe_interest_group->interest_group.expiry = + test_case.expected_group->expiry; + EXPECT_TRUE(maybe_interest_group->interest_group.IsEqualForTesting( + *test_case.expected_group)); + } else { + EXPECT_FALSE(maybe_interest_group); + } + + // Cleanup between runs. + EXPECT_EQ(kSuccess, LeaveInterestGroupAndVerify(/*owner=*/origin, + /*name=*/"cars")); + } +} + IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTest, RunAdAuctionInvalidSeller) { ASSERT_TRUE(NavigateToURL(shell(), https_server_->GetURL("a.test", "/echo"))); AttachInterestGroupObserver(); @@ -3665,7 +3798,7 @@ EXPECT_EQ( "TypeError: Failed to execute 'runAdAuction' on 'Navigator': " - "decisionLogicUrl 'https://invalid^&' for AuctionAdConfig with seller " + "decisionLogicURL 'https://invalid^&' for AuctionAdConfig with seller " "'https://test.com' cannot be resolved to a valid URL.", RunAuctionAndWait(R"({ seller: 'https://test.com', @@ -3674,6 +3807,40 @@ WaitForAccessObserved({}); } +// TODO(crbug.com/1441988): Remove test when old names are no longer supported. +IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTest, + RunAdAuctionMissingDecisionLogicUrl) { + ASSERT_TRUE(NavigateToURL(shell(), https_server_->GetURL("a.test", "/echo"))); + AttachInterestGroupObserver(); + + EXPECT_EQ( + "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Missing " + "required field ad auction config decisionLogicURL", + RunAuctionAndWait(R"({ + seller: 'https://test.com', + })")); + WaitForAccessObserved({}); +} + +// TODO(crbug.com/1441988): Remove test when old names are no longer supported. +IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTest, + RunAdAuctionDecisionLogicUrlOldAndNewNamesDontMatch) { + ASSERT_TRUE(NavigateToURL(shell(), https_server_->GetURL("a.test", "/echo"))); + AttachInterestGroupObserver(); + + EXPECT_EQ( + "TypeError: Failed to execute 'runAdAuction' on 'Navigator': ad auction " + "config decisionLogicUrl doesn't have the same value as ad auction " + "config decisionLogicURL ('https://test.com/decision2' vs " + "'https://test.com/decision1')", + RunAuctionAndWait(R"({ + seller: 'https://test.com', + decisionLogicURL: 'https://test.com/decision1', + decisionLogicUrl: 'https://test.com/decision2' + })")); + WaitForAccessObserved({}); +} + IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTest, RunAdAuctionInvalidTrustedScoringSignalsUrl) { GURL url = https_server_->GetURL("a.test", "/echo"); @@ -3684,7 +3851,7 @@ EXPECT_EQ( base::StringPrintf( "TypeError: Failed to execute 'runAdAuction' on 'Navigator': " - "trustedScoringSignalsUrl 'https://invalid^&' for AuctionAdConfig " + "trustedScoringSignalsURL 'https://invalid^&' for AuctionAdConfig " "with seller '%s' cannot be resolved to a valid URL.", origin.Serialize().c_str()), RunAuctionAndWait(JsReplace(R"({ @@ -3696,6 +3863,30 @@ WaitForAccessObserved({}); } +// TODO(crbug.com/1441988): Remove test when old names are no longer supported. +IN_PROC_BROWSER_TEST_F( + InterestGroupBrowserTest, + RunAdAuctionTrustedScoringSignalsUrlOldAndNewNamesDontMatch) { + GURL url = https_server_->GetURL("a.test", "/echo"); + url::Origin origin = url::Origin::Create(url); + ASSERT_TRUE(NavigateToURL(shell(), url)); + AttachInterestGroupObserver(); + + EXPECT_EQ( + "TypeError: Failed to execute 'runAdAuction' on 'Navigator': ad auction " + "config trustedScoringSignalsUrl doesn't have the same value as ad " + "auction config trustedScoringSignalsURL ('https://test.com/scoring2' vs " + "'https://test.com/scoring1')", + RunAuctionAndWait(JsReplace(R"({ + seller: $1, + decisionLogicUrl: $2, + trustedScoringSignalsURL: 'https://test.com/scoring1', + trustedScoringSignalsUrl: 'https://test.com/scoring2' + })", + origin, url))); + WaitForAccessObserved({}); +} + IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTest, RunAdAuctionDecisionLogicUrlDifferentFromSeller) { GURL test_url = https_server_->GetURL("a.test", "/echo"); @@ -3705,7 +3896,7 @@ EXPECT_EQ( "TypeError: Failed to execute 'runAdAuction' on 'Navigator': " - "decisionLogicUrl 'https://b.test/foo' for AuctionAdConfig with seller " + "decisionLogicURL 'https://b.test/foo' for AuctionAdConfig with seller " "'https://a.test/' must match seller origin.", RunAuctionAndWait(R"({ seller: "https://a.test/", @@ -3725,7 +3916,7 @@ EXPECT_EQ( "TypeError: Failed to execute 'runAdAuction' on 'Navigator': " - "trustedScoringSignalsUrl 'https://b.test/foo' for AuctionAdConfig with " + "trustedScoringSignalsURL 'https://b.test/foo' for AuctionAdConfig with " "seller 'https://a.test/' must match seller origin.", RunAuctionAndWait(R"({ seller: "https://a.test/", @@ -8681,9 +8872,9 @@ return { ad: 'ad', bid: 1, - render: interestGroup.ads[0].renderUrl, - adComponents: [interestGroup.adComponents[0].renderUrl, - interestGroup.adComponents[2].renderUrl] + render: interestGroup.ads[0].renderURL, + adComponents: [interestGroup.adComponents[0].renderURL, + interestGroup.adComponents[2].renderURL] }; )"; GURL bidding_url = @@ -9366,6 +9557,211 @@ (async function() { return await navigator.runAdAuction({ seller: $1, + decisionLogicURL: $2, + trustedScoringSignalsURL: $3, + auctionSignals: maybePromise(["top-level auction signals"]), + sellerSignals: maybePromise(["top-level seller signals"]), + directFromSellerSignals: maybePromise($4), + sellerTimeout: 300, + perBuyerSignals: maybePromise({$8: ["top-level buyer signals"]}), + perBuyerTimeouts: maybePromise({$8: 110, '*': 150}), + perBuyerCumulativeTimeouts: maybePromise({$8: 11100, '*': 15100}), + perBuyerPrioritySignals: {'*': {foo: 3}}, + perBuyerCurrencies: {'*': 'MXN', $5: 'CAD'}, + componentAuctions: [{ + seller: $5, + decisionLogicURL: $6, + trustedScoringSignalsURL: $7, + interestGroupBuyers: [$8], + auctionSignals: maybePromise(["component auction signals"]), + sellerSignals: maybePromise(["component seller signals"]), + directFromSellerSignals: maybePromise($9), + sellerTimeout: 200, + perBuyerSignals: maybePromise({$8: ["component buyer signals"]}), + perBuyerTimeouts: maybePromise({$8: 200}), + perBuyerCumulativeTimeouts: maybePromise({$8: 20100}), + perBuyerPrioritySignals: {$8: {bar: 1}, '*': {BaZ: -2}}, + perBuyerCurrencies: maybePromise({$8: 'USD'}), + sellerCurrency: 'CAD', + }], + }); +})())", + top_level_seller_origin, top_level_seller_script_url, + https_server_->GetURL( + kTopLevelSellerHost, + "/interest_group/trusted_scoring_signals.json"), + https_server_->GetURL(kTopLevelSellerHost, + "/direct_from_seller_signals"), + url::Origin::Create(component_seller_script_url), + component_seller_script_url, + https_server_->GetURL( + kComponentSellerHost, + "/interest_group/trusted_scoring_signals2.json"), + bidder_origin, + https_server_->GetURL(kComponentSellerHost, + "/direct_from_seller_signals"))) + .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(kTopLevelSellerHost, + "/echo?report_top_level_seller")); + WaitForUrl(https_server_->GetURL(kComponentSellerHost, + "/echo?report_component_seller")); + WaitForUrl(https_server_->GetURL(kBidderHost, "/echo?report_bidder")); + } +} + +// TODO(crbug.com/1441988): Remove this test once old names are no longer +// supported. +// Same as ComponentAuctionValidateWorkletParameters, but using deprecated names +// like decisionLogicUrl. +IN_PROC_BROWSER_TEST_F( + InterestGroupBrowserTest, + ComponentAuctionValidateWorkletParametersOldRunAdAuctionNames) { + // Use different hostnames for each participant. + // + // Match assignments in above test as closely as possible, to make scripts + // similar. + constexpr char kBidderHost[] = "a.test"; + constexpr char kTopLevelSellerHost[] = "b.test"; + constexpr char kTopFrameHost[] = "c.test"; + constexpr char kComponentSellerHost[] = "d.test"; + + content_browser_client_->AddToAllowList( + {url::Origin::Create(https_server_->GetURL(kComponentSellerHost, "/"))}); + + for (bool use_promise : {false, true}) { + SCOPED_TRACE(use_promise); + + const url::Origin top_frame_origin = + url::Origin::Create(https_server_->GetURL(kTopFrameHost, "/echo")); + + GURL bidder_url = https_server_->GetURL(kBidderHost, "/echo"); + ASSERT_TRUE(NavigateToURL(shell(), bidder_url)); + url::Origin bidder_origin = url::Origin::Create(bidder_url); + + if (use_promise) { + // Cleanup between runs, to reset the stats to expected values. + EXPECT_EQ(kSuccess, LeaveInterestGroupAndVerify(/*owner=*/bidder_origin, + /*name=*/"cars")); + } + + ASSERT_EQ( + kSuccess, + JoinInterestGroupAndVerify(blink::InterestGroup( + /*expiry=*/base::Time(), + /*owner=*/bidder_origin, + /*name=*/"cars", + /*priority=*/0.0, /*enable_bidding_signals_prioritization=*/false, + /*priority_vector=*/{{{"FOO", 2}}}, + /*priority_signals_overrides=*/{{{"FOO", 1}}}, + /*seller_capabilities=*/absl::nullopt, + /*all_sellers_capabilities=*/ + {}, /*execution_mode=*/ + blink::InterestGroup::ExecutionMode::kCompatibilityMode, + /*bidding_url=*/ + https_server_->GetURL( + kBidderHost, + "/interest_group/" + "component_auction_bidding_argument_validator.js"), + /*bidding_wasm_helper_url=*/absl::nullopt, + /*update_url=*/ + https_server_->GetURL(kBidderHost, "/not_found_update_url.json"), + /*trusted_bidding_signals_url=*/ + https_server_->GetURL( + kBidderHost, "/interest_group/trusted_bidding_signals.json"), + /*trusted_bidding_signals_keys=*/{{"key1"}}, + /*user_bidding_signals=*/ + R"({"some":"json","stuff":{"here":[1,2]}})", + /*ads=*/ + {{{GURL("https://example.com/render"), + R"({"ad":"metadata","here":[1,2,3]})"}}}, + /*ad_components=*/ + {{{GURL("https://example.com/render-component"), + /*metadata=*/absl::nullopt}}}, + /*ad_sizes=*/{}, + /*size_groups=*/{}))); + + // For `directFromSellerSignals` to work, we need to navigate to a page that + // declares the subresource bundle resources we pass to those fields. + GURL top_level_seller_script_url = https_server_->GetURL( + kTopLevelSellerHost, + "/interest_group/" + "component_auction_top_level_decision_argument_validator.js"); + GURL component_seller_script_url = https_server_->GetURL( + kComponentSellerHost, + "/interest_group/" + "component_auction_component_decision_argument_validator.js"); + const url::Origin top_level_seller_origin = + url::Origin::Create(top_level_seller_script_url); + const url::Origin component_seller_origin = + url::Origin::Create(component_seller_script_url); + std::vector<NetworkResponder::SubresourceResponse> + top_level_subresource_responses = { + NetworkResponder::SubresourceResponse( + /*subresource_url=*/ + "/direct_from_seller_signals?sellerSignals", + /*payload=*/ + R"({"json": "for", "the": ["seller"]})"), + NetworkResponder::SubresourceResponse( + /*subresource_url=*/"/direct_from_seller_signals?" + "auctionSignals", + /*payload=*/ + R"({"json": "for", "all": ["parties"]})"), + }; + std::vector<NetworkResponder::SubresourceResponse> + component_subresource_responses = { + NetworkResponder::SubresourceResponse( + /*subresource_url=*/ + "/direct_from_seller_signals?sellerSignals", + /*payload=*/ + R"({"from": "component", "json": "for", "the": ["seller"]})"), + NetworkResponder::SubresourceResponse( + /*subresource_url=*/"/direct_from_seller_signals?" + "auctionSignals", + /*payload=*/ + R"({"from": "component", "json": "for", "all": ["parties"]})"), + NetworkResponder::DirectFromSellerPerBuyerSignals( + bidder_origin, /*payload=*/ + R"({"from": "component", "json": "for", "buyer": [1]})"), + }; + std::vector<NetworkResponder::SubresourceBundle> bundles = { + NetworkResponder::SubresourceBundle( + /*bundle_url=*/https_server_->GetURL(kTopLevelSellerHost, + "/0generated_bundle.wbn"), + /*subresources=*/top_level_subresource_responses), + {NetworkResponder::SubresourceBundle( + /*bundle_url=*/https_server_->GetURL(kComponentSellerHost, + "/1generated_bundle.wbn"), + /*subresources=*/component_subresource_responses)}}; + + network_responder_->RegisterDirectFromSellerSignalsResponse( + /*bundles=*/bundles, + /*allow_origin=*/top_frame_origin.Serialize()); + constexpr char kPagePath[] = "/page-with-bundles.html"; + network_responder_->RegisterHtmlWithSubresourceBundles( + /*bundles=*/bundles, + /*page_url=*/kPagePath); + + ASSERT_TRUE(NavigateToURL(shell(), + https_server_->GetURL(kTopFrameHost, kPagePath))); + + TestFencedFrameURLMappingResultObserver observer; + ConvertFencedFrameURNToURL( + GURL(EvalJs( + shell(), + JsReplace( + std::string(use_promise ? kFeedPromise : kFeedDirect) + R"( +(async function() { + return await navigator.runAdAuction({ + seller: $1, decisionLogicUrl: $2, trustedScoringSignalsUrl: $3, auctionSignals: maybePromise(["top-level auction signals"]), @@ -9427,6 +9823,216 @@ } } +// TODO(crbug.com/1441988): Remove this test once old names are no longer +// supported. +// Same as ComponentAuctionValidateWorkletParameters, but using deprecated names +// like decisionLogicUrl and new names like decisionLogicURL together, using the +// same values for each. +IN_PROC_BROWSER_TEST_F( + InterestGroupBrowserTest, + ComponentAuctionValidateWorkletParametersOldRunAdAuctionNamesAndNewNames) { + // Use different hostnames for each participant. + // + // Match assignments in above test as closely as possible, to make scripts + // similar. + constexpr char kBidderHost[] = "a.test"; + constexpr char kTopLevelSellerHost[] = "b.test"; + constexpr char kTopFrameHost[] = "c.test"; + constexpr char kComponentSellerHost[] = "d.test"; + + content_browser_client_->AddToAllowList( + {url::Origin::Create(https_server_->GetURL(kComponentSellerHost, "/"))}); + + for (bool use_promise : {false, true}) { + SCOPED_TRACE(use_promise); + + const url::Origin top_frame_origin = + url::Origin::Create(https_server_->GetURL(kTopFrameHost, "/echo")); + + GURL bidder_url = https_server_->GetURL(kBidderHost, "/echo"); + ASSERT_TRUE(NavigateToURL(shell(), bidder_url)); + url::Origin bidder_origin = url::Origin::Create(bidder_url); + + if (use_promise) { + // Cleanup between runs, to reset the stats to expected values. + EXPECT_EQ(kSuccess, LeaveInterestGroupAndVerify(/*owner=*/bidder_origin, + /*name=*/"cars")); + } + + ASSERT_EQ( + kSuccess, + JoinInterestGroupAndVerify(blink::InterestGroup( + /*expiry=*/base::Time(), + /*owner=*/bidder_origin, + /*name=*/"cars", + /*priority=*/0.0, /*enable_bidding_signals_prioritization=*/false, + /*priority_vector=*/{{{"FOO", 2}}}, + /*priority_signals_overrides=*/{{{"FOO", 1}}}, + /*seller_capabilities=*/absl::nullopt, + /*all_sellers_capabilities=*/ + {}, /*execution_mode=*/ + blink::InterestGroup::ExecutionMode::kCompatibilityMode, + /*bidding_url=*/ + https_server_->GetURL( + kBidderHost, + "/interest_group/" + "component_auction_bidding_argument_validator.js"), + /*bidding_wasm_helper_url=*/absl::nullopt, + /*update_url=*/ + https_server_->GetURL(kBidderHost, "/not_found_update_url.json"), + /*trusted_bidding_signals_url=*/ + https_server_->GetURL( + kBidderHost, "/interest_group/trusted_bidding_signals.json"), + /*trusted_bidding_signals_keys=*/{{"key1"}}, + /*user_bidding_signals=*/ + R"({"some":"json","stuff":{"here":[1,2]}})", + /*ads=*/ + {{{GURL("https://example.com/render"), + R"({"ad":"metadata","here":[1,2,3]})"}}}, + /*ad_components=*/ + {{{GURL("https://example.com/render-component"), + /*metadata=*/absl::nullopt}}}, + /*ad_sizes=*/{}, + /*size_groups=*/{}))); + + // For `directFromSellerSignals` to work, we need to navigate to a page that + // declares the subresource bundle resources we pass to those fields. + GURL top_level_seller_script_url = https_server_->GetURL( + kTopLevelSellerHost, + "/interest_group/" + "component_auction_top_level_decision_argument_validator.js"); + GURL component_seller_script_url = https_server_->GetURL( + kComponentSellerHost, + "/interest_group/" + "component_auction_component_decision_argument_validator.js"); + const url::Origin top_level_seller_origin = + url::Origin::Create(top_level_seller_script_url); + const url::Origin component_seller_origin = + url::Origin::Create(component_seller_script_url); + std::vector<NetworkResponder::SubresourceResponse> + top_level_subresource_responses = { + NetworkResponder::SubresourceResponse( + /*subresource_url=*/ + "/direct_from_seller_signals?sellerSignals", + /*payload=*/ + R"({"json": "for", "the": ["seller"]})"), + NetworkResponder::SubresourceResponse( + /*subresource_url=*/"/direct_from_seller_signals?" + "auctionSignals", + /*payload=*/ + R"({"json": "for", "all": ["parties"]})"), + }; + std::vector<NetworkResponder::SubresourceResponse> + component_subresource_responses = { + NetworkResponder::SubresourceResponse( + /*subresource_url=*/ + "/direct_from_seller_signals?sellerSignals", + /*payload=*/ + R"({"from": "component", "json": "for", "the": ["seller"]})"), + NetworkResponder::SubresourceResponse( + /*subresource_url=*/"/direct_from_seller_signals?" + "auctionSignals", + /*payload=*/ + R"({"from": "component", "json": "for", "all": ["parties"]})"), + NetworkResponder::DirectFromSellerPerBuyerSignals( + bidder_origin, /*payload=*/ + R"({"from": "component", "json": "for", "buyer": [1]})"), + }; + std::vector<NetworkResponder::SubresourceBundle> bundles = { + NetworkResponder::SubresourceBundle( + /*bundle_url=*/https_server_->GetURL(kTopLevelSellerHost, + "/0generated_bundle.wbn"), + /*subresources=*/top_level_subresource_responses), + {NetworkResponder::SubresourceBundle( + /*bundle_url=*/https_server_->GetURL(kComponentSellerHost, + "/1generated_bundle.wbn"), + /*subresources=*/component_subresource_responses)}}; + + network_responder_->RegisterDirectFromSellerSignalsResponse( + /*bundles=*/bundles, + /*allow_origin=*/top_frame_origin.Serialize()); + constexpr char kPagePath[] = "/page-with-bundles.html"; + network_responder_->RegisterHtmlWithSubresourceBundles( + /*bundles=*/bundles, + /*page_url=*/kPagePath); + + ASSERT_TRUE(NavigateToURL(shell(), + https_server_->GetURL(kTopFrameHost, kPagePath))); + + TestFencedFrameURLMappingResultObserver observer; + ConvertFencedFrameURNToURL( + GURL(EvalJs( + shell(), + JsReplace( + std::string(use_promise ? kFeedPromise : kFeedDirect) + R"( +(async function() { + return await navigator.runAdAuction({ + seller: $1, + decisionLogicURL: $2, + decisionLogicUrl: $2, + trustedScoringSignalsURL: $3, + trustedScoringSignalsUrl: $3, + auctionSignals: maybePromise(["top-level auction signals"]), + sellerSignals: maybePromise(["top-level seller signals"]), + directFromSellerSignals: maybePromise($4), + sellerTimeout: 300, + perBuyerSignals: maybePromise({$8: ["top-level buyer signals"]}), + perBuyerTimeouts: maybePromise({$8: 110, '*': 150}), + perBuyerCumulativeTimeouts: maybePromise({$8: 11100, '*': 15100}), + perBuyerPrioritySignals: {'*': {foo: 3}}, + perBuyerCurrencies: {'*': 'MXN', $5: 'CAD'}, + componentAuctions: [{ + seller: $5, + decisionLogicURL: $6, + decisionLogicUrl: $6, + trustedScoringSignalsURL: $7, + trustedScoringSignalsUrl: $7, + interestGroupBuyers: [$8], + auctionSignals: maybePromise(["component auction signals"]), + sellerSignals: maybePromise(["component seller signals"]), + directFromSellerSignals: maybePromise($9), + sellerTimeout: 200, + perBuyerSignals: maybePromise({$8: ["component buyer signals"]}), + perBuyerTimeouts: maybePromise({$8: 200}), + perBuyerCumulativeTimeouts: maybePromise({$8: 20100}), + perBuyerPrioritySignals: {$8: {bar: 1}, '*': {BaZ: -2}}, + perBuyerCurrencies: maybePromise({$8: 'USD'}), + sellerCurrency: 'CAD', + }], + }); +})())", + top_level_seller_origin, top_level_seller_script_url, + https_server_->GetURL( + kTopLevelSellerHost, + "/interest_group/trusted_scoring_signals.json"), + https_server_->GetURL(kTopLevelSellerHost, + "/direct_from_seller_signals"), + url::Origin::Create(component_seller_script_url), + component_seller_script_url, + https_server_->GetURL( + kComponentSellerHost, + "/interest_group/trusted_scoring_signals2.json"), + bidder_origin, + https_server_->GetURL(kComponentSellerHost, + "/direct_from_seller_signals"))) + .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(kTopLevelSellerHost, + "/echo?report_top_level_seller")); + WaitForUrl(https_server_->GetURL(kComponentSellerHost, + "/echo?report_component_seller")); + WaitForUrl(https_server_->GetURL(kBidderHost, "/echo?report_bidder")); + } +} + IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTest, SellerWorkletThrowsFailsAuction) { GURL test_url = https_server_->GetURL("a.test", "/echo"); @@ -9495,7 +10101,7 @@ validatePerBuyerSignals(perBuyerSignals); validateTrustedBiddingSignals(trustedBiddingSignals); const ad = interestGroup.ads[0]; - return {'ad': ad, 'bid': 1, 'render': ad.renderUrl}; + return {'ad': ad, 'bid': 1, 'render': ad.renderURL}; } function validateInterestGroup(interestGroup) { @@ -9541,7 +10147,9 @@ function validateAdMetadata(adMetadata) { const adMetadataJSON = JSON.stringify(adMetadata); if (adMetadataJSON !== - '{"renderUrl":"https://example.com/render","metadata":2}') + '{"renderURL":"https://example.com/render",' + + '"renderUrl":"https://example.com/render",' + + '"metadata":2}') throw 'Wrong adMetadata ' + adMetadataJSON; } @@ -9582,7 +10190,7 @@ trustedBiddingSignalsKeys: ['key1'], biddingLogicUrl: $3, userBiddingSignals: 1, - ads: [{renderUrl:"https://example.com/render", metadata:2}], + ads: [{renderURL:"https://example.com/render", metadata:2}], }, /*joinDurationSec=*/1); } catch (e) { @@ -9641,7 +10249,7 @@ if (perBuyerSignals !== 5) throw 'Wrong perBuyerSignals ' + JSON.stringify(perBuyerSignals); const ad = interestGroup.ads[0]; - return {'ad': ad, 'bid': 1, 'render': ad.renderUrl}; + return {'ad': ad, 'bid': 1, 'render': ad.renderURL}; } function validateAuctionSignals(auctionSignals) { @@ -9698,7 +10306,7 @@ name: 'cars', owner: $1, biddingLogicUrl: $2, - ads: [{renderUrl:"https://example.com/render", metadata:2}], + ads: [{renderURL:"https://example.com/render", metadata:2}], }, /*joinDurationSec=*/100); } catch (e) { @@ -9758,7 +10366,7 @@ unusedBrowserSignals) { validateAuctionSignals(auctionSignals); const ad = interestGroup.ads[0]; - return {'ad': ad, 'bid': 1, 'render': ad.renderUrl}; + return {'ad': ad, 'bid': 1, 'render': ad.renderURL}; } function validateAuctionSignals(auctionSignals) { @@ -9803,7 +10411,7 @@ name: 'cars', owner: $1, biddingLogicUrl: $2, - ads: [{renderUrl:"https://example.com/render", metadata:2}], + ads: [{renderURL:"https://example.com/render", metadata:2}], }, /*joinDurationSec=*/100); } catch (e) { @@ -9863,7 +10471,7 @@ const ad = interestGroup.ads[0]; if (perBuyerSignals !== null) throw 'perBuyerSignals in generateBid not null!'; - return {'ad': ad, 'bid': 1, 'render': ad.renderUrl}; + return {'ad': ad, 'bid': 1, 'render': ad.renderURL}; } function validateAuctionSignals(auctionSignals) { @@ -9940,7 +10548,7 @@ name: 'cars', owner: $1, biddingLogicUrl: $2, - ads: [{renderUrl:"https://example.com/render", metadata:2}], + ads: [{renderURL:"https://example.com/render", metadata:2}], }, /*joinDurationSec=*/100); } catch (e) { @@ -10009,7 +10617,7 @@ interestGroup, auctionSignals, perBuyerSignals, trustedBiddingSignals, unusedBrowserSignals) { const ad = interestGroup.ads[0]; - return {'ad': ad, 'bid': 1, 'render': ad.renderUrl}; + return {'ad': ad, 'bid': 1, 'render': ad.renderURL}; } )"; @@ -10084,7 +10692,7 @@ name: 'cars', owner: $1, biddingLogicUrl: $2, - ads: [{renderUrl:"https://example.com/render", metadata:2}], + ads: [{renderURL:"https://example.com/render", metadata:2}], }, /*joinDurationSec=*/100); } catch (e) { @@ -10172,7 +10780,7 @@ "%s/interest_group/new_trusted_bidding_signals_url.json", "trustedBiddingSignalsKeys": ["new_key"], "executionMode": "group-by-origin", -"ads": [{"renderUrl": "%s/new_ad_render_url", +"ads": [{"renderURL": "%s/new_ad_render_url", "metadata": {"new_a": "b"} }] })", @@ -10260,7 +10868,7 @@ "%s/interest_group/new_trusted_bidding_signals_url.json", "trustedBiddingSignalsKeys": ["new_key"], "executionMode": "groupByOrigin", -"ads": [{"renderUrl": "%s/new_ad_render_url", +"ads": [{"renderURL": "%s/new_ad_render_url", "metadata": {"new_a": "b"} }] })", @@ -10350,7 +10958,7 @@ "%s/interest_group/new_trusted_bidding_signals_url.json", "trustedBiddingSignalsKeys": ["new_key"], "executionMode": "groupByOrigin", -"ads": [{"renderUrl": "%s/new_ad_render_url", +"ads": [{"renderURL": "%s/new_ad_render_url", "metadata": {"new_a": "b"} }] })", @@ -10429,7 +11037,7 @@ constexpr char kUpdateUrlPath[] = "/interest_group/update_partial.json"; network_responder_->RegisterNetworkResponse( kUpdateUrlPath, base::StringPrintf(R"({ -"ads": [{"renderUrl": "%s/new_ad_render_url", +"ads": [{"renderURL": "%s/new_ad_render_url", "metadata": {"new_a": "b"} }] })", @@ -11343,7 +11951,7 @@ constexpr char kUpdatePath[] = "/interest_group/update_partial_a.json"; constexpr char kUpdateResponse[] = R"( { -"ads": [{"renderUrl": "https://example.com/render2" +"ads": [{"renderURL": "https://example.com/render2" }] })"; // The server JSON updates the ads only. Both update URLs use the same path,
diff --git a/content/browser/interest_group/interest_group_update_manager.cc b/content/browser/interest_group/interest_group_update_manager.cc index d47deed..f52fb80 100644 --- a/content/browser/interest_group/interest_group_update_manager.cc +++ b/content/browser/interest_group/interest_group_update_manager.cc
@@ -265,7 +265,18 @@ const base::Value::Dict* ads_dict = ads_value.GetIfDict(); if (!ads_dict) return absl::nullopt; - const std::string* maybe_render_url = ads_dict->FindString("renderUrl"); + const std::string* maybe_render_url = ads_dict->FindString("renderURL"); + const std::string* maybe_render_url_deprecated = + ads_dict->FindString("renderUrl"); + if (maybe_render_url_deprecated) { + if (maybe_render_url) { + if (*maybe_render_url != *maybe_render_url_deprecated) { + return absl::nullopt; + } + } else { + maybe_render_url = maybe_render_url_deprecated; + } + } if (!maybe_render_url) return absl::nullopt; blink::InterestGroup::Ad ad; @@ -431,9 +442,21 @@ if (!TryToCopySellerCapabilities(*dict, interest_group_update)) { return absl::nullopt; } - const std::string* maybe_bidding_url = dict->FindString("biddingLogicUrl"); - if (maybe_bidding_url) + const std::string* maybe_bidding_url = dict->FindString("biddingLogicURL"); + const std::string* maybe_bidding_url_deprecated = + dict->FindString("biddingLogicUrl"); + if (maybe_bidding_url_deprecated) { + if (maybe_bidding_url) { + if (*maybe_bidding_url_deprecated != *maybe_bidding_url) { + return absl::nullopt; + } + } else { + maybe_bidding_url = maybe_bidding_url_deprecated; + } + } + if (maybe_bidding_url) { interest_group_update.bidding_url = GURL(*maybe_bidding_url); + } const std::string* maybe_bidding_wasm_helper_url = dict->FindString("biddingWasmHelperUrl"); if (maybe_bidding_wasm_helper_url) {
diff --git a/content/browser/media/webaudio/audio_context_manager_browsertest.cc b/content/browser/media/webaudio/audio_context_manager_browsertest.cc index a833d61..aff2875 100644 --- a/content/browser/media/webaudio/audio_context_manager_browsertest.cc +++ b/content/browser/media/webaudio/audio_context_manager_browsertest.cc
@@ -78,9 +78,11 @@ } }; -// Flaky on Linux: https://crbug.com/1047163 -// Flaky on Mac: https://crbug.com/1399440 -#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) +// Flaky on Linux: crbug.com/941219 +// Flaky on Mac: crbug.com/941219 +// Flaky on Fuchsia: crbug.com/941219 +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \ + BUILDFLAG(IS_FUCHSIA) #define MAYBE_AudioContextPlaybackRecorded DISABLED_AudioContextPlaybackRecorded #else #define MAYBE_AudioContextPlaybackRecorded AudioContextPlaybackRecorded @@ -92,11 +94,12 @@ PlayPause(); } -// Flaky on Linux: https://crbug.com/941219 -// Flaky on Android: https://crbug.com/1379357 -// Flaky on Mac: https://crbug.com/1399440 +// Flaky on Linux: crbug.com/941219 +// Flaky on Android: crbug.com/941219 +// Flaky on Mac: crbug.com/941219 +// Flaky on Fuchsia: crbug.com/941219 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || \ - BUILDFLAG(IS_MAC) + BUILDFLAG(IS_MAC) || BUILDFLAG(IS_FUCHSIA) #define MAYBE_AudioContextPlaybackTimeUkm DISABLED_AudioContextPlaybackTimeUkm #else #define MAYBE_AudioContextPlaybackTimeUkm AudioContextPlaybackTimeUkm
diff --git a/content/browser/navigation_browsertest.cc b/content/browser/navigation_browsertest.cc index eba171b5..5f5f444 100644 --- a/content/browser/navigation_browsertest.cc +++ b/content/browser/navigation_browsertest.cc
@@ -6450,6 +6450,54 @@ EXPECT_EQ(embedded_test_server()->GetOrigin("d.com"), results[2].origin); } +// Verify that a speculative RFH in the pending commit state is still cleaned up +// if the renderer crashes. +IN_PROC_BROWSER_TEST_P(CommitNavigationRaceBrowserTest, + CrashedInPendingCommit) { + ASSERT_TRUE(NavigateToURL( + shell(), embedded_test_server()->GetURL("a.com", "/title1.html"))); + ASSERT_TRUE(BeginNavigateToURLFromRenderer( + shell(), embedded_test_server()->GetURL("b.com", "/title1.html"))); + + WebContentsImpl* web_contents = + static_cast<WebContentsImpl*>(shell()->web_contents()); + base::WeakPtr<RenderFrameHostImpl> speculative_render_frame_host = + web_contents->GetPrimaryFrameTree() + .root() + ->render_manager() + ->speculative_frame_host() + ->GetWeakPtr(); + ASSERT_TRUE(speculative_render_frame_host); + + // Wait for the next `DidCommitProvisionalLoad()` and ignore it. + CommitNavigationPauser commit_pauser(speculative_render_frame_host.get()); + commit_pauser.WaitForCommitAndPause(); + + ASSERT_EQ(RenderFrameHostImpl::LifecycleStateImpl::kPendingCommit, + speculative_render_frame_host->lifecycle_state()); + + // Terminate the renderer process while `speculative_render_frame_host` is in + // `kPendingCommit`. + RenderProcessHostWatcher watcher( + speculative_render_frame_host->GetProcess(), + RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT); + speculative_render_frame_host->GetProcess()->ShutdownForBadMessage( + RenderProcessHost::CrashReportMode::NO_CRASH_DUMP); + watcher.Wait(); + + // The speculative RFH should be gone: + ASSERT_FALSE(speculative_render_frame_host); + EXPECT_FALSE(web_contents->GetPrimaryFrameTree() + .root() + ->render_manager() + ->speculative_frame_host()); + + // And a new navigation should not hit any DCHECKs in + // `GetFrameHostForNavigation()`. + EXPECT_TRUE(NavigateToURLFromRenderer( + shell(), embedded_test_server()->GetURL("b.com", "/title1.html"))); +} + INSTANTIATE_TEST_SUITE_P(, CommitNavigationRaceBrowserTest, ::testing::Bool(),
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc index 5cf8d6a..865bed3f 100644 --- a/content/browser/renderer_host/render_frame_host_impl.cc +++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -3189,7 +3189,8 @@ // If this was the current pending or speculative RFH dying, cancel and // destroy it. - if (lifecycle_state_ == LifecycleStateImpl::kSpeculative) { + if (lifecycle_state_ == LifecycleStateImpl::kSpeculative || + lifecycle_state_ == LifecycleStateImpl::kPendingCommit) { CHECK(owner_); // See `owner_` invariants about `lifecycle_state_`. owner_->GetRenderFrameHostManager() .CleanupSpeculativeRfhForRenderProcessGone(); @@ -4859,14 +4860,21 @@ void RenderFrameHostImpl::ResetOwnedNavigationRequests( NavigationDiscardReason reason) { - if (ShouldQueueNavigationsWhenPendingCommitRFHExists() && - lifecycle_state_ == LifecycleStateImpl::kPendingCommit) { - // With navigation queueing, pending commit navigations shouldn't get - // canceled, unless the FrameTreeNode or renderer process - // is gone/will be gone soon. - CHECK(reason == NavigationDiscardReason::kRenderProcessGone || - reason == NavigationDiscardReason::kWillRemoveFrame); + if (lifecycle_state_ == LifecycleStateImpl::kPendingCommit) { + // Pending commit RenderFrameHosts should never have same document + // navigation requests yet, as they do not have a real document committed + // yet. + DCHECK(same_document_navigation_requests_.empty()); + + if (ShouldQueueNavigationsWhenPendingCommitRFHExists()) { + // With navigation queueing, pending commit navigations shouldn't get + // canceled, unless the FrameTreeNode or renderer process + // is gone/will be gone soon. + CHECK(reason == NavigationDiscardReason::kRenderProcessGone || + reason == NavigationDiscardReason::kWillRemoveFrame); + } } + // Move the NavigationRequests to new maps first before deleting them. This // avoids issues if a re-entrant call is made when a NavigationRequest is // being deleted (e.g., if the process goes away as the tab is closing).
diff --git a/content/browser/renderer_host/render_frame_host_manager.cc b/content/browser/renderer_host/render_frame_host_manager.cc index 0f9f741..fea976a0 100644 --- a/content/browser/renderer_host/render_frame_host_manager.cc +++ b/content/browser/renderer_host/render_frame_host_manager.cc
@@ -1786,10 +1786,16 @@ ->GetRenderFrameProxyHost( speculative_render_frame_host_->GetSiteInstance()->group()); DCHECK(proxy); + // Note: this advances the RenderFrameHost's lifecycle state to + // kReadyToBeDeleted. speculative_render_frame_host_->UndoCommitNavigation( *proxy, frame_tree_node_->IsLoading()); + } else { + speculative_render_frame_host_->SetLifecycleState( + LifecycleStateImpl::kReadyToBeDeleted); } } + return std::move(speculative_render_frame_host_); }
diff --git a/content/browser/serial/OWNERS b/content/browser/serial/OWNERS index ff41043..c82c4e3 100644 --- a/content/browser/serial/OWNERS +++ b/content/browser/serial/OWNERS
@@ -1 +1,3 @@ +chengweih@chromium.org +mattreynolds@chromium.org reillyg@chromium.org
diff --git a/content/browser/usb/OWNERS b/content/browser/usb/OWNERS index d74f809..3aa6b47 100644 --- a/content/browser/usb/OWNERS +++ b/content/browser/usb/OWNERS
@@ -1,3 +1,4 @@ reillyg@chromium.org rockot@google.com chengweih@chromium.org +mattreynolds@chromium.org
diff --git a/content/browser/webid/fedcm_metrics.cc b/content/browser/webid/fedcm_metrics.cc index 384368bb..02193a5 100644 --- a/content/browser/webid/fedcm_metrics.cc +++ b/content/browser/webid/fedcm_metrics.cc
@@ -219,21 +219,23 @@ } void FedCmMetrics::RecordAutoReauthnMetrics( - bool has_single_returning_account, + absl::optional<bool> has_single_returning_account, const IdentityRequestAccount* auto_signin_account, bool auto_reauthn_success, bool is_auto_reauthn_setting_blocked, bool is_auto_reauthn_embargoed, absl::optional<base::TimeDelta> time_from_embargo) { NumReturningAccounts num_returning_accounts = NumReturningAccounts::kZero; - if (has_single_returning_account) { - num_returning_accounts = NumReturningAccounts::kOne; - } else if (auto_signin_account) { - num_returning_accounts = NumReturningAccounts::kMultiple; - } + if (has_single_returning_account.has_value()) { + if (*has_single_returning_account) { + num_returning_accounts = NumReturningAccounts::kOne; + } else if (auto_signin_account) { + num_returning_accounts = NumReturningAccounts::kMultiple; + } - base::UmaHistogramEnumeration("Blink.FedCm.AutoReauthn.ReturningAccounts", - num_returning_accounts); + base::UmaHistogramEnumeration("Blink.FedCm.AutoReauthn.ReturningAccounts", + num_returning_accounts); + } base::UmaHistogramBoolean("Blink.FedCm.AutoReauthn.Succeeded", auto_reauthn_success); base::UmaHistogramBoolean("Blink.FedCm.AutoReauthn.BlockedByContentSettings", @@ -254,8 +256,10 @@ time_from_embargo->InMilliseconds())); } - ukm_builder.SetAutoReauthn_ReturningAccounts( - static_cast<int>(num_returning_accounts)); + if (has_single_returning_account.has_value()) { + ukm_builder.SetAutoReauthn_ReturningAccounts( + static_cast<int>(num_returning_accounts)); + } ukm_builder.SetAutoReauthn_Succeeded(auto_reauthn_success); ukm_builder.SetAutoReauthn_BlockedByContentSettings( is_auto_reauthn_setting_blocked);
diff --git a/content/browser/webid/fedcm_metrics.h b/content/browser/webid/fedcm_metrics.h index 709ed314..29580083 100644 --- a/content/browser/webid/fedcm_metrics.h +++ b/content/browser/webid/fedcm_metrics.h
@@ -174,8 +174,10 @@ }; // Records several auto reauthn metrics using the given parameters. + // |has_single_returning_account| is nullopt when we are recording the metrics + // during a failure that happened before the accounts fetch. void RecordAutoReauthnMetrics( - bool has_single_returning_account, + absl::optional<bool> has_single_returning_account, const IdentityRequestAccount* auto_signin_account, bool auto_reauthn_success, bool is_auto_reauthn_setting_blocked,
diff --git a/content/browser/webid/federated_auth_request_impl.cc b/content/browser/webid/federated_auth_request_impl.cc index 7448c34..00cee196 100644 --- a/content/browser/webid/federated_auth_request_impl.cc +++ b/content/browser/webid/federated_auth_request_impl.cc
@@ -1165,6 +1165,7 @@ // are signing in. has_single_returning_account = GetSingleReturningAccount(&auto_reauthn_idp, &auto_reauthn_account); + auto_reauthn &= has_single_returning_account; if (!has_single_returning_account && mediation_requirement_ == MediationRequirement::kSilent) { fedcm_metrics_->RecordAutoReauthnMetrics( @@ -1190,7 +1191,6 @@ /*should_delay_callback=*/false); return; } - auto_reauthn &= has_single_returning_account; } if (auto_reauthn) { @@ -2084,7 +2084,12 @@ bool is_auto_reauthn_embargoed = auto_reauthn_permission_delegate_->IsAutoReauthnEmbargoed( GetEmbeddingOrigin()); + absl::optional<base::TimeDelta> time_from_embargo; if (is_auto_reauthn_embargoed) { + time_from_embargo = + base::Time::Now() - + auto_reauthn_permission_delegate_->GetAutoReauthnEmbargoStartTime( + GetEmbeddingOrigin()); render_frame_host().AddMessageToConsole( blink::mojom::ConsoleMessageLevel::kError, "Silent mediation failed reason: auto re-authn is in quiet period " @@ -2112,8 +2117,17 @@ "invoked on the site."); } - return requires_user_mediation || !is_auto_reauthn_setting_enabled || - is_auto_reauthn_embargoed || !has_sharing_permission_for_any_account; + if (requires_user_mediation || !is_auto_reauthn_setting_enabled || + is_auto_reauthn_embargoed || !has_sharing_permission_for_any_account) { + // Record the relevant auto reauthn metrics before aborting the FedCM flow. + fedcm_metrics_->RecordAutoReauthnMetrics( + /*has_single_returning_account=*/absl::nullopt, + /*auto_signin_account=*/nullptr, + /*auto_reauthn_success=*/false, !is_auto_reauthn_setting_enabled, + is_auto_reauthn_embargoed, time_from_embargo); + return true; + } + return false; } bool FederatedAuthRequestImpl::RequiresUserMediation() {
diff --git a/content/browser/webid/federated_auth_request_impl_unittest.cc b/content/browser/webid/federated_auth_request_impl_unittest.cc index 4b54a7bd..f73a586 100644 --- a/content/browser/webid/federated_auth_request_impl_unittest.cc +++ b/content/browser/webid/federated_auth_request_impl_unittest.cc
@@ -1081,16 +1081,22 @@ } void ExpectAutoReauthnMetrics( - FedCmMetrics::NumReturningAccounts expected_returning_accounts, + absl::optional<FedCmMetrics::NumReturningAccounts> + expected_returning_accounts, bool expected_succeeded, bool expected_auto_reauthn_setting_blocked, bool expected_auto_reauthn_embargoed) { // UMA checks histogram_tester_.ExpectUniqueSample("Blink.FedCm.AutoReauthn.Succeeded", expected_succeeded, 1); - histogram_tester_.ExpectUniqueSample( - "Blink.FedCm.AutoReauthn.ReturningAccounts", - static_cast<int>(expected_returning_accounts), 1); + if (expected_returning_accounts.has_value()) { + histogram_tester_.ExpectUniqueSample( + "Blink.FedCm.AutoReauthn.ReturningAccounts", + static_cast<int>(*expected_returning_accounts), 1); + } else { + histogram_tester_.ExpectTotalCount( + "Blink.FedCm.AutoReauthn.ReturningAccounts", 0); + } histogram_tester_.ExpectUniqueSample( "Blink.FedCm.AutoReauthn.BlockedByContentSettings", expected_auto_reauthn_setting_blocked, 1); @@ -1126,8 +1132,13 @@ metric = ukm_recorder()->GetEntryMetric(entry, "AutoReauthn.ReturningAccounts"); - ASSERT_TRUE(metric) << "AutoReauthn.ReturningAccounts was not found"; - EXPECT_EQ(static_cast<int>(expected_returning_accounts), *metric); + if (expected_returning_accounts) { + ASSERT_TRUE(metric) << "AutoReauthn.ReturningAccounts was not found"; + EXPECT_EQ(static_cast<int>(*expected_returning_accounts), *metric); + } else { + EXPECT_FALSE(metric) + << "AutoReauthn.ReturningAccounts should not have been recorded"; + } metric = ukm_recorder()->GetEntryMetric( entry, "AutoReauthn.BlockedByContentSettings"); @@ -2026,6 +2037,11 @@ ExpectStatusMetrics(TokenStatus::kSilentMediationFailure, MediationRequirement::kSilent); + + ExpectAutoReauthnMetrics(/*expected_returning_accounts=*/absl::nullopt, + /*expected_succeeded=*/false, + /*expected_auto_reauthn_setting_blocked=*/false, + /*expected_auto_reauthn_embargoed=*/false); } // Test that no network request is sent if `mediation: silent` is used and auto @@ -2068,6 +2084,11 @@ ExpectStatusMetrics(TokenStatus::kSilentMediationFailure, MediationRequirement::kSilent); + + ExpectAutoReauthnMetrics(/*expected_returning_accounts=*/absl::nullopt, + /*expected_succeeded=*/false, + /*expected_auto_reauthn_setting_blocked=*/false, + /*expected_auto_reauthn_embargoed=*/true); } // Test that no network request is sent if `mediation: silent` is used and user @@ -2108,6 +2129,11 @@ ExpectStatusMetrics(TokenStatus::kSilentMediationFailure, MediationRequirement::kSilent); + + ExpectAutoReauthnMetrics(/*expected_returning_accounts=*/absl::nullopt, + /*expected_succeeded=*/false, + /*expected_auto_reauthn_setting_blocked=*/false, + /*expected_auto_reauthn_embargoed=*/false); } // Test that no network request is sent if `mediation: silent` is used and user @@ -2147,6 +2173,11 @@ ExpectStatusMetrics(TokenStatus::kSilentMediationFailure, MediationRequirement::kSilent); + + ExpectAutoReauthnMetrics(/*expected_returning_accounts=*/absl::nullopt, + /*expected_succeeded=*/false, + /*expected_auto_reauthn_setting_blocked=*/true, + /*expected_auto_reauthn_embargoed=*/false); } // Test `mediation: silent` could fail silently after fetching accounts @@ -2218,6 +2249,11 @@ ExpectStatusMetrics(TokenStatus::kSilentMediationFailure, MediationRequirement::kSilent); + + ExpectAutoReauthnMetrics(FedCmMetrics::NumReturningAccounts::kMultiple, + /*expected_succeeded=*/false, + /*expected_auto_reauthn_setting_blocked=*/false, + /*expected_auto_reauthn_embargoed=*/false); } // Test that `mediation: required` sets the sign-in mode to explicit even though
diff --git a/content/public/test/fenced_frame_test_util.cc b/content/public/test/fenced_frame_test_util.cc index 4489544..1adf734 100644 --- a/content/public/test/fenced_frame_test_util.cc +++ b/content/public/test/fenced_frame_test_util.cc
@@ -140,7 +140,7 @@ name: 'testAd1', owner: page_origin, biddingLogicUrl: bidding_url, - ads: [{renderUrl: $1, bid: 1}], + ads: [{renderURL: $1, bid: 1}], }; // Pick an arbitrarily high duration to guarantee that we never leave the
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index 9ddb98c..8bf6b5d 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -967,6 +967,10 @@ navigation_params->navigation_timings = BuildNavigationTimings( common_params.navigation_start, *commit_params.navigation_timing, common_params.input_start); + if (!commit_params.redirect_infos.empty()) { + navigation_params->navigation_timings.critical_ch_restart = + commit_params.redirect_infos.back().critical_ch_restart_time; + } navigation_params->is_user_activated = commit_params.was_activated == blink::mojom::WasActivatedOption::kYes;
diff --git a/content/services/auction_worklet/bidder_worklet.cc b/content/services/auction_worklet/bidder_worklet.cc index 3cf9b4f..807e22e9 100644 --- a/content/services/auction_worklet/bidder_worklet.cc +++ b/content/services/auction_worklet/bidder_worklet.cc
@@ -93,6 +93,40 @@ return true; } +// TODO(crbug.com/1441988): Remove this code after rename. These functions allow +// having multiple dictionary keys (e.g. renderUrl and renderURL) share the same +// V8 value. +bool SetDictMember(v8::Isolate* isolate, + v8::Local<v8::Object> object, + const std::string& key, + v8::Local<v8::Value> v8_value) { + v8::Maybe<bool> result = object->Set(isolate->GetCurrentContext(), + gin::StringToV8(isolate, key), v8_value); + return !result.IsNothing() && result.FromJust(); +} + +bool SetRenderUrl(v8::Isolate* isolate, + v8::Local<v8::Object> object, + const std::string& val) { + v8::Local<v8::Value> v8_value; + if (!gin::TryConvertToV8(isolate, val, &v8_value)) { + return false; + } + return SetDictMember(isolate, object, "renderURL", v8_value) && + SetDictMember(isolate, object, "renderUrl", v8_value); +} + +bool SetBiddingLogicUrl(v8::Isolate* isolate, + v8::Local<v8::Object> object, + const std::string& val) { + v8::Local<v8::Value> v8_value; + if (!gin::TryConvertToV8(isolate, val, &v8_value)) { + return false; + } + return SetDictMember(isolate, object, "biddingLogicURL", v8_value) && + SetDictMember(isolate, object, "biddingLogicUrl", v8_value); +} + // Converts a vector of blink::InterestGroup::Ads into a v8 object. bool CreateAdVector(AuctionV8Helper* v8_helper, v8::Local<v8::Context> context, @@ -108,7 +142,9 @@ } v8::Local<v8::Object> ad_object = v8::Object::New(isolate); gin::Dictionary ad_dict(isolate, ad_object); - if (!ad_dict.Set("renderUrl", ad.render_url.spec()) || + if ( + // TODO(crbug.com/1441988): Remove deprecated `renderUrl` alias. + !SetRenderUrl(isolate, ad_object, ad.render_url.spec()) || (ad.metadata && !v8_helper->InsertJsonValue(context, "metadata", *ad.metadata, ad_object))) { return false; @@ -604,8 +640,9 @@ "interestGroupOwner", url::Origin::Create(script_source_url_).Serialize()) || !browser_signals_dict.Set(reporting_id_field_name, reporting_id) || - !browser_signals_dict.Set("renderUrl", - browser_signal_render_url.spec()) || + // TODO(crbug.com/1441988): Remove deprecated `renderUrl` alias. + !SetRenderUrl(isolate, browser_signals, + browser_signal_render_url.spec()) || !browser_signals_dict.Set("bid", browser_signal_bid) || !browser_signals_dict.Set( "bidCurrency", @@ -1005,7 +1042,8 @@ !interest_group_dict.Set("useBiddingSignalsPrioritization", bidder_worklet_non_shared_params .enable_bidding_signals_prioritization) || - !interest_group_dict.Set("biddingLogicUrl", script_source_url_.spec()) || + !SetBiddingLogicUrl(isolate, interest_group_object, + script_source_url_.spec()) || (wasm_helper_url_ && !interest_group_dict.Set("biddingWasmHelperUrl", wasm_helper_url_->spec())) ||
diff --git a/content/services/auction_worklet/bidder_worklet_unittest.cc b/content/services/auction_worklet/bidder_worklet_unittest.cc index c330cc8b..d6a2b16 100644 --- a/content/services/auction_worklet/bidder_worklet_unittest.cc +++ b/content/services/auction_worklet/bidder_worklet_unittest.cc
@@ -3273,16 +3273,18 @@ {"https://url.test/ generateBid() bid render URL " "'https://response2.test/' isn't one of the registered creative URLs."}); - // Adding an ad with a corresponding `renderUrl` should result in success. + // Adding an ad with a corresponding `renderURL` should result in success. // Also check the `interestGroup.ads` field passed to Javascript. interest_group_ads_.emplace_back(GURL("https://response2.test/"), /*metadata=*/R"(["metadata"])"); RunGenerateBidWithReturnValueExpectingResult( R"({ad: interestGroup.ads, bid:1, render:"https://response2.test/"})", mojom::BidderWorkletBid::New( - "[{\"renderUrl\":\"https://response.test/\"}," - "{\"renderUrl\":\"https://response2.test/" - "\",\"metadata\":[\"metadata\"]}]", + "[{\"renderURL\":\"https://response.test/\"," + "\"renderUrl\":\"https://response.test/\"}," + "{\"renderURL\":\"https://response2.test/\"," + "\"renderUrl\":\"https://response2.test/\"," + "\"metadata\":[\"metadata\"]}]", 1, /*bid_currency=*/absl::nullopt, /*ad_cost=*/absl::nullopt, blink::AdDescriptor(GURL("https://response2.test/")), /*ad_component_descriptors=*/absl::nullopt, @@ -3338,9 +3340,11 @@ render:"https://response.test/", adComponents:["https://ad_component.test/", "https://ad_component2.test/"]})", mojom::BidderWorkletBid::New( - "[{\"renderUrl\":\"https://ad_component.test/\"}," - "{\"renderUrl\":\"https://ad_component2.test/" - "\",\"metadata\":[\"metadata\"]}]", + "[{\"renderURL\":\"https://ad_component.test/\"," + "\"renderUrl\":\"https://ad_component.test/\"}," + "{\"renderURL\":\"https://ad_component2.test/\"," + "\"renderUrl\":\"https://ad_component2.test/\"," + "\"metadata\":[\"metadata\"]}]", 1, /*bid_currency=*/absl::nullopt, /*ad_cost=*/absl::nullopt, blink::AdDescriptor(GURL("https://response.test/")), std::vector<blink::AdDescriptor>{ @@ -5063,7 +5067,7 @@ TEST_F(BidderWorkletTest, ReportWinBrowserSignalRenderUrl) { browser_signal_render_url_ = GURL("https://shrimp.test/"); RunReportWinWithFunctionBodyExpectingResult( - "sendReportTo(browserSignals.renderUrl)", browser_signal_render_url_); + "sendReportTo(browserSignals.renderURL)", browser_signal_render_url_); } TEST_F(BidderWorkletTest, ReportWinBrowserSignalBid) { @@ -7289,7 +7293,7 @@ RunGenerateBidWithJavascriptExpectingResult( CreateGenerateBidScript( R"({ad: ["ad"], bid:interestGroup.ads.length, - render:interestGroup.ads[interestGroup.ads.length - 1].renderUrl})", + render:interestGroup.ads[interestGroup.ads.length - 1].renderURL})", kSideEffectScript), mojom::BidderWorkletBid::New( R"(["ad"])", 2, /*bid_currency=*/absl::nullopt, @@ -7319,7 +7323,7 @@ RunGenerateBidWithJavascriptExpectingResult( CreateGenerateBidScript( R"({ad: ["ad"], bid:interestGroup.ads.length, - render:interestGroup.ads[interestGroup.ads.length - 1].renderUrl})", + render:interestGroup.ads[interestGroup.ads.length - 1].renderURL})", kSideEffectScript), mojom::BidderWorkletBid::New( R"(["ad"])", 2, /*bid_currency=*/absl::nullopt, @@ -7405,7 +7409,7 @@ RunGenerateBidWithJavascriptExpectingResult( CreateGenerateBidScript( R"({ad: ["ad"], bid:interestGroup.ads.length, - render:interestGroup.ads[interestGroup.ads.length - 1].renderUrl})", + render:interestGroup.ads[interestGroup.ads.length - 1].renderURL})", kSideEffectScript), mojom::BidderWorkletBid::New( R"(["ad"])", 2, /*bid_currency=*/absl::nullopt, @@ -7435,7 +7439,7 @@ RunGenerateBidWithJavascriptExpectingResult( CreateGenerateBidScript( R"({ad: ["ad"], bid:interestGroup.ads.length, - render:interestGroup.ads[interestGroup.ads.length - 1].renderUrl})", + render:interestGroup.ads[interestGroup.ads.length - 1].renderURL})", kSideEffectScript), mojom::BidderWorkletBid::New( R"(["ad"])", 2, /*bid_currency=*/absl::nullopt, @@ -7460,7 +7464,7 @@ function generateBid(interestGroup) { ++count; return {ad: ["ad"], bid:count, - render:interestGroup.ads[interestGroup.ads.length - 1].renderUrl}; + render:interestGroup.ads[interestGroup.ads.length - 1].renderURL}; } )";
diff --git a/content/services/auction_worklet/seller_worklet.cc b/content/services/auction_worklet/seller_worklet.cc index 11dc8444..452ab73a 100644 --- a/content/services/auction_worklet/seller_worklet.cc +++ b/content/services/auction_worklet/seller_worklet.cc
@@ -56,6 +56,51 @@ namespace { +// TODO(crbug.com/1441988): Remove this code after rename. These functions allow +// having multiple dictionary keys (e.g. renderUrl and renderURL) share the same +// V8 value. +bool SetDictMember(v8::Isolate* isolate, + v8::Local<v8::Object> object, + const std::string& key, + v8::Local<v8::Value> v8_value) { + v8::Maybe<bool> result = object->Set(isolate->GetCurrentContext(), + gin::StringToV8(isolate, key), v8_value); + return !result.IsNothing() && result.FromJust(); +} + +bool SetRenderUrl(v8::Isolate* isolate, + v8::Local<v8::Object> object, + const std::string& val) { + v8::Local<v8::Value> v8_value; + if (!gin::TryConvertToV8(isolate, val, &v8_value)) { + return false; + } + return SetDictMember(isolate, object, "renderURL", v8_value) && + SetDictMember(isolate, object, "renderUrl", v8_value); +} + +bool SetDecisionLogicUrl(v8::Isolate* isolate, + v8::Local<v8::Object> object, + const std::string& val) { + v8::Local<v8::Value> v8_value; + if (!gin::TryConvertToV8(isolate, val, &v8_value)) { + return false; + } + return SetDictMember(isolate, object, "decisionLogicURL", v8_value) && + SetDictMember(isolate, object, "decisionLogicUrl", v8_value); +} + +bool SetTrustedScoringSignalsUrl(v8::Isolate* isolate, + v8::Local<v8::Object> object, + const std::string& val) { + v8::Local<v8::Value> v8_value; + if (!gin::TryConvertToV8(isolate, val, &v8_value)) { + return false; + } + return SetDictMember(isolate, object, "trustedScoringSignalsURL", v8_value) && + SetDictMember(isolate, object, "trustedScoringSignalsUrl", v8_value); +} + bool InsertPrioritySignals( AuctionV8Helper* v8_helper, base::StringPiece key, @@ -195,10 +240,11 @@ gin::Dictionary auction_config_dict(isolate, auction_config_value); if (!auction_config_dict.Set( "seller", url::Origin::Create(decision_logic_url).Serialize()) || - !auction_config_dict.Set("decisionLogicUrl", decision_logic_url.spec()) || + !SetDecisionLogicUrl(isolate, auction_config_value, + decision_logic_url.spec()) || (trusted_coding_signals_url && - !auction_config_dict.Set("trustedScoringSignalsUrl", - trusted_coding_signals_url->spec()))) { + !SetTrustedScoringSignalsUrl(isolate, auction_config_value, + trusted_coding_signals_url->spec()))) { return false; } @@ -810,8 +856,9 @@ !browser_signals_dict.Set( "interestGroupOwner", browser_signal_interest_group_owner.Serialize()) || - !browser_signals_dict.Set("renderUrl", - browser_signal_render_url.spec()) || + // TODO(crbug.com/1441988): Remove deprecated `renderUrl` alias. + !SetRenderUrl(isolate, browser_signals, + browser_signal_render_url.spec()) || !browser_signals_dict.Set("biddingDurationMsec", browser_signal_bidding_duration_msecs) || !browser_signals_dict.Set("bidCurrency", @@ -1255,8 +1302,9 @@ !browser_signals_dict.Set( "buyerAndSellerReportingId", *browser_signal_buyer_and_seller_reporting_id)) || - !browser_signals_dict.Set("renderUrl", - browser_signal_render_url.spec()) || + // TODO(crbug.com/1441988): Remove deprecated `renderUrl` alias. + !SetRenderUrl(isolate, browser_signals, + browser_signal_render_url.spec()) || !browser_signals_dict.Set("bid", browser_signal_bid) || !browser_signals_dict.Set( "bidCurrency",
diff --git a/content/services/auction_worklet/seller_worklet_unittest.cc b/content/services/auction_worklet/seller_worklet_unittest.cc index 724f7fc93..8ae5b4c 100644 --- a/content/services/auction_worklet/seller_worklet_unittest.cc +++ b/content/services/auction_worklet/seller_worklet_unittest.cc
@@ -1430,9 +1430,9 @@ TEST_F(SellerWorkletTest, ScoreAdRenderUrl) { browser_signal_render_url_ = GURL("https://bar.test/path"); RunScoreAdWithReturnValueExpectingResult( - R"(browserSignals.renderUrl === "https://bar.test/path" ? 3 : 0)", 3); + R"(browserSignals.renderURL === "https://bar.test/path" ? 3 : 0)", 3); RunScoreAdWithReturnValueExpectingResult( - R"(browserSignals.renderUrl === "https://bar.test/" ? 3 : 0)", 0); + R"(browserSignals.renderURL === "https://bar.test/" ? 3 : 0)", 0); } TEST_F(SellerWorkletTest, ScoreAdAdComponents) { @@ -1665,11 +1665,11 @@ task_environment_.RunUntilIdle(); EXPECT_EQ(0u, num_completed_worklets); - // Load a seller script that uses the last character of `renderUrl` as the + // Load a seller script that uses the last character of `renderURL` as the // score. The worklet should report a successful load. AddJavascriptResponse( &url_loader_factory_, decision_logic_url_, - CreateScoreAdScript("parseInt(browserSignals.renderUrl.slice(-1))")); + CreateScoreAdScript("parseInt(browserSignals.renderURL.slice(-1))")); // All scripts should complete successfully. run_loop.Run(); @@ -1678,10 +1678,10 @@ // Test the case of a bunch of ScoreAd() calls in parallel, all started after // the worklet script has loaded. TEST_F(SellerWorkletTest, ScoreAdParallelAfterLoadComplete) { - // Seller script that uses the last character of `renderUrl` as the score. + // Seller script that uses the last character of `renderURL` as the score. AddJavascriptResponse( &url_loader_factory_, decision_logic_url_, - CreateScoreAdScript("parseInt(browserSignals.renderUrl.slice(-1))")); + CreateScoreAdScript("parseInt(browserSignals.renderURL.slice(-1))")); auto seller_worklet = CreateWorklet(); const size_t kNumWorklets = 10; @@ -1740,11 +1740,11 @@ base::Time start_time = base::Time::Now(); // Seller script that gets the score from the `trustedScoringSignals` value of - // the passed in `renderUrl`. + // the passed in `renderURL`. AddJavascriptResponse( &url_loader_factory_, decision_logic_url_, CreateScoreAdScript( - "trustedScoringSignals.renderUrl[browserSignals.renderUrl]")); + "trustedScoringSignals.renderUrl[browserSignals.renderURL]")); trusted_scoring_signals_url_ = GURL("https://url.test/trusted_scoring_signals"); auto seller_worklet = CreateWorklet(); @@ -1810,11 +1810,11 @@ // 3) The trusted bidding signals are loaded. TEST_F(SellerWorkletTest, ScoreAdParallelTrustedScoringSignalsBatched1) { // Seller script that gets the score from the `trustedScoringSignals` value of - // the passed in `renderUrl`. + // the passed in `renderURL`. AddJavascriptResponse( &url_loader_factory_, decision_logic_url_, CreateScoreAdScript( - "trustedScoringSignals.renderUrl[browserSignals.renderUrl]")); + "trustedScoringSignals.renderUrl[browserSignals.renderURL]")); trusted_scoring_signals_url_ = GURL("https://url.test/trusted_scoring_signals"); auto seller_worklet = CreateWorklet(); @@ -1909,11 +1909,11 @@ EXPECT_EQ(0u, num_completed_worklets); // Return seller script that gets the score from the `trustedScoringSignals` - // value of the passed in `renderUrl`, and wait for it to finish loading. + // value of the passed in `renderURL`, and wait for it to finish loading. AddJavascriptResponse( &url_loader_factory_, decision_logic_url_, CreateScoreAdScript( - "trustedScoringSignals.renderUrl[browserSignals.renderUrl]")); + "trustedScoringSignals.renderUrl[browserSignals.renderURL]")); task_environment_.RunUntilIdle(); // Provide a single response for the merged URL request. @@ -2003,11 +2003,11 @@ EXPECT_EQ(0u, num_completed_worklets); // Return seller script that gets the score from the `trustedScoringSignals` - // value of the passed in `renderUrl`, and wait for it to finish loading. + // value of the passed in `renderURL`, and wait for it to finish loading. AddJavascriptResponse( &url_loader_factory_, decision_logic_url_, CreateScoreAdScript( - "trustedScoringSignals.renderUrl[browserSignals.renderUrl]")); + "trustedScoringSignals.renderUrl[browserSignals.renderURL]")); // All ScoreAd() calls should succeed with the expected scores. run_loop.Run(); @@ -2550,7 +2550,7 @@ TEST_F(SellerWorkletTest, ReportResultRenderUrl) { browser_signal_render_url_ = GURL("https://foo/"); RunReportResultCreatedScriptExpectingResult( - "browserSignals.renderUrl", "sendReportTo(browserSignals.renderUrl)", + "browserSignals.renderURL", "sendReportTo(browserSignals.renderURL)", R"("https://foo/")", browser_signal_render_url_); } @@ -2576,14 +2576,14 @@ 'click': "https://click.example.com/", 'view': "https://view.example.com/", }); - sendReportTo(browserSignals.renderUrl))", + sendReportTo(browserSignals.renderURL))", /*expected_signals_for_winner=*/"5", /*expected_report_url =*/browser_signal_render_url_, expected_ad_beacon_map); RunReportResultCreatedScriptExpectingResult( R"(5)", - R"(sendReportTo(browserSignals.renderUrl); + R"(sendReportTo(browserSignals.renderURL); registerAdBeacon({ 'click': "https://click.example.com/", 'view': "https://view.example.com/", @@ -2754,6 +2754,7 @@ RunReportResultCreatedScriptExpectingResult( "auctionConfig", /*extra_code=*/std::string(), R"({"seller":"https://example.com",)" + R"("decisionLogicURL":"https://example.com/auction.js",)" R"("decisionLogicUrl":"https://example.com/auction.js"})", /*expected_report_url=*/absl::nullopt); @@ -2819,7 +2820,9 @@ const char kExpectedJson1[] = R"({"seller":"https://example.com", + "decisionLogicURL":"https://example.com/auction.js", "decisionLogicUrl":"https://example.com/auction.js", + "trustedScoringSignalsURL":"https://example.com/scoring_signals.json", "trustedScoringSignalsUrl":"https://example.com/scoring_signals.json", "interestGroupBuyers":["https://buyer1.com", "https://another-buyer.com"], @@ -2866,14 +2869,19 @@ const char kExpectedJson2[] = R"({"seller":"https://example.com", + "decisionLogicURL":"https://example.com/auction.js", "decisionLogicUrl":"https://example.com/auction.js", + "trustedScoringSignalsURL":"https://example.com/scoring_signals.json", "trustedScoringSignalsUrl":"https://example.com/scoring_signals.json", "componentAuctions":[ {"seller":"https://component1.com", + "decisionLogicURL":"https://component1.com/script.js", "decisionLogicUrl":"https://component1.com/script.js", "sellerTimeout":111}, {"seller":"https://component2.com", + "decisionLogicURL":"https://component2.com/script.js", "decisionLogicUrl":"https://component2.com/script.js", + "trustedScoringSignalsURL":"https://component2.com/signals.json", "trustedScoringSignalsUrl":"https://component2.com/signals.json"} ]})"; RunReportResultCreatedScriptExpectingResult( @@ -2888,6 +2896,7 @@ RunReportResultCreatedScriptExpectingResult( "auctionConfig", /*extra_code=*/std::string(), R"({"seller":"https://example.com",)" + R"("decisionLogicURL":"https://example.com/auction.js",)" R"("decisionLogicUrl":"https://example.com/auction.js"})", /*expected_report_url=*/absl::nullopt); @@ -2901,6 +2910,7 @@ RunReportResultCreatedScriptExpectingResult( "auctionConfig", /*extra_code=*/std::string(), R"({"seller":"https://example.com",)" + R"("decisionLogicURL":"https://example.com/auction.js",)" R"("decisionLogicUrl":"https://example.com/auction.js",)" R"("perBuyerTimeouts":{}})", /*expected_report_url=*/absl::nullopt); @@ -2917,6 +2927,7 @@ RunReportResultCreatedScriptExpectingResult( "auctionConfig", /*extra_code=*/std::string(), R"({"seller":"https://example.com",)" + R"("decisionLogicURL":"https://example.com/auction.js",)" R"("decisionLogicUrl":"https://example.com/auction.js",)" R"("perBuyerTimeouts":{"*":150}})", /*expected_report_url=*/absl::nullopt);
diff --git a/content/services/auction_worklet/trusted_signals.cc b/content/services/auction_worklet/trusted_signals.cc index e01590c1..00122ce 100644 --- a/content/services/auction_worklet/trusted_signals.cc +++ b/content/services/auction_worklet/trusted_signals.cc
@@ -307,11 +307,14 @@ v8::Local<v8::Object> out = v8::Object::New(v8_helper->isolate()); - // Create renderUrl sub-object, and add it to to `out`. + // Create renderURL sub-object, and add it to to `out`. v8::Local<v8::Object> render_url_v8_object = CreateObjectFromMap(std::vector<std::string>{render_url.spec()}, *render_url_data_, v8_helper, context); - bool result = v8_helper->InsertValue("renderUrl", render_url_v8_object, out); + bool result = v8_helper->InsertValue("renderURL", render_url_v8_object, out); + DCHECK(result); + // TODO(crbug.com/1441988): Remove deprecated `renderUrl` alias. + result = v8_helper->InsertValue("renderUrl", render_url_v8_object, out); DCHECK(result); // If there are any ad components, assemble and add an `adComponentRenderUrls` @@ -319,6 +322,9 @@ if (!ad_component_render_urls.empty()) { v8::Local<v8::Object> ad_components_v8_object = CreateObjectFromMap( ad_component_render_urls, *ad_component_data_, v8_helper, context); + result = v8_helper->InsertValue("adComponentRenderURLs", + ad_components_v8_object, out); + // TODO(crbug.com/1441988): Remove deprecated `adComponentRenderUrls` alias. result = v8_helper->InsertValue("adComponentRenderUrls", ad_components_v8_object, out); DCHECK(result); @@ -386,6 +392,7 @@ std::move(ad_component_render_urls), trusted_scoring_signals_url, std::move(v8_helper), std::move(load_signals_callback))); + // TODO(crbug.com/1432707): Find a way to rename renderUrls to renderURLs. std::string query_params = base::StrCat( {"hostname=", base::EscapeQueryParamValue(hostname, /*use_plus=*/true), CreateQueryParam("renderUrls", *trusted_signals->render_urls_), @@ -576,12 +583,24 @@ "Ads.InterestGroup.Net.ResponseSizeBytes.TrustedScoring", body->size()); base::UmaHistogramTimes("Ads.InterestGroup.Net.DownloadTime.TrustedScoring", download_time); + + // TODO(crbug.com/1441988): Remove deprecated `renderUrl` alias. + auto render_urls_map = ParseChildKeyValueMap(v8_helper.get(), v8_object, + "renderURLs", *render_urls); + auto render_urls_map_deprecated = ParseChildKeyValueMap( + v8_helper.get(), v8_object, "renderUrls", *render_urls); + auto ad_component_render_urls_map = ParseChildKeyValueMap( + v8_helper.get(), v8_object, "adComponentRenderURLs", + *ad_component_render_urls); + auto ad_component_render_urls_map_deprecated = ParseChildKeyValueMap( + v8_helper.get(), v8_object, "adComponentRenderUrls", + *ad_component_render_urls); result = base::MakeRefCounted<Result>( - ParseChildKeyValueMap(v8_helper.get(), v8_object, "renderUrls", - *render_urls), - ParseChildKeyValueMap(v8_helper.get(), v8_object, - "adComponentRenderUrls", - *ad_component_render_urls), + !render_urls_map.empty() ? std::move(render_urls_map) + : std::move(render_urls_map_deprecated), + !ad_component_render_urls_map.empty() + ? std::move(ad_component_render_urls_map) + : std::move(ad_component_render_urls_map_deprecated), maybe_data_version); }
diff --git a/content/services/auction_worklet/trusted_signals_request_manager_unittest.cc b/content/services/auction_worklet/trusted_signals_request_manager_unittest.cc index c427e10..9b22499d 100644 --- a/content/services/auction_worklet/trusted_signals_request_manager_unittest.cc +++ b/content/services/auction_worklet/trusted_signals_request_manager_unittest.cc
@@ -397,8 +397,11 @@ ASSERT_TRUE(signals); EXPECT_FALSE(error_msg_.has_value()); EXPECT_EQ( - R"({"renderUrl":{"https://foo.test/":1},")" - R"(adComponentRenderUrls":{"https://foosub.test/":2,)" + R"({"renderURL":{"https://foo.test/":1},)" + R"("renderUrl":{"https://foo.test/":1},)" + R"("adComponentRenderURLs":{"https://foosub.test/":2,)" + R"("https://barsub.test/":[3],"https://bazsub.test/":"4"},)" + R"("adComponentRenderUrls":{"https://foosub.test/":2,)" R"("https://barsub.test/":[3],"https://bazsub.test/":"4"}})", ExtractScoringSignals(signals.get(), kRenderUrl, kAdComponentRenderUrls)); } @@ -480,8 +483,11 @@ kRenderUrl1, kAdComponentRenderUrls1); ASSERT_TRUE(signals1); EXPECT_FALSE(error_msg_.has_value()); - EXPECT_EQ(R"({"renderUrl":{"https://foo.test/":1},")" - R"(adComponentRenderUrls":{"https://foosub.test/":2,)" + EXPECT_EQ(R"({"renderURL":{"https://foo.test/":1},)" + R"("renderUrl":{"https://foo.test/":1},)" + R"("adComponentRenderURLs":{"https://foosub.test/":2,)" + R"("https://bazsub.test/":3},)" + R"("adComponentRenderUrls":{"https://foosub.test/":2,)" R"("https://bazsub.test/":3}})", ExtractScoringSignals(signals1.get(), kRenderUrl1, kAdComponentRenderUrls1)); @@ -506,8 +512,11 @@ kRenderUrl2, kAdComponentRenderUrls2); ASSERT_TRUE(signals2); EXPECT_FALSE(error_msg_.has_value()); - EXPECT_EQ(R"({"renderUrl":{"https://bar.test/":4},")" - R"(adComponentRenderUrls":{"https://barsub.test/":5,)" + EXPECT_EQ(R"({"renderURL":{"https://bar.test/":4},)" + R"("renderUrl":{"https://bar.test/":4},)" + R"("adComponentRenderURLs":{"https://barsub.test/":5,)" + R"("https://bazsub.test/":6},)" + R"("adComponentRenderUrls":{"https://barsub.test/":5,)" R"("https://bazsub.test/":6}})", ExtractScoringSignals(signals2.get(), kRenderUrl2, kAdComponentRenderUrls2)); @@ -664,8 +673,11 @@ run_loop1.Run(); EXPECT_FALSE(error_msg1); ASSERT_TRUE(signals1); - EXPECT_EQ(R"({"renderUrl":{"https://foo.test/":1},")" - R"(adComponentRenderUrls":{"https://foosub.test/":2,)" + EXPECT_EQ(R"({"renderURL":{"https://foo.test/":1},)" + R"("renderUrl":{"https://foo.test/":1},)" + R"("adComponentRenderURLs":{"https://foosub.test/":2,)" + R"("https://bazsub.test/":3},)" + R"("adComponentRenderUrls":{"https://foosub.test/":2,)" R"("https://bazsub.test/":3}})", ExtractScoringSignals(signals1.get(), kRenderUrl1, kAdComponentRenderUrls1)); @@ -673,8 +685,11 @@ run_loop2.Run(); EXPECT_FALSE(error_msg2); ASSERT_TRUE(signals2); - EXPECT_EQ(R"({"renderUrl":{"https://bar.test/":4},")" - R"(adComponentRenderUrls":{"https://barsub.test/":5,)" + EXPECT_EQ(R"({"renderURL":{"https://bar.test/":4},)" + R"("renderUrl":{"https://bar.test/":4},)" + R"("adComponentRenderURLs":{"https://barsub.test/":5,)" + R"("https://bazsub.test/":6},)" + R"("adComponentRenderUrls":{"https://barsub.test/":5,)" R"("https://bazsub.test/":6}})", ExtractScoringSignals(signals2.get(), kRenderUrl2, kAdComponentRenderUrls2)); @@ -782,8 +797,11 @@ run_loop1.Run(); EXPECT_FALSE(error_msg1); ASSERT_TRUE(signals1); - EXPECT_EQ(R"({"renderUrl":{"https://foo.test/":1},")" - R"(adComponentRenderUrls":{"https://foosub.test/":2,)" + EXPECT_EQ(R"({"renderURL":{"https://foo.test/":1},)" + R"("renderUrl":{"https://foo.test/":1},)" + R"("adComponentRenderURLs":{"https://foosub.test/":2,)" + R"("https://bazsub.test/":"4"},)" + R"("adComponentRenderUrls":{"https://foosub.test/":2,)" R"("https://bazsub.test/":"4"}})", ExtractScoringSignals(signals1.get(), kRenderUrl1, kAdComponentRenderUrls1)); @@ -791,8 +809,11 @@ run_loop2.Run(); EXPECT_FALSE(error_msg2); ASSERT_TRUE(signals2); - EXPECT_EQ(R"({"renderUrl":{"https://bar.test/":[2]},")" - R"(adComponentRenderUrls":{"https://barsub.test/":[3],)" + EXPECT_EQ(R"({"renderURL":{"https://bar.test/":[2]},)" + R"("renderUrl":{"https://bar.test/":[2]},)" + R"("adComponentRenderURLs":{"https://barsub.test/":[3],)" + R"("https://bazsub.test/":"4"},)" + R"("adComponentRenderUrls":{"https://barsub.test/":[3],)" R"("https://bazsub.test/":"4"}})", ExtractScoringSignals(signals2.get(), kRenderUrl2, kAdComponentRenderUrls2)); @@ -800,7 +821,8 @@ run_loop3.Run(); EXPECT_FALSE(error_msg3); ASSERT_TRUE(signals3); - EXPECT_EQ(R"({"renderUrl":{"https://foo.test/":1}})", + EXPECT_EQ(R"({"renderURL":{"https://foo.test/":1},)" + R"("renderUrl":{"https://foo.test/":1}})", ExtractScoringSignals(signals3.get(), kRenderUrl3, kAdComponentRenderUrls3)); } @@ -1209,8 +1231,11 @@ run_loop.Run(); EXPECT_FALSE(error_msg) << *error_msg; ASSERT_TRUE(signals); - EXPECT_EQ(R"({"renderUrl":{"https://foo.test/":1},")" - R"(adComponentRenderUrls":{"https://foosub.test/":2,)" + EXPECT_EQ(R"({"renderURL":{"https://foo.test/":1},)" + R"("renderUrl":{"https://foo.test/":1},)" + R"("adComponentRenderURLs":{"https://foosub.test/":2,)" + R"("https://bazsub.test/":"4"},)" + R"("adComponentRenderUrls":{"https://foosub.test/":2,)" R"("https://bazsub.test/":"4"}})", ExtractScoringSignals(signals.get(), kRenderUrl1, kAdComponentRenderUrls1));
diff --git a/content/services/auction_worklet/trusted_signals_unittest.cc b/content/services/auction_worklet/trusted_signals_unittest.cc index 5834739..db26da79 100644 --- a/content/services/auction_worklet/trusted_signals_unittest.cc +++ b/content/services/auction_worklet/trusted_signals_unittest.cc
@@ -99,6 +99,52 @@ } )"; +const char kBaseScoringJsonNewNames[] = R"( + { + "renderURLs": { + "https://foo.test/": 1, + "https://bar.test/": [2], + "https://baz.test/": null, + "https://shared.test/": "render url" + }, + "adComponentRenderURLs": { + "https://foosub.test/": 2, + "https://barsub.test/": [3], + "https://bazsub.test/": null, + "https://shared.test/": "ad component url" + } + } +)"; + +const char kBaseScoringJsonNewAndOldNames[] = R"( + { + "renderURLs": { + "https://foo.test/": 1, + "https://bar.test/": [2], + "https://baz.test/": null, + "https://shared.test/": "render url" + }, + "renderUrls": { + "https://foo.test/": 1, + "https://bar.test/": [2], + "https://baz.test/": null, + "https://shared.test/": "render url" + }, + "adComponentRenderURLs": { + "https://foosub.test/": 2, + "https://barsub.test/": [3], + "https://bazsub.test/": null, + "https://shared.test/": "ad component url" + }, + "adComponentRenderUrls": { + "https://foosub.test/": 2, + "https://barsub.test/": [3], + "https://bazsub.test/": null, + "https://shared.test/": "ad component url" + } + } +)"; + const char kHostname[] = "publisher"; class TrustedSignalsTest : public testing::Test { @@ -443,7 +489,9 @@ /*ad_component_render_urls=*/{"https://bar.test/"}, kHostname, /*experiment_group_id=*/absl::nullopt); ASSERT_TRUE(signals); - EXPECT_EQ(R"({"renderUrl":{"https://foo.test/":null},)" + EXPECT_EQ(R"({"renderURL":{"https://foo.test/":null},)" + R"("renderUrl":{"https://foo.test/":null},)" + R"("adComponentRenderURLs":{"https://bar.test/":null},)" R"("adComponentRenderUrls":{"https://bar.test/":null}})", ExtractScoringSignals( signals.get(), /*render_url=*/GURL("https://foo.test/"), @@ -519,7 +567,9 @@ /*ad_component_render_urls=*/{"https://bar.test/"}, kHostname, /*experiment_group_id=*/absl::nullopt); ASSERT_TRUE(signals); - EXPECT_EQ(R"({"renderUrl":{"https://foo.test/":null},)" + EXPECT_EQ(R"({"renderURL":{"https://foo.test/":null},)" + R"("renderUrl":{"https://foo.test/":null},)" + R"("adComponentRenderURLs":{"https://bar.test/":null},)" R"("adComponentRenderUrls":{"https://bar.test/":null}})", ExtractScoringSignals( signals.get(), /*render_url=*/GURL("https://foo.test/"), @@ -566,7 +616,9 @@ /*ad_component_render_urls=*/{"https://bar.test/"}, kHostname, /*experiment_group_id=*/absl::nullopt); ASSERT_TRUE(signals); - EXPECT_EQ(R"({"renderUrl":{"https://foo.test/":null},)" + EXPECT_EQ(R"({"renderURL":{"https://foo.test/":null},)" + R"("renderUrl":{"https://foo.test/":null},)" + R"("adComponentRenderURLs":{"https://bar.test/":null},)" R"("adComponentRenderUrls":{"https://bar.test/":null}})", ExtractScoringSignals( signals.get(), /*render_url=*/GURL("https://foo.test/"), @@ -599,7 +651,8 @@ /*ad_component_render_urls=*/{}, kHostname, /*experiment_group_id=*/absl::nullopt); ASSERT_TRUE(signals); - EXPECT_EQ(R"({"renderUrl":{"https://foo.test/":1}})", + EXPECT_EQ(R"({"renderURL":{"https://foo.test/":1},)" + R"("renderUrl":{"https://foo.test/":1}})", ExtractScoringSignals(signals.get(), /*render_url=*/GURL("https://foo.test/"), /*ad_component_render_urls=*/{})); @@ -659,8 +712,73 @@ kHostname, /*experiment_group_id=*/absl::nullopt); ASSERT_TRUE(signals); EXPECT_FALSE(error_msg_.has_value()); - EXPECT_EQ(R"({"renderUrl":{"https://bar.test/":[2]},")" - R"(adComponentRenderUrls":{"https://foosub.test/":2,)" + EXPECT_EQ(R"({"renderURL":{"https://bar.test/":[2]},)" + R"("renderUrl":{"https://bar.test/":[2]},)" + R"("adComponentRenderURLs":{"https://foosub.test/":2,)" + R"("https://barsub.test/":[3],"https://bazsub.test/":null},)" + R"("adComponentRenderUrls":{"https://foosub.test/":2,)" + R"("https://barsub.test/":[3],"https://bazsub.test/":null}})", + ExtractScoringSignals( + signals.get(), /*render_url=*/GURL("https://bar.test/"), + /*ad_component_render_urls=*/ + {"https://foosub.test/", "https://barsub.test/", + "https://bazsub.test/"})); +} + +TEST_F(TrustedSignalsTest, ScoringSignalsNewNames) { + // URLs are currently added in lexical order. + scoped_refptr<TrustedSignals::Result> signals = + FetchScoringSignalsWithResponse( + GURL("https://url.test/?hostname=publisher" + "&renderUrls=https%3A%2F%2Fbar.test%2F," + "https%3A%2F%2Fbaz.test%2F,https%3A%2F%2Ffoo.test%2F" + "&adComponentRenderUrls=https%3A%2F%2Fbarsub.test%2F," + "https%3A%2F%2Fbazsub.test%2F,https%3A%2F%2Ffoosub.test%2F"), + kBaseScoringJsonNewNames, + /*render_urls=*/ + {"https://foo.test/", "https://bar.test/", "https://baz.test/"}, + /*ad_component_render_urls=*/ + {"https://foosub.test/", "https://barsub.test/", + "https://bazsub.test/"}, + kHostname, /*experiment_group_id=*/absl::nullopt); + ASSERT_TRUE(signals); + EXPECT_FALSE(error_msg_.has_value()); + EXPECT_EQ(R"({"renderURL":{"https://bar.test/":[2]},)" + R"("renderUrl":{"https://bar.test/":[2]},)" + R"("adComponentRenderURLs":{"https://foosub.test/":2,)" + R"("https://barsub.test/":[3],"https://bazsub.test/":null},)" + R"("adComponentRenderUrls":{"https://foosub.test/":2,)" + R"("https://barsub.test/":[3],"https://bazsub.test/":null}})", + ExtractScoringSignals( + signals.get(), /*render_url=*/GURL("https://bar.test/"), + /*ad_component_render_urls=*/ + {"https://foosub.test/", "https://barsub.test/", + "https://bazsub.test/"})); +} + +TEST_F(TrustedSignalsTest, ScoringSignalsNewAndOldNames) { + // URLs are currently added in lexical order. + scoped_refptr<TrustedSignals::Result> signals = + FetchScoringSignalsWithResponse( + GURL("https://url.test/?hostname=publisher" + "&renderUrls=https%3A%2F%2Fbar.test%2F," + "https%3A%2F%2Fbaz.test%2F,https%3A%2F%2Ffoo.test%2F" + "&adComponentRenderUrls=https%3A%2F%2Fbarsub.test%2F," + "https%3A%2F%2Fbazsub.test%2F,https%3A%2F%2Ffoosub.test%2F"), + kBaseScoringJsonNewAndOldNames, + /*render_urls=*/ + {"https://foo.test/", "https://bar.test/", "https://baz.test/"}, + /*ad_component_render_urls=*/ + {"https://foosub.test/", "https://barsub.test/", + "https://bazsub.test/"}, + kHostname, /*experiment_group_id=*/absl::nullopt); + ASSERT_TRUE(signals); + EXPECT_FALSE(error_msg_.has_value()); + EXPECT_EQ(R"({"renderURL":{"https://bar.test/":[2]},)" + R"("renderUrl":{"https://bar.test/":[2]},)" + R"("adComponentRenderURLs":{"https://foosub.test/":2,)" + R"("https://barsub.test/":[3],"https://bazsub.test/":null},)" + R"("adComponentRenderUrls":{"https://foosub.test/":2,)" R"("https://barsub.test/":[3],"https://bazsub.test/":null}})", ExtractScoringSignals( signals.get(), /*render_url=*/GURL("https://bar.test/"), @@ -709,16 +827,19 @@ kHostname, /*experiment_group_id=*/absl::nullopt); ASSERT_TRUE(signals); EXPECT_FALSE(error_msg_.has_value()); - EXPECT_EQ(R"({"renderUrl":{"https://bar.test/":[2]},")" - R"(adComponentRenderUrls":{)" + EXPECT_EQ(R"({"renderURL":{"https://bar.test/":[2]},)" + R"("renderUrl":{"https://bar.test/":[2]},)" + R"("adComponentRenderURLs":{)" + R"("https://barsub.test/":[3],"https://foosub.test/":2},)" + R"("adComponentRenderUrls":{)" R"("https://barsub.test/":[3],"https://foosub.test/":2}})", ExtractScoringSignals(signals.get(), /*render_url=*/GURL("https://bar.test/"), ad_component_render_urls_vector)); } -// Test when a single URL is used as both a `renderUrl` and -// `adComponentRenderUrl`. +// Test when a single URL is used as both a `renderURL` and +// `adComponentRenderURL`. TEST_F(TrustedSignalsTest, ScoringSignalsSharedUrl) { // URLs are currently added in lexical order. scoped_refptr<TrustedSignals::Result> signals = @@ -735,8 +856,10 @@ ASSERT_TRUE(signals); EXPECT_FALSE(error_msg_.has_value()); EXPECT_EQ( - R"({"renderUrl":{"https://shared.test/":"render url"},")" - R"(adComponentRenderUrls":{"https://shared.test/":"ad component url"}})", + R"({"renderURL":{"https://shared.test/":"render url"},)" + R"("renderUrl":{"https://shared.test/":"render url"},)" + R"("adComponentRenderURLs":{"https://shared.test/":"ad component url"},)" + R"("adComponentRenderUrls":{"https://shared.test/":"ad component url"}})", ExtractScoringSignals(signals.get(), /*render_url=*/GURL("https://shared.test/"), /*ad_component_render_urls=*/ @@ -790,7 +913,9 @@ {"https://bar.test/?&="}, "pub li&sher", /*experiment_group_id=*/absl::nullopt); ASSERT_TRUE(signals); - EXPECT_EQ(R"({"renderUrl":{"https://foo.test/?&=":4},)" + EXPECT_EQ(R"({"renderURL":{"https://foo.test/?&=":4},)" + R"("renderUrl":{"https://foo.test/?&=":4},)" + R"("adComponentRenderURLs":{"https://bar.test/?&=":5},)" R"("adComponentRenderUrls":{"https://bar.test/?&=":5}})", ExtractScoringSignals( signals.get(), /*render_url=*/ @@ -863,7 +988,8 @@ /*ad_component_render_urls=*/{}, kHostname, /*experiment_group_id=*/absl::nullopt); ASSERT_TRUE(signals); - EXPECT_EQ(R"({"renderUrl":{"https://foo.test/":1}})", + EXPECT_EQ(R"({"renderURL":{"https://foo.test/":1},)" + R"("renderUrl":{"https://foo.test/":1}})", ExtractScoringSignals(signals.get(), /*render_url=*/GURL("https://foo.test/"), /*ad_component_render_urls=*/{})); @@ -922,7 +1048,8 @@ /*ad_component_render_urls=*/{}, kHostname, /*experiment_group_id=*/2345u); ASSERT_TRUE(signals); - EXPECT_EQ(R"({"renderUrl":{"https://foo.test/":1}})", + EXPECT_EQ(R"({"renderURL":{"https://foo.test/":1},)" + R"("renderUrl":{"https://foo.test/":1}})", ExtractScoringSignals(signals.get(), /*render_url=*/GURL("https://foo.test/"), /*ad_component_render_urls=*/{}));
diff --git a/content/test/content_test_bundle_data.filelist b/content/test/content_test_bundle_data.filelist index 541dd3f2..654d6c1 100644 --- a/content/test/content_test_bundle_data.filelist +++ b/content/test/content_test_bundle_data.filelist
@@ -5116,6 +5116,7 @@ data/attribution_reporting/databases/version_51.sql data/attribution_reporting/databases/version_52.sql data/attribution_reporting/databases/version_53.sql +data/attribution_reporting/databases/version_54.sql data/attribution_reporting/inject_cross_app_web_third_party_ot.js data/attribution_reporting/interop/aggregatable_budget.json data/attribution_reporting/interop/aggregatable_contributions_creation.json
diff --git a/content/test/data/accessibility/html/link-target-expected-auralinux.txt b/content/test/data/accessibility/html/link-target-expected-auralinux.txt index 0324713..fafdc31 100644 --- a/content/test/data/accessibility/html/link-target-expected-auralinux.txt +++ b/content/test/data/accessibility/html/link-target-expected-auralinux.txt
@@ -7,11 +7,11 @@ ++++++++[static] name='First context.' ++++++[link] name='Self target. Opens in this iframe. ' ++++++++[static] name='Self target. Opens in this iframe. ' -++++++[link] name='Parent target. Opens in the body of the whole page.' +++++++[link] name='Parent target. Opens in the body of the whole page.' link-target:_parent ++++++++[static] name='Parent target. Opens in the body of the whole page.' -++[link] name='Base target. Open in blank. ' +++[link] name='Base target. Open in blank. ' link-target:_top ++++[static] name='Base target. Open in blank. ' -++[link] name='Top target. Opens in current context. ' +++[link] name='Top target. Opens in current context. ' link-target:_top ++++[static] name='Top target. Opens in current context. ' -++[link] name='Opens in iframe.' +++[link] name='Opens in iframe.' link-target:iframeContext ++++[static] name='Opens in iframe.' \ No newline at end of file
diff --git a/content/test/data/attribution_reporting/databases/version_53.sql b/content/test/data/attribution_reporting/databases/version_53.sql index c527e4b..d70ba52 100644 --- a/content/test/data/attribution_reporting/databases/version_53.sql +++ b/content/test/data/attribution_reporting/databases/version_53.sql
@@ -44,4 +44,6 @@ CREATE INDEX rate_limit_source_id_idx ON rate_limits(source_id); +INSERT INTO rate_limits VALUES (0,1,2,'3','4','5','https://a.r.test',7,8); + COMMIT;
diff --git a/content/test/data/attribution_reporting/databases/version_54.sql b/content/test/data/attribution_reporting/databases/version_54.sql new file mode 100644 index 0000000..a29db32b --- /dev/null +++ b/content/test/data/attribution_reporting/databases/version_54.sql
@@ -0,0 +1,47 @@ +PRAGMA foreign_keys=OFF; + +BEGIN TRANSACTION; + +CREATE TABLE sources(source_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,source_event_id INTEGER NOT NULL,source_origin TEXT NOT NULL,reporting_origin TEXT NOT NULL,source_time INTEGER NOT NULL,expiry_time INTEGER NOT NULL,event_report_window_time INTEGER NOT NULL,aggregatable_report_window_time INTEGER NOT NULL,num_attributions INTEGER NOT NULL,event_level_active INTEGER NOT NULL,aggregatable_active INTEGER NOT NULL,source_type INTEGER NOT NULL,attribution_logic INTEGER NOT NULL,priority INTEGER NOT NULL,source_site TEXT NOT NULL,debug_key INTEGER,aggregatable_budget_consumed INTEGER NOT NULL,num_aggregatable_reports INTEGER NOT NULL,aggregatable_source BLOB NOT NULL,filter_data BLOB NOT NULL); + +CREATE TABLE reports(report_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,source_id INTEGER NOT NULL,trigger_time INTEGER NOT NULL,report_time INTEGER NOT NULL,initial_report_time INTEGER NOT NULL,failed_send_attempts INTEGER NOT NULL,external_report_id TEXT NOT NULL,debug_key INTEGER,context_origin TEXT NOT NULL,reporting_origin TEXT NOT NULL,report_type INTEGER NOT NULL,metadata BLOB NOT NULL); + +CREATE TABLE rate_limits(id INTEGER PRIMARY KEY NOT NULL,scope INTEGER NOT NULL,source_id INTEGER NOT NULL,source_site TEXT NOT NULL,destination_site TEXT NOT NULL,context_origin TEXT NOT NULL,reporting_origin TEXT NOT NULL,reporting_site TEXT NOT NULL,time INTEGER NOT NULL,source_expiry_or_attribution_time INTEGER NOT NULL); + +CREATE TABLE dedup_keys(source_id INTEGER NOT NULL,report_type INTEGER NOT NULL,dedup_key INTEGER NOT NULL,PRIMARY KEY(source_id,report_type,dedup_key))WITHOUT ROWID; + +CREATE TABLE source_destinations(source_id INTEGER NOT NULL,destination_site TEXT NOT NULL,PRIMARY KEY(source_id,destination_site))WITHOUT ROWID; + +CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR); + +INSERT INTO meta VALUES('mmap_status','-1'); +INSERT INTO meta VALUES('version','54'); +INSERT INTO meta VALUES('last_compatible_version','54'); + +CREATE INDEX sources_by_active_reporting_origin ON sources(event_level_active,aggregatable_active,reporting_origin); + +CREATE INDEX sources_by_expiry_time ON sources(expiry_time); + +CREATE INDEX active_sources_by_source_origin ON sources(source_origin)WHERE event_level_active=1 OR aggregatable_active=1; + +CREATE INDEX sources_by_source_time ON sources(source_time); + +CREATE INDEX sources_by_destination_site ON source_destinations(destination_site); + +CREATE INDEX reports_by_report_time ON reports(report_time); + +CREATE INDEX reports_by_source_id_report_type ON reports(source_id,report_type); + +CREATE INDEX reports_by_trigger_time ON reports(trigger_time); + +CREATE INDEX reports_by_reporting_origin ON reports(reporting_origin)WHERE report_type=2; + +CREATE INDEX rate_limit_source_site_reporting_site_idx ON rate_limits(source_site,reporting_site)WHERE scope=0; + +CREATE INDEX rate_limit_reporting_origin_idx ON rate_limits(scope,destination_site,source_site); + +CREATE INDEX rate_limit_time_idx ON rate_limits(time); + +CREATE INDEX rate_limit_source_id_idx ON rate_limits(source_id); + +COMMIT;
diff --git a/content/test/data/attribution_reporting/interop/README.md b/content/test/data/attribution_reporting/interop/README.md index 025fa5f5..cfb5762 100644 --- a/content/test/data/attribution_reporting/interop/README.md +++ b/content/test/data/attribution_reporting/interop/README.md
@@ -31,9 +31,9 @@ "max_sources_per_origin": "1024", // Positive integer that controls the maximum number of distinct destinations - // covered by pending sources for a given (source site, reporting origin). + // covered by pending sources for a given (source site, reporting site). // Formatted as a base-10 string. - "max_destinations_per_source_site_reporting_origin": "100", + "max_destinations_per_source_site_reporting_site": "100", // Positive integer that controls the rate-limiting time window in days for // attribution. Formatted as a base-10 string. @@ -50,7 +50,7 @@ "rate_limit_max_attribution_reporting_origins": "10", // Positive integer that controls the maximum number of attributions for a - // given (source site, destination site, reporting origin) per rate-limit window. + // given (source site, destination site, reporting site) per rate-limit window. // Formatted as a base-10 string. "rate_limit_max_attributions": "100",
diff --git a/content/test/data/attribution_reporting/interop/default_config.json b/content/test/data/attribution_reporting/interop/default_config.json index a54d666..3303534 100644 --- a/content/test/data/attribution_reporting/interop/default_config.json +++ b/content/test/data/attribution_reporting/interop/default_config.json
@@ -1,6 +1,6 @@ { "max_sources_per_origin": "1024", - "max_destinations_per_source_site_reporting_origin": "100", + "max_destinations_per_source_site_reporting_site": "100", "rate_limit_time_window": "30", "rate_limit_max_source_registration_reporting_origins": "100", "rate_limit_max_attribution_reporting_origins": "10",
diff --git a/content/test/data/attribution_reporting/interop/destination_limit.json b/content/test/data/attribution_reporting/interop/destination_limit.json index afbd049..902bc2d 100644 --- a/content/test/data/attribution_reporting/interop/destination_limit.json +++ b/content/test/data/attribution_reporting/interop/destination_limit.json
@@ -1,7 +1,7 @@ { "description": "Unique destination limit covered by unexpired sources", "api_config": { - "max_destinations_per_source_site_reporting_origin": "1" + "max_destinations_per_source_site_reporting_site": "1" }, "input": { "sources": [ @@ -113,7 +113,31 @@ } }] }, - // Should be registered as the reporting origin is different. + // Should be dropped due to destination limit even if one of the + // destinations existed because the reporting site is the same. + { + "timestamp": "1643235575003", + "registration_request": { + "source_origin": "https://source1.test", + "attribution_src_url": "https://sub.reporter1.test/register-source", + "source_type": "event" + }, + "responses": [{ + "url": "https://sub.reporter1.test/register-source", + "debug_permission": true, + "response": { + "Attribution-Reporting-Register-Source": { + "debug_reporting": true, + "destination": [ + "https://destination1.test", + "https://destination2.test" + ], + "source_event_id": "765" + } + } + }] + }, + // Should be registered as the reporting site is different. { "timestamp": "1643235577000", "registration_request": { @@ -428,6 +452,19 @@ } ], "report_time": "1643235575002", "report_url": "https://reporter1.test/.well-known/attribution-reporting/debug/verbose" + }, + { + "payload": [ { + "body": { + "attribution_destination": [ "https://destination1.test", "https://destination2.test" ], + "limit": "1", + "source_event_id": "765", + "source_site": "https://source1.test" + }, + "type": "source-destination-limit" + } ], + "report_time": "1643235575003", + "report_url": "https://sub.reporter1.test/.well-known/attribution-reporting/debug/verbose" } ] }
diff --git a/content/test/data/attribution_reporting/interop/rate_limit_max_attributions.json b/content/test/data/attribution_reporting/interop/rate_limit_max_attributions.json index 4400636..507351d4 100644 --- a/content/test/data/attribution_reporting/interop/rate_limit_max_attributions.json +++ b/content/test/data/attribution_reporting/interop/rate_limit_max_attributions.json
@@ -86,6 +86,23 @@ } }] }, + { + "timestamp": "1643235581001", + "registration_request": { + "source_origin": "https://source.test", + "attribution_src_url": "https://reporter2.test/register-source", + "source_type": "navigation" + }, + "responses": [{ + "url": "https://reporter2.test/register-source", + "response": { + "Attribution-Reporting-Register-Source": { + "destination": "https://destination.test", + "source_event_id": "555" + } + } + }] + }, // Should be preferred over the third source as it's more recent. { "timestamp": "1643235583000", @@ -290,10 +307,10 @@ } }] }, - // Should result in an event-level report because the attribution limit - // is separate for a different reporting origin. + // Should not result in an event-level report because the attribution limit + // applies to reporting sites, not reporting origins. { - "timestamp": "1643235582000", + "timestamp": "1643235581500", "registration_request": { "attribution_src_url": "https://example.reporter.test/register-trigger", "destination_origin": "https://destination.test" @@ -311,6 +328,27 @@ } }] }, + // Should result in an event-level report because the attribution limit + // is separate for a different reporting site. + { + "timestamp": "1643235582000", + "registration_request": { + "attribution_src_url": "https://reporter2.test/register-trigger", + "destination_origin": "https://destination.test" + }, + "responses": [{ + "url": "https://reporter2.test/register-trigger", + "response": { + "Attribution-Reporting-Register-Trigger": { + "event_trigger_data": [ + { + "trigger_data": "4" + } + ] + } + } + }] + }, // Should be dropped due to attribution limit that ignores source type. { "timestamp": "1643235584000", @@ -415,8 +453,8 @@ "source_type": "navigation", "trigger_data": "4" }, - "report_url": "https://example.reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411981000" + "report_url": "https://reporter2.test/.well-known/attribution-reporting/report-event-attribution", + "report_time": "1643411981001" }, { "payload": {
diff --git a/content/test/data/interest_group/bidding_argument_validator.js b/content/test/data/interest_group/bidding_argument_validator.js index 0c1125f..8e5a42ed 100644 --- a/content/test/data/interest_group/bidding_argument_validator.js +++ b/content/test/data/interest_group/bidding_argument_validator.js
@@ -20,8 +20,8 @@ 'adCost': 3, 'bidCurrency': interestGroup.owner.startsWith("https://a.test") ? 'USD' : 'CAD', - 'render': ad.renderUrl, - 'adComponents': [interestGroup.adComponents[0].renderUrl] + 'render': ad.renderURL, + 'adComponents': [interestGroup.adComponents[0].renderURL] }; } @@ -40,7 +40,7 @@ if (!interestGroup) throw 'No interest group'; - if (Object.keys(interestGroup).length !== 12) { + if (Object.keys(interestGroup).length !== 13) { throw 'Wrong number of interestGroupFields ' + JSON.stringify(interestGroup); } @@ -62,6 +62,12 @@ JSON.stringify(interestGroup.priorityVector); } + if (!interestGroup.biddingLogicURL.startsWith('https://a.test') || + !interestGroup.biddingLogicURL.endsWith( + '/bidding_argument_validator.js')) { + throw 'Incorrect biddingLogicURL ' + interestGroup.biddingLogicURL; + } + if (!interestGroup.biddingLogicUrl.startsWith('https://a.test') || !interestGroup.biddingLogicUrl.endsWith( '/bidding_argument_validator.js')) { @@ -109,6 +115,8 @@ if (interestGroup.ads.length !== 1) throw 'Wrong ads.length ' + interestGroup.ads.length; + if (interestGroup.ads[0].renderURL !== 'https://example.com/render') + throw 'Wrong ads[0].renderURL ' + interestGroup.ads[0].renderURL; if (interestGroup.ads[0].renderUrl !== 'https://example.com/render') throw 'Wrong ads[0].renderUrl ' + interestGroup.ads[0].renderUrl; const adMetadataJSON = JSON.stringify(interestGroup.ads[0].metadata); @@ -117,6 +125,11 @@ if (interestGroup.adComponents.length !== 1) throw 'Wrong adComponents.length ' + interestGroup.adComponents.length; + if (interestGroup.adComponents[0].renderURL !== + 'https://example.com/render-component') { + throw 'Wrong adComponents[0].renderURL ' + + interestGroup.adComponents[0].renderURL; + } if (interestGroup.adComponents[0].renderUrl !== 'https://example.com/render-component') { throw 'Wrong adComponents[0].renderUrl ' + @@ -182,7 +195,7 @@ if (browserSignals.prevWins.length !== 0) throw 'Wrong prevWins ' + JSON.stringify(browserSignals.prevWins); } else { - if (Object.keys(browserSignals).length !== 13) { + if (Object.keys(browserSignals).length !== 14) { throw 'Wrong number of browser signals fields ' + JSON.stringify(browserSignals); } @@ -190,6 +203,8 @@ 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.renderUrl !== "https://example.com/render") throw 'Wrong renderUrl ' + browserSignals.renderUrl; if (browserSignals.bid !== 2)
diff --git a/content/test/data/interest_group/bidding_logic_expect_top_frame_a_test.js b/content/test/data/interest_group/bidding_logic_expect_top_frame_a_test.js index 09a72fe..d82150b 100644 --- a/content/test/data/interest_group/bidding_logic_expect_top_frame_a_test.js +++ b/content/test/data/interest_group/bidding_logic_expect_top_frame_a_test.js
@@ -8,7 +8,7 @@ const ad = interestGroup.ads[0]; if (browserSignals.topWindowHostname != 'a.test') throw new Error('Unexpected hostname:' + browserSignals.topWindowHostname); - return {'ad': ad, 'bid': 1, 'render': ad.renderUrl}; + return {'ad': ad, 'bid': 1, 'render': ad.renderURL}; } function reportWin(
diff --git a/content/test/data/interest_group/bidding_logic_register_ad_beacon.js b/content/test/data/interest_group/bidding_logic_register_ad_beacon.js index ce5aa94..7416c50 100644 --- a/content/test/data/interest_group/bidding_logic_register_ad_beacon.js +++ b/content/test/data/interest_group/bidding_logic_register_ad_beacon.js
@@ -3,7 +3,7 @@ // found in the LICENSE file. // Basic generate bid script that offers a bid of 1 using the first ad's -// `renderUrl` and, if present, the first adComponent's `renderUrl`. +// `renderURL` and, if present, the first adComponent's `renderURL`. function generateBid(interestGroup, auctionSignals, perBuyerSignals, trustedBiddingSignals, browserSignals) { const ad = interestGroup.ads[0]; @@ -14,11 +14,11 @@ auctionSignals.includes('bidderAllowsComponentAuction'); let result = { - 'ad': ad, 'bid': 1, 'render': ad.renderUrl, + 'ad': ad, 'bid': 1, 'render': ad.renderURL, 'allowComponentAuction': allowComponentAuction }; if (interestGroup.adComponents && interestGroup.adComponents[0]) - result.adComponents = [interestGroup.adComponents[0].renderUrl]; + result.adComponents = [interestGroup.adComponents[0].renderURL]; return result; }
diff --git a/content/test/data/interest_group/bidding_logic_stop_bidding_after_win.js b/content/test/data/interest_group/bidding_logic_stop_bidding_after_win.js index 51764c9..28d6235 100644 --- a/content/test/data/interest_group/bidding_logic_stop_bidding_after_win.js +++ b/content/test/data/interest_group/bidding_logic_stop_bidding_after_win.js
@@ -9,7 +9,7 @@ return { 'ad': 'example', 'bid': bid, - 'render': interestGroup.ads[0].renderUrl + 'render': interestGroup.ads[0].renderURL }; }
diff --git a/content/test/data/interest_group/bidding_logic_use_wasm.js b/content/test/data/interest_group/bidding_logic_use_wasm.js index d4c4229..5425ba3 100644 --- a/content/test/data/interest_group/bidding_logic_use_wasm.js +++ b/content/test/data/interest_group/bidding_logic_use_wasm.js
@@ -3,7 +3,7 @@ // found in the LICENSE file. // A generate bid script that offers a bid of 2 passed through a "multiply by 4" -// WASM helper, using the first ad's `renderUrl`. +// WASM helper, using the first ad's `renderURL`. function generateBid( interestGroup, auctionSignals, perBuyerSignals, trustedBiddingSignals, browserSignals) { @@ -13,7 +13,7 @@ // The WASM is expected to multiply by 4, so bid should be 2 * 4 = 8. if (bid != 8) throw 'WASM didn\'t do what was expected:' + bid; - let result = {'ad': ad, 'bid': bid, 'render': ad.renderUrl}; + let result = {'ad': ad, 'bid': bid, 'render': ad.renderURL}; return result; }
diff --git a/content/test/data/interest_group/bidding_logic_with_debugging_report.js b/content/test/data/interest_group/bidding_logic_with_debugging_report.js index fab016f0..75ec661 100644 --- a/content/test/data/interest_group/bidding_logic_with_debugging_report.js +++ b/content/test/data/interest_group/bidding_logic_with_debugging_report.js
@@ -3,7 +3,7 @@ // found in the LICENSE file. // Basic generate bid script that offers a bid of 1 using the first ad's -// `renderUrl` and, if present, the first adComponent's `renderUrl`. +// `renderURL` and, if present, the first adComponent's `renderURL`. function generateBid( interestGroup, auctionSignals, perBuyerSignals, trustedBiddingSignals, browserSignals) { @@ -15,7 +15,7 @@ forDebuggingOnly.reportAdAuctionWin( interestGroup.owner + '/echo?bidder_debug_report_win/' + interestGroup.name); - return {'ad': interestGroup.name, 'bid': bid, 'render': ad.renderUrl}; + return {'ad': interestGroup.name, 'bid': bid, 'render': ad.renderURL}; } function reportWin(
diff --git a/content/test/data/interest_group/bidding_logic_with_size.js b/content/test/data/interest_group/bidding_logic_with_size.js index 0047b835..0454389 100644 --- a/content/test/data/interest_group/bidding_logic_with_size.js +++ b/content/test/data/interest_group/bidding_logic_with_size.js
@@ -3,7 +3,7 @@ // found in the LICENSE file. // Basic generate bid script that offers a bid of 1 using the first ad's -// `renderUrl` and, if present, the first adComponent's `renderUrl`. +// `renderURL` and, if present, the first adComponent's `renderURL`. function generateBid(interestGroup, auctionSignals, perBuyerSignals, trustedBiddingSignals, browserSignals) { const ad = interestGroup.ads[0]; @@ -16,12 +16,12 @@ let result = { 'ad': ad, 'bid': 1, - 'render': { url: ad.renderUrl, width: "100sw", height: "50sh" }, + 'render': { url: ad.renderURL, width: "100sw", height: "50sh" }, 'allowComponentAuction': allowComponentAuction }; if (interestGroup.adComponents && interestGroup.adComponents[0]) result.adComponents = [{ - url: interestGroup.adComponents[0].renderUrl, + url: interestGroup.adComponents[0].renderURL, width: "50px", height: "25px" }];
diff --git a/content/test/data/interest_group/bidding_no_direct_from_seller_signals_validator.js b/content/test/data/interest_group/bidding_no_direct_from_seller_signals_validator.js index c52881a7..5c64bb6 100644 --- a/content/test/data/interest_group/bidding_no_direct_from_seller_signals_validator.js +++ b/content/test/data/interest_group/bidding_no_direct_from_seller_signals_validator.js
@@ -18,11 +18,11 @@ let result = { 'ad': ad, 'bid': 2, - 'render': ad.renderUrl, + 'render': ad.renderURL, 'allowComponentAuction': allowComponentAuction }; if (interestGroup.adComponents && interestGroup.adComponents[0]) - result.adComponents = [interestGroup.adComponents[0].renderUrl]; + result.adComponents = [interestGroup.adComponents[0].renderURL]; return result; }
diff --git a/content/test/data/interest_group/component_auction_bidding_argument_validator.js b/content/test/data/interest_group/component_auction_bidding_argument_validator.js index fcb3d02..d02a2d7 100644 --- a/content/test/data/interest_group/component_auction_bidding_argument_validator.js +++ b/content/test/data/interest_group/component_auction_bidding_argument_validator.js
@@ -19,8 +19,8 @@ 'bid': 2, 'bidCurrency': 'USD', 'adCost': 3, - 'render': ad.renderUrl, - 'adComponents': [interestGroup.adComponents[0].renderUrl], + 'render': ad.renderURL, + 'adComponents': [interestGroup.adComponents[0].renderURL], 'allowComponentAuction': true, }; } @@ -40,7 +40,7 @@ if (!interestGroup) throw 'No interest group'; - if (Object.keys(interestGroup).length !== 12) { + if (Object.keys(interestGroup).length !== 13) { throw 'Wrong number of interestGroupFields ' + JSON.stringify(interestGroup); } @@ -61,6 +61,12 @@ JSON.stringify(interestGroup.priorityVector); } + if (!interestGroup.biddingLogicURL.startsWith('https://a.test') || + !interestGroup.biddingLogicURL.endsWith( + '/component_auction_bidding_argument_validator.js')) { + throw 'Incorrect biddingLogicURL ' + interestGroup.biddingLogicURL; + } + if (!interestGroup.biddingLogicUrl.startsWith('https://a.test') || !interestGroup.biddingLogicUrl.endsWith( '/component_auction_bidding_argument_validator.js')) { @@ -82,7 +88,8 @@ if (!interestGroup.trustedBiddingSignalsUrl.startsWith('https://a.test') || !interestGroup.trustedBiddingSignalsUrl.includes( 'trusted_bidding_signals.json')) { - throw 'Incorrect biddingLogicUrl ' + interestGroup.biddingLogicUrl; + throw 'Incorrect trustedBiddingSignalsUrl ' + + interestGroup.trustedBiddingSignalsUrl; } trustedBiddingSignalsKeysJson = @@ -93,7 +100,7 @@ } // TODO(crbug.com/1186444): Consider validating URL fields like - // interestGroup.biddingLogicUrl once we decide what to do about URL + // interestGroup.biddingLogicURL once we decide what to do about URL // normalization. // If userBiddingSignals is passed as a JSON string instead of an object, @@ -108,6 +115,8 @@ if (interestGroup.ads.length !== 1) throw 'Wrong ads.length ' + interestGroup.ads.length; + if (interestGroup.ads[0].renderURL !== 'https://example.com/render') + throw 'Wrong ads[0].renderURL ' + interestGroup.ads[0].renderURL; if (interestGroup.ads[0].renderUrl !== 'https://example.com/render') throw 'Wrong ads[0].renderUrl ' + interestGroup.ads[0].renderUrl; const adMetadataJson = JSON.stringify(interestGroup.ads[0].metadata); @@ -116,6 +125,11 @@ if (interestGroup.adComponents.length !== 1) throw 'Wrong adComponents.length ' + interestGroup.adComponents.length; + if (interestGroup.adComponents[0].renderURL !== + 'https://example.com/render-component') { + throw 'Wrong adComponents[0].renderURL ' + + interestGroup.adComponents[0].renderURL; + } if (interestGroup.adComponents[0].renderUrl !== 'https://example.com/render-component') { throw 'Wrong adComponents[0].renderUrl ' + @@ -166,7 +180,7 @@ if (browserSignals.prevWins.length !== 0) throw 'Wrong prevWins ' + JSON.stringify(browserSignals.prevWins); } else { - if (Object.keys(browserSignals).length !== 14) { + if (Object.keys(browserSignals).length !== 15) { throw 'Wrong number of browser signals fields ' + JSON.stringify(browserSignals); } @@ -174,6 +188,8 @@ 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.renderUrl !== "https://example.com/render") throw 'Wrong renderUrl ' + browserSignals.renderUrl; if (browserSignals.bid !== 2)
diff --git a/content/test/data/interest_group/component_auction_component_decision_argument_validator.js b/content/test/data/interest_group/component_auction_component_decision_argument_validator.js index 53bc0150..6f9b1bb 100644 --- a/content/test/data/interest_group/component_auction_component_decision_argument_validator.js +++ b/content/test/data/interest_group/component_auction_component_decision_argument_validator.js
@@ -26,7 +26,8 @@ function validateAdMetadata(adMetadata) { const adMetadataJSON = JSON.stringify(adMetadata); if (adMetadataJSON !== - '{"renderUrl":"https://example.com/render",' + + '{"renderURL":"https://example.com/render",' + + '"renderUrl":"https://example.com/render",' + '"metadata":{"ad":"metadata","here":[1,2,3]}}') { throw 'Wrong adMetadata ' + adMetadataJSON; } @@ -38,7 +39,7 @@ } function validateAuctionConfig(auctionConfig) { - if (Object.keys(auctionConfig).length !== 13) { + if (Object.keys(auctionConfig).length !== 15) { throw 'Wrong number of auctionConfig fields ' + JSON.stringify(auctionConfig); } @@ -46,12 +47,24 @@ if (!auctionConfig.seller.includes('d.test')) throw 'Wrong seller ' + auctionConfig.seller; + if (auctionConfig.decisionLogicURL !== + auctionConfig.seller + '/interest_group' + + '/component_auction_component_decision_argument_validator.js') { + throw 'Wrong decisionLogicURL ' + auctionConfig.decisionLogicURL; + } + if (auctionConfig.decisionLogicUrl !== auctionConfig.seller + '/interest_group' + '/component_auction_component_decision_argument_validator.js') { throw 'Wrong decisionLogicUrl ' + auctionConfig.decisionLogicUrl; } + if (auctionConfig.trustedScoringSignalsURL !== + auctionConfig.seller + '/interest_group/trusted_scoring_signals2.json') { + throw 'Wrong trustedScoringSignalsURL ' + + auctionConfig.trustedScoringSignalsURL; + } + if (auctionConfig.trustedScoringSignalsUrl !== auctionConfig.seller + '/interest_group/trusted_scoring_signals2.json') { throw 'Wrong trustedScoringSignalsUrl ' + @@ -118,6 +131,15 @@ } function validateTrustedScoringSignals(signals) { + if (signals.renderURL["https://example.com/render"] !== "bar") { + throw 'Wrong trustedScoringSignals.renderURL ' + + signals.renderURL["https://example.com/render"]; + } + if (signals.adComponentRenderURLs["https://example.com/render-component"] !== + 2) { + throw 'Wrong trustedScoringSignals.adComponentRenderURLs ' + + signals.adComponentRenderURLs["https://example.com/render-component"]; + } if (signals.renderUrl["https://example.com/render"] !== "bar") { throw 'Wrong trustedScoringSignals.renderUrl ' + signals.renderUrl["https://example.com/render"]; @@ -140,12 +162,14 @@ throw 'Wrong componentSeller ' + browserSignals.componentSeller; if (!browserSignals.interestGroupOwner.startsWith('https://a.test')) throw 'Wrong interestGroupOwner ' + browserSignals.interestGroupOwner; + if (browserSignals.renderURL !== "https://example.com/render") + throw 'Wrong renderURL ' + browserSignals.renderURL; if (browserSignals.renderUrl !== "https://example.com/render") throw 'Wrong renderUrl ' + browserSignals.renderUrl; // Fields that vary by method. if (isScoreAd) { - if (Object.keys(browserSignals).length !== 8) { + if (Object.keys(browserSignals).length !== 9) { throw 'Wrong number of browser signals fields ' + JSON.stringify(browserSignals); } @@ -159,7 +183,7 @@ if (browserSignals.bidCurrency != 'USD') throw 'Wrong bidCurrency ' + browserSignals.bidCurrency; } else { - if (Object.keys(browserSignals).length !== 12) { + if (Object.keys(browserSignals).length !== 13) { throw 'Wrong number of browser signals fields ' + JSON.stringify(browserSignals); }
diff --git a/content/test/data/interest_group/component_auction_top_level_decision_argument_validator.js b/content/test/data/interest_group/component_auction_top_level_decision_argument_validator.js index 6a3e2ab9..1fb7628 100644 --- a/content/test/data/interest_group/component_auction_top_level_decision_argument_validator.js +++ b/content/test/data/interest_group/component_auction_top_level_decision_argument_validator.js
@@ -39,7 +39,7 @@ } function validateAuctionConfig(auctionConfig) { - if (Object.keys(auctionConfig).length !== 12) { + if (Object.keys(auctionConfig).length !== 14) { throw 'Wrong number of auctionConfig fields ' + JSON.stringify(auctionConfig); } @@ -47,12 +47,24 @@ if (!auctionConfig.seller.includes('b.test')) throw 'Wrong seller ' + auctionConfig.seller; + if (auctionConfig.decisionLogicURL !== + auctionConfig.seller + '/interest_group' + + '/component_auction_top_level_decision_argument_validator.js') { + throw 'Wrong decisionLogicURL ' + auctionConfig.decisionLogicURL; + } + if (auctionConfig.decisionLogicUrl !== auctionConfig.seller + '/interest_group' + '/component_auction_top_level_decision_argument_validator.js') { throw 'Wrong decisionLogicUrl ' + auctionConfig.decisionLogicUrl; } + if (auctionConfig.trustedScoringSignalsURL !== + auctionConfig.seller + '/interest_group/trusted_scoring_signals.json') { + throw 'Wrong trustedScoringSignalsURL ' + + auctionConfig.trustedScoringSignalsURL; + } + if (auctionConfig.trustedScoringSignalsUrl !== auctionConfig.seller + '/interest_group/trusted_scoring_signals.json') { throw 'Wrong trustedScoringSignalsUrl ' + @@ -118,9 +130,14 @@ throw 'Wrong componentAuctions ' + JSON.stringify(componentAuctions); const componentAuction = auctionConfig.componentAuctions[0]; if (!componentAuction.seller.startsWith('https://d.test') || + componentAuction.decisionLogicURL != componentAuction.seller + + '/interest_group' + + '/component_auction_component_decision_argument_validator.js' || componentAuction.decisionLogicUrl != componentAuction.seller + '/interest_group' + '/component_auction_component_decision_argument_validator.js' || + componentAuction.trustedScoringSignalsURL !== componentAuction.seller + + '/interest_group/trusted_scoring_signals2.json' || componentAuction.trustedScoringSignalsUrl !== componentAuction.seller + '/interest_group/trusted_scoring_signals2.json' || componentAuction.sellerTimeout !== 200) { @@ -129,6 +146,15 @@ } function validateTrustedScoringSignals(signals) { + if (signals.renderURL["https://example.com/render"] !== "foo") { + throw 'Wrong trustedScoringSignals.renderURL ' + + signals.renderURL["https://example.com/render"]; + } + if (signals.adComponentRenderURLs["https://example.com/render-component"] !== + 1) { + throw 'Wrong trustedScoringSignals.adComponentRenderURLs ' + + signals.adComponentRenderURLs["https://example.com/render-component"]; + } if (signals.renderUrl["https://example.com/render"] !== "foo") { throw 'Wrong trustedScoringSignals.renderUrl ' + signals.renderUrl["https://example.com/render"]; @@ -151,12 +177,14 @@ throw 'Wrong componentSeller ' + browserSignals.componentSeller; if (!browserSignals.interestGroupOwner.startsWith('https://a.test')) throw 'Wrong interestGroupOwner ' + browserSignals.interestGroupOwner; + if (browserSignals.renderURL !== "https://example.com/render") + throw 'Wrong renderURL ' + browserSignals.renderURL; if (browserSignals.renderUrl !== "https://example.com/render") throw 'Wrong renderUrl ' + browserSignals.renderUrl; // Fields that vary by method. if (isScoreAd) { - if (Object.keys(browserSignals).length !== 8) { + if (Object.keys(browserSignals).length !== 9) { throw 'Wrong number of browser signals fields ' + JSON.stringify(browserSignals); } @@ -170,7 +198,7 @@ if (browserSignals.bidCurrency !== 'CAD') throw 'Wrong bidCurrency ' + browserSignals.bidCurrency; } else { - if (Object.keys(browserSignals).length !== 10) { + if (Object.keys(browserSignals).length !== 11) { throw 'Wrong number of browser signals fields ' + JSON.stringify(browserSignals); }
diff --git a/content/test/data/interest_group/decision_argument_validator.js b/content/test/data/interest_group/decision_argument_validator.js index c50350f..093c879 100644 --- a/content/test/data/interest_group/decision_argument_validator.js +++ b/content/test/data/interest_group/decision_argument_validator.js
@@ -29,7 +29,9 @@ function validateAdMetadata(adMetadata) { const adMetadataJSON = JSON.stringify(adMetadata); if (adMetadataJSON !== - '{"renderUrl":"https://example.com/render","metadata":{"ad":"metadata","here":[1,2,3]}}') + '{"renderURL":"https://example.com/render",' + + '"renderUrl":"https://example.com/render",' + + '"metadata":{"ad":"metadata","here":[1,2,3]}}') throw 'Wrong adMetadata ' + adMetadataJSON; } @@ -39,7 +41,7 @@ } function validateAuctionConfig(auctionConfig) { - if (Object.keys(auctionConfig).length !== 13) { + if (Object.keys(auctionConfig).length !== 15) { throw 'Wrong number of auctionConfig fields ' + JSON.stringify(auctionConfig); } @@ -47,11 +49,22 @@ if (!auctionConfig.seller.includes('b.test')) throw 'Wrong seller ' + auctionConfig.seller; + if (auctionConfig.decisionLogicURL !== + auctionConfig.seller + '/interest_group/decision_argument_validator.js') { + throw 'Wrong decisionLogicURL ' + auctionConfig.decisionLogicURL; + } + if (auctionConfig.decisionLogicUrl !== auctionConfig.seller + '/interest_group/decision_argument_validator.js') { throw 'Wrong decisionLogicUrl ' + auctionConfig.decisionLogicUrl; } + if (auctionConfig.trustedScoringSignalsURL !== + auctionConfig.seller + '/interest_group/trusted_scoring_signals.json') { + throw 'Wrong trustedScoringSignalsURL ' + + auctionConfig.trustedScoringSignalsURL; + } + if (auctionConfig.trustedScoringSignalsUrl !== auctionConfig.seller + '/interest_group/trusted_scoring_signals.json') { throw 'Wrong trustedScoringSignalsUrl ' + @@ -59,7 +72,7 @@ } // TODO(crbug.com/1186444): Consider validating URL fields like - // auctionConfig.decisionLogicUrl once we decide what to do about URL + // auctionConfig.decisionLogicURL once we decide what to do about URL // normalization. if (auctionConfig.interestGroupBuyers.length !== 2 || @@ -134,6 +147,15 @@ } function validateTrustedScoringSignals(signals) { + if (signals.renderURL["https://example.com/render"] !== "foo") { + throw 'Wrong trustedScoringSignals.renderURL ' + + signals.renderURL["https://example.com/render"]; + } + if (signals.adComponentRenderURLs["https://example.com/render-component"] !== + 1) { + throw 'Wrong trustedScoringSignals.adComponentRenderURLs ' + + signals.adComponentRenderURLs["https://example.com/render-component"]; + } if (signals.renderUrl["https://example.com/render"] !== "foo") { throw 'Wrong trustedScoringSignals.renderUrl ' + signals.renderUrl["https://example.com/render"]; @@ -155,6 +177,8 @@ throw 'Wrong componentSeller ' + browserSignals.componentSeller; if (!browserSignals.interestGroupOwner.startsWith('https://a.test')) throw 'Wrong interestGroupOwner ' + browserSignals.interestGroupOwner; + if (browserSignals.renderURL !== "https://example.com/render") + throw 'Wrong renderURL ' + browserSignals.renderURL; if (browserSignals.renderUrl !== "https://example.com/render") throw 'Wrong renderUrl ' + browserSignals.renderUrl; if (browserSignals.dataVersion !== 1234) @@ -162,7 +186,7 @@ // Fields that vary by method. if (isScoreAd) { - if (Object.keys(browserSignals).length !== 7) { + if (Object.keys(browserSignals).length !== 8) { throw 'Wrong number of browser signals fields ' + JSON.stringify(browserSignals); } @@ -174,7 +198,7 @@ if (browserSignals.bidCurrency !== 'USD') throw 'Wrong bidCurrency ' + browserSignals.bidCurrency; } else { - if (Object.keys(browserSignals).length !== 9) { + if (Object.keys(browserSignals).length !== 10) { throw 'Wrong number of browser signals fields ' + JSON.stringify(browserSignals); }
diff --git a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt index fceff93..83954fc 100644 --- a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
@@ -409,9 +409,7 @@ # Samsung flaky incorrect colors crbug.com/1445552 [ android android-sm-a135m ] Pixel_OffscreenCanvasWebGLDefault [ Failure ] - -# ChromeOS consistent Canvas failure -crbug.com/1445502 [ chromeos chromeos-board-amd64-generic angle-disabled no-passthrough ] Pixel_VideoStreamFrom2DAlphaCanvas_DisableReadbackFromTexture [ Failure ] +crbug.com/1445552 [ android android-sm-a235m ] Pixel_OffscreenCanvasWebGLDefault [ Failure ] # DrDC Crash on Pixel 4 Webview crbug.com/1446429 [ android-pixel-4 android-r android-webview-instrumentation angle-opengles no-passthrough ] Pixel_Video_MP4_FourColors_Rot_180 [ Failure ]
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt index af15a474..8a24258 100644 --- a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
@@ -466,7 +466,7 @@ crbug.com/1338004 [ mac nvidia-0xfe9 passthrough ] deqp/functional/gles3/multisample/fbo_4_samples.html [ RetryOnFailure ] -crbug.com/1446664 [ mac nvidia-0xfe9 angle-opengl passthrough ] deqp/functional/gles3/texturespecification/teximage3d_depth.html [ Failure ] +crbug.com/1446664 [ mac nvidia-0xfe9 angle-opengl passthrough ] conformance2/rendering/vertex-id-large-count.html [ Failure ] ## Mac AMD ##
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt index 3acf650..3d79141 100644 --- a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
@@ -536,6 +536,10 @@ # These video tests are flakey on many configurations. crbug.com/1347077 [ android-nexus-5x android-nougat angle-opengles passthrough qualcomm renderer-skia-gl target-cpu-64 ] conformance/textures/misc/video-rotation.html [ Failure ] +# Overlay scheduling issue can leave destroyed overlays around for tests that follow these. Creating confusing flakes. +# Seen on Pixel-6 and Samsung, skipping generically for now. +crbug.com/1445548 [ android no-passthrough ] conformance/extensions/oes-texture-float-with-video.html [ Skip ] +crbug.com/1445548 [ android no-passthrough ] conformance/extensions/oes-texture-half-float-with-video.html [ Skip ] ## Nexus 5X ##
diff --git a/content/test/gpu/gpu_tests/webgpu_cts_integration_test.py b/content/test/gpu/gpu_tests/webgpu_cts_integration_test.py index f146965..d316a82 100644 --- a/content/test/gpu/gpu_tests/webgpu_cts_integration_test.py +++ b/content/test/gpu/gpu_tests/webgpu_cts_integration_test.py
@@ -14,11 +14,14 @@ from gpu_tests import common_typing as ct from gpu_tests import gpu_integration_test from gpu_tests.util import websocket_server +from typ import expectations_parser import gpu_path_util EXPECTATIONS_FILE = os.path.join(gpu_path_util.CHROMIUM_SRC_DIR, 'third_party', 'dawn', 'webgpu-cts', 'expectations.txt') +SLOW_TESTS_FILE = os.path.join(gpu_path_util.CHROMIUM_SRC_DIR, 'third_party', + 'dawn', 'webgpu-cts', 'slow_tests.txt') TEST_LIST_FILE = os.path.join(gpu_path_util.CHROMIUM_SRC_DIR, 'third_party', 'dawn', 'third_party', 'gn', 'webgpu-cts', 'test_list.txt') @@ -84,11 +87,19 @@ websocket_server = None + _slow_tests = None + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self._query = None self._run_in_worker = False + if WebGpuCtsIntegrationTest._slow_tests is None: + with open(SLOW_TESTS_FILE, 'r') as f: + expectations = expectations_parser.TestExpectations() + expectations.parse_tagged_list(f.read(), f.name) + WebGpuCtsIntegrationTest._slow_tests = expectations + # Only perform the pre/post test cleanup every X tests instead of every test # to reduce overhead. def ShouldPerformMinidumpCleanupOnSetUp(self) -> bool: @@ -520,7 +531,7 @@ # We access the expectations directly instead of using # self.GetExpectationsForTest since we need the raw results, but that method # only returns the parsed results and whether the test should be retried. - expectation = self.child.expectations.expectations_for( + expectation = WebGpuCtsIntegrationTest._slow_tests.expectations_for( TestNameFromInputs(self._query, self._run_in_worker)) return 'Slow' in expectation.raw_results
diff --git a/device/OWNERS b/device/OWNERS index 427c17d7f..fdf9db1 100644 --- a/device/OWNERS +++ b/device/OWNERS
@@ -1,4 +1,6 @@ set noparent +chengweih@chromium.org +mattreynolds@chromium.org reillyg@chromium.org rockot@google.com
diff --git a/device/bluetooth/OWNERS b/device/bluetooth/OWNERS index dcf2516..bfbe59e 100644 --- a/device/bluetooth/OWNERS +++ b/device/bluetooth/OWNERS
@@ -1,3 +1,5 @@ +chengweih@chromium.org +mattreynolds@chromium.org reillyg@chromium.org per-file BUILD.gn=*
diff --git a/docs/enterprise/description_guidelines.md b/docs/enterprise/description_guidelines.md index 0a83963..4ace0c0f 100644 --- a/docs/enterprise/description_guidelines.md +++ b/docs/enterprise/description_guidelines.md
@@ -29,5 +29,6 @@ * macOS: `<ph name="MAC_OS_NAME">macOS</ph>` * iOS: `<ph name="IOS_NAME">iOS</ph>` * Windows: `<ph name="MS_WIN_NAME">Microsoft® Windows®</ph>` -* Microsoft ActiveDirectory: `<ph name="MS_AD_NAME">Microsoft® Active Directory®</ph>` +* Microsoft Active Directory: `<ph name="MS_AD_NAME">Microsoft® Active Directory®</ph>` +* Microsoft Azure Active Directory `<ph name="MS_AAD_NAME">Microsoft® Azure® Active Directory®</ph>` * Fuchsia: `<ph name="FUCHSIA_OS_NAME">Fuchsia</ph>`
diff --git a/docs/profiling.md b/docs/profiling.md index 8b7443c9..7a21f327 100644 --- a/docs/profiling.md +++ b/docs/profiling.md
@@ -26,12 +26,9 @@ # Profiling on Linux ## General checkout setup -Profiling should always be done on a Release build, which has very similar performance characteristics to an official build. Make sure the following appears in your `args.gn` file: +Profiling should preferably be done on an official build. Make sure the following appears in your `args.gn` file: - is_debug = false - blink_symbol_level = 2 - symbol_level = 2 - dcheck_always_on = false + is_official_build = true ## Profiling a process or thread for a defined period of time using perf
diff --git a/docs/updater/protocol_3_1.md b/docs/updater/protocol_3_1.md index 8232cf85..349324e 100644 --- a/docs/updater/protocol_3_1.md +++ b/docs/updater/protocol_3_1.md
@@ -897,7 +897,7 @@ For `type == 14` events: * `download_time_ms`: The time elapsed between the start of the download and - the end of the download, in milliseconds. -1 if unavailable or irrelevant. + the end of the download, in milliseconds. -1 if unavailable. Default: -1. * `downloaded_bytes`: The number of bytes successfully received from the download server. Default: 0.
diff --git a/extensions/browser/api/serial/OWNERS b/extensions/browser/api/serial/OWNERS index c21268b..45e4663 100644 --- a/extensions/browser/api/serial/OWNERS +++ b/extensions/browser/api/serial/OWNERS
@@ -1,2 +1,4 @@ +chengweih@chromium.org +mattreynolds@chromium.org reillyg@chromium.org rockot@google.com
diff --git a/extensions/browser/api/usb/OWNERS b/extensions/browser/api/usb/OWNERS index 3c8ced4..8625b40 100644 --- a/extensions/browser/api/usb/OWNERS +++ b/extensions/browser/api/usb/OWNERS
@@ -3,3 +3,4 @@ reillyg@chromium.org rockot@google.com chengweih@chromium.org +mattreynolds@chromium.org
diff --git a/extensions/browser/api/web_request/form_data_parser.cc b/extensions/browser/api/web_request/form_data_parser.cc index b7ddf52..6d516e8 100644 --- a/extensions/browser/api/web_request/form_data_parser.cc +++ b/extensions/browser/api/web_request/form_data_parser.cc
@@ -423,7 +423,7 @@ bool FormDataParserUrlEncoded::SetSource(base::StringPiece source) { if (source_set_) return false; // We do not allow multiple sources for this parser. - source_.set(source.data(), source.size()); + source_ = re2::StringPiece(source.data(), source.size()); source_set_ = true; source_malformed_ = false; return true; @@ -567,7 +567,7 @@ bool FormDataParserMultipart::SetSource(base::StringPiece source) { if (source.data() == nullptr || !source_.empty()) return false; - source_.set(source.data(), source.size()); + source_ = re2::StringPiece(source.data(), source.size()); switch (state_) { case STATE_INIT:
diff --git a/gpu/command_buffer/service/webgpu_decoder_impl.cc b/gpu/command_buffer/service/webgpu_decoder_impl.cc index 788785fa..39146fc 100644 --- a/gpu/command_buffer/service/webgpu_decoder_impl.cc +++ b/gpu/command_buffer/service/webgpu_decoder_impl.cc
@@ -1193,6 +1193,8 @@ case WGPUFeatureName_TimestampQueryInsidePasses: case WGPUFeatureName_PipelineStatisticsQuery: case WGPUFeatureName_ChromiumExperimentalDp4a: + // TODO(dawn:1664): Enable Float32Filterable by default once it is tested. + case WGPUFeatureName_Float32Filterable: // TODO(crbug.com/1258986): DawnMultiPlanarFormats is a stable feature in // Dawn, but currently we hide it from Render process as unsafe apis, so // that 0-copy code path, which explicitly checks this feature, is protected
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_be.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_be.xtb index a479e9af..ed05f4d4 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_be.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_be.xtb
@@ -49,6 +49,7 @@ <translation id="3650632991272923014">Карыстальнік <ph name="USER_EMAIL1" />, папрацаваўшы ў браўзеры Chromium, пакінуў на гэтай прыладзе закладкі, паролі і іншыя налады.</translation> <translation id="372658070733623520">Каб выкарыстоўваць і захоўваць даныя Chromium ва Уліковым запісе Google, пацвердзіце сваю асобу.</translation> <translation id="3805899903892079518">Chromium не мае доступу да вашых фота і відэа. Даць доступ можна ў меню iOS "Налады > Прыватнасць > Фота".</translation> +<translation id="3955621079070267756">Адкрываць Chromium з любой праграмы</translation> <translation id="4043291146360695975">Паролі захоўваюцца ў Менеджары пароляў толькі на гэтай прыладзе.</translation> <translation id="4099085513035183040">Не падтрымліваецца ў Chromium Beta</translation> <translation id="4432744876818348753">Увайдзіце ва ўліковы запіс, каб карыстацца ўсімі магчымасцямі Chromium.</translation> @@ -143,5 +144,6 @@ <translation id="9089354809943900324">Chromium састарэў</translation> <translation id="9110075932708282655">Выкарыстоўвайце Chromium стандартна</translation> <translation id="921174536258924340">Браўзеру Chromium не ўдалося праверыць усе паролі. Паўтарыце спробу заўтра або <ph name="BEGIN_LINK" />праверце паролі ва Уліковым запісе Google<ph name="END_LINK" />.</translation> +<translation id="971488683725792095">Аўтаматычна выкарыстоўваць Chromium, калі вы націскаеце на спасылкі ў паведамленнях, дакументах або іншых праграмах.</translation> <translation id="985602178874221306">Аўтары Chromium</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_be.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_be.xtb index 384e24a..f9883598 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_be.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_be.xtb
@@ -12,6 +12,7 @@ <translation id="1554731936187952550">Вы выкарыстоўваеце самую моцную абарону Chrome ад шкодных вэб-сайтаў</translation> <translation id="1682483655351012182">Сінхранізацыя даных Chrome</translation> <translation id="1759842336958782510">Chrome</translation> +<translation id="1843217788865538014">Chrome можа запускацца аўтаматычна, калі вы націскаеце на спасылкі ў паведамленнях, дакументах і іншых праграмах.</translation> <translation id="1917964099031477364">Гэты ўліковы запіс і ўсе незахаваныя даныя будуць выдалены з браўзера Chromium і іншых праграм Google на гэтай прыладзе.</translation> <translation id="2009224836393115614">Браўзеру Chrome не ўдалося праверыць паролі. Паспрабуйце праверыць падключэнне да інтэрнэту.</translation> <translation id="2056123005618757196">Паспявайце больш дзякуючы простаму, абароненаму і яшчэ хутчэйшаму браўзеру Google Chrome.</translation> @@ -58,6 +59,7 @@ <translation id="4233521129555661685">Карыстальнік <ph name="USER_EMAIL1" />, папрацаваўшы ў браўзеры Chrome, пакінуў на гэтай прыладзе закладкі, паролі і іншыя налады.</translation> <translation id="424864128008805179">Выйсці з Chrome?</translation> <translation id="4249068189593983585">Падказка Chrome. Каб адкрыць больш параметраў укладкі, націсніце і ўтрымлівайце кнопку "Паказваць укладкі" на панэлі інструментаў, якая знаходзіцца ўнізе або ўверсе экрана.</translation> +<translation id="4508370294876102450">Адкрывайце Chrome з любой праграмы</translation> <translation id="4523886039239821078">Некаторыя дадатковыя кампаненты выклікаюць збой у Chrome. Калі ласка, выдаліце:</translation> <translation id="4633328489441962921">Браўзеру Chrome не ўдаецца праверыць наяўнасць абнаўленняў</translation> <translation id="4636900170638246267">Выканайце ўваход на сайт і ў Chrome.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_az.xtb b/ios/chrome/app/strings/resources/ios_strings_az.xtb index 1bbbfe88..d41bd091 100644 --- a/ios/chrome/app/strings/resources/ios_strings_az.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_az.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">Artıq cihazda Chrome-dan maksimum yararlanacaqsınız.</translation> <translation id="2434405374328098816">Artıq <ph name="WEBSITE" /> saytında "<ph name="USERNAME" />" üçün parolu yadda saxlamısınız</translation> <translation id="2435457462613246316">Parol görünsün</translation> +<translation id="2439425774439590">Ən çox daxil olunan saytlar</translation> <translation id="2451654228769116489">Tabı sancın</translation> <translation id="2461070143328828326">Parol Ayarları</translation> <translation id="2469960372084740698">Təhlükəsiz Baxış Deaktiv edilsin?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">Qiymət</translation> <translation id="3892144330757387737">Tarixçəni burada tapa bilərsiniz</translation> <translation id="3897092660631435901">Menyu</translation> +<translation id="3899568514738536144">Brauzer tarixçəsinə baxın</translation> <translation id="3904829425754749514">Təşkilatınız sinxronizasiyanı deaktiv etdi. Hələ də bu cihazda bütün əlfəcinlər, tarixçə, parol və digər ayarları görə bilərsiniz. Dəyişiklik etsəniz, onlar hesabınızla sinxronizasiya edilməyəcək.</translation> <translation id="3913386780052199712">Chrome'a daxil olmusunuz</translation> <translation id="3915450441834151894">Sayt Haqqında</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_be.xtb b/ios/chrome/app/strings/resources/ios_strings_be.xtb index 2965dc3..f6124d1 100644 --- a/ios/chrome/app/strings/resources/ios_strings_be.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_be.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">Цяпер вы зможаце карыстацца ўсімі магчымасцямі Chrome на сваёй прыладзе.</translation> <translation id="2434405374328098816">Вы ўжо захавалі пароль для карыстальніка <ph name="USERNAME" /> на вэб-сайце <ph name="WEBSITE" /></translation> <translation id="2435457462613246316">Паказаць пароль</translation> +<translation id="2439425774439590">Найбольш наведвальныя сайты</translation> <translation id="2451654228769116489">Замацаваць укладку</translation> <translation id="2461070143328828326">Налады пароляў</translation> <translation id="2469960372084740698">Выключыць Бяспечны прагляд?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">Цана</translation> <translation id="3892144330757387737">Ваша гісторыя знаходзіцца тут</translation> <translation id="3897092660631435901">Меню</translation> +<translation id="3899568514738536144">Паглядзець гісторыю прагляду сайтаў</translation> <translation id="3904829425754749514">Ваша арганізацыя выключыла сінхранізацыю. Як і раней, вы можаце праглядаць свае закладкі, гісторыю, паролі і іншыя налады на гэтай прыладзе. Зробленыя вамі змяненні не будуць сінхранізавацца з вашым уліковым запісам.</translation> <translation id="3913386780052199712">Уваход у Chrome выкананы</translation> <translation id="3915450441834151894">Звесткі пра сайт</translation> @@ -539,6 +541,7 @@ <translation id="4592368184551360546">Клавіятура</translation> <translation id="4606247758155004938">Браўзерам кіруе ваша арганізацыя.</translation> <translation id="461440297010471931">Пошук з дапамогай Google</translation> +<translation id="4616391354457235490">Адмяніць</translation> <translation id="4619564267100705184">Пацвердзіць маю асобу</translation> <translation id="4619615317237390068">Укладкі з іншых прылад</translation> <translation id="4620246317052452550">Прачытанае</translation> @@ -861,6 +864,7 @@ Паспрабуйце выкарыстоўваць унікальны пароль для кожнага сайта.</translation> <translation id="650279896687777322">Даведацца больш...</translation> +<translation id="6507973708545996744">Каб спіс для прагляду быў даступным на ўсіх вашых прыладах, выканайце ўваход.</translation> <translation id="6510072653668207258">Нагадаць пазней</translation> <translation id="651505212789431520">Скасаваць сінхранізацыю? Сінхранізацыю можна ўключыць у любы момант у Наладах.</translation> <translation id="6518133107902771759">Спраўдзіць</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_strings_bn.xtb index 665797a2..d573595 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">এখন আপনার ডিভাইসেই Chrome থেকে সবচেয়ে বেশি সুবিধা লাভ করতে পারবেন।</translation> <translation id="2434405374328098816">আপনি আগে থেকেই "<ph name="USERNAME" />"-এর জন্য <ph name="WEBSITE" />-এ পাসওয়ার্ড সেভ করেছেন</translation> <translation id="2435457462613246316">পাসওয়ার্ড দেখান</translation> +<translation id="2439425774439590">সবচেয়ে বেশি দেখা সাইট</translation> <translation id="2451654228769116489">ট্যাব পিন করুন</translation> <translation id="2461070143328828326">পাসওয়ার্ড সেটিংস</translation> <translation id="2469960372084740698">Safe Browsing বন্ধ করতে চান?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">দাম</translation> <translation id="3892144330757387737">আপনি এখানে আপনার ইতিহাস দেখতে পাবেন</translation> <translation id="3897092660631435901">মেনু</translation> +<translation id="3899568514738536144">ব্রাউজিং ইতিহাস দেখুন</translation> <translation id="3904829425754749514">আপনার প্রতিষ্ঠান সিঙ্ক করার সুবিধা বন্ধ করে দিয়েছে। এখনও এই ডিভাইসে আপনার বুকমার্ক, ইতিহাস, পাসওয়ার্ড এবং অন্য সেটিংস দেখতে পাবেন। আপনি কোনও পরিবর্তন করলে, তা আপনার অ্যাকাউন্টে সিঙ্ক হবে না।</translation> <translation id="3913386780052199712">Chrome-এ সাইন-ইন করা হয়েছে</translation> <translation id="3915450441834151894">সাইটের তথ্য</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb index a062c292..a161a1d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">Ara podràs treure el màxim profit de Chrome al teu dispositiu.</translation> <translation id="2434405374328098816">Ja has desat una contrasenya per a <ph name="USERNAME" /> a <ph name="WEBSITE" /></translation> <translation id="2435457462613246316">Mostra la contrasenya</translation> +<translation id="2439425774439590">Llocs web més visitats</translation> <translation id="2451654228769116489">Fixa la pestanya</translation> <translation id="2461070143328828326">Configuració de contrasenyes</translation> <translation id="2469960372084740698">Vols desactivar Navegació segura?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">Preu</translation> <translation id="3892144330757387737">Trobaràs l'historial aquí</translation> <translation id="3897092660631435901">Menú</translation> +<translation id="3899568514738536144">Mostra l'historial de navegació</translation> <translation id="3904829425754749514">La teva organització ha desactivat la sincronització. Encara pots veure les adreces d'interès, l'historial, les contrasenyes i altres opcions de configuració en aquest dispositiu. Si fas canvis, no se sincronitzaran amb el teu compte.</translation> <translation id="3913386780052199712">Sessió iniciada a Chrome</translation> <translation id="3915450441834151894">Informació del lloc web</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb index e54802c..3ec20cdc 100644 --- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">Nyní využijete Chrome na svém zařízení na maximum.</translation> <translation id="2434405374328098816">Heslo pro uživatelské jméno „<ph name="USERNAME" />“ už jste na webu <ph name="WEBSITE" /> uložili</translation> <translation id="2435457462613246316">Zobrazit heslo</translation> +<translation id="2439425774439590">Nejnavštěvovanější weby</translation> <translation id="2451654228769116489">Připnout kartu</translation> <translation id="2461070143328828326">Nastavení hesla</translation> <translation id="2469960372084740698">Vypnout Bezpečné prohlížení?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">Cena</translation> <translation id="3892144330757387737">Zde najdete svou historii</translation> <translation id="3897092660631435901">Nabídka</translation> +<translation id="3899568514738536144">Zobrazit historii prohlížení</translation> <translation id="3904829425754749514">Vaše organizace vypnula synchronizaci. Záložky, historii, hesla a další nastavení na tomto zařízení nadále uvidíte. Pokud provedete nějaké změny, nesynchronizují se do účtu.</translation> <translation id="3913386780052199712">Jste přihlášeni do Chromu jako</translation> <translation id="3915450441834151894">Informace o stránkách</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb index d860816..dbfc6c20 100644 --- a/ios/chrome/app/strings/resources/ios_strings_da.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">Nu får du mest muligt ud af Chrome på din enhed.</translation> <translation id="2434405374328098816">Du har allerede gemt en adgangskode for "<ph name="USERNAME" />" på <ph name="WEBSITE" /></translation> <translation id="2435457462613246316">Vis adgangskode</translation> +<translation id="2439425774439590">Mest besøgte websites</translation> <translation id="2451654228769116489">Fastgør fane</translation> <translation id="2461070143328828326">Adgangskodeindstillinger</translation> <translation id="2469960372084740698">Vil du deaktivere Beskyttet browsing?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">Pris</translation> <translation id="3892144330757387737">Her kan du se din historik</translation> <translation id="3897092660631435901">Menu</translation> +<translation id="3899568514738536144">Se browserhistorik</translation> <translation id="3904829425754749514">Din organisation har deaktiveret synkronisering. Du kan stadig se din historik samt dine bogmærker, adgangskoder og andre indstillinger på din enhed. Hvis du foretager nogen ændringer, bliver de dog ikke synkroniseret med din konto.</translation> <translation id="3913386780052199712">Logget ind på Chrome</translation> <translation id="3915450441834151894">Websiteoplysninger</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 987f42a4..01f9c5e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">Ahora puedes aprovechar Chrome al máximo en tu dispositivo.</translation> <translation id="2434405374328098816">Ya guardaste una contraseña para "<ph name="USERNAME" />" en <ph name="WEBSITE" /></translation> <translation id="2435457462613246316">Mostrar contraseña</translation> +<translation id="2439425774439590">Los sitios más visitados</translation> <translation id="2451654228769116489">Fijar pestaña</translation> <translation id="2461070143328828326">Configuración de contraseñas</translation> <translation id="2469960372084740698">¿Quieres desactivar la Navegación segura?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">Precio</translation> <translation id="3892144330757387737">Aquí encontrarás tu historial</translation> <translation id="3897092660631435901">Menú</translation> +<translation id="3899568514738536144">Ver el historial de navegación</translation> <translation id="3904829425754749514">Tu organización desactivó la sincronización. Podrás seguir viendo tus favoritos, el historial, las contraseñas y otras opciones de configuración en este dispositivo. Si realizas cambios, no se sincronizarán con tu cuenta.</translation> <translation id="3913386780052199712">Accediste a Chrome.</translation> <translation id="3915450441834151894">Información del sitio</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb index 71b254f..c73082b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_es.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">Ahora podrás sacar el máximo partido a Chrome en tu dispositivo.</translation> <translation id="2434405374328098816">Ya has guardado una contraseña para <ph name="USERNAME" /> en <ph name="WEBSITE" /></translation> <translation id="2435457462613246316">Mostrar contraseña</translation> +<translation id="2439425774439590">Sitios más visitados</translation> <translation id="2451654228769116489">Fijar pestaña</translation> <translation id="2461070143328828326">Ajustes de contraseña</translation> <translation id="2469960372084740698">¿Desactivar Navegación segura?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">Precio</translation> <translation id="3892144330757387737">Aquí verás tu historial</translation> <translation id="3897092660631435901">Menú</translation> +<translation id="3899568514738536144">Ver historial de navegación</translation> <translation id="3904829425754749514">Tu organización ha desactivado la sincronización. Podrás seguir viendo tus marcadores, el historial, las contraseñas y otros ajustes en este dispositivo. Si realizas cambios, no se sincronizarán con tu cuenta.</translation> <translation id="3913386780052199712">Has iniciado sesión en Chrome</translation> <translation id="3915450441834151894">Información del sitio web</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb index d9eacad9..4b5e8613 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">Vous allez maintenant tirer le meilleur parti de Chrome sur votre appareil.</translation> <translation id="2434405374328098816">Vous avez déjà enregistré un mot de passe pour l'utilisateur « <ph name="USERNAME" /> » sur le site <ph name="WEBSITE" /></translation> <translation id="2435457462613246316">Affich. mot de passe</translation> +<translation id="2439425774439590">Sites les plus visités</translation> <translation id="2451654228769116489">Épingler l'onglet</translation> <translation id="2461070143328828326">Paramètres des mots de passe</translation> <translation id="2469960372084740698">Désactiver la navigation sécurisée?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">Prix</translation> <translation id="3892144330757387737">Vous trouverez votre historique ici</translation> <translation id="3897092660631435901">Menu</translation> +<translation id="3899568514738536144">Afficher l'historique de navigation</translation> <translation id="3904829425754749514">Votre organisation a désactivé la synchronisation. Vous pouvez tout de même voir vos favoris, votre historique, vos mots de passe et d'autres paramètres sur cet appareil. Si vous apportez des modifications, elles ne seront pas synchronisées avec votre compte.</translation> <translation id="3913386780052199712">Connecté à Chrome</translation> <translation id="3915450441834151894">Information sur le site</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gl.xtb b/ios/chrome/app/strings/resources/ios_strings_gl.xtb index a600f281..09c6ebea 100644 --- a/ios/chrome/app/strings/resources/ios_strings_gl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_gl.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">Xa podes aproveitar todo o que Chrome che ofrece no teu dispositivo.</translation> <translation id="2434405374328098816">Xa gardaches un contrasinal de <ph name="USERNAME" /> para <ph name="WEBSITE" /></translation> <translation id="2435457462613246316">Mostrar contrasinal</translation> +<translation id="2439425774439590">Sitios máis visitados</translation> <translation id="2451654228769116489">Fixar pestana</translation> <translation id="2461070143328828326">Configuración dos contrasinais</translation> <translation id="2469960372084740698">Queres desactivar a función Navegación segura?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">Prezo</translation> <translation id="3892144330757387737">Aquí atoparás o teu historial</translation> <translation id="3897092660631435901">Menú</translation> +<translation id="3899568514738536144">Consulta o historial de navegación</translation> <translation id="3904829425754749514">A túa organización desactivou a sincronización. Podes seguir vendo os marcadores, o historial, os contrasinais e o resto das opcións de configuración que teñas neste dispositivo. Se fas cambios, non se sincronizarán coa túa conta.</translation> <translation id="3913386780052199712">Sesión iniciada en Chrome</translation> <translation id="3915450441834151894">Información sobre o sitio</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_strings_gu.xtb index de55032f..5ec11c43 100644 --- a/ios/chrome/app/strings/resources/ios_strings_gu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">તમે હવે તમારા ડિવાઇસ પર Chromeનો વધુને વધુ લાભ મેળવશો.</translation> <translation id="2434405374328098816">તમે <ph name="WEBSITE" /> પર "<ph name="USERNAME" />" માટેનો પાસવર્ડ પહેલેથી સાચવ્યો છે</translation> <translation id="2435457462613246316">પાસવર્ડ બતાવો</translation> +<translation id="2439425774439590">સૌથી વધુ મુલાકાત લેવામાં આવેલી સાઇટ</translation> <translation id="2451654228769116489">ટૅબને પિન કરો</translation> <translation id="2461070143328828326">પાસવર્ડ સેટિંગ</translation> <translation id="2469960372084740698">Safe Browsing બંધ કરીએ?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">કિંમત</translation> <translation id="3892144330757387737">તમને તમારો ઇતિહાસ અહીં મળશે</translation> <translation id="3897092660631435901">મેનૂ</translation> +<translation id="3899568514738536144">બ્રાઉઝિંગ ઇતિહાસ જુઓ</translation> <translation id="3904829425754749514">તમારી સંસ્થાએ સિંક બંધ કર્યું છે. તમે હજુ પણ આ ડિવાઇસ પરના તમારા બુકમાર્ક, ઇતિહાસ, પાસવર્ડ અને અન્ય સેટિંગ જોઈ શકો છો. જો તમે ફેરફારો કરશો, તો તે તમારા એકાઉન્ટ સાથે સિંક કરવામાં આવશે નહીં.</translation> <translation id="3913386780052199712">Chromeમાં સાઇન ઇન કર્યું</translation> <translation id="3915450441834151894">સાઇટ માહિતી</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_strings_hu.xtb index ac42572b..d085cd6 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
@@ -379,6 +379,7 @@ <translation id="3464194322481586217">Nem sikerült az ár nyomon követésének beállítása.</translation> <translation id="3469166899695866866">Leállítja a letöltést?</translation> <translation id="3470502288861289375">Másolás...</translation> +<translation id="3471148582064653480">Szinkronizálhatja a jelszavakat, az előzményeket és egyebeket.</translation> <translation id="3474048842645761983">{COUNT,plural, =1{{COUNT} webhelynél vagy alkalmazásnál}other{{COUNT} webhelynél vagy alkalmazásnál}}</translation> <translation id="3474624961160222204">Folytatás mint <ph name="NAME" /></translation> <translation id="3478058380795961209">Lejárat hónapja</translation> @@ -399,6 +400,7 @@ <translation id="3551320343578183772">Lap bezárása</translation> <translation id="3565207542107370586">Böngészési adatok törlése…</translation> <translation id="3575234738189584619">Keresés a Lens segítségével</translation> +<translation id="3577555362230509265">Használhatja a Chrome-ot más alkalmazásokban.</translation> <translation id="3581564640715911333">Más nyelvű oldalak fordításának felajánlása</translation> <translation id="3588820906588687999">Kép megnyitása új lapon</translation> <translation id="3595252146048399851">A <ph name="BEGIN_LINK" />beállítások<ph name="END_LINK" /> között bármikor módosíthatja a szinkronizálni kívánt elemeket. A Google az Ön előzményei alapján személyre szabhatja a Keresőt és más szolgáltatásokat.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hy.xtb b/ios/chrome/app/strings/resources/ios_strings_hy.xtb index 85751e6..e6705e40 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hy.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hy.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">Այժմ դուք կարող եք օգտվել Chrome-ի բոլոր հնարավորություններից</translation> <translation id="2434405374328098816">Դուք <ph name="WEBSITE" /> կայքում «<ph name="USERNAME" />» օգտատիրոջ համար արդեն գաղտնաբառ պահել եք։</translation> <translation id="2435457462613246316">Ցույց տալ գաղտնաբառը</translation> +<translation id="2439425774439590">Ամենաշատ այցելվող կայքեր</translation> <translation id="2451654228769116489">Ամրացնել ներդիրը</translation> <translation id="2461070143328828326">Գաղտնաբառերի կարգավորումներ</translation> <translation id="2469960372084740698">Անջատե՞լ ապահով դիտարկումը</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">Գին</translation> <translation id="3892144330757387737">Պատմությունը կգտնեք այստեղ</translation> <translation id="3897092660631435901">Ընտրացանկ</translation> +<translation id="3899568514738536144">Դիտել այցելությունների պատմությունը</translation> <translation id="3904829425754749514">Ձեր կազմակերպությունն անջատել է համաժամացումը։ Դուք նախկինի պես կարող եք տեսնել ձեր էջանիշները, պատմությունը, գաղտնաբառերն ու մյուս կարգավորումները այս սարքում։ Սակայն ձեր կատարած փոփոխությունները չեն համաժամացվի հաշվի հետ։</translation> <translation id="3913386780052199712">Դուք մուտք եք գործել Chrome-ում</translation> <translation id="3915450441834151894">Տեղեկություններ կայքի մասին</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb index 7f5079d..28542b7 100644 --- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">עכשיו אפשר ליהנות מהמיטב של Chrome במכשיר.</translation> <translation id="2434405374328098816">כבר שמרת סיסמה עבור המשתמש "<ph name="USERNAME" />" לאתר <ph name="WEBSITE" /></translation> <translation id="2435457462613246316">הצגת סיסמה</translation> +<translation id="2439425774439590">האתרים עם הכי הרבה ביקורים</translation> <translation id="2451654228769116489">הצמדת הכרטיסייה</translation> <translation id="2461070143328828326">הגדרות סיסמה</translation> <translation id="2469960372084740698">להשבית את 'גלישה בטוחה'?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">מחיר</translation> <translation id="3892144330757387737">ההיסטוריה זמינה כאן</translation> <translation id="3897092660631435901">תפריט</translation> +<translation id="3899568514738536144">לצפייה בהיסטוריית הגלישה</translation> <translation id="3904829425754749514">הארגון שלך השבית את הסנכרון. יש לך עדיין אפשרות לראות את הסימניות, ההיסטוריה, הסיסמאות והגדרות נוספות במכשיר הזה. שינויים שיתבצעו על ידך לא יסונכרנו בחשבון שלך.</translation> <translation id="3913386780052199712">נכנסת ל-Chrome</translation> <translation id="3915450441834151894">פרטי אתר</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_km.xtb b/ios/chrome/app/strings/resources/ios_strings_km.xtb index b47f059d1..9a6f3d9 100644 --- a/ios/chrome/app/strings/resources/ios_strings_km.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_km.xtb
@@ -379,6 +379,7 @@ <translation id="3464194322481586217">មិនអាចតាមដានតម្លៃនេះបានទេ។</translation> <translation id="3469166899695866866">បញ្ឈប់ការទាញយកមែនទេ?</translation> <translation id="3470502288861289375">កំពុងចម្លង...</translation> +<translation id="3471148582064653480">ធ្វើសមកាលកម្មប្រវត្តិ ពាក្យសម្ងាត់របស់អ្នក និងអ្វីៗជាច្រើនទៀត។</translation> <translation id="3474048842645761983">{COUNT,plural, =1{សម្រាប់កម្មវិធី ឬគេហទំព័រ {COUNT}}other{សម្រាប់កម្មវិធី និងគេហទំព័រ {COUNT}}}</translation> <translation id="3474624961160222204">បន្តជា <ph name="NAME" /></translation> <translation id="3478058380795961209">ខែផុតកំណត់</translation> @@ -399,6 +400,7 @@ <translation id="3551320343578183772">បិទផ្ទាំង</translation> <translation id="3565207542107370586">សម្អាតទិន្នន័យរុករក…</translation> <translation id="3575234738189584619">ស្វែងរកដោយប្រើ Lens</translation> +<translation id="3577555362230509265">ប្រើ Chrome នៅក្នុងកម្មវិធីផ្សេងទៀត។</translation> <translation id="3581564640715911333">ផ្តល់ជូនការបកប្រែទំព័រជាភាសាផ្សេងទៀត</translation> <translation id="3588820906588687999">បើករូបភាពនៅក្នុងផ្ទាំងថ្មី</translation> <translation id="3595252146048399851">អ្នកអាចជ្រើសរើសអ្វីដែលត្រូវធ្វើសមកាលកម្មនៅក្នុង<ph name="BEGIN_LINK" />ការកំណត់<ph name="END_LINK" />បានជានិច្ច។ Google អាចកំណត់ម៉ាស៊ីនស្វែងរក និងសេវាកម្មផ្សេងទៀតឱ្យមានលក្ខណៈផ្ទាល់ខ្លួន ផ្អែកតាមប្រវត្តិរបស់អ្នក។</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ky.xtb b/ios/chrome/app/strings/resources/ios_strings_ky.xtb index d791b806..d84d5f6 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ky.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ky.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">Chrome'дун бардык мүмкүнчүлүктөрүн түзмөгүңүздө колдонуңуз.</translation> <translation id="2434405374328098816">"<ph name="USERNAME" />" үчүн <ph name="WEBSITE" /> вебсайтында сырсөздү сактап койгонсуз</translation> <translation id="2435457462613246316">Сырсөздү көрсөтүү</translation> +<translation id="2439425774439590">Эң көп ачылган сайттар</translation> <translation id="2451654228769116489">Өтмөктү кадоо</translation> <translation id="2461070143328828326">Сырсөздүн параметрлери</translation> <translation id="2469960372084740698">Коопсуз серептөө өчүрүлсүнбү?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">Баасы</translation> <translation id="3892144330757387737">Таржымалыңызды ушул жерден табасыз</translation> <translation id="3897092660631435901">Меню</translation> +<translation id="3899568514738536144">Көрүлгөн вебсайттарды карап көрүү</translation> <translation id="3904829425754749514">Уюмуңуз шайкештирүүнү өчүрүп койду. Ушул түзмөгүңүздө кыстармаларды, таржымалды, сырсөздөрдү жана башка параметрлериңизди дагы деле көрүп турасыз. Эгер өзгөртүүлөрдү киргизсеңиз, алар аккаунтуңузга шайкештирилбейт.</translation> <translation id="3913386780052199712">Chrome'го кирдиңиз</translation> <translation id="3915450441834151894">Сайт тууралуу маалымат</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mk.xtb b/ios/chrome/app/strings/resources/ios_strings_mk.xtb index 0c6540cd..817eb01 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mk.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">Сега ќе го извлекувате максимумот од Chrome на вашиот уред.</translation> <translation id="2434405374328098816">Веќе зачувавте лозинка за „<ph name="USERNAME" />“ на <ph name="WEBSITE" /></translation> <translation id="2435457462613246316">Прикажи ја лозинката</translation> +<translation id="2439425774439590">Најпосетувани сајтови</translation> <translation id="2451654228769116489">Прикачи картичка</translation> <translation id="2461070143328828326">Поставки за лозинка</translation> <translation id="2469960372084740698">Да се исклучи „Безбедно прелистување“?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">Цена</translation> <translation id="3892144330757387737">Вашата историја ќе ја најдете тука</translation> <translation id="3897092660631435901">Мени</translation> +<translation id="3899568514738536144">Прегледајте ја историјата на прелистувањето</translation> <translation id="3904829425754749514">Вашата организација го исклучи синхронизирањето. Сѐ уште може да ги гледате вашите обележувачи, историја, лозинки и другите поставки на уредов. Промените нема да се синхронизираат со вашата сметка.</translation> <translation id="3913386780052199712">Најавени сте на Chrome</translation> <translation id="3915450441834151894">Информации за сајтот</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb index fc0f524..9fba50a4a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">നിങ്ങളുടെ ഉപകരണത്തിൽ Chrome പരമാവധി പ്രയോജനപ്പെടുത്തുക.</translation> <translation id="2434405374328098816">നിങ്ങൾ "<ph name="USERNAME" />" എന്നതിനുള്ള പാസ്വേഡ് <ph name="WEBSITE" /> എന്ന വെബ്സൈറ്റിൽ മുമ്പേ സംരക്ഷിച്ചു</translation> <translation id="2435457462613246316">പാസ്വേഡ് കാണിക്കുക</translation> +<translation id="2439425774439590">ഏറ്റവുമധികം സന്ദർശിച്ച സൈറ്റുകൾ</translation> <translation id="2451654228769116489">ടാബ് പിൻ ചെയ്യുക</translation> <translation id="2461070143328828326">പാസ്വേഡ് ക്രമീകരണം</translation> <translation id="2469960372084740698">സുരക്ഷിത ബ്രൗസിംഗ് ഓഫാക്കണോ?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">നിരക്ക്</translation> <translation id="3892144330757387737">നിങ്ങളുടെ ചരിത്രം ഇവിടെ കാണാം</translation> <translation id="3897092660631435901">മെനു</translation> +<translation id="3899568514738536144">ബ്രൗസിംഗ് ചരിത്രം കാണുക</translation> <translation id="3904829425754749514">നിങ്ങളുടെ സ്ഥാപനം സമന്വയം ഓഫാക്കി. ഈ ഉപകരണത്തിലെ നിങ്ങളുടെ ബുക്ക്മാർക്കുകളും ചരിത്രവും പാസ്വേഡുകളും മറ്റ് ക്രമീകരണവും നിങ്ങൾക്ക് തുടർന്നും കാണാം. മാറ്റങ്ങൾ വരുത്തിയാൽ, അവ നിങ്ങളുടെ അക്കൗണ്ടിൽ സമന്വയിപ്പിക്കില്ല.</translation> <translation id="3913386780052199712">Chrome-ൽ സൈൻ ഇൻ ചെയ്തു</translation> <translation id="3915450441834151894">സൈറ്റ് വിവരങ്ങള്</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mn.xtb b/ios/chrome/app/strings/resources/ios_strings_mn.xtb index 012d8134..23002df 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">Та одоо төхөөрөмждөө Chrome-г бүрэн ашиглана.</translation> <translation id="2434405374328098816">Та <ph name="WEBSITE" />-д аль хэдийн "<ph name="USERNAME" />"-н нууц үгийг хадгалсан</translation> <translation id="2435457462613246316">Нууц үг харуулах</translation> +<translation id="2439425774439590">Хамгийн их зочилсон сайтууд</translation> <translation id="2451654228769116489">Таб бэхлэх</translation> <translation id="2461070143328828326">Нууц үгний тохиргоо</translation> <translation id="2469960372084740698">Аюулгүй үзэхийг унтраах уу?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">Үнэ</translation> <translation id="3892144330757387737">Та түүхээ эндээс олох болно</translation> <translation id="3897092660631435901">Цэс</translation> +<translation id="3899568514738536144">Хөтчийн түүхийг харах</translation> <translation id="3904829425754749514">Танай байгууллага синк хийхийг унтраасан. Та энэ төхөөрөмж дээрх хавчуурганууд, түүх, нууц үгнүүд болон бусад тохиргоог харах боломжтой хэвээр байна. Хэрэв та өөрчлөлтүүд хийвэл тэдгээрийг таны бүртгэлд синк хийхгүй.</translation> <translation id="3913386780052199712">Chrome-д нэвтэрсэн</translation> <translation id="3915450441834151894">Сайтын мэдээлэл</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ne.xtb b/ios/chrome/app/strings/resources/ios_strings_ne.xtb index 08ae813..9c40ff1 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ne.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ne.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">तपाईं अब आफ्नो डिभाइसमा Chrome बाट बढीभन्दा बढी फाइदा पाउनु हुने छ।</translation> <translation id="2434405374328098816">तपाईंले <ph name="WEBSITE" /> का हकमा "<ph name="USERNAME" />" को पासवर्ड सेभ गरिसक्नुभएको छ</translation> <translation id="2435457462613246316">पासवर्ड देखाउनुहोस्</translation> +<translation id="2439425774439590">सबैभन्दा धेरै पटक खोलिएका साइटहरू</translation> <translation id="2451654228769116489">ट्याब पिन गर्नुहोस्</translation> <translation id="2461070143328828326">पासवर्डसम्बन्धी सेटिङ</translation> <translation id="2469960372084740698">Safe Browsing अफ गर्ने हो?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">मूल्य</translation> <translation id="3892144330757387737">तपाईंले गर्नुभएका क्रियाकलापको इतिहास यहाँ देखिने छ</translation> <translation id="3897092660631435901">मेनु</translation> +<translation id="3899568514738536144">ब्राउजिङ हिस्ट्री हेर्नुहोस्</translation> <translation id="3904829425754749514">तपाईंको सङ्गठनले सिंक गर्ने सुविधा अफ गरेको छ। तपाईं यो डिभाइसमा आफ्ना बुकमार्क, हिस्ट्री, पासवर्ड र अन्य सेटिङ देखिरहनु हुने छ। तपाईंले यी कुरा परिवर्तन गर्नुभयो भने ती परिवर्तन तपाईंको खातामा सिंक हुने छैनन्।</translation> <translation id="3913386780052199712">तपाईंले Chrome मा साइन इन गर्नुभएको छ</translation> <translation id="3915450441834151894">साइटको जानकारी</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb index fa54cb6..a087088 100644 --- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">Je kunt nu optimaal gebruikmaken van Chrome op je apparaat.</translation> <translation id="2434405374328098816">Je hebt al een wachtwoord voor <ph name="USERNAME" /> opgeslagen op <ph name="WEBSITE" /></translation> <translation id="2435457462613246316">Wachtwoord bekijken</translation> +<translation id="2439425774439590">Meest bezochte sites</translation> <translation id="2451654228769116489">Tabblad vastzetten</translation> <translation id="2461070143328828326">Wachtwoordinstellingen</translation> <translation id="2469960372084740698">Safe Browsing uitzetten?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">Prijs</translation> <translation id="3892144330757387737">Hier vind je je geschiedenis</translation> <translation id="3897092660631435901">Menu</translation> +<translation id="3899568514738536144">Browsegeschiedenis bekijken</translation> <translation id="3904829425754749514">Je organisatie heeft synchronisatie uitgezet. Je bookmarks, geschiedenis, wachtwoorden en andere instellingen blijven zichtbaar op dit apparaat. Als je wijzigingen aanbrengt, worden deze niet gesynchroniseerd met je account.</translation> <translation id="3913386780052199712">Ingelogd bij Chrome</translation> <translation id="3915450441834151894">Site-informatie</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb index 42dbbe7..e7f29f5 100644 --- a/ios/chrome/app/strings/resources/ios_strings_no.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -379,6 +379,7 @@ <translation id="3464194322481586217">Kunne ikke spore prisen.</translation> <translation id="3469166899695866866">Vil du stoppe nedlastingen?</translation> <translation id="3470502288861289375">Kopierer ...</translation> +<translation id="3471148582064653480">Synkroniser passordene dine, loggen din med mer.</translation> <translation id="3474048842645761983">{COUNT,plural, =1{For {COUNT} nettsted eller app}other{for {COUNT} nettsteder og apper}}</translation> <translation id="3474624961160222204">Fortsett som <ph name="NAME" /></translation> <translation id="3478058380795961209">Utløpsmåned</translation> @@ -399,6 +400,7 @@ <translation id="3551320343578183772">Lukk fanen</translation> <translation id="3565207542107370586">Slett nettlesingsdata…</translation> <translation id="3575234738189584619">Søk med Lens</translation> +<translation id="3577555362230509265">Bruk Chrome i andre apper.</translation> <translation id="3581564640715911333">Tilby å oversette sider på andre språk</translation> <translation id="3588820906588687999">Åpne bildet i en ny fane</translation> <translation id="3595252146048399851">Du kan når som helst velge hva du vil synkronisere, i <ph name="BEGIN_LINK" />innstillingene<ph name="END_LINK" />. Google kan gi Søk og andre tjenester personlig preg basert på loggen din.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_or.xtb b/ios/chrome/app/strings/resources/ios_strings_or.xtb index 05a17903..cb1e7f2 100644 --- a/ios/chrome/app/strings/resources/ios_strings_or.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_or.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">ଆପଣ ବର୍ତ୍ତମାନ ଆପଣଙ୍କ ଡିଭାଇସରେ Chromeରୁ ସବୁଠୁ ଅଧିକ ସୁବିଧା ପାଇବେ।</translation> <translation id="2434405374328098816">ଆପଣ <ph name="WEBSITE" />ରେ "<ph name="USERNAME" />" ପାଇଁ ପୂର୍ବରୁ ଏକ ପାସୱାର୍ଡ ସେଭ କରିଛନ୍ତି</translation> <translation id="2435457462613246316">ପାସୱାର୍ଡ ଦେଖାନ୍ତୁ</translation> +<translation id="2439425774439590">ସବୁଠୁ ଅଧିକ ଭିଜିଟ କରାଯାଇଥିବା ସାଇଟଗୁଡ଼ିକ</translation> <translation id="2451654228769116489">ଟାବକୁ ପିନ କରନ୍ତୁ</translation> <translation id="2461070143328828326">ପାସୱାର୍ଡ ସେଟିଂସ</translation> <translation id="2469960372084740698">ସେଫ ବ୍ରାଉଜିଂକୁ ବନ୍ଦ କରିବେ?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">ମୂଲ୍ୟ</translation> <translation id="3892144330757387737">ଆପଣ ଏଠାରେ ଆପଣଙ୍କ ଇତିହାସ ପାଇବେ</translation> <translation id="3897092660631435901">ମେନୁ</translation> +<translation id="3899568514738536144">ବ୍ରାଉଜିଂ ଇତିହାସକୁ ଭ୍ୟୁ କରନ୍ତୁ</translation> <translation id="3904829425754749514">ଆପଣଙ୍କ ସଂସ୍ଥା ସିଙ୍କ ବନ୍ଦ କରିଦେଇଛି। ଆପଣ ଏବେ ବି ଏହି ଡିଭାଇସରେ ଆପଣଙ୍କର ବୁକମାର୍କ, ଇତିହାସ, ପାସୱାର୍ଡ ଏବଂ ଅନ୍ୟ ସେଟିଂସ ଦେଖିପାରିବେ। ଯଦି ଆପଣ ପରିବର୍ତ୍ତନ କରନ୍ତି, ତେବେ ସେଗୁଡ଼ିକୁ ଆପଣଙ୍କ ଆକାଉଣ୍ଟ ସହିତ ସିଙ୍କ କରାଯିବ ନାହିଁ।</translation> <translation id="3913386780052199712">Chromeରେ ସାଇନ୍ ଇନ୍ କରନ୍ତୁ</translation> <translation id="3915450441834151894">ସାଇଟ୍ ସୂଚନା</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pa.xtb b/ios/chrome/app/strings/resources/ios_strings_pa.xtb index 9984fb1..aaf26cd 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pa.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pa.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">ਤੁਸੀਂ ਹੁਣ ਆਪਣੇ ਡੀਵਾਈਸ 'ਤੇ Chrome ਦਾ ਵੱਧ ਤੋਂ ਵੱਧ ਲਾਹਾ ਲਓਗੇ।</translation> <translation id="2434405374328098816">ਤੁਸੀਂ ਪਹਿਲਾਂ ਹੀ "<ph name="USERNAME" />" ਲਈ <ph name="WEBSITE" /> 'ਤੇ ਪਾਸਵਰਡ ਰੱਖਿਅਤ ਕਰ ਲਿਆ ਹੈ</translation> <translation id="2435457462613246316">ਪਾਸਵਰਡ ਵੇਖੋ</translation> +<translation id="2439425774439590">ਸਭ ਤੋਂ ਵੱਧ ਦੇਖੀਆਂ ਗਈਆਂ ਸਾਈਟਾਂ</translation> <translation id="2451654228769116489">ਟੈਬ ਪਿੰਨ ਕਰੋ</translation> <translation id="2461070143328828326">ਪਾਸਵਰਡ ਸੈਟਿੰਗਾਂ</translation> <translation id="2469960372084740698">ਕੀ ਸੁਰੱਖਿਅਤ ਬ੍ਰਾਊਜ਼ਿੰਗ ਨੂੰ ਬੰਦ ਕਰਨਾ ਹੈ?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">ਕੀਮਤ</translation> <translation id="3892144330757387737">ਤੁਹਾਨੂੰ ਆਪਣਾ ਇਤਿਹਾਸ ਇੱਥੇ ਮਿਲੇਗਾ</translation> <translation id="3897092660631435901">ਮੀਨੂ</translation> +<translation id="3899568514738536144">ਬ੍ਰਾਊਜ਼ਿੰਗ ਇਤਿਹਾਸ ਦੇਖੋ</translation> <translation id="3904829425754749514">ਤੁਹਾਡੀ ਸੰਸਥਾ ਨੇ ਸਿੰਕ ਬੰਦ ਕਰ ਦਿੱਤਾ ਹੈ। ਤੁਸੀਂ ਹਾਲੇ ਵੀ ਇਸ ਡੀਵਾਈਸ 'ਤੇ ਆਪਣੇ ਬੁੱਕਮਾਰਕ, ਇਤਿਹਾਸ, ਪਾਸਵਰਡ ਅਤੇ ਹੋਰ ਸੈਟਿੰਗਾਂ ਦੇਖ ਸਕਦੇ ਹੋ। ਜੇ ਤੁਸੀਂ ਤਬਦੀਲੀਆਂ ਕਰਦੇ ਹੋ, ਤਾਂ ਉਨ੍ਹਾਂ ਦਾ ਸਿੰਕ ਤੁਹਾਡੇ ਖਾਤੇ ਨਾਲ ਨਹੀਂ ਕੀਤਾ ਜਾਵੇਗਾ।</translation> <translation id="3913386780052199712">Chrome ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕੀਤਾ ਗਿਆ</translation> <translation id="3915450441834151894">ਸਾਈਟ ਜਾਣਕਾਰੀ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb index 26cb466..e37dd05e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -379,6 +379,7 @@ <translation id="3464194322481586217">Nu s-a putut urmări prețul.</translation> <translation id="3469166899695866866">Oprești descărcarea?</translation> <translation id="3470502288861289375">Se copiază...</translation> +<translation id="3471148582064653480">Sincronizează parolele, istoricul și alte date.</translation> <translation id="3474048842645761983">{COUNT,plural, =1{pentru {COUNT} site sau o aplicație}few{pentru {COUNT} site-uri și aplicații}other{pentru {COUNT} de site-uri și aplicații}}</translation> <translation id="3474624961160222204">Continuă ca <ph name="NAME" /></translation> <translation id="3478058380795961209">Lună expirare</translation> @@ -399,6 +400,7 @@ <translation id="3551320343578183772">Închide fila</translation> <translation id="3565207542107370586">Șterge datele de navigare…</translation> <translation id="3575234738189584619">Caută cu Lens</translation> +<translation id="3577555362230509265">Folosește Chrome în alte aplicații.</translation> <translation id="3581564640715911333">Oferă traducerea paginilor în alte limbi</translation> <translation id="3588820906588687999">Deschide imaginea într-o filă nouă</translation> <translation id="3595252146048399851">Poți să alegi oricând ce să sincronizezi în <ph name="BEGIN_LINK" />setări<ph name="END_LINK" />. Google poate personaliza Căutarea și alte servicii pe baza istoricului.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb index 972fb08..cdbd83bd 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">Теперь вы сможете использовать все возможности Chrome.</translation> <translation id="2434405374328098816">Пароль пользователя <ph name="USERNAME" /> для сайта <ph name="WEBSITE" /> уже сохранен.</translation> <translation id="2435457462613246316">Показать пароль</translation> +<translation id="2439425774439590">Часто открываемые сайты</translation> <translation id="2451654228769116489">Закрепить вкладку</translation> <translation id="2461070143328828326">Настройки паролей</translation> <translation id="2469960372084740698">Отключить Безопасный просмотр?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">Цена</translation> <translation id="3892144330757387737">Здесь вы найдете свою историю</translation> <translation id="3897092660631435901">Меню</translation> +<translation id="3899568514738536144">Просматривайте историю браузера</translation> <translation id="3904829425754749514">В вашей организации синхронизация отключена. На этом устройстве по-прежнему доступны закладки, история, пароли и другие настройки. Однако изменения не сохраняются в вашем аккаунте.</translation> <translation id="3913386780052199712">Вы вошли в Chrome</translation> <translation id="3915450441834151894">Информация о сайте</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_si.xtb b/ios/chrome/app/strings/resources/ios_strings_si.xtb index 36e2cf2..c075c4d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_si.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_si.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">ඔබ දැන් ඔබේ උපාංගයෙහි Chrome වෙතින් උපරිමය ලබා ගනු ඇත.</translation> <translation id="2434405374328098816">ඔබ දැනටමත් "<ph name="USERNAME" />" සඳහා මුරපදයක් <ph name="WEBSITE" /> හි සුරැක ඇත</translation> <translation id="2435457462613246316">මුරපදය පෙන්වන්න</translation> +<translation id="2439425774439590">වැඩිපුරම පිවිසි අඩවි</translation> <translation id="2451654228769116489">පටිත්ත අමුණන්න</translation> <translation id="2461070143328828326">මුරපද සැකසීම්</translation> <translation id="2469960372084740698">සුරක්ෂිත බ්රවුස් කිරීම ක්රියාවිරහිත කරන්නද?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">මිල</translation> <translation id="3892144330757387737">ඔබට ඔබේ ඉතිහාසය මෙහි හමුවනු ඇත</translation> <translation id="3897092660631435901">මෙනුව</translation> +<translation id="3899568514738536144">බ්රවුස් කිරීමේ ඉතිහාසය බලන්න</translation> <translation id="3904829425754749514">ඔබගේ සංවිධානය සමමුහුර්ත කිරීම ක්රියාවිරහිත කර ඇත. ඔබට තවම ඔබගේ පිටුසන්, ඉතිහාසය, මුරපද සහ වෙනත් සැකසීම් මෙම උපාංගයෙහි බැලිය හැකිය. ඔබ වෙනස් කිරීම් සිදු කළහොත්, ඒවා ඔබගේ ගිණුමට සමමුහුර්ත නොවනු ඇත.</translation> <translation id="3913386780052199712">Chrome වෙත පුරන ලදි</translation> <translation id="3915450441834151894">අඩවි තොරතුරු</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_strings_sk.xtb index 53604c50..c5251f4 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -379,6 +379,7 @@ <translation id="3464194322481586217">Cenu sa nepodarilo sledovať.</translation> <translation id="3469166899695866866">Zastaviť sťahovanie?</translation> <translation id="3470502288861289375">Prebieha kopírovanie...</translation> +<translation id="3471148582064653480">Synchronizujte si heslá, históriu a ďalší obsah.</translation> <translation id="3474048842645761983">{COUNT,plural, =1{pre {COUNT} web alebo aplikáciu}few{pre {COUNT} weby alebo aplikácie}many{for {COUNT} sites and apps}other{pre {COUNT} webov alebo aplikácií}}</translation> <translation id="3474624961160222204">Pokračovať ako <ph name="NAME" /></translation> <translation id="3478058380795961209">Mesiac vypršania platnosti</translation> @@ -399,6 +400,7 @@ <translation id="3551320343578183772">Zatvoriť kartu</translation> <translation id="3565207542107370586">Vymazať dáta prehliadania…</translation> <translation id="3575234738189584619">Vyhľadávať pomocou funkcie Lens</translation> +<translation id="3577555362230509265">Používajte Chrome v iných aplikáciách.</translation> <translation id="3581564640715911333">Ponúkať preklad stránok v ďalších jazykoch</translation> <translation id="3588820906588687999">Otvoriť obrázok na novej karte</translation> <translation id="3595252146048399851">Položky, ktoré chcete synchronizovať, môžete kedykoľvek vybrať v <ph name="BEGIN_LINK" />nastaveniach<ph name="END_LINK" />. Google môže prispôsobiť Vyhľadávanie a ďalšie služby na základe vašej histórie.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb index 8557c12..fe58c70 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">Zdaj boste lahko v napravi kar najbolje izkoristili Chrome.</translation> <translation id="2434405374328098816">Na <ph name="WEBSITE" /> ste že shranili geslo za »<ph name="USERNAME" />«.</translation> <translation id="2435457462613246316">Pokaži geslo</translation> +<translation id="2439425774439590">Najbolj obiskana spletna mesta</translation> <translation id="2451654228769116489">Pripni zavihek</translation> <translation id="2461070143328828326">Nastavitve gesel</translation> <translation id="2469960372084740698">Želite izklopiti varno brskanje?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">Cena</translation> <translation id="3892144330757387737">Tukaj bo prikazana zgodovina</translation> <translation id="3897092660631435901">Meni</translation> +<translation id="3899568514738536144">Ogled zgodovine brskanja</translation> <translation id="3904829425754749514">Vaša organizacija je izklopila sinhronizacijo. Še vedno si lahko ogledate zaznamke, zgodovino, gesla in druge nastavitve v tej napravi. Če naredite spremembe, ne bodo sinhronizirane z računom.</translation> <translation id="3913386780052199712">Prijavljeni ste v Chrome</translation> <translation id="3915450441834151894">Podatki o spletnem mestu</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sq.xtb b/ios/chrome/app/strings/resources/ios_strings_sq.xtb index 5a8c878..9993d42a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sq.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sq.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">Tani do të përfitosh më shumë nga Chrome në pajisjen tënde.</translation> <translation id="2434405374328098816">Ke ruajtur tashmë një fjalëkalim për "<ph name="USERNAME" />" në <ph name="WEBSITE" />.</translation> <translation id="2435457462613246316">Shfaq fjalëkalimin</translation> +<translation id="2439425774439590">Sajtet më të vizituara</translation> <translation id="2451654228769116489">Gozhdo skedën</translation> <translation id="2461070143328828326">Cilësimet e fjalëkalimeve</translation> <translation id="2469960372084740698">Të çaktivizohet "Shfletimi i sigurt"?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">Çmimi</translation> <translation id="3892144330757387737">Këtu do të gjesh historikun tënd</translation> <translation id="3897092660631435901">Menyja</translation> +<translation id="3899568514738536144">Shiko historikun e shfletimit</translation> <translation id="3904829425754749514">Organizata jote e ka çaktivizuar sinkronizimin. Mund të shikosh ende faqeshënuesit, historikun, fjalëkalimet dhe cilësime të tjera në këtë pajisje. Nëse bën ndryshime, ato nuk do të sinkronizohen me llogarinë tënde.</translation> <translation id="3913386780052199712">Identifikuar në Chrome</translation> <translation id="3915450441834151894">Informacionet rreth sajtit</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb index 4299ffa..e248bf5 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">Sasa utanufaika zaidi na Chrome kwenye kifaa chako.</translation> <translation id="2434405374328098816">Tayari umehifadhi nenosiri la "<ph name="USERNAME" />" unalotumia katika <ph name="WEBSITE" /></translation> <translation id="2435457462613246316">Onyesha nenosiri</translation> +<translation id="2439425774439590">Tovuti Zilizotembelewa Zaidi</translation> <translation id="2451654228769116489">Bandika Kichupo</translation> <translation id="2461070143328828326">Mipangilio ya Nenosiri</translation> <translation id="2469960372084740698">Ungependa Kuzima Kipengele cha Kuvinjari Salama?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">Bei</translation> <translation id="3892144330757387737">Utapata historia yako hapa</translation> <translation id="3897092660631435901">Menyu</translation> +<translation id="3899568514738536144">Tazama historia ya kuvinjari</translation> <translation id="3904829425754749514">Shirika lako limezima kipengele cha kusawazisha. Bado unaweza kuona alamisho, historia, manenosiri na mipangilio mingine kwenye kifaa hiki. Iwapo utafanya mabadiliko, hayatasawazishwa kwenye akaunti yako.</translation> <translation id="3913386780052199712">Umeingia katika akaunti kwenye Chrome</translation> <translation id="3915450441834151894">Maelezo ya Tovuti</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb index 4fb89845..b236b6e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">இப்போது உங்கள் சாதனத்தில் உள்ள Chromeமில் இருந்து அதிகப் பலன்களைப் பெறுங்கள்.</translation> <translation id="2434405374328098816"><ph name="WEBSITE" /> இணையதளத்தில் "<ph name="USERNAME" />" கணக்கிற்கான கடவுச்சொல்லை ஏற்கெனவே சேமித்துள்ளீர்கள்</translation> <translation id="2435457462613246316">கடவுச்சொல்லைக் காண்பி</translation> +<translation id="2439425774439590">அதிகமுறை பார்த்த தளங்கள்</translation> <translation id="2451654228769116489">உலாவிப் பக்கத்தைப் பின் செய்</translation> <translation id="2461070143328828326">கடவுச்சொல் அமைப்புகள்</translation> <translation id="2469960372084740698">'பாதுகாப்பு உலாவல்' அம்சத்தை முடக்கவா?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">விலை</translation> <translation id="3892144330757387737">உங்கள் வரலாற்றை இங்கே பார்ப்பீர்கள்</translation> <translation id="3897092660631435901">மெனு</translation> +<translation id="3899568514738536144">இதுவரை இணையத்தில் பார்த்தவற்றைக் காட்டும்</translation> <translation id="3904829425754749514">உங்கள் நிறுவனம் ஒத்திசைவை முடக்கியுள்ளது. இருப்பினும் இந்தச் சாதனத்தில் உள்ள உங்கள் புக்மார்க்குகள், பதிவுகள், கடவுச்சொற்கள் மற்றும் பிற அமைப்புகளை உங்களால் பார்க்க முடியும். ஏதேனும் மாற்றங்களைச் செய்தால் அவை உங்கள் கணக்குடன் ஒத்திசைக்கப்படாது.</translation> <translation id="3913386780052199712">Chromeமில் நுழைந்துள்ளீர்கள்</translation> <translation id="3915450441834151894">தளம் குறித்த தகவல்</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb index c5461cb..bd7facb1 100644 --- a/ios/chrome/app/strings/resources/ios_strings_th.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -379,6 +379,7 @@ <translation id="3464194322481586217">ติดตามราคาไม่ได้</translation> <translation id="3469166899695866866">หยุดดาวน์โหลดไหม</translation> <translation id="3470502288861289375">กำลังคัดลอก...</translation> +<translation id="3471148582064653480">ซิงค์รหัสผ่าน ประวัติการเข้าชม และอื่นๆ</translation> <translation id="3474048842645761983">{COUNT,plural, =1{สำหรับเว็บไซต์หรือแอป {COUNT} รายการ}other{สําหรับเว็บไซต์และแอป {COUNT} รายการ}}</translation> <translation id="3474624961160222204">ดำเนินการต่อในชื่อ <ph name="NAME" /></translation> <translation id="3478058380795961209">เดือนที่หมดอายุ</translation> @@ -399,6 +400,7 @@ <translation id="3551320343578183772">ปิดแท็บ</translation> <translation id="3565207542107370586">ล้างข้อมูลการท่องเว็บ…</translation> <translation id="3575234738189584619">ค้นหาด้วย Lens</translation> +<translation id="3577555362230509265">ใช้ Chrome ในแอปอื่นๆ</translation> <translation id="3581564640715911333">เสนอที่จะแปลหน้าเว็บในภาษาอื่นๆ</translation> <translation id="3588820906588687999">เปิดภาพในแท็บใหม่</translation> <translation id="3595252146048399851">คุณเลือกสิ่งที่ต้องการซิงค์ได้เสมอใน<ph name="BEGIN_LINK" />การตั้งค่า<ph name="END_LINK" /> Google อาจปรับเปลี่ยน Search และบริการอื่นๆ ให้เหมาะกับคุณโดยอิงจากประวัติการเข้าชม</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb index acdfa212..63d6263d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">Artık cihazınızda Chrome'dan en iyi şekilde yararlanabileceksiniz.</translation> <translation id="2434405374328098816"><ph name="WEBSITE" /> adresinde "<ph name="USERNAME" />" için zaten kayıtlı şifreniz var</translation> <translation id="2435457462613246316">Şifreyi göster</translation> +<translation id="2439425774439590">En Çok Ziyaret Edilen Siteler</translation> <translation id="2451654228769116489">Sekmeyi Sabitle</translation> <translation id="2461070143328828326">Şifre Ayarları</translation> <translation id="2469960372084740698">Güvenli Tarama kapatılsın mı?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">Fiyat</translation> <translation id="3892144330757387737">Geçmişiniz burada gösterilir</translation> <translation id="3897092660631435901">Menü</translation> +<translation id="3899568514738536144">Tarama geçmişini göster</translation> <translation id="3904829425754749514">Kuruluşunuz senkronizasyonu kapattı. Yer işaretleri, geçmiş, şifreler ve diğer ayarlarınızı bu cihazda görmeye devam edebilirsiniz. Değişiklik yaparsanız bu değişiklikler hesabınızla senkronize edilmez.</translation> <translation id="3913386780052199712">Chrome'da oturum açıldı</translation> <translation id="3915450441834151894">Site Bilgileri</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb index 03c24f4..3f3d4a26 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">Тепер ви можете використовувати всі можливості Chrome на своєму пристрої.</translation> <translation id="2434405374328098816">Ви вже зберегли пароль для користувача <ph name="USERNAME" /> на веб-сайті <ph name="WEBSITE" /></translation> <translation id="2435457462613246316">Показати пароль</translation> +<translation id="2439425774439590">Найпопулярніші сайти</translation> <translation id="2451654228769116489">Закріпити вкладку</translation> <translation id="2461070143328828326">Налаштування паролю</translation> <translation id="2469960372084740698">Вимкнути Безпечний перегляд?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">Ціна</translation> <translation id="3892144330757387737">Тут відображатиметься ваша історія</translation> <translation id="3897092660631435901">Меню</translation> +<translation id="3899568514738536144">Переглянути історію веб-перегляду</translation> <translation id="3904829425754749514">Адміністратор вашої організації вимкнув синхронізацію. Ви все ще можете переглядати свої закладки, історію, паролі й інші налаштування на цьому пристрої. Якщо ви внесете зміни, вони не синхронізуватимуться з обліковим записом.</translation> <translation id="3913386780052199712">Ви ввійшли в Chrome</translation> <translation id="3915450441834151894">Інформація про сайт</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uz.xtb b/ios/chrome/app/strings/resources/ios_strings_uz.xtb index ab10707..0cc9c13 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uz.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">Endi qurilmangizda Chromedan unumli foydalanasiz.</translation> <translation id="2434405374328098816"><ph name="WEBSITE" /> saytidagi <ph name="USERNAME" /> paroli allaqachon saqlangan</translation> <translation id="2435457462613246316">Parolni ko‘rsatish</translation> +<translation id="2439425774439590">Eng koʻp kirilgan saytlar</translation> <translation id="2451654228769116489">Varaqni mahkamlash</translation> <translation id="2461070143328828326">Parol sozlamalari</translation> <translation id="2469960372084740698">Saytlarni xavfsiz kezish faolsizlantirilsinmi?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">Narxi</translation> <translation id="3892144330757387737">Brauzer tarixi shu yerda chiqadi</translation> <translation id="3897092660631435901">Menyu</translation> +<translation id="3899568514738536144">Ochilgan veb-sahifalar tarixini koʻrish</translation> <translation id="3904829425754749514">Sinxronizatsiya tashkilotingiz tomonidan faolsizlantirilgan. Bu qurilmadagi bukmarklar, tarix, parollar va boshqa sozlamalarni koʻrishingiz mumkin. Oʻzgartirish kiritilsa, ular hisobingizga sinxronlanmaydi.</translation> <translation id="3913386780052199712">Chrome hisobiga kirildi</translation> <translation id="3915450441834151894">Sayt haqida</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_strings_vi.xtb index 639b4255..bb7d31b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_vi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">Giờ đây, bạn có thể khai thác tối đa Chrome trên thiết bị của mình.</translation> <translation id="2434405374328098816">Bạn đã lưu mật khẩu cho "<ph name="USERNAME" />" tại <ph name="WEBSITE" /></translation> <translation id="2435457462613246316">Hiện mật khẩu</translation> +<translation id="2439425774439590">Các trang web được truy cập nhiều nhất</translation> <translation id="2451654228769116489">Ghim thẻ</translation> <translation id="2461070143328828326">Cài đặt mật khẩu</translation> <translation id="2469960372084740698">Tắt tính năng Duyệt web an toàn?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">Giá</translation> <translation id="3892144330757387737">Bạn sẽ thấy lịch sử hoạt động ở đây</translation> <translation id="3897092660631435901">Menu</translation> +<translation id="3899568514738536144">Xem nhật ký duyệt web</translation> <translation id="3904829425754749514">Tổ chức của bạn đã tắt tính năng đồng bộ hoá. Bạn vẫn có thể xem dấu trang, nhật ký duyệt web, mật khẩu và các chế độ cài đặt khác trên thiết bị này. Nếu bạn thực hiện thay đổi thì những thay đổi đó sẽ không đồng bộ hoá với tài khoản của bạn.</translation> <translation id="3913386780052199712">Đã đăng nhập vào Chrome</translation> <translation id="3915450441834151894">Thông tin về trang web</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 1af5599..393c3b90 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
@@ -218,6 +218,7 @@ <translation id="2423077901494354337">您现在可以在设备上充分利用 Chrome 了。</translation> <translation id="2434405374328098816">您已经在 <ph name="WEBSITE" /> 上保存了“<ph name="USERNAME" />”的密码</translation> <translation id="2435457462613246316">显示密码</translation> +<translation id="2439425774439590">最常访问的网站</translation> <translation id="2451654228769116489">固定标签页</translation> <translation id="2461070143328828326">密码设置</translation> <translation id="2469960372084740698">关闭“安全浏览”功能?</translation> @@ -439,6 +440,7 @@ <translation id="3891414008432200754">价格</translation> <translation id="3892144330757387737">您的历史记录会显示在此处</translation> <translation id="3897092660631435901">菜单</translation> +<translation id="3899568514738536144">查看浏览记录</translation> <translation id="3904829425754749514">贵组织已关闭同步功能。您仍可在此设备上查看自己的书签、历史记录、密码及其他设置。如果您做出更改,这些更改将不会同步到您的帐号。</translation> <translation id="3913386780052199712">已登录 Chrome</translation> <translation id="3915450441834151894">网站信息</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 d3c9ff9..9698614b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
@@ -220,6 +220,7 @@ <translation id="2423077901494354337">您現可在裝置上充分運用 Chrome 的功能。</translation> <translation id="2434405374328098816">您已儲存「<ph name="USERNAME" />」在 <ph name="WEBSITE" /> 使用的密碼</translation> <translation id="2435457462613246316">顯示密碼</translation> +<translation id="2439425774439590">最常瀏覽的網站</translation> <translation id="2451654228769116489">固定分頁</translation> <translation id="2461070143328828326">密碼設定</translation> <translation id="2469960372084740698">要關閉安全瀏覽功能嗎?</translation> @@ -441,6 +442,7 @@ <translation id="3891414008432200754">價格</translation> <translation id="3892144330757387737">您可在此查看記錄</translation> <translation id="3897092660631435901">選單</translation> +<translation id="3899568514738536144">查看瀏覽記錄</translation> <translation id="3904829425754749514">您的機構已關閉同步功能。您仍可在此裝置上查看自己的書籤、記錄、密碼和其他設定,但作出的變更將不會同步到您的帳戶。</translation> <translation id="3913386780052199712">已登入 Chrome</translation> <translation id="3915450441834151894">網站資料</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 5de797f..6f3a822 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -218,6 +218,7 @@ <translation id="2423077901494354337">你現在可以在裝置上充分運用 Chrome 的各項功能。</translation> <translation id="2434405374328098816">你已儲存過「<ph name="USERNAME" />」在 <ph name="WEBSITE" /> 使用的密碼</translation> <translation id="2435457462613246316">顯示密碼</translation> +<translation id="2439425774439590">最常造訪的網站</translation> <translation id="2451654228769116489">固定分頁</translation> <translation id="2461070143328828326">密碼設定</translation> <translation id="2469960372084740698">要停用安全瀏覽功能嗎?</translation> @@ -439,6 +440,7 @@ <translation id="3891414008432200754">價格</translation> <translation id="3892144330757387737">這裡會顯示你的歷史記錄</translation> <translation id="3897092660631435901">選單</translation> +<translation id="3899568514738536144">查看瀏覽記錄</translation> <translation id="3904829425754749514">貴機構已關閉同步功能。你仍然可以在這部裝置上查看自己的書籤、歷史記錄、密碼和其他設定,但你所做的變更將不會同步到帳戶。</translation> <translation id="3913386780052199712">已登入 Chrome</translation> <translation id="3915450441834151894">網站資訊</translation>
diff --git a/ios/chrome/browser/ui/content_suggestions/BUILD.gn b/ios/chrome/browser/ui/content_suggestions/BUILD.gn index 28122e98..f9a2616 100644 --- a/ios/chrome/browser/ui/content_suggestions/BUILD.gn +++ b/ios/chrome/browser/ui/content_suggestions/BUILD.gn
@@ -104,6 +104,7 @@ "//ios/chrome/browser/ui/content_suggestions/identifier", "//ios/chrome/browser/ui/content_suggestions/set_up_list", "//ios/chrome/browser/ui/content_suggestions/set_up_list:default_browser_promo", + "//ios/chrome/browser/ui/content_suggestions/set_up_list:utils", "//ios/chrome/browser/ui/credential_provider_promo", "//ios/chrome/browser/ui/favicon", "//ios/chrome/browser/ui/first_run:utils",
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm index d3613a5..20a6e00f 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm
@@ -46,6 +46,7 @@ #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h" #import "ios/chrome/browser/signin/authentication_service.h" #import "ios/chrome/browser/signin/authentication_service_factory.h" +#import "ios/chrome/browser/signin/identity_manager_factory.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_item.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_constants.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.h" @@ -168,6 +169,10 @@ AuthenticationServiceFactory::GetForBrowserState( self.browser->GetBrowserState()); + signin::IdentityManager* identityManager = + IdentityManagerFactory::GetForBrowserState( + self.browser->GetBrowserState()); + self.contentSuggestionsMediator = [[ContentSuggestionsMediator alloc] initWithLargeIconService:largeIconService largeIconCache:cache @@ -176,6 +181,7 @@ prefService:prefs isGoogleDefaultSearchProvider:isGoogleDefaultSearchProvider authenticationService:authenticationService + identityManager:identityManager browser:self.browser]; self.contentSuggestionsMediator.feedDelegate = self.feedDelegate; self.contentSuggestionsMediator.promosManager = promosManager;
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.h index cce7b5db..ee4c294d 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.h +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.h
@@ -23,6 +23,10 @@ class MostVisitedSites; } +namespace signin { +class IdentityManager; +} + namespace user_prefs { class PrefRegistrySyncable; } // namespace user_prefs @@ -57,6 +61,7 @@ prefService:(PrefService*)prefService isGoogleDefaultSearchProvider:(BOOL)isGoogleDefaultSearchProvider authenticationService:(AuthenticationService*)authService + identityManager:(signin::IdentityManager*)identityManager browser:(Browser*)browser NS_DESIGNATED_INITIALIZER; - (instancetype)init NS_UNAVAILABLE;
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm index f8882664..e352b2c 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm
@@ -26,6 +26,8 @@ #import "components/reading_list/ios/reading_list_model_bridge_observer.h" #import "components/search_engines/search_terms_data.h" #import "components/search_engines/template_url.h" +#import "components/signin/public/identity_manager/identity_manager.h" +#import "components/signin/public/identity_manager/objc/identity_manager_observer_bridge.h" #import "components/strings/grit/components_strings.h" #import "ios/chrome/app/application_delegate/app_state.h" #import "ios/chrome/browser/default_browser/utils.h" @@ -68,9 +70,9 @@ #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_tile_saver.h" #import "ios/chrome/browser/ui/content_suggestions/identifier/content_suggestions_section_information.h" #import "ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_item_view_data.h" +#import "ios/chrome/browser/ui/content_suggestions/set_up_list/utils.h" #import "ios/chrome/browser/ui/content_suggestions/start_suggest_service_factory.h" #import "ios/chrome/browser/ui/credential_provider_promo/credential_provider_promo_metrics.h" -#import "ios/chrome/browser/ui/first_run/first_run_util.h" #import "ios/chrome/browser/ui/ntp/feed_delegate.h" #import "ios/chrome/browser/ui/ntp/new_tab_page_feature.h" #import "ios/chrome/browser/ui/ntp/new_tab_page_metrics_delegate.h" @@ -108,7 +110,8 @@ } // namespace -@interface ContentSuggestionsMediator () <MostVisitedSitesObserving, +@interface ContentSuggestionsMediator () <IdentityManagerObserverBridgeDelegate, + MostVisitedSitesObserving, ReadingListModelBridgeObserver, PrefObserverDelegate, SetUpListDelegate> { @@ -181,6 +184,11 @@ PrefChangeRegistrar _prefChangeRegistrar; // Local State prefs. PrefService* _localState; + // Used by SetUpList to get signed-in status. + AuthenticationService* _authenticationService; + // Used by SetUpList to observe changes to signed-in status. + std::unique_ptr<signin::IdentityManagerObserverBridge> + _identityObserverBridge; } #pragma mark - Public @@ -194,6 +202,7 @@ prefService:(PrefService*)prefService isGoogleDefaultSearchProvider:(BOOL)isGoogleDefaultSearchProvider authenticationService:(AuthenticationService*)authenticationService + identityManager:(signin::IdentityManager*)identityManager browser:(Browser*)browser { self = [super init]; if (self) { @@ -221,7 +230,11 @@ std::make_unique<ReadingListModelBridge>(self, readingListModel); if (IsIOSSetUpListEnabled() && - !set_up_list_prefs::IsSetUpListDisabled(_localState)) { + set_up_list_utils::IsSetUpListActive(_localState)) { + _authenticationService = authenticationService; + _identityObserverBridge = + std::make_unique<signin::IdentityManagerObserverBridge>( + identityManager, self); _prefObserverBridge = std::make_unique<PrefObserverBridge>(self); _prefChangeRegistrar.Init(_localState); _prefObserverBridge->ObserveChangesForPreference( @@ -250,6 +263,8 @@ _mostVisitedSites.reset(); _readingListModelBridge.reset(); if (IsIOSSetUpListEnabled()) { + _authenticationService = nullptr; + _identityObserverBridge.reset(); if (_prefObserverBridge) { _prefChangeRegistrar.RemoveAll(); _prefObserverBridge.reset(); @@ -361,6 +376,33 @@ }]; } +#pragma mark - IdentityManagerObserverBridgeDelegate + +// Called when a user changes the syncing state. +- (void)onPrimaryAccountChanged: + (const signin::PrimaryAccountChangeEvent&)event { + switch (event.GetEventTypeFor(signin::ConsentLevel::kSync)) { + case signin::PrimaryAccountChangeEvent::Type::kSet: + if (IsIOSSetUpListEnabled() && _authenticationService->GetPrimaryIdentity( + signin::ConsentLevel::kSignin)) { + // User has signed in, mark SetUpList item complete. Delayed to allow + // Signin UI flow to be fully dismissed before starting SetUpList + // completion animation. + PrefService* localState = _localState; + base::SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask( + FROM_HERE, base::BindOnce(^{ + set_up_list_prefs::MarkItemComplete( + localState, SetUpListItemType::kSignInSync); + }), + base::Seconds(0.5)); + } + break; + case signin::PrimaryAccountChangeEvent::Type::kCleared: + case signin::PrimaryAccountChangeEvent::Type::kNone: + break; + } +} + #pragma mark - SetUpListDelegate - (void)setUpListItemDidComplete:(SetUpListItem*)item { @@ -757,18 +799,7 @@ if (!IsIOSSetUpListEnabled()) { return NO; } - if (set_up_list_prefs::IsSetUpListDisabled(_localState)) { - return NO; - } - // check if we are within 14 days of FRE - absl::optional<base::Time> firstRunTime = GetFirstRunTime(); - if (!firstRunTime) { - // If this is the first time the app has been opened, First Run will not - // have been completed yet. In this case, we will wait until the next run. - return NO; - } - base::Time expiryTime = firstRunTime.value() + base::Days(14); - if (base::Time::Now() > expiryTime) { + if (!set_up_list_utils::IsSetUpListActive(_localState)) { return NO; }
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator_unittest.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator_unittest.mm index 23c1e5e..78b20cd 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator_unittest.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator_unittest.mm
@@ -31,6 +31,7 @@ #import "ios/chrome/browser/signin/authentication_service.h" #import "ios/chrome/browser/signin/authentication_service_factory.h" #import "ios/chrome/browser/signin/fake_authentication_service_delegate.h" +#import "ios/chrome/browser/signin/identity_manager_factory.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_action_item.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_item.h" #import "ios/chrome/browser/ui/content_suggestions/cells/query_suggestion_view.h" @@ -117,6 +118,9 @@ AuthenticationServiceFactory::GetForBrowserState( chrome_browser_state_.get()); + signin::IdentityManager* identityManager = + IdentityManagerFactory::GetForBrowserState(chrome_browser_state_.get()); + mediator_ = [[ContentSuggestionsMediator alloc] initWithLargeIconService:largeIconService largeIconCache:cache @@ -125,6 +129,7 @@ prefService:chrome_browser_state_.get()->GetPrefs() isGoogleDefaultSearchProvider:NO authenticationService:authentication_service + identityManager:identityManager browser:browser_.get()]; mediator_.dispatcher = dispatcher_; mediator_.consumer = consumer_;
diff --git a/ios/chrome/browser/ui/content_suggestions/set_up_list/BUILD.gn b/ios/chrome/browser/ui/content_suggestions/set_up_list/BUILD.gn index 10b8ad87..6d7f495f 100644 --- a/ios/chrome/browser/ui/content_suggestions/set_up_list/BUILD.gn +++ b/ios/chrome/browser/ui/content_suggestions/set_up_list/BUILD.gn
@@ -53,6 +53,19 @@ ] } +source_set("utils") { + sources = [ + "utils.h", + "utils.mm", + ] + configs += [ "//build/config/compiler:enable_arc" ] + deps = [ + "//base", + "//ios/chrome/browser/ntp:set_up_list_prefs", + "//ios/chrome/browser/ui/first_run:utils", + ] +} + source_set("unit_tests") { testonly = true sources = [
diff --git a/ios/chrome/browser/ui/content_suggestions/set_up_list/utils.h b/ios/chrome/browser/ui/content_suggestions/set_up_list/utils.h new file mode 100644 index 0000000..8a09177e72 --- /dev/null +++ b/ios/chrome/browser/ui/content_suggestions/set_up_list/utils.h
@@ -0,0 +1,19 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_SET_UP_LIST_UTILS_H_ +#define IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_SET_UP_LIST_UTILS_H_ + +class PrefService; + +namespace set_up_list_utils { + +// Returns `true` if the SetUpList should be active based on how long it has +// been since the user finished the FRE, and whether it has been disabled via +// a local state pref. +bool IsSetUpListActive(PrefService* local_state); + +} // namespace set_up_list_utils + +#endif // IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_SET_UP_LIST_UTILS_H_
diff --git a/ios/chrome/browser/ui/content_suggestions/set_up_list/utils.mm b/ios/chrome/browser/ui/content_suggestions/set_up_list/utils.mm new file mode 100644 index 0000000..7fb3a316 --- /dev/null +++ b/ios/chrome/browser/ui/content_suggestions/set_up_list/utils.mm
@@ -0,0 +1,36 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/ui/content_suggestions/set_up_list/utils.h" + +#import "base/time/time.h" +#import "ios/chrome/browser/ntp/set_up_list_prefs.h" +#import "ios/chrome/browser/ui/first_run/first_run_util.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace set_up_list_utils { + +bool IsSetUpListActive(PrefService* local_state) { + if (set_up_list_prefs::IsSetUpListDisabled(local_state)) { + return false; + } + // check if we are within 14 days of FRE + absl::optional<base::Time> first_run_time = GetFirstRunTime(); + if (!first_run_time) { + // If this is the first time the app has been opened, First Run will not + // have been completed yet. In this case, we will wait until the next run. + return false; + } + base::Time expiry_time = first_run_time.value() + base::Days(14); + if (base::Time::Now() > expiry_time) { + return false; + } + + return true; +} + +} // namespace set_up_list_utils
diff --git a/ios/chrome/browser/ui/ntp/feed_top_section/BUILD.gn b/ios/chrome/browser/ui/ntp/feed_top_section/BUILD.gn index abba4fb..d37904a 100644 --- a/ios/chrome/browser/ui/ntp/feed_top_section/BUILD.gn +++ b/ios/chrome/browser/ui/ntp/feed_top_section/BUILD.gn
@@ -19,7 +19,9 @@ "//components/signin/public/identity_manager/objc", "//ios/chrome/app/strings", "//ios/chrome/browser/discover_feed:constants", + "//ios/chrome/browser/ntp:features", "//ios/chrome/browser/shared/coordinator/chrome_coordinator", + "//ios/chrome/browser/shared/model/application_context", "//ios/chrome/browser/shared/model/browser", "//ios/chrome/browser/shared/model/browser_state", "//ios/chrome/browser/shared/public/commands", @@ -27,6 +29,7 @@ "//ios/chrome/browser/ui/authentication", "//ios/chrome/browser/ui/authentication:signin_presenter", "//ios/chrome/browser/ui/authentication/cells", + "//ios/chrome/browser/ui/content_suggestions/set_up_list:utils", "//ios/chrome/browser/ui/ntp", "//ios/chrome/browser/ui/ntp:constants", "//ios/chrome/browser/ui/ntp:feature_flags",
diff --git a/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_mediator.mm b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_mediator.mm index 756763a..9ba0608 100644 --- a/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_mediator.mm +++ b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_mediator.mm
@@ -6,10 +6,13 @@ #import "components/signin/public/identity_manager/identity_manager.h" #import "components/signin/public/identity_manager/objc/identity_manager_observer_bridge.h" +#import "ios/chrome/browser/ntp/features.h" +#import "ios/chrome/browser/shared/model/application_context/application_context.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/signin/authentication_service_factory.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" #import "ios/chrome/browser/ui/authentication/signin_promo_view_mediator.h" +#import "ios/chrome/browser/ui/content_suggestions/set_up_list/utils.h" #import "ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_consumer.h" #import "ios/chrome/browser/ui/ntp/new_tab_page_delegate.h" @@ -135,6 +138,14 @@ [self.ntpDelegate isStartSurface]) { return; } + + // Don't show the promo if SetUpList might be displayed. + PrefService* localState = GetApplicationContext()->GetLocalState(); + if (IsIOSSetUpListEnabled() && + set_up_list_utils::IsSetUpListActive(localState)) { + return; + } + AuthenticationService* authenticationService = AuthenticationServiceFactory::GetForBrowserState(_browserState); if ([SigninPromoViewMediator
diff --git a/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_lens.imageset/keyboard_accessory_lens@2x.png b/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_lens.imageset/keyboard_accessory_lens@2x.png index 5eb4fe46..eee05543 100644 --- a/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_lens.imageset/keyboard_accessory_lens@2x.png +++ b/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_lens.imageset/keyboard_accessory_lens@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_lens.imageset/keyboard_accessory_lens@3x.png b/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_lens.imageset/keyboard_accessory_lens@3x.png index 826b4be..05bcb4b 100644 --- a/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_lens.imageset/keyboard_accessory_lens@3x.png +++ b/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_lens.imageset/keyboard_accessory_lens@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_lens.imageset/keyboard_accessory_lens_dark@2x.png b/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_lens.imageset/keyboard_accessory_lens_dark@2x.png index bc0d6cf..1011ad0 100644 --- a/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_lens.imageset/keyboard_accessory_lens_dark@2x.png +++ b/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_lens.imageset/keyboard_accessory_lens_dark@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_lens.imageset/keyboard_accessory_lens_dark@3x.png b/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_lens.imageset/keyboard_accessory_lens_dark@3x.png index b0cf281d..abe12b2c 100644 --- a/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_lens.imageset/keyboard_accessory_lens_dark@3x.png +++ b/ios/chrome/browser/ui/omnibox/keyboard_assist/resources/keyboard_accessory_lens.imageset/keyboard_accessory_lens_dark@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/passwords/bottom_sheet/password_suggestion_bottom_sheet_mediator.mm b/ios/chrome/browser/ui/passwords/bottom_sheet/password_suggestion_bottom_sheet_mediator.mm index 69c093d..ae0a3ffc 100644 --- a/ios/chrome/browser/ui/passwords/bottom_sheet/password_suggestion_bottom_sheet_mediator.mm +++ b/ios/chrome/browser/ui/passwords/bottom_sheet/password_suggestion_bottom_sheet_mediator.mm
@@ -129,7 +129,7 @@ // Create and register the observers. _observer = std::make_unique<web::WebStateObserverBridge>(self); _forwarder = std::make_unique<ActiveWebStateObservationForwarder>( - webStateList, _observer.get()); + _webStateList, _observer.get()); if (activeWebState) { FormSuggestionTabHelper* tabHelper = @@ -291,7 +291,7 @@ } } -#pragma mark - WebStateListObserver +#pragma mark - WebStateListObserving - (void)webStateList:(WebStateList*)webStateList didReplaceWebState:(web::WebState*)oldWebState @@ -314,6 +314,15 @@ [self.consumer dismiss]; } +- (void)webStateListDestroyed:(WebStateList*)webStateList { + DCHECK_EQ(webStateList, _webStateList); + _forwarder = nullptr; + _observer = nullptr; + _webStateList = nullptr; + [self disableRefocus]; + [self.consumer dismiss]; +} + #pragma mark - CRWWebStateObserver - (void)webStateDestroyed:(web::WebState*)webState {
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 abe83b54..d9b7a74 100644 --- a/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm +++ b/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm
@@ -2062,7 +2062,8 @@ } // Test search and delete all passwords and blocked items. -- (void)testSearchAndDeleteAllPasswords { +// TODO(crbug.com/1441783): Flaky. +- (void)DISABLED_testSearchAndDeleteAllPasswords { SaveExamplePasswordForms(); SaveExampleBlockedForms();
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_hu.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_hu.xtb index 45996a7..2dfc418a 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_hu.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_hu.xtb
@@ -12,6 +12,7 @@ <translation id="3798529146539130967">A Chrome-ban hangja segítségével is kereshet.</translation> <translation id="405442954313519726">Keresés vagy navigáció új lapon, inkognitó módban, hangja segítségével vagy QR-kóddal.</translation> <translation id="4557098988773644458">Vágjon bele a Chrome dinós játékába</translation> +<translation id="4678859075583681103">Új keresést indíthat, vagy megnyithatja a leggyakrabban felkeresett webhelyeket az iPhone kezdőlapjáról.</translation> <translation id="4954445889641385956">Keressen, vagy írjon be URL-címet</translation> <translation id="5234725349196694896">Kedvenc keresőmotorjával kereshet a Chrome-ban.</translation> <translation id="5277852985315196237">Keressen, vagy írjon be URL-címet</translation> @@ -20,12 +21,14 @@ <translation id="6179961764474023795">Gyorsműveletek</translation> <translation id="6336802729091778259">A Chrome dinós játéka</translation> <translation id="6663288906398689853">Keresés</translation> +<translation id="6691821786147477657">Új keresést indíthat, vagy megnyithatja a leggyakrabban felkeresett webhelyeket az iPad kezdőlapjáról.</translation> <translation id="6855322554930231468">Keresés</translation> <translation id="7010831364920321713">Keresés inkognitó módban</translation> <translation id="7048549665319929185">Keressen, vagy írjon be URL-címet</translation> <translation id="7317302007099170473">QR-kód beolvasása</translation> <translation id="744668050028871192">Keresés</translation> +<translation id="7730705312376865830">Chrome-gyorsparancsok</translation> <translation id="8104498668011127805">Vágjon bele a Chrome dinós játékába</translation> <translation id="8150601371542319992">Lens</translation> <translation id="8171952085734471362">Keresés inkognitó módban</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_km.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_km.xtb index c8412a9..ebcfedd 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_km.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_km.xtb
@@ -12,6 +12,7 @@ <translation id="3798529146539130967">ស្វែងរកនៅក្នុង Chrome ដោយប្រើសំឡេងរបស់អ្នក។</translation> <translation id="405442954313519726">ស្វែងរក ឬរុករកនៅក្នុងផ្ទាំងថ្មី នៅក្នុងមុខងារឯកជន ដោយប្រើសំឡេងរបស់អ្នក ឬដោយប្រើកូដ QR។</translation> <translation id="4557098988773644458">ចូលក្នុងហ្គេមដាយណូស័រ Chrome</translation> +<translation id="4678859075583681103">ចាប់ផ្ដើមការស្វែងរកថ្មី ឬបើកគេហទំព័រដែលអ្នកបានចូលមើលច្រើនបំផុតពីទំព័រដើម iPhone របស់អ្នក។</translation> <translation id="4954445889641385956">ស្វែងរក ឬវាយបញ្ចូល URL</translation> <translation id="5234725349196694896">ស្វែងរកនៅក្នុង Chrome ដោយប្រើម៉ាស៊ីនស្វែងរកដែលអ្នកពេញចិត្ត។</translation> <translation id="5277852985315196237">ស្វែងរក ឬវាយបញ្ចូល URL</translation> @@ -20,12 +21,14 @@ <translation id="6179961764474023795">សកម្មភាពរហ័ស</translation> <translation id="6336802729091778259">ហ្គេមដាយណូស័រ Chrome</translation> <translation id="6663288906398689853">ស្វែងរក</translation> +<translation id="6691821786147477657">ចាប់ផ្ដើមការស្វែងរកថ្មី ឬបើកគេហទំព័រដែលអ្នកបានចូលមើលច្រើនបំផុតពីទំព័រដើម iPad របស់អ្នក។</translation> <translation id="6855322554930231468">ស្វែងរក</translation> <translation id="7010831364920321713">ការស្វែងរកលក្ខណៈឯកជន</translation> <translation id="7048549665319929185">ស្វែងរក ឬ វាយបញ្ចូល URL</translation> <translation id="7317302007099170473">ស្កេនកូដ QR</translation> <translation id="744668050028871192">ស្វែងរក</translation> +<translation id="7730705312376865830">ផ្លូវកាត់ Chrome</translation> <translation id="8104498668011127805">ចូលក្នុងហ្គេម Chrome ដាយណូស័រ</translation> <translation id="8150601371542319992">Lens</translation> <translation id="8171952085734471362">ការស្វែងរកលក្ខណៈឯកជន</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_no.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_no.xtb index 569897ef..1a94c967c 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_no.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_no.xtb
@@ -12,6 +12,7 @@ <translation id="3798529146539130967">Søk i Chrome med stemmen.</translation> <translation id="405442954313519726">Søk eller naviger på en ny fane, i Inkognitomodus, ved bruk av stemmen eller med en QR-kode.</translation> <translation id="4557098988773644458">Hopp inn i Chrome Dino-spillet</translation> +<translation id="4678859075583681103">Start et nytt søk, eller åpne nettstedene du besøker mest, via iPhone-startsiden.</translation> <translation id="4954445889641385956">Søk, eller skriv inn en nettadresse</translation> <translation id="5234725349196694896">Søk i Chrome med favorittsøkemotoren din.</translation> <translation id="5277852985315196237">Søk, eller skriv inn en nettadresse</translation> @@ -20,12 +21,14 @@ <translation id="6179961764474023795">Hurtighandlinger</translation> <translation id="6336802729091778259">Chrome Dino-spillet</translation> <translation id="6663288906398689853">Søk</translation> +<translation id="6691821786147477657">Start et nytt søk, eller åpne nettstedene du besøker mest, via iPad-startsiden.</translation> <translation id="6855322554930231468">Søk</translation> <translation id="7010831364920321713">Inkognitosøk</translation> <translation id="7048549665319929185">Søk, eller skriv inn en nettadresse</translation> <translation id="7317302007099170473">Skann QR-kode</translation> <translation id="744668050028871192">Søk</translation> +<translation id="7730705312376865830">Chrome-snarveier</translation> <translation id="8104498668011127805">Hopp inn i Chrome Dino-spillet</translation> <translation id="8150601371542319992">Lens</translation> <translation id="8171952085734471362">Inkognitosøk</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ro.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ro.xtb index 3cff906..c65d5e7c 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ro.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ro.xtb
@@ -12,6 +12,7 @@ <translation id="3798529146539130967">Caută în Chrome folosind vocea.</translation> <translation id="405442954313519726">Caută sau navighează la o filă nouă, în modul incognito, folosind vocea sau un cod QR.</translation> <translation id="4557098988773644458">Accesează jocul Chrome Dino</translation> +<translation id="4678859075583681103">Începe o nouă căutare sau deschide cele mai vizitate site-uri de pe pagina ta de pornire iPhone.</translation> <translation id="4954445889641385956">Caută sau introdu adresa URL</translation> <translation id="5234725349196694896">Caută în Chrome folosind motorul de căutare preferat.</translation> <translation id="5277852985315196237">Caută sau introdu adresa URL</translation> @@ -20,11 +21,13 @@ <translation id="6179961764474023795">Acțiuni rapide</translation> <translation id="6336802729091778259">Jocul Chrome Dino</translation> <translation id="6663288906398689853">Caută</translation> +<translation id="6691821786147477657">Începe o nouă căutare sau deschide cele mai vizitate site-uri de pe pagina ta de pornire iPad.</translation> <translation id="6855322554930231468">Caută</translation> <translation id="7010831364920321713">Căutare incognito</translation> <translation id="7048549665319929185">Caută sau introdu adresa URL</translation> <translation id="7317302007099170473">Scanează codul QR</translation> <translation id="744668050028871192">Caută</translation> +<translation id="7730705312376865830">Comenzi rapide Chrome</translation> <translation id="8104498668011127805">Accesează jocul cu dinozauri din Chrome</translation> <translation id="8150601371542319992">Lens</translation> <translation id="8171952085734471362">Căutare incognito</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_sk.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_sk.xtb index bf1e7148..c3a49ad 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_sk.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_sk.xtb
@@ -12,6 +12,7 @@ <translation id="3798529146539130967">Vyhľadávajte v Chrome hlasom.</translation> <translation id="405442954313519726">Hľadajte alebo prechádzajte na novej karte, v režime inkognito, hlasom alebo pomocou QR kódu.</translation> <translation id="4557098988773644458">Prejsť do hry Chrome Dino</translation> +<translation id="4678859075583681103">Začnite nové vyhľadávanie alebo otvorte najnavštevovanejšie weby na domovskej stránke iPhonu.</translation> <translation id="4954445889641385956">Hľadať alebo zadať webovú adresu</translation> <translation id="5234725349196694896">Vyhľadávajte v Chrome pomocou svojho obľúbeného vyhľadávača.</translation> <translation id="5277852985315196237">Vyhľadávanie alebo zadávanie webovej adresy</translation> @@ -20,12 +21,14 @@ <translation id="6179961764474023795">Rýchle akcie</translation> <translation id="6336802729091778259">Hra Chrome Dino</translation> <translation id="6663288906398689853">Hľadať</translation> +<translation id="6691821786147477657">Začnite nové vyhľadávanie alebo otvorte najnavštevovanejšie weby na domovskej stránke iPadu.</translation> <translation id="6855322554930231468">Vyhľadávanie</translation> <translation id="7010831364920321713">Vyhľadávanie v režime inkognito</translation> <translation id="7048549665319929185">Vyhľadávanie alebo zadávanie webovej adresy</translation> <translation id="7317302007099170473">Naskenovať QR kód</translation> <translation id="744668050028871192">Hľadať</translation> +<translation id="7730705312376865830">Skratky Chromu</translation> <translation id="8104498668011127805">Prejsť do hry Dinosaurus v Chrome</translation> <translation id="8150601371542319992">Lens</translation> <translation id="8171952085734471362">Vyhľadávanie v režime inkognito</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_th.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_th.xtb index 9d4bfe5..757408b 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_th.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_th.xtb
@@ -12,6 +12,7 @@ <translation id="3798529146539130967">ค้นหาใน Chrome โดยใช้เสียงของคุณ</translation> <translation id="405442954313519726">ค้นหาหรือไปยังส่วนต่างๆ ในแท็บใหม่ ในโหมดไม่ระบุตัวตน โดยใช้เสียงหรือคิวอาร์โค้ด</translation> <translation id="4557098988773644458">ไปที่เกมไดโนเสาร์ Chrome</translation> +<translation id="4678859075583681103">เริ่มการค้นหาใหม่หรือเปิดเว็บไซต์ที่เข้าชมบ่อยที่สุดจากหน้าแรกของ iPhone</translation> <translation id="4954445889641385956">ค้นหาหรือพิมพ์ URL</translation> <translation id="5234725349196694896">ค้นหาใน Chrome ด้วยเครื่องมือค้นหาโปรด</translation> <translation id="5277852985315196237">ค้นหาหรือพิมพ์ URL</translation> @@ -20,11 +21,13 @@ <translation id="6179961764474023795">การดำเนินการด่วน</translation> <translation id="6336802729091778259">เกมไดโนเสาร์ Chrome</translation> <translation id="6663288906398689853">ค้นหา</translation> +<translation id="6691821786147477657">เริ่มการค้นหาใหม่หรือเปิดเว็บไซต์ที่เข้าชมบ่อยที่สุดจากหน้าแรกของ iPad</translation> <translation id="6855322554930231468">ค้นหา</translation> <translation id="7010831364920321713">ค้นหาในโหมดไม่ระบุตัวตน</translation> <translation id="7048549665319929185">ค้นหาหรือพิมพ์ URL</translation> <translation id="7317302007099170473">สแกนคิวอาร์โค้ด</translation> <translation id="744668050028871192">ค้นหา</translation> +<translation id="7730705312376865830">ทางลัดของ Chrome</translation> <translation id="8104498668011127805">ไปที่เกมไดโนเสาร์ Chrome</translation> <translation id="8150601371542319992">Lens</translation> <translation id="8171952085734471362">ค้นหาในโหมดไม่ระบุตัวตน</translation>
diff --git a/media/gpu/android/video_accelerator_util.cc b/media/gpu/android/video_accelerator_util.cc index 7f9472d..8fb8b29 100644 --- a/media/gpu/android/video_accelerator_util.cc +++ b/media/gpu/android/video_accelerator_util.cc
@@ -6,7 +6,6 @@ #include "base/android/build_info.h" #include "base/android/jni_string.h" -#include "base/metrics/histogram_functions.h" #include "base/no_destructor.h" #include "media/base/android/media_jni_headers/VideoAcceleratorUtil_jni.h" @@ -21,11 +20,9 @@ auto java_profiles = Java_VideoAcceleratorUtil_getSupportedEncoderProfiles(env); - constexpr char kHasMediaCodecEncoderInfo[] = - "Media.Android.MediaCodecInfo.HasEncoderInfo"; std::vector<MediaCodecEncoderInfo> cpp_infos; if (!java_profiles) { - base::UmaHistogramBoolean(kHasMediaCodecEncoderInfo, false); + // Per histograms this happens ~0% of the time, so no need for fallback. return cpp_infos; } @@ -65,7 +62,6 @@ [](const MediaCodecEncoderInfo& a, const MediaCodecEncoderInfo& b) { return a.profile.profile < b.profile.profile; }); - base::UmaHistogramBoolean(kHasMediaCodecEncoderInfo, !cpp_infos.empty()); return cpp_infos; }()); return *infos; @@ -77,40 +73,13 @@ CHECK(env); auto java_profiles = Java_VideoAcceleratorUtil_getSupportedDecoderProfiles(env); - constexpr char kHasMediaCodecDecoderInfo[] = - "Media.Android.MediaCodecInfo.HasDecoderInfo"; - if (!java_profiles) { - // TODO(crbug.com/1413887): Can we remove default profiles? - base::UmaHistogramBoolean(kHasMediaCodecDecoderInfo, false); - - LOG(ERROR) - << "Unable to retreive MediaCodecInfo, assuming default support."; - - // Since we don't bundle a software decoder for H.264, H.265, to avoid - // breaking all video unnecessarily, inject what is likely supported. - constexpr auto kDefaultSize = gfx::Size(4096, 4096); - constexpr auto kSoftwareCodec = true; - constexpr auto kHardwareCodec = false; - constexpr char kUnknownDecoderName[] = ""; - return std::vector<MediaCodecDecoderInfo>({ - {H264PROFILE_BASELINE, kNoVideoCodecLevel, gfx::Size(), kDefaultSize, - kHardwareCodec, SecureCodecCapability::kClear, kUnknownDecoderName}, - {H264PROFILE_MAIN, kNoVideoCodecLevel, gfx::Size(), kDefaultSize, - kHardwareCodec, SecureCodecCapability::kClear, kUnknownDecoderName}, - {H264PROFILE_HIGH, kNoVideoCodecLevel, gfx::Size(), kDefaultSize, - kHardwareCodec, SecureCodecCapability::kClear, kUnknownDecoderName}, - {HEVCPROFILE_MAIN, kNoVideoCodecLevel, gfx::Size(), kDefaultSize, - kHardwareCodec, SecureCodecCapability::kClear, kUnknownDecoderName}, - - // Report codecs as software where we have a bundled decoder. - {VP8PROFILE_ANY, kNoVideoCodecLevel, gfx::Size(), kDefaultSize, - kSoftwareCodec, SecureCodecCapability::kClear, kUnknownDecoderName}, - {VP9PROFILE_PROFILE0, kNoVideoCodecLevel, gfx::Size(), kDefaultSize, - kSoftwareCodec, SecureCodecCapability::kClear, kUnknownDecoderName}, - }); - } std::vector<MediaCodecDecoderInfo> cpp_infos; + if (!java_profiles) { + // Per histograms this happens ~0% of the time, so no need for fallback. + return cpp_infos; + } + for (auto java_profile : java_profiles.ReadElements<jobject>()) { MediaCodecDecoderInfo info; info.profile = static_cast<VideoCodecProfile>( @@ -147,8 +116,6 @@ [](const MediaCodecDecoderInfo& a, const MediaCodecDecoderInfo& b) { return a.profile < b.profile; }); - - base::UmaHistogramBoolean(kHasMediaCodecDecoderInfo, !cpp_infos.empty()); return cpp_infos; }()); return *infos;
diff --git a/media/gpu/macros.h b/media/gpu/macros.h index 212c9a69..0cec929 100644 --- a/media/gpu/macros.h +++ b/media/gpu/macros.h
@@ -17,6 +17,7 @@ #define VLOGF(level) VLOG(level) << __func__ << "(): " #define VPLOGF(level) VPLOG(level) << __func__ << "(): " #define LOGF(severity) LOG(severity) << __func__ << "(): " +#define DLOGF(severity) DLOG(severity) << __func__ << "(): " namespace media {
diff --git a/media/gpu/v4l2/v4l2_device.cc b/media/gpu/v4l2/v4l2_device.cc index 3147651f..d5afd09d 100644 --- a/media/gpu/v4l2/v4l2_device.cc +++ b/media/gpu/v4l2/v4l2_device.cc
@@ -2118,48 +2118,28 @@ void V4L2Device::GetSupportedResolution(uint32_t pixelformat, gfx::Size* min_resolution, gfx::Size* max_resolution) { - max_resolution->SetSize(0, 0); - min_resolution->SetSize(0, 0); + constexpr gfx::Size kDefaultMaxCodedSize(1920, 1088); + *max_resolution = kDefaultMaxCodedSize; + constexpr gfx::Size kDefaultMinCodedSize(16, 16); + *min_resolution = kDefaultMinCodedSize; + v4l2_frmsizeenum frame_size; memset(&frame_size, 0, sizeof(frame_size)); frame_size.pixel_format = pixelformat; - for (; Ioctl(VIDIOC_ENUM_FRAMESIZES, &frame_size) == 0; ++frame_size.index) { - if (frame_size.type == V4L2_FRMSIZE_TYPE_DISCRETE) { - if (frame_size.discrete.width >= - base::checked_cast<uint32_t>(max_resolution->width()) && - frame_size.discrete.height >= - base::checked_cast<uint32_t>(max_resolution->height())) { - max_resolution->SetSize(frame_size.discrete.width, - frame_size.discrete.height); - } - if (min_resolution->IsEmpty() || - (frame_size.discrete.width <= - base::checked_cast<uint32_t>(min_resolution->width()) && - frame_size.discrete.height <= - base::checked_cast<uint32_t>(min_resolution->height()))) { - min_resolution->SetSize(frame_size.discrete.width, - frame_size.discrete.height); - } - } else if (frame_size.type == V4L2_FRMSIZE_TYPE_STEPWISE || - frame_size.type == V4L2_FRMSIZE_TYPE_CONTINUOUS) { + if (Ioctl(VIDIOC_ENUM_FRAMESIZES, &frame_size) == 0) { + if (frame_size.type == V4L2_FRMSIZE_TYPE_STEPWISE) { max_resolution->SetSize(frame_size.stepwise.max_width, frame_size.stepwise.max_height); min_resolution->SetSize(frame_size.stepwise.min_width, frame_size.stepwise.min_height); - break; + } else { +#if BUILDFLAG(IS_CHROMEOS) + // All of Chrome-supported implementations support STEPWISE only. + CHECK_EQ(frame_size.type, V4L2_FRMSIZE_TYPE_STEPWISE); +#endif } - } - if (max_resolution->IsEmpty()) { - max_resolution->SetSize(1920, 1088); - VLOGF(1) << "GetSupportedResolution failed to get maximum resolution for " - << "fourcc " << FourccToString(pixelformat) << ", fall back to " - << max_resolution->ToString(); - } - if (min_resolution->IsEmpty()) { - min_resolution->SetSize(16, 16); - VLOGF(1) << "GetSupportedResolution failed to get minimum resolution for " - << "fourcc " << FourccToString(pixelformat) << ", fall back to " - << min_resolution->ToString(); + } else { + DLOGF(INFO) << "VIDIOC_ENUM_FRAMESIZES failed, using default values"; } }
diff --git a/media/gpu/vaapi/vaapi_wrapper.cc b/media/gpu/vaapi/vaapi_wrapper.cc index 492069c5..b0140b4c 100644 --- a/media/gpu/vaapi/vaapi_wrapper.cc +++ b/media/gpu/vaapi/vaapi_wrapper.cc
@@ -235,6 +235,9 @@ VADisplayStateSingleton() = default; ~VADisplayStateSingleton() = default; + // If this method returns false, the VADisplayStateSingleton is unchanged. + bool Initialize() EXCLUSIVE_LOCKS_REQUIRED(lock_); + void OnRefDestroyed(); // This lock makes reference counting and initialization/de-initialization @@ -1632,6 +1635,13 @@ VA_MAJOR_VERSION >= 2 || (VA_MAJOR_VERSION == 1 && VA_MINOR_VERSION >= 1), "Requires VA-API >= 1.1.0"); + const bool success = va_display_state.Initialize(); + UMA_HISTOGRAM_BOOLEAN("Media.VaapiWrapper.VADisplayStateInitializeSuccess", + success); + return success ? VADisplayStateHandle(&va_display_state) : VADisplayStateHandle(); +} + +bool VADisplayStateSingleton::Initialize() { // Set VA logging level, unless already set. constexpr char libva_log_level_env[] = "LIBVA_MESSAGING_LEVEL"; std::unique_ptr<base::Environment> env(base::Environment::Create()); @@ -1641,18 +1651,18 @@ absl::optional<VADisplay> display = #if BUILDFLAG(USE_VAAPI_X11) - GetVADisplayStateX11(va_display_state.drm_fd_); + GetVADisplayStateX11(drm_fd_); #else - GetVADisplayState(va_display_state.drm_fd_); + GetVADisplayState(drm_fd_); #endif if (!display) { - return {}; + return false; } VADisplay va_display = *display; base::ScopedClosureRunner va_display_cleaner_cb(base::BindOnce( [](VADisplay va_display) { - if (va_display) { + if (vaDisplayIsValid(va_display)) { vaTerminate(va_display); } }, @@ -1660,7 +1670,7 @@ if (!vaDisplayIsValid(va_display)) { LOG(ERROR) << "Could not get a valid VA display"; - return {}; + return false; } // The VA-API version. @@ -1668,13 +1678,13 @@ VAStatus va_res = vaInitialize(va_display, &major_version, &minor_version); if (va_res != VA_STATUS_SUCCESS) { VLOGF(1) << "vaInitialize failed: " << vaErrorStr(va_res); - return {}; + return false; } const std::string va_vendor_string = vaQueryVendorString(va_display); if (va_vendor_string.empty()) { VLOGF(1) << "vaQueryVendorString returned an empty string"; - return {}; + return false; } DVLOG(1) << "VAAPI version: " << major_version << "." << minor_version << " " << va_vendor_string; @@ -1693,15 +1703,15 @@ VLOGF(1) << "The system version " << major_version << "." << minor_version << " should be greater than or equal to " << VA_MAJOR_VERSION << "." << VA_MINOR_VERSION; - return {}; + return false; } std::ignore = va_display_cleaner_cb.Release(); - va_display_state.refcount_ = 1; - va_display_state.va_display_ = va_display; - va_display_state.implementation_type_ = implementation_type; - va_display_state.va_vendor_string_ = va_vendor_string; - return VADisplayStateHandle(&va_display_state); + refcount_ = 1; + va_display_ = va_display; + implementation_type_ = implementation_type; + va_vendor_string_ = va_vendor_string; + return true; } void VADisplayStateSingleton::OnRefDestroyed() {
diff --git a/net/base/features.cc b/net/base/features.cc index 0603635e..b50811b4 100644 --- a/net/base/features.cc +++ b/net/base/features.cc
@@ -80,7 +80,7 @@ BASE_FEATURE(kEncryptedClientHelloQuic, "EncryptedClientHelloQuic", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kNetworkQualityEstimator, "NetworkQualityEstimator",
diff --git a/net/dns/dns_response_result_extractor.cc b/net/dns/dns_response_result_extractor.cc index 644b88f..0cb7040f 100644 --- a/net/dns/dns_response_result_extractor.cc +++ b/net/dns/dns_response_result_extractor.cc
@@ -27,6 +27,7 @@ #include "base/ranges/algorithm.h" #include "base/strings/string_piece.h" #include "base/strings/string_util.h" +#include "base/time/clock.h" #include "base/time/time.h" #include "net/base/address_list.h" #include "net/base/connection_endpoint_metadata.h" @@ -39,6 +40,7 @@ #include "net/dns/dns_response.h" #include "net/dns/dns_util.h" #include "net/dns/host_cache.h" +#include "net/dns/host_resolver_internal_result.h" #include "net/dns/https_record_rdata.h" #include "net/dns/public/dns_protocol.h" #include "net/dns/public/dns_query_type.h" @@ -50,9 +52,15 @@ namespace { -using AliasMap = - std::map<std::string, std::string, dns_names_util::DomainNameComparator>; +using AliasMap = std::map<std::string, + std::unique_ptr<const RecordParsed>, + dns_names_util::DomainNameComparator>; using ExtractionError = DnsResponseResultExtractor::ExtractionError; +using RecordsOrError = + base::expected<std::vector<std::unique_ptr<const RecordParsed>>, + ExtractionError>; +using ResultsOrError = DnsResponseResultExtractor::ResultsOrError; +using Source = HostResolverInternalResult::Source; void SaveMetricsForAdditionalHttpsRecord(const RecordParsed& record, bool is_unsolicited) { @@ -90,8 +98,9 @@ const std::vector<const SrvRecordRdata*>& rdatas) { std::map<uint16_t, std::unordered_set<const SrvRecordRdata*>> ordered_by_priority; - for (const SrvRecordRdata* rdata : rdatas) + for (const SrvRecordRdata* rdata : rdatas) { ordered_by_priority[rdata->priority()].insert(rdata); + } std::vector<HostPortPair> sorted_targets; for (auto& priority : ordered_by_priority) { @@ -99,8 +108,9 @@ // (weight per result) <= UINT16_MAX, then it should be the case that // (total weight) <= UINT32_MAX, but use CheckedNumeric for extra safety. auto total_weight = base::MakeCheckedNum<uint32_t>(0); - for (const SrvRecordRdata* rdata : priority.second) + for (const SrvRecordRdata* rdata : priority.second) { total_weight += rdata->weight(); + } // Add 1 to total weight because, to deal with 0-weight targets, we want // our random selection to be inclusive [0, total]. @@ -140,113 +150,155 @@ return sorted_targets; } +// Validates that all `aliases` form a single non-looping chain, starting from +// `query_name` and that all alias records are valid. Also validates that all +// `data_records` are at the final name at the end of the alias chain. +// TODO(crbug.com/1381506): Consider altering chain TTLs so that each TTL is +// less than or equal to all previous links in the chain. ExtractionError ValidateNamesAndAliases( base::StringPiece query_name, const AliasMap& aliases, - const std::vector<std::unique_ptr<const RecordParsed>>& results) { + const std::vector<std::unique_ptr<const RecordParsed>>& data_records, + std::string& out_final_chain_name) { // Validate that all aliases form a single non-looping chain, starting from // `query_name`. size_t aliases_in_chain = 0; - base::StringPiece final_chain_name = query_name; - auto alias = aliases.find(std::string(query_name)); - while (alias != aliases.end() && aliases_in_chain <= aliases.size()) { + std::string target_name = + dns_names_util::UrlCanonicalizeNameIfAble(query_name); + for (auto alias = aliases.find(target_name); + alias != aliases.end() && aliases_in_chain <= aliases.size(); + alias = aliases.find(target_name)) { aliases_in_chain++; - final_chain_name = alias->second; - alias = aliases.find(alias->second); + + const CnameRecordRdata* cname_data = + alias->second->rdata<CnameRecordRdata>(); + if (!cname_data) { + return ExtractionError::kMalformedCname; + } + + target_name = + dns_names_util::UrlCanonicalizeNameIfAble(cname_data->cname()); + if (!dns_names_util::IsValidDnsRecordName(target_name)) { + return ExtractionError::kMalformedCname; + } } - if (aliases_in_chain != aliases.size()) + if (aliases_in_chain != aliases.size()) { return ExtractionError::kBadAliasChain; + } - // All results must match final alias name. - for (const auto& result : results) { - DCHECK_NE(result->type(), dns_protocol::kTypeCNAME); - if (!base::EqualsCaseInsensitiveASCII(final_chain_name, result->name())) { + // All records must match final alias name. + for (const auto& record : data_records) { + DCHECK_NE(record->type(), dns_protocol::kTypeCNAME); + if (!base::EqualsCaseInsensitiveASCII( + target_name, + dns_names_util::UrlCanonicalizeNameIfAble(record->name()))) { return ExtractionError::kNameMismatch; } } + out_final_chain_name = std::move(target_name); return ExtractionError::kOk; } -ExtractionError ExtractResponseRecords( +// Common results (aliases and errors) are extracted into +// `out_non_data_results`. +RecordsOrError ExtractResponseRecords( const DnsResponse& response, - uint16_t result_qtype, - std::vector<std::unique_ptr<const RecordParsed>>* out_records, - absl::optional<base::TimeDelta>* out_response_ttl, - std::set<std::string>* out_aliases) { + DnsQueryType query_type, + base::Time now, + base::TimeTicks now_ticks, + std::set<std::unique_ptr<HostResolverInternalResult>>& + out_non_data_results) { DCHECK_EQ(response.question_count(), 1u); - DCHECK(out_records); - DCHECK(out_response_ttl); - std::vector<std::unique_ptr<const RecordParsed>> records; + std::vector<std::unique_ptr<const RecordParsed>> data_records; absl::optional<base::TimeDelta> response_ttl; DnsRecordParser parser = response.Parser(); // Expected to be validated by DnsTransaction. - DCHECK_EQ(result_qtype, response.GetSingleQType()); + DCHECK_EQ(DnsQueryTypeToQtype(query_type), response.GetSingleQType()); AliasMap aliases; for (unsigned i = 0; i < response.answer_count(); ++i) { std::unique_ptr<const RecordParsed> record = - RecordParsed::CreateFrom(&parser, base::Time::Now()); + RecordParsed::CreateFrom(&parser, now); - if (!record) - return ExtractionError::kMalformedRecord; + if (!record || !dns_names_util::IsValidDnsRecordName(record->name())) { + return base::unexpected(ExtractionError::kMalformedRecord); + } - DCHECK_NE(result_qtype, dns_protocol::kTypeCNAME); if (record->klass() == dns_protocol::kClassIN && record->type() == dns_protocol::kTypeCNAME) { + std::string canonicalized_name = + dns_names_util::UrlCanonicalizeNameIfAble(record->name()); + DCHECK(dns_names_util::IsValidDnsRecordName(canonicalized_name)); + + bool added = + aliases.emplace(canonicalized_name, std::move(record)).second; // Per RFC2181, multiple CNAME records are not allowed for the same name. - if (aliases.find(record->name()) != aliases.end()) - return ExtractionError::kMultipleCnames; - - const CnameRecordRdata* cname_data = record->rdata<CnameRecordRdata>(); - if (!cname_data) - return ExtractionError::kMalformedCname; - - base::TimeDelta ttl = base::Seconds(record->ttl()); - response_ttl = - std::min(response_ttl.value_or(base::TimeDelta::Max()), ttl); - - bool added = aliases.emplace(record->name(), cname_data->cname()).second; - DCHECK(added); + if (!added) { + return base::unexpected(ExtractionError::kMultipleCnames); + } } else if (record->klass() == dns_protocol::kClassIN && - record->type() == result_qtype) { + record->type() == DnsQueryTypeToQtype(query_type)) { base::TimeDelta ttl = base::Seconds(record->ttl()); response_ttl = std::min(response_ttl.value_or(base::TimeDelta::Max()), ttl); - records.push_back(std::move(record)); + data_records.push_back(std::move(record)); } } - ExtractionError name_and_alias_validation_error = - ValidateNamesAndAliases(response.GetSingleDottedName(), aliases, records); - if (name_and_alias_validation_error != ExtractionError::kOk) - return name_and_alias_validation_error; + std::string final_chain_name; + ExtractionError name_and_alias_validation_error = ValidateNamesAndAliases( + response.GetSingleDottedName(), aliases, data_records, final_chain_name); + if (name_and_alias_validation_error != ExtractionError::kOk) { + return base::unexpected(name_and_alias_validation_error); + } - // For NXDOMAIN or NODATA (NOERROR with 0 answers), attempt to find a TTL - // via an SOA record. - if (response.rcode() == dns_protocol::kRcodeNXDOMAIN || - (response.answer_count() == 0 && - response.rcode() == dns_protocol::kRcodeNOERROR)) { - bool soa_found = false; - for (unsigned i = 0; i < response.authority_count(); ++i) { - DnsResourceRecord record; - if (parser.ReadRecord(&record) && record.type == dns_protocol::kTypeSOA) { - soa_found = true; - base::TimeDelta ttl = base::Seconds(record.ttl); - response_ttl = - std::min(response_ttl.value_or(base::TimeDelta::Max()), ttl); - } + std::set<std::unique_ptr<HostResolverInternalResult>> non_data_results; + for (const auto& alias : aliases) { + DCHECK(alias.second->rdata<CnameRecordRdata>()); + non_data_results.insert(std::make_unique<HostResolverInternalAliasResult>( + alias.first, query_type, now_ticks + base::Seconds(alias.second->ttl()), + now + base::Seconds(alias.second->ttl()), Source::kDns, + alias.second->rdata<CnameRecordRdata>()->cname())); + } + + absl::optional<base::TimeDelta> error_ttl; + for (unsigned i = 0; i < response.authority_count(); ++i) { + DnsResourceRecord record; + if (!parser.ReadRecord(&record)) { + // Stop trying to process records if things get malformed in the authority + // section. + break; } - // Per RFC2308, section 5, never cache negative results unless an SOA - // record is found. - if (!soa_found) - response_ttl.reset(); + if (record.type == dns_protocol::kTypeSOA) { + base::TimeDelta ttl = base::Seconds(record.ttl); + error_ttl = std::min(error_ttl.value_or(base::TimeDelta::Max()), ttl); + } + } + + // For NXDOMAIN or NODATA (NOERROR with 0 answers matching the qtype), cache + // an error if an error TTL was found from SOA records. Also, ignore the error + // if we somehow have result records (most likely if the server incorrectly + // sends NXDOMAIN with results). Note that, per the weird QNAME definition in + // RFC2308, section 1, as well as the clarifications in RFC6604, section 3, + // and in RFC8020, section 2, the cached error is specific to the final chain + // name, not the query name. + // + // TODO(ericorth@chromium.org): Differentiate nxdomain errors by making it + // cacheable across any query type (per RFC2308, Section 5). + bool is_cachable_error = data_records.empty() && + (response.rcode() == dns_protocol::kRcodeNXDOMAIN || + response.rcode() == dns_protocol::kRcodeNOERROR); + if (is_cachable_error && error_ttl.has_value()) { + non_data_results.insert(std::make_unique<HostResolverInternalErrorResult>( + final_chain_name, query_type, now_ticks + error_ttl.value(), + now + error_ttl.value(), Source::kDns, ERR_NAME_NOT_RESOLVED)); } for (unsigned i = 0; i < response.additional_answer_count(); ++i) { @@ -254,186 +306,164 @@ RecordParsed::CreateFrom(&parser, base::Time::Now()); if (record && record->klass() == dns_protocol::kClassIN && record->type() == dns_protocol::kTypeHttps) { - bool is_unsolicited = result_qtype != dns_protocol::kTypeHttps; + bool is_unsolicited = query_type != DnsQueryType::HTTPS; SaveMetricsForAdditionalHttpsRecord(*record, is_unsolicited); } } - *out_records = std::move(records); - *out_response_ttl = response_ttl; - - if (out_aliases) { - out_aliases->clear(); - for (const auto& alias : aliases) { - std::string canonicalized_alias = - dns_names_util::UrlCanonicalizeNameIfAble(alias.second); - if (dns_names_util::IsValidDnsRecordName(canonicalized_alias)) { - out_aliases->insert(std::move(canonicalized_alias)); - } - } - std::string canonicalized_query = dns_names_util::UrlCanonicalizeNameIfAble( - response.GetSingleDottedName()); - if (dns_names_util::IsValidDnsRecordName(canonicalized_query)) { - out_aliases->insert(std::move(canonicalized_query)); - } - } - - return ExtractionError::kOk; + out_non_data_results = std::move(non_data_results); + return data_records; } -ExtractionError ExtractAddressResults(const DnsResponse& response, - uint16_t address_qtype, - HostCache::Entry* out_results) { +ResultsOrError ExtractAddressResults(const DnsResponse& response, + DnsQueryType query_type, + base::Time now, + base::TimeTicks now_ticks) { DCHECK_EQ(response.question_count(), 1u); - DCHECK(address_qtype == dns_protocol::kTypeA || - address_qtype == dns_protocol::kTypeAAAA); - DCHECK(out_results); + DCHECK(query_type == DnsQueryType::A || query_type == DnsQueryType::AAAA); - std::vector<std::unique_ptr<const RecordParsed>> records; - absl::optional<base::TimeDelta> response_ttl; - std::set<std::string> aliases; - ExtractionError extraction_error = ExtractResponseRecords( - response, address_qtype, &records, &response_ttl, &aliases); - - if (extraction_error != ExtractionError::kOk) { - *out_results = HostCache::Entry(ERR_DNS_MALFORMED_RESPONSE, - HostCache::Entry::SOURCE_DNS); - return extraction_error; + std::set<std::unique_ptr<HostResolverInternalResult>> results; + RecordsOrError records = + ExtractResponseRecords(response, query_type, now, now_ticks, results); + if (!records.has_value()) { + return base::unexpected(records.error()); } std::vector<IPEndPoint> ip_endpoints; - std::string canonical_name; - for (const auto& record : records) { - if (ip_endpoints.empty()) - canonical_name = record->name(); - - // Expect that ExtractResponseRecords validates that all results correctly - // have the same name. - DCHECK(base::EqualsCaseInsensitiveASCII(canonical_name, record->name())) - << "canonical_name: " << canonical_name - << "\nrecord->name(): " << record->name(); - + auto min_ttl = base::TimeDelta::Max(); + for (const auto& record : records.value()) { IPAddress address; - if (address_qtype == dns_protocol::kTypeA) { + if (query_type == DnsQueryType::A) { const ARecordRdata* rdata = record->rdata<ARecordRdata>(); + DCHECK(rdata); address = rdata->address(); DCHECK(address.IsIPv4()); } else { - DCHECK_EQ(address_qtype, dns_protocol::kTypeAAAA); + DCHECK_EQ(query_type, DnsQueryType::AAAA); const AAAARecordRdata* rdata = record->rdata<AAAARecordRdata>(); + DCHECK(rdata); address = rdata->address(); DCHECK(address.IsIPv6()); } ip_endpoints.emplace_back(address, /*port=*/0); - } - int error_result = ip_endpoints.empty() ? ERR_NAME_NOT_RESOLVED : OK; - HostCache::Entry results(error_result, std::move(ip_endpoints), - std::move(aliases), HostCache::Entry::SOURCE_DNS, - response_ttl); - - if (!canonical_name.empty()) { - results.set_canonical_names(std::set<std::string>({canonical_name})); + base::TimeDelta ttl = base::Seconds(record->ttl()); + min_ttl = std::min(ttl, min_ttl); } - *out_results = std::move(results); - return ExtractionError::kOk; + if (!ip_endpoints.empty()) { + results.insert(std::make_unique<HostResolverInternalDataResult>( + records->front()->name(), query_type, now_ticks + min_ttl, + now + min_ttl, Source::kDns, std::move(ip_endpoints), + std::vector<std::string>{}, std::vector<HostPortPair>{})); + } + + return results; } -ExtractionError ExtractTxtResults(const DnsResponse& response, - HostCache::Entry* out_results) { - DCHECK(out_results); - - std::vector<std::unique_ptr<const RecordParsed>> records; - absl::optional<base::TimeDelta> response_ttl; - ExtractionError extraction_error = - ExtractResponseRecords(response, dns_protocol::kTypeTXT, &records, - &response_ttl, nullptr /* out_aliases */); - - if (extraction_error != ExtractionError::kOk) { - *out_results = HostCache::Entry(ERR_DNS_MALFORMED_RESPONSE, - HostCache::Entry::SOURCE_DNS); - return extraction_error; +ResultsOrError ExtractTxtResults(const DnsResponse& response, + base::Time now, + base::TimeTicks now_ticks) { + std::set<std::unique_ptr<HostResolverInternalResult>> results; + RecordsOrError txt_records = ExtractResponseRecords( + response, DnsQueryType::TXT, now, now_ticks, results); + if (!txt_records.has_value()) { + return base::unexpected(txt_records.error()); } - std::vector<std::string> text_records; - for (const auto& record : records) { + std::vector<std::string> strings; + base::TimeDelta min_ttl = base::TimeDelta::Max(); + for (const auto& record : txt_records.value()) { const TxtRecordRdata* rdata = record->rdata<net::TxtRecordRdata>(); - text_records.insert(text_records.end(), rdata->texts().begin(), - rdata->texts().end()); + DCHECK(rdata); + strings.insert(strings.end(), rdata->texts().begin(), rdata->texts().end()); + + base::TimeDelta ttl = base::Seconds(record->ttl()); + min_ttl = std::min(ttl, min_ttl); } - *out_results = HostCache::Entry( - text_records.empty() ? ERR_NAME_NOT_RESOLVED : OK, - std::move(text_records), HostCache::Entry::SOURCE_DNS, response_ttl); - return ExtractionError::kOk; + if (!strings.empty()) { + results.insert(std::make_unique<HostResolverInternalDataResult>( + txt_records->front()->name(), DnsQueryType::TXT, now_ticks + min_ttl, + now + min_ttl, Source::kDns, std::vector<IPEndPoint>{}, + std::move(strings), std::vector<HostPortPair>{})); + } + + return results; } -ExtractionError ExtractPointerResults(const DnsResponse& response, - HostCache::Entry* out_results) { - DCHECK(out_results); - - std::vector<std::unique_ptr<const RecordParsed>> records; - absl::optional<base::TimeDelta> response_ttl; - ExtractionError extraction_error = - ExtractResponseRecords(response, dns_protocol::kTypePTR, &records, - &response_ttl, nullptr /* out_aliases */); - - if (extraction_error != ExtractionError::kOk) { - *out_results = HostCache::Entry(ERR_DNS_MALFORMED_RESPONSE, - HostCache::Entry::SOURCE_DNS); - return extraction_error; +ResultsOrError ExtractPointerResults(const DnsResponse& response, + base::Time now, + base::TimeTicks now_ticks) { + std::set<std::unique_ptr<HostResolverInternalResult>> results; + RecordsOrError ptr_records = ExtractResponseRecords( + response, DnsQueryType::PTR, now, now_ticks, results); + if (!ptr_records.has_value()) { + return base::unexpected(ptr_records.error()); } std::vector<HostPortPair> pointers; - for (const auto& record : records) { + auto min_ttl = base::TimeDelta::Max(); + for (const auto& record : ptr_records.value()) { const PtrRecordRdata* rdata = record->rdata<net::PtrRecordRdata>(); + DCHECK(rdata); std::string pointer = rdata->ptrdomain(); // Skip pointers to the root domain. - if (!pointer.empty()) + if (!pointer.empty()) { pointers.emplace_back(std::move(pointer), 0); + + base::TimeDelta ttl = base::Seconds(record->ttl()); + min_ttl = std::min(ttl, min_ttl); + } } - *out_results = HostCache::Entry(pointers.empty() ? ERR_NAME_NOT_RESOLVED : OK, - std::move(pointers), - HostCache::Entry::SOURCE_DNS, response_ttl); - return ExtractionError::kOk; + if (!pointers.empty()) { + results.insert(std::make_unique<HostResolverInternalDataResult>( + ptr_records->front()->name(), DnsQueryType::PTR, now_ticks + min_ttl, + now + min_ttl, Source::kDns, std::vector<IPEndPoint>{}, + std::vector<std::string>{}, std::move(pointers))); + } + + return results; } -ExtractionError ExtractServiceResults(const DnsResponse& response, - HostCache::Entry* out_results) { - DCHECK(out_results); - - std::vector<std::unique_ptr<const RecordParsed>> records; - absl::optional<base::TimeDelta> response_ttl; - ExtractionError extraction_error = - ExtractResponseRecords(response, dns_protocol::kTypeSRV, &records, - &response_ttl, nullptr /* out_aliases */); - - if (extraction_error != ExtractionError::kOk) { - *out_results = HostCache::Entry(ERR_DNS_MALFORMED_RESPONSE, - HostCache::Entry::SOURCE_DNS); - return extraction_error; +ResultsOrError ExtractServiceResults(const DnsResponse& response, + base::Time now, + base::TimeTicks now_ticks) { + std::set<std::unique_ptr<HostResolverInternalResult>> results; + RecordsOrError srv_records = ExtractResponseRecords( + response, DnsQueryType::SRV, now, now_ticks, results); + if (!srv_records.has_value()) { + return base::unexpected(srv_records.error()); } std::vector<const SrvRecordRdata*> fitered_rdatas; - for (const auto& record : records) { + auto min_ttl = base::TimeDelta::Max(); + for (const auto& record : srv_records.value()) { const SrvRecordRdata* rdata = record->rdata<net::SrvRecordRdata>(); + DCHECK(rdata); // Skip pointers to the root domain. - if (!rdata->target().empty()) + if (!rdata->target().empty()) { fitered_rdatas.push_back(rdata); + + base::TimeDelta ttl = base::Seconds(record->ttl()); + min_ttl = std::min(ttl, min_ttl); + } } std::vector<HostPortPair> ordered_service_targets = SortServiceTargets(fitered_rdatas); - *out_results = HostCache::Entry( - ordered_service_targets.empty() ? ERR_NAME_NOT_RESOLVED : OK, - std::move(ordered_service_targets), HostCache::Entry::SOURCE_DNS, - response_ttl); - return ExtractionError::kOk; + if (!ordered_service_targets.empty()) { + results.insert(std::make_unique<HostResolverInternalDataResult>( + srv_records->front()->name(), DnsQueryType::SRV, now_ticks + min_ttl, + now + min_ttl, Source::kDns, std::vector<IPEndPoint>{}, + std::vector<std::string>{}, std::move(ordered_service_targets))); + } + + return results; } const RecordParsed* UnwrapRecordPtr( @@ -446,40 +476,25 @@ return record->rdata<HttpsRecordRdata>()->IsAlias(); } -ExtractionError ExtractHttpsResults(const DnsResponse& response, - base::StringPiece original_domain_name, - uint16_t request_port, - HostCache::Entry* out_results) { +ResultsOrError ExtractHttpsResults(const DnsResponse& response, + base::StringPiece original_domain_name, + uint16_t request_port, + base::Time now, + base::TimeTicks now_ticks) { DCHECK(!original_domain_name.empty()); - DCHECK(out_results); - absl::optional<base::TimeDelta> response_ttl; - std::vector<std::unique_ptr<const RecordParsed>> records; - ExtractionError extraction_error = - ExtractResponseRecords(response, dns_protocol::kTypeHttps, &records, - &response_ttl, nullptr /* out_aliases */); - - if (extraction_error != ExtractionError::kOk) { - *out_results = HostCache::Entry(ERR_DNS_MALFORMED_RESPONSE, - HostCache::Entry::SOURCE_DNS); - return extraction_error; + std::set<std::unique_ptr<HostResolverInternalResult>> results; + RecordsOrError https_records = ExtractResponseRecords( + response, DnsQueryType::HTTPS, now, now_ticks, results); + if (!https_records.has_value()) { + return base::unexpected(https_records.error()); } - std::multimap<HttpsRecordPriority, ConnectionEndpointMetadata> results; - std::vector<bool> record_compatibility; + std::multimap<HttpsRecordPriority, ConnectionEndpointMetadata> metadatas; + auto min_ttl = base::TimeDelta::Max(); + bool compatible_record_found = false; bool default_alpn_found = false; -#if DCHECK_IS_ON() - std::string canonical_name; -#endif // DCHECK_IS_ON() - for (const auto& record : records) { -#if DCHECK_IS_ON() - if (canonical_name.empty()) { - canonical_name = record->name(); - } else { - DCHECK(record->name() == canonical_name); - } -#endif // DCHECK_IS_ON() - + for (const auto& record : https_records.value()) { const HttpsRecordRdata* rdata = record->rdata<HttpsRecordRdata>(); DCHECK(rdata); @@ -487,28 +502,33 @@ if (rdata->IsAlias()) { // Alias records are always considered compatible because they do not // support "mandatory" params. - record_compatibility.push_back(true); + compatible_record_found = true; continue; } const ServiceFormHttpsRecordRdata* service = rdata->AsServiceForm(); - record_compatibility.push_back(service->IsCompatible()); - - // Ignore services incompatible with Chrome's HTTPS record parser. - // draft-ietf-dnsop-svcb-https-08#section-8 - if (!service->IsCompatible()) + if (service->IsCompatible()) { + compatible_record_found = true; + } else { + // Ignore services incompatible with Chrome's HTTPS record parser. + // draft-ietf-dnsop-svcb-https-12#section-8 continue; + } - base::StringPiece target_name = service->service_name().empty() - ? record->name() - : service->service_name(); + std::string target_name = dns_names_util::UrlCanonicalizeNameIfAble( + service->service_name().empty() ? record->name() + : service->service_name()); // Chrome does not yet support followup queries. So only support services at // the original domain name or the canonical name (the record name). // Note: HostCache::Entry::GetEndpoints() will not return metadatas which // target name is different from the canonical name of A/AAAA query results. - if ((target_name != original_domain_name) && - (target_name != record->name())) { + if (!base::EqualsCaseInsensitiveASCII( + target_name, + dns_names_util::UrlCanonicalizeNameIfAble(original_domain_name)) && + !base::EqualsCaseInsensitiveASCII( + target_name, + dns_names_util::UrlCanonicalizeNameIfAble(record->name()))) { continue; } @@ -517,8 +537,10 @@ // port redirects, Chrome must ensure redirects to the "bad port list" are // disallowed. Unclear if such logic would belong here or in socket // connection logic. - if (service->port().has_value() && service->port().value() != request_port) + if (service->port().has_value() && + service->port().value() != request_port) { continue; + } ConnectionEndpointMetadata metadata; @@ -532,97 +554,92 @@ // Services with no supported ALPNs (those with "no-default-alpn" and no or // empty "alpn") are not self-consistent and are rejected. - // draft-ietf-dnsop-svcb-https-08#section-7.1.1 and - // draft-ietf-dnsop-svcb-https-08#section-2.4.3. - if (metadata.supported_protocol_alpns.empty()) + // draft-ietf-dnsop-svcb-https-12#section-7.1.1 and + // draft-ietf-dnsop-svcb-https-12#section-2.4.3. + if (metadata.supported_protocol_alpns.empty()) { continue; + } metadata.ech_config_list = ConnectionEndpointMetadata::EchConfigList( service->ech_config().cbegin(), service->ech_config().cend()); - metadata.target_name = base::ToLowerASCII(target_name); + metadata.target_name = std::move(target_name); - results.emplace(service->priority(), std::move(metadata)); + metadatas.emplace(service->priority(), std::move(metadata)); - if (service->default_alpn()) + base::TimeDelta ttl = base::Seconds(record->ttl()); + min_ttl = std::min(ttl, min_ttl); + + if (service->default_alpn()) { default_alpn_found = true; + } } // Ignore all records if any are an alias record. Chrome does not yet support // alias records, but aliases take precedence over any other records. - if (base::ranges::any_of(records, &RecordIsAlias, &UnwrapRecordPtr)) { - records.clear(); - results.clear(); + if (base::ranges::any_of(https_records.value(), &RecordIsAlias, + &UnwrapRecordPtr)) { + metadatas.clear(); } // Ignore all records if they all mark "no-default-alpn". Domains should // always provide at least one endpoint allowing default ALPN to ensure a // reasonable expectation of connection success. - // draft-ietf-dnsop-svcb-https-08#section-7.1.2 + // draft-ietf-dnsop-svcb-https-12#section-7.1.2 if (!default_alpn_found) { - records.clear(); - results.clear(); + metadatas.clear(); } - *out_results = HostCache::Entry(results.empty() ? ERR_NAME_NOT_RESOLVED : OK, - std::move(results), - HostCache::Entry::SOURCE_DNS, response_ttl); - out_results->set_https_record_compatibility(std::move(record_compatibility)); - DCHECK_EQ(extraction_error, ExtractionError::kOk); - return extraction_error; + // Empty metadata result signifies that compatible HTTPS records were + // received but with no contained metadata of use to Chrome. + if (!metadatas.empty() || compatible_record_found) { + results.insert(std::make_unique<HostResolverInternalMetadataResult>( + https_records->front()->name(), DnsQueryType::HTTPS, + now_ticks + min_ttl, now + min_ttl, Source::kDns, + std::move(metadatas))); + } + + return results; } } // namespace DnsResponseResultExtractor::DnsResponseResultExtractor( - const DnsResponse* response) - : response_(response) { - DCHECK(response_); -} + const DnsResponse& response, + const base::Clock& clock, + const base::TickClock& tick_clock) + : response_(response), clock_(clock), tick_clock_(tick_clock) {} DnsResponseResultExtractor::~DnsResponseResultExtractor() = default; -DnsResponseResultExtractor::ExtractionError -DnsResponseResultExtractor::ExtractDnsResults( +ResultsOrError DnsResponseResultExtractor::ExtractDnsResults( DnsQueryType query_type, base::StringPiece original_domain_name, - uint16_t request_port, - HostCache::Entry* out_results) const { + uint16_t request_port) const { DCHECK(!original_domain_name.empty()); - DCHECK(out_results); switch (query_type) { case DnsQueryType::UNSPECIFIED: // Should create multiple transactions with specified types. NOTREACHED(); - return ExtractionError::kUnexpected; + return base::unexpected(ExtractionError::kUnexpected); case DnsQueryType::A: case DnsQueryType::AAAA: - return ExtractAddressResults(*response_, DnsQueryTypeToQtype(query_type), - out_results); + return ExtractAddressResults(*response_, query_type, clock_->Now(), + tick_clock_->NowTicks()); case DnsQueryType::TXT: - return ExtractTxtResults(*response_, out_results); + return ExtractTxtResults(*response_, clock_->Now(), + tick_clock_->NowTicks()); case DnsQueryType::PTR: - return ExtractPointerResults(*response_, out_results); + return ExtractPointerResults(*response_, clock_->Now(), + tick_clock_->NowTicks()); case DnsQueryType::SRV: - return ExtractServiceResults(*response_, out_results); + return ExtractServiceResults(*response_, clock_->Now(), + tick_clock_->NowTicks()); case DnsQueryType::HTTPS: return ExtractHttpsResults(*response_, original_domain_name, request_port, - out_results); + clock_->Now(), tick_clock_->NowTicks()); } } -// static -HostCache::Entry DnsResponseResultExtractor::CreateEmptyResult( - DnsQueryType query_type) { - if (query_type != DnsQueryType::HTTPS) { - // Currently only used for HTTPS. - NOTIMPLEMENTED(); - return HostCache::Entry(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - } - - return HostCache::Entry(ERR_NAME_NOT_RESOLVED, std::vector<bool>(), - HostCache::Entry::SOURCE_DNS); -} - } // namespace net
diff --git a/net/dns/dns_response_result_extractor.h b/net/dns/dns_response_result_extractor.h index f34a540..f8d6d135 100644 --- a/net/dns/dns_response_result_extractor.h +++ b/net/dns/dns_response_result_extractor.h
@@ -7,8 +7,15 @@ #include <stdint.h> +#include <memory> +#include <set> + #include "base/memory/raw_ptr.h" #include "base/strings/string_piece.h" +#include "base/time/clock.h" +#include "base/time/default_clock.h" +#include "base/time/default_tick_clock.h" +#include "base/types/expected.h" #include "net/base/net_export.h" #include "net/dns/host_cache.h" #include "net/dns/public/dns_query_type.h" @@ -16,6 +23,7 @@ namespace net { class DnsResponse; +class HostResolverInternalResult; // Higher-level parser to take a DnsResponse and extract results. class NET_EXPORT_PRIVATE DnsResponseResultExtractor { @@ -40,7 +48,16 @@ kUnexpected, }; - explicit DnsResponseResultExtractor(const DnsResponse* response); + using ResultsOrError = + base::expected<std::set<std::unique_ptr<HostResolverInternalResult>>, + ExtractionError>; + + // References must stay alive for the life of the created extractor. + explicit DnsResponseResultExtractor( + const DnsResponse& response, + const base::Clock& clock = *base::DefaultClock::GetInstance(), + const base::TickClock& tick_clock = + *base::DefaultTickClock::GetInstance()); ~DnsResponseResultExtractor(); DnsResponseResultExtractor(const DnsResponseResultExtractor&) = delete; @@ -58,17 +75,14 @@ // May have the side effect of recording metrics about DnsResponses as they // are parsed, so while not an absolute requirement, any given DnsResponse // should only be used and extracted from at most once. - ExtractionError ExtractDnsResults(DnsQueryType query_type, - base::StringPiece original_domain_name, - uint16_t request_port, - HostCache::Entry* out_results) const; - - // Creates the results of a NODATA response (successfully parsed but without - // any results) appropriate for `query_type`. - static HostCache::Entry CreateEmptyResult(DnsQueryType query_type); + ResultsOrError ExtractDnsResults(DnsQueryType query_type, + base::StringPiece original_domain_name, + uint16_t request_port) const; private: - const raw_ptr<const DnsResponse, DanglingUntriaged> response_; + const raw_ref<const DnsResponse> response_; + const raw_ref<const base::Clock> clock_; + const raw_ref<const base::TickClock> tick_clock_; }; } // namespace net
diff --git a/net/dns/dns_response_result_extractor_unittest.cc b/net/dns/dns_response_result_extractor_unittest.cc index 5ac4276..e0e9ba9 100644 --- a/net/dns/dns_response_result_extractor_unittest.cc +++ b/net/dns/dns_response_result_extractor_unittest.cc
@@ -10,6 +10,8 @@ #include "base/ranges/algorithm.h" #include "base/strings/string_piece.h" +#include "base/test/simple_test_clock.h" +#include "base/test/simple_test_tick_clock.h" #include "base/time/time.h" #include "net/base/connection_endpoint_metadata_test_util.h" #include "net/base/host_port_pair.h" @@ -20,6 +22,8 @@ #include "net/dns/dns_response.h" #include "net/dns/dns_test_util.h" #include "net/dns/host_cache.h" +#include "net/dns/host_resolver_internal_result.h" +#include "net/dns/host_resolver_internal_result_test_util.h" #include "net/dns/host_resolver_results_test_util.h" #include "net/dns/public/dns_protocol.h" #include "net/dns/public/dns_query_type.h" @@ -31,77 +35,104 @@ namespace net { namespace { -TEST(DnsResponseResultExtractorTest, ExtractsSingleARecord) { +using ::testing::AllOf; +using ::testing::ElementsAre; +using ::testing::ElementsAreArray; +using ::testing::Eq; +using ::testing::IsEmpty; +using ::testing::Ne; +using ::testing::Pair; +using ::testing::Pointee; +using ::testing::ResultOf; +using ::testing::SizeIs; +using ::testing::UnorderedElementsAre; + +using ExtractionError = DnsResponseResultExtractor::ExtractionError; +using ResultsOrError = DnsResponseResultExtractor::ResultsOrError; + +constexpr HostResolverInternalResult::Source kDnsSource = + HostResolverInternalResult::Source::kDns; + +class DnsResponseResultExtractorTest : public ::testing::Test { + protected: + base::SimpleTestClock clock_; + base::SimpleTestTickClock tick_clock_; +}; + +TEST_F(DnsResponseResultExtractorTest, ExtractsSingleARecord) { constexpr char kName[] = "address.test"; const IPAddress kExpected(192, 168, 0, 1); DnsResponse response = BuildTestDnsAddressResponse(kName, kExpected); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::A, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::A, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); - IPEndPoint expected_endpoint(kExpected, 0 /* port */); - - EXPECT_THAT(results.GetEndpoints(), - testing::Optional(testing::ElementsAre(ExpectEndpointResult( - testing::ElementsAre(expected_endpoint))))); - EXPECT_THAT(results.aliases(), testing::Pointee(testing::ElementsAre(kName))); - EXPECT_TRUE(results.has_ttl()); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT(results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalDataResult( + kName, DnsQueryType::A, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + ElementsAre(IPEndPoint(kExpected, /*port=*/0)))))); } -TEST(DnsResponseResultExtractorTest, ExtractsSingleAAAARecord) { +TEST_F(DnsResponseResultExtractorTest, ExtractsSingleAAAARecord) { constexpr char kName[] = "address.test"; IPAddress expected; CHECK(expected.AssignFromIPLiteral("2001:4860:4860::8888")); DnsResponse response = BuildTestDnsAddressResponse(kName, expected); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::AAAA, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::AAAA, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); - IPEndPoint expected_endpoint(expected, 0 /* port */); - EXPECT_THAT(results.GetEndpoints(), - testing::Optional(testing::ElementsAre(ExpectEndpointResult( - testing::ElementsAre(expected_endpoint))))); - EXPECT_THAT(results.aliases(), testing::Pointee(testing::ElementsAre(kName))); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT(results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalDataResult( + kName, DnsQueryType::AAAA, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + ElementsAre(IPEndPoint(expected, /*port=*/0)))))); } -TEST(DnsResponseResultExtractorTest, ExtractsSingleARecordWithCname) { +TEST_F(DnsResponseResultExtractorTest, ExtractsSingleARecordWithCname) { const IPAddress kExpected(192, 168, 0, 1); constexpr char kName[] = "address.test"; constexpr char kCanonicalName[] = "alias.test"; DnsResponse response = BuildTestDnsAddressResponseWithCname(kName, kExpected, kCanonicalName); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::A, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::A, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); - IPEndPoint expected_endpoint(kExpected, 0 /* port */); - EXPECT_THAT(results.GetEndpoints(), - testing::Optional(testing::ElementsAre(ExpectEndpointResult( - testing::ElementsAre(expected_endpoint))))); - EXPECT_THAT(results.aliases(), testing::Pointee(testing::UnorderedElementsAre( - kName, kCanonicalName))); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT( + results.value(), + UnorderedElementsAre(Pointee(ExpectHostResolverInternalDataResult( + kCanonicalName, DnsQueryType::A, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + ElementsAre(IPEndPoint(kExpected, /*port=*/0)))), + Pointee(ExpectHostResolverInternalAliasResult( + kName, DnsQueryType::A, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + kCanonicalName)))); } -TEST(DnsResponseResultExtractorTest, ExtractsARecordsWithCname) { +TEST_F(DnsResponseResultExtractorTest, ExtractsARecordsWithCname) { constexpr char kName[] = "addresses.test"; DnsResponse response = BuildTestDnsResponse( @@ -114,29 +145,34 @@ BuildTestAddressRecord("alias.test", IPAddress(74, 125, 226, 177)), BuildTestAddressRecord("alias.test", IPAddress(74, 125, 226, 178)), }); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::A, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::A, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); + ASSERT_TRUE(results.has_value()); EXPECT_THAT( - results.GetEndpoints(), - testing::Optional(testing::ElementsAre( - ExpectEndpointResult(testing::UnorderedElementsAre( - IPEndPoint(IPAddress(74, 125, 226, 179), 0 /* port */), - IPEndPoint(IPAddress(74, 125, 226, 178), 0 /* port */), - IPEndPoint(IPAddress(74, 125, 226, 180), 0 /* port */), - IPEndPoint(IPAddress(74, 125, 226, 176), 0 /* port */), - IPEndPoint(IPAddress(74, 125, 226, 177), 0 /* port */)))))); - EXPECT_THAT(results.aliases(), testing::Pointee(testing::UnorderedElementsAre( - "alias.test", kName))); + results.value(), + UnorderedElementsAre( + Pointee(ExpectHostResolverInternalDataResult( + "alias.test", DnsQueryType::A, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + UnorderedElementsAre( + IPEndPoint(IPAddress(74, 125, 226, 179), /*port=*/0), + IPEndPoint(IPAddress(74, 125, 226, 180), /*port=*/0), + IPEndPoint(IPAddress(74, 125, 226, 176), /*port=*/0), + IPEndPoint(IPAddress(74, 125, 226, 177), /*port=*/0), + IPEndPoint(IPAddress(74, 125, 226, 178), /*port=*/0)))), + Pointee(ExpectHostResolverInternalAliasResult( + kName, DnsQueryType::A, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "alias.test")))); } -TEST(DnsResponseResultExtractorTest, ExtractsNxdomainAResponses) { +TEST_F(DnsResponseResultExtractorTest, ExtractsNxdomainAResponses) { constexpr char kName[] = "address.test"; constexpr auto kTtl = base::Hours(2); @@ -145,23 +181,23 @@ /*authority=*/ {BuildTestDnsRecord(kName, dns_protocol::kTypeSOA, "fake rdata", kTtl)}, /*additional=*/{}, dns_protocol::kRcodeNXDOMAIN); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::A, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::A, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_THAT(results.GetEndpoints(), testing::Optional(testing::IsEmpty())); - EXPECT_THAT(results.aliases(), testing::Pointee(testing::ElementsAre(kName))); - - ASSERT_TRUE(results.has_ttl()); - EXPECT_EQ(results.ttl(), kTtl); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT(results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalErrorResult( + kName, DnsQueryType::A, kDnsSource, + /*expiration_matcher=*/Eq(tick_clock_.NowTicks() + kTtl), + /*timed_expiration_matcher=*/Eq(clock_.Now() + kTtl), + ERR_NAME_NOT_RESOLVED)))); } -TEST(DnsResponseResultExtractorTest, ExtractsNodataAResponses) { +TEST_F(DnsResponseResultExtractorTest, ExtractsNodataAResponses) { constexpr char kName[] = "address.test"; constexpr auto kTtl = base::Minutes(15); @@ -169,80 +205,74 @@ kName, dns_protocol::kTypeA, /*answers=*/{}, /*authority=*/ {BuildTestDnsRecord(kName, dns_protocol::kTypeSOA, "fake rdata", kTtl)}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::A, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::A, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_THAT(results.GetEndpoints(), testing::Optional(testing::IsEmpty())); - EXPECT_THAT(results.aliases(), testing::Pointee(testing::ElementsAre(kName))); - - ASSERT_TRUE(results.has_ttl()); - EXPECT_EQ(results.ttl(), kTtl); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT(results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalErrorResult( + kName, DnsQueryType::A, kDnsSource, + /*expiration_matcher=*/Eq(tick_clock_.NowTicks() + kTtl), + /*timed_expiration_matcher=*/Eq(clock_.Now() + kTtl), + ERR_NAME_NOT_RESOLVED)))); } -TEST(DnsResponseResultExtractorTest, RejectsMalformedARecord) { +TEST_F(DnsResponseResultExtractorTest, RejectsMalformedARecord) { constexpr char kName[] = "address.test"; DnsResponse response = BuildTestDnsResponse( kName, dns_protocol::kTypeA, {BuildTestDnsRecord(kName, dns_protocol::kTypeA, "malformed rdata")} /* answers */); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::A, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kMalformedRecord); - - EXPECT_THAT(results.error(), test::IsError(ERR_DNS_MALFORMED_RESPONSE)); - EXPECT_FALSE(results.has_ttl()); + EXPECT_EQ(extractor + .ExtractDnsResults(DnsQueryType::A, + /*original_domain_name=*/kName, + /*request_port=*/0) + .error_or(ExtractionError::kOk), + ExtractionError::kMalformedRecord); } -TEST(DnsResponseResultExtractorTest, RejectsWrongNameARecord) { +TEST_F(DnsResponseResultExtractorTest, RejectsWrongNameARecord) { constexpr char kName[] = "address.test"; DnsResponse response = BuildTestDnsAddressResponse( kName, IPAddress(1, 2, 3, 4), "different.test"); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::A, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kNameMismatch); - - EXPECT_THAT(results.error(), test::IsError(ERR_DNS_MALFORMED_RESPONSE)); - EXPECT_FALSE(results.has_ttl()); + EXPECT_EQ(extractor + .ExtractDnsResults(DnsQueryType::A, + /*original_domain_name=*/kName, + /*request_port=*/0) + .error_or(ExtractionError::kOk), + ExtractionError::kNameMismatch); } -TEST(DnsResponseResultExtractorTest, IgnoresWrongTypeRecordsInAResponse) { +TEST_F(DnsResponseResultExtractorTest, IgnoresWrongTypeRecordsInAResponse) { constexpr char kName[] = "address.test"; DnsResponse response = BuildTestDnsResponse( kName, dns_protocol::kTypeA, {BuildTestTextRecord("address.test", {"foo"} /* text_strings */)}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::A, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::A, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_THAT(results.GetEndpoints(), testing::Optional(testing::IsEmpty())); - EXPECT_THAT(results.aliases(), - testing::Pointee(testing::ElementsAre("address.test"))); - EXPECT_FALSE(results.has_ttl()); + // Expect empty results because NODATA is not cacheable (due to no TTL). + ASSERT_TRUE(results.has_value()); + EXPECT_THAT(results.value(), IsEmpty()); } -TEST(DnsResponseResultExtractorTest, IgnoresWrongTypeRecordsMixedWithARecords) { +TEST_F(DnsResponseResultExtractorTest, + IgnoresWrongTypeRecordsMixedWithARecords) { constexpr char kName[] = "address.test"; const IPAddress kExpected(8, 8, 8, 8); constexpr auto kTtl = base::Days(3); @@ -251,26 +281,23 @@ kName, dns_protocol::kTypeA, {BuildTestTextRecord(kName, /*text_strings=*/{"foo"}, base::Hours(2)), BuildTestAddressRecord(kName, kExpected, kTtl)}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::A, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::A, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); - IPEndPoint expected_endpoint(kExpected, 0 /* port */); - EXPECT_THAT(results.GetEndpoints(), - testing::Optional(testing::ElementsAre(ExpectEndpointResult( - testing::ElementsAre(expected_endpoint))))); - EXPECT_THAT(results.aliases(), testing::Pointee(testing::ElementsAre(kName))); - - ASSERT_TRUE(results.has_ttl()); - EXPECT_EQ(results.ttl(), kTtl); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT(results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalDataResult( + kName, DnsQueryType::A, kDnsSource, + /*expiration_matcher=*/Eq(tick_clock_.NowTicks() + kTtl), + /*timed_expiration_matcher=*/Eq(clock_.Now() + kTtl), + ElementsAre(IPEndPoint(kExpected, /*port=*/0)))))); } -TEST(DnsResponseResultExtractorTest, ExtractsMinATtl) { +TEST_F(DnsResponseResultExtractorTest, ExtractsMinATtl) { constexpr char kName[] = "name.test"; constexpr base::TimeDelta kMinTtl = base::Minutes(4); @@ -280,19 +307,27 @@ BuildTestAddressRecord(kName, IPAddress(2, 3, 4, 5), kMinTtl), BuildTestAddressRecord(kName, IPAddress(3, 4, 5, 6), base::Minutes(15))}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::A, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::A, + /*original_domain_name=*/kName, + /*request_port=*/0); - ASSERT_TRUE(results.has_ttl()); - EXPECT_EQ(results.ttl(), kMinTtl); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT(results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalDataResult( + kName, DnsQueryType::A, kDnsSource, + /*expiration_matcher=*/Eq(tick_clock_.NowTicks() + kMinTtl), + /*timed_expiration_matcher=*/Eq(clock_.Now() + kMinTtl), + /*endpoints_matcher=*/SizeIs(3))))); } -TEST(DnsResponseResultExtractorTest, ExtractsTxtResponses) { +MATCHER_P(ContainsContiguousElements, elements, "") { + return base::ranges::search(arg, elements) != arg.end(); +} + +TEST_F(DnsResponseResultExtractorTest, ExtractsTxtResponses) { constexpr char kName[] = "name.test"; // Simulate two separate DNS records, each with multiple strings. @@ -303,29 +338,30 @@ DnsResponse response = BuildTestDnsTextResponse(kName, std::move(text_records)); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::TXT, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::TXT, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); - + ASSERT_TRUE(results.has_value()); // Order between separate DNS records is undefined, but each record should // stay in order as that order may be meaningful. - ASSERT_THAT(results.text_records(), - testing::Optional(testing::UnorderedElementsAre( - "foo1", "foo2", "foo3", "bar1", "bar2"))); - std::vector<std::string> results_vector = results.text_records().value(); - EXPECT_NE(results_vector.end(), - base::ranges::search(results_vector, foo_records)); - EXPECT_NE(results_vector.end(), - base::ranges::search(results_vector, bar_records)); + EXPECT_THAT( + results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalDataResult( + kName, DnsQueryType::TXT, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + /*endpoints_matcher=*/IsEmpty(), + /*strings_matcher=*/ + AllOf(UnorderedElementsAre("foo1", "foo2", "foo3", "bar1", "bar2"), + ContainsContiguousElements(foo_records), + ContainsContiguousElements(bar_records)))))); } -TEST(DnsResponseResultExtractorTest, ExtractsNxdomainTxtResponses) { +TEST_F(DnsResponseResultExtractorTest, ExtractsNxdomainTxtResponses) { constexpr char kName[] = "name.test"; constexpr auto kTtl = base::Days(4); @@ -334,22 +370,23 @@ /*authority=*/ {BuildTestDnsRecord(kName, dns_protocol::kTypeSOA, "fake rdata", kTtl)}, /*additional=*/{}, dns_protocol::kRcodeNXDOMAIN); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::TXT, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::TXT, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_THAT(results.text_records(), testing::Optional(testing::IsEmpty())); - - ASSERT_TRUE(results.has_ttl()); - EXPECT_EQ(results.ttl(), kTtl); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT(results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalErrorResult( + kName, DnsQueryType::TXT, kDnsSource, + /*expiration_matcher=*/Eq(tick_clock_.NowTicks() + kTtl), + /*timed_expiration_matcher=*/Eq(clock_.Now() + kTtl), + ERR_NAME_NOT_RESOLVED)))); } -TEST(DnsResponseResultExtractorTest, ExtractsNodataTxtResponses) { +TEST_F(DnsResponseResultExtractorTest, ExtractsNodataTxtResponses) { constexpr char kName[] = "name.test"; constexpr auto kTtl = base::Minutes(42); @@ -357,77 +394,73 @@ kName, dns_protocol::kTypeTXT, /*answers=*/{}, /*authority=*/ {BuildTestDnsRecord(kName, dns_protocol::kTypeSOA, "fake rdata", kTtl)}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::TXT, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::TXT, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_THAT(results.text_records(), testing::Optional(testing::IsEmpty())); - - ASSERT_TRUE(results.has_ttl()); - EXPECT_EQ(results.ttl(), kTtl); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT(results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalErrorResult( + kName, DnsQueryType::TXT, kDnsSource, + /*expiration_matcher=*/Eq(tick_clock_.NowTicks() + kTtl), + /*timed_expiration_matcher=*/Eq(clock_.Now() + kTtl), + ERR_NAME_NOT_RESOLVED)))); } -TEST(DnsResponseResultExtractorTest, RejectsMalformedTxtRecord) { +TEST_F(DnsResponseResultExtractorTest, RejectsMalformedTxtRecord) { constexpr char kName[] = "name.test"; DnsResponse response = BuildTestDnsResponse( kName, dns_protocol::kTypeTXT, {BuildTestDnsRecord(kName, dns_protocol::kTypeTXT, "malformed rdata")} /* answers */); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::TXT, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kMalformedRecord); - - EXPECT_THAT(results.error(), test::IsError(ERR_DNS_MALFORMED_RESPONSE)); - EXPECT_FALSE(results.has_ttl()); + EXPECT_EQ(extractor + .ExtractDnsResults(DnsQueryType::TXT, + /*original_domain_name=*/kName, + /*request_port=*/0) + .error_or(ExtractionError::kOk), + ExtractionError::kMalformedRecord); } -TEST(DnsResponseResultExtractorTest, RejectsWrongNameTxtRecord) { +TEST_F(DnsResponseResultExtractorTest, RejectsWrongNameTxtRecord) { constexpr char kName[] = "name.test"; DnsResponse response = BuildTestDnsTextResponse(kName, {{"foo"}}, "different.test"); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::TXT, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kNameMismatch); - - EXPECT_THAT(results.error(), test::IsError(ERR_DNS_MALFORMED_RESPONSE)); - EXPECT_FALSE(results.has_ttl()); + EXPECT_EQ(extractor + .ExtractDnsResults(DnsQueryType::TXT, + /*original_domain_name=*/kName, + /*request_port=*/0) + .error_or(ExtractionError::kOk), + ExtractionError::kNameMismatch); } -TEST(DnsResponseResultExtractorTest, IgnoresWrongTypeTxtResponses) { +TEST_F(DnsResponseResultExtractorTest, IgnoresWrongTypeTxtResponses) { constexpr char kName[] = "name.test"; DnsResponse response = BuildTestDnsResponse( kName, dns_protocol::kTypeTXT, {BuildTestAddressRecord(kName, IPAddress(1, 2, 3, 4))}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::TXT, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::TXT, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_THAT(results.text_records(), testing::Optional(testing::IsEmpty())); - EXPECT_FALSE(results.has_ttl()); + // Expect empty results because NODATA is not cacheable (due to no TTL). + ASSERT_TRUE(results.has_value()); + EXPECT_THAT(results.value(), IsEmpty()); } -TEST(DnsResponseResultExtractorTest, ExtractsMinTxtTtl) { +TEST_F(DnsResponseResultExtractorTest, ExtractsMinTxtTtl) { constexpr char kName[] = "name.test"; constexpr base::TimeDelta kMinTtl = base::Minutes(4); @@ -436,40 +469,49 @@ {BuildTestTextRecord(kName, {"foo"}, base::Hours(3)), BuildTestTextRecord(kName, {"bar"}, kMinTtl), BuildTestTextRecord(kName, {"baz"}, base::Minutes(15))}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::TXT, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::TXT, + /*original_domain_name=*/kName, + /*request_port=*/0); - ASSERT_TRUE(results.has_ttl()); - EXPECT_EQ(results.ttl(), kMinTtl); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT(results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalDataResult( + kName, DnsQueryType::TXT, kDnsSource, + /*expiration_matcher=*/Eq(tick_clock_.NowTicks() + kMinTtl), + /*timed_expiration_matcher=*/Eq(clock_.Now() + kMinTtl), + /*endpoints_matcher=*/IsEmpty(), + /*strings_matcher=*/SizeIs(3))))); } -TEST(DnsResponseResultExtractorTest, ExtractsPtrResponses) { +TEST_F(DnsResponseResultExtractorTest, ExtractsPtrResponses) { constexpr char kName[] = "name.test"; DnsResponse response = BuildTestDnsPointerResponse(kName, {"foo.com", "bar.com"}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::PTR, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::PTR, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); - - // Order between separate records is undefined. - EXPECT_THAT(results.hostnames(), - testing::Optional(testing::UnorderedElementsAre( - HostPortPair("foo.com", 0), HostPortPair("bar.com", 0)))); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT(results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalDataResult( + kName, DnsQueryType::PTR, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + /*endpoints_matcher=*/IsEmpty(), + /*strings_matcher=*/IsEmpty(), + /*hosts_matcher=*/ + UnorderedElementsAre(HostPortPair("foo.com", 0), + HostPortPair("bar.com", 0)))))); } -TEST(DnsResponseResultExtractorTest, ExtractsNxdomainPtrResponses) { +TEST_F(DnsResponseResultExtractorTest, ExtractsNxdomainPtrResponses) { constexpr char kName[] = "name.test"; constexpr auto kTtl = base::Hours(5); @@ -478,22 +520,23 @@ /*authority=*/ {BuildTestDnsRecord(kName, dns_protocol::kTypeSOA, "fake rdata", kTtl)}, /*additional=*/{}, dns_protocol::kRcodeNXDOMAIN); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::PTR, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::PTR, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_THAT(results.hostnames(), testing::Optional(testing::IsEmpty())); - - ASSERT_TRUE(results.has_ttl()); - EXPECT_EQ(results.ttl(), kTtl); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT(results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalErrorResult( + kName, DnsQueryType::PTR, kDnsSource, + /*expiration_matcher=*/Eq(tick_clock_.NowTicks() + kTtl), + /*timed_expiration_matcher=*/Eq(clock_.Now() + kTtl), + ERR_NAME_NOT_RESOLVED)))); } -TEST(DnsResponseResultExtractorTest, ExtractsNodataPtrResponses) { +TEST_F(DnsResponseResultExtractorTest, ExtractsNodataPtrResponses) { constexpr char kName[] = "name.test"; constexpr auto kTtl = base::Minutes(50); @@ -501,77 +544,73 @@ kName, dns_protocol::kTypePTR, /*answers=*/{}, /*authority=*/ {BuildTestDnsRecord(kName, dns_protocol::kTypeSOA, "fake rdata", kTtl)}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::PTR, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::PTR, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_THAT(results.hostnames(), testing::Optional(testing::IsEmpty())); - - ASSERT_TRUE(results.has_ttl()); - EXPECT_EQ(results.ttl(), kTtl); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT(results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalErrorResult( + kName, DnsQueryType::PTR, kDnsSource, + /*expiration_matcher=*/Eq(tick_clock_.NowTicks() + kTtl), + /*timed_expiration_matcher=*/Eq(clock_.Now() + kTtl), + ERR_NAME_NOT_RESOLVED)))); } -TEST(DnsResponseResultExtractorTest, RejectsMalformedPtrRecord) { +TEST_F(DnsResponseResultExtractorTest, RejectsMalformedPtrRecord) { constexpr char kName[] = "name.test"; DnsResponse response = BuildTestDnsResponse( kName, dns_protocol::kTypePTR, {BuildTestDnsRecord(kName, dns_protocol::kTypePTR, "malformed rdata")} /* answers */); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::PTR, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kMalformedRecord); - - EXPECT_THAT(results.error(), test::IsError(ERR_DNS_MALFORMED_RESPONSE)); - EXPECT_FALSE(results.has_ttl()); + EXPECT_EQ(extractor + .ExtractDnsResults(DnsQueryType::PTR, + /*original_domain_name=*/kName, + /*request_port=*/0) + .error_or(ExtractionError::kOk), + ExtractionError::kMalformedRecord); } -TEST(DnsResponseResultExtractorTest, RejectsWrongNamePtrRecord) { +TEST_F(DnsResponseResultExtractorTest, RejectsWrongNamePtrRecord) { constexpr char kName[] = "name.test"; DnsResponse response = BuildTestDnsPointerResponse( kName, {"foo.com", "bar.com"}, "different.test"); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::PTR, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kNameMismatch); - - EXPECT_THAT(results.error(), test::IsError(ERR_DNS_MALFORMED_RESPONSE)); - EXPECT_FALSE(results.has_ttl()); + EXPECT_EQ(extractor + .ExtractDnsResults(DnsQueryType::PTR, + /*original_domain_name=*/kName, + /*request_port=*/0) + .error_or(ExtractionError::kOk), + ExtractionError::kNameMismatch); } -TEST(DnsResponseResultExtractorTest, IgnoresWrongTypePtrResponses) { +TEST_F(DnsResponseResultExtractorTest, IgnoresWrongTypePtrResponses) { constexpr char kName[] = "name.test"; DnsResponse response = BuildTestDnsResponse( kName, dns_protocol::kTypePTR, {BuildTestAddressRecord(kName, IPAddress(1, 2, 3, 4))}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::PTR, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::PTR, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_THAT(results.hostnames(), testing::Optional(testing::IsEmpty())); - EXPECT_FALSE(results.has_ttl()); + // Expect empty results because NODATA is not cacheable (due to no TTL). + ASSERT_TRUE(results.has_value()); + EXPECT_THAT(results.value(), IsEmpty()); } -TEST(DnsResponseResultExtractorTest, ExtractsSrvResponses) { +TEST_F(DnsResponseResultExtractorTest, ExtractsSrvResponses) { constexpr char kName[] = "name.test"; const TestServiceRecord kRecord1 = {2, 3, 1223, "foo.com"}; @@ -581,30 +620,37 @@ DnsResponse response = BuildTestDnsServiceResponse( kName, {kRecord1, kRecord2, kRecord3, kRecord4}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::SRV, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::SRV, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT(results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalDataResult( + kName, DnsQueryType::SRV, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + /*endpoints_matcher=*/IsEmpty(), + /*strings_matcher=*/IsEmpty(), + /*hosts_matcher=*/ + UnorderedElementsAre(HostPortPair("foo.com", 1223), + HostPortPair("bar.com", 80), + HostPortPair("google.com", 5), + HostPortPair("chromium.org", 12345)))))); // Expect ordered by priority, and random within a priority. - absl::optional<std::vector<HostPortPair>> result_hosts = results.hostnames(); - ASSERT_THAT( - result_hosts, - testing::Optional(testing::UnorderedElementsAre( - HostPortPair("foo.com", 1223), HostPortPair("bar.com", 80), - HostPortPair("google.com", 5), HostPortPair("chromium.org", 12345)))); - auto priority2 = std::vector<HostPortPair>(result_hosts.value().begin(), - result_hosts.value().begin() + 2); + std::vector<HostPortPair> result_hosts = + (*results.value().begin())->AsData().hosts(); + auto priority2 = + std::vector<HostPortPair>(result_hosts.begin(), result_hosts.begin() + 2); EXPECT_THAT(priority2, testing::UnorderedElementsAre( HostPortPair("foo.com", 1223), HostPortPair("chromium.org", 12345))); - auto priority5 = std::vector<HostPortPair>(result_hosts.value().begin() + 2, - result_hosts.value().end()); + auto priority5 = + std::vector<HostPortPair>(result_hosts.begin() + 2, result_hosts.end()); EXPECT_THAT(priority5, testing::UnorderedElementsAre(HostPortPair("bar.com", 80), HostPortPair("google.com", 5))); @@ -612,7 +658,7 @@ // 0-weight services are allowed. Ensure that we can handle such records, // especially the case where all entries have weight 0. -TEST(DnsResponseResultExtractorTest, ExtractsZeroWeightSrvResponses) { +TEST_F(DnsResponseResultExtractorTest, ExtractsZeroWeightSrvResponses) { constexpr char kName[] = "name.test"; const TestServiceRecord kRecord1 = {5, 0, 80, "bar.com"}; @@ -620,23 +666,27 @@ DnsResponse response = BuildTestDnsServiceResponse(kName, {kRecord1, kRecord2}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::SRV, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::SRV, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); - - // Expect ordered by priority, and random within a priority. - EXPECT_THAT(results.hostnames(), - testing::Optional(testing::UnorderedElementsAre( - HostPortPair("bar.com", 80), HostPortPair("google.com", 5)))); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT(results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalDataResult( + kName, DnsQueryType::SRV, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + /*endpoints_matcher=*/IsEmpty(), + /*strings_matcher=*/IsEmpty(), + /*hosts_matcher=*/ + UnorderedElementsAre(HostPortPair("bar.com", 80), + HostPortPair("google.com", 5)))))); } -TEST(DnsResponseResultExtractorTest, ExtractsNxdomainSrvResponses) { +TEST_F(DnsResponseResultExtractorTest, ExtractsNxdomainSrvResponses) { constexpr char kName[] = "name.test"; constexpr auto kTtl = base::Days(7); @@ -645,22 +695,23 @@ /*authority=*/ {BuildTestDnsRecord(kName, dns_protocol::kTypeSOA, "fake rdata", kTtl)}, /*additional=*/{}, dns_protocol::kRcodeNXDOMAIN); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::SRV, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::SRV, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_THAT(results.hostnames(), testing::Optional(testing::IsEmpty())); - - ASSERT_TRUE(results.has_ttl()); - EXPECT_EQ(results.ttl(), kTtl); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT(results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalErrorResult( + kName, DnsQueryType::SRV, kDnsSource, + /*expiration_matcher=*/Eq(tick_clock_.NowTicks() + kTtl), + /*timed_expiration_matcher=*/Eq(clock_.Now() + kTtl), + ERR_NAME_NOT_RESOLVED)))); } -TEST(DnsResponseResultExtractorTest, ExtractsNodataSrvResponses) { +TEST_F(DnsResponseResultExtractorTest, ExtractsNodataSrvResponses) { constexpr char kName[] = "name.test"; constexpr auto kTtl = base::Hours(12); @@ -668,108 +719,103 @@ kName, dns_protocol::kTypeSRV, /*answers=*/{}, /*authority=*/ {BuildTestDnsRecord(kName, dns_protocol::kTypeSOA, "fake rdata", kTtl)}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::SRV, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::SRV, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_THAT(results.hostnames(), testing::Optional(testing::IsEmpty())); - - ASSERT_TRUE(results.has_ttl()); - EXPECT_EQ(results.ttl(), kTtl); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT(results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalErrorResult( + kName, DnsQueryType::SRV, kDnsSource, + /*expiration_matcher=*/Eq(tick_clock_.NowTicks() + kTtl), + /*timed_expiration_matcher=*/Eq(clock_.Now() + kTtl), + ERR_NAME_NOT_RESOLVED)))); } -TEST(DnsResponseResultExtractorTest, RejectsMalformedSrvRecord) { +TEST_F(DnsResponseResultExtractorTest, RejectsMalformedSrvRecord) { constexpr char kName[] = "name.test"; DnsResponse response = BuildTestDnsResponse( kName, dns_protocol::kTypeSRV, {BuildTestDnsRecord(kName, dns_protocol::kTypeSRV, "malformed rdata")} /* answers */); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::SRV, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kMalformedRecord); - - EXPECT_THAT(results.error(), test::IsError(ERR_DNS_MALFORMED_RESPONSE)); - EXPECT_FALSE(results.has_ttl()); + EXPECT_EQ(extractor + .ExtractDnsResults(DnsQueryType::SRV, + /*original_domain_name=*/kName, + /*request_port=*/0) + .error_or(ExtractionError::kOk), + ExtractionError::kMalformedRecord); } -TEST(DnsResponseResultExtractorTest, RejectsWrongNameSrvRecord) { +TEST_F(DnsResponseResultExtractorTest, RejectsWrongNameSrvRecord) { constexpr char kName[] = "name.test"; const TestServiceRecord kRecord = {2, 3, 1223, "foo.com"}; DnsResponse response = BuildTestDnsServiceResponse(kName, {kRecord}, "different.test"); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::SRV, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kNameMismatch); - - EXPECT_THAT(results.error(), test::IsError(ERR_DNS_MALFORMED_RESPONSE)); - EXPECT_FALSE(results.has_ttl()); + EXPECT_EQ(extractor + .ExtractDnsResults(DnsQueryType::SRV, + /*original_domain_name=*/kName, + /*request_port=*/0) + .error_or(ExtractionError::kOk), + ExtractionError::kNameMismatch); } -TEST(DnsResponseResultExtractorTest, IgnoresWrongTypeSrvResponses) { +TEST_F(DnsResponseResultExtractorTest, IgnoresWrongTypeSrvResponses) { constexpr char kName[] = "name.test"; DnsResponse response = BuildTestDnsResponse( kName, dns_protocol::kTypeSRV, {BuildTestAddressRecord(kName, IPAddress(1, 2, 3, 4))}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::SRV, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::SRV, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_THAT(results.hostnames(), testing::Optional(testing::IsEmpty())); - EXPECT_FALSE(results.has_ttl()); + // Expect empty results because NODATA is not cacheable (due to no TTL). + ASSERT_TRUE(results.has_value()); + EXPECT_THAT(results.value(), IsEmpty()); } -TEST(DnsResponseResultExtractorTest, ExtractsBasicHttpsResponses) { +TEST_F(DnsResponseResultExtractorTest, ExtractsBasicHttpsResponses) { constexpr char kName[] = "https.test"; constexpr auto kTtl = base::Hours(12); DnsResponse response = BuildTestDnsResponse(kName, dns_protocol::kTypeHttps, - {BuildTestHttpsServiceRecord(kName, /*priority=*/4, + {BuildTestHttpsServiceRecord(kName, + /*priority=*/4, /*service_name=*/".", /*params=*/{}, kTtl)}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::HTTPS, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::HTTPS, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); + ASSERT_TRUE(results.has_value()); EXPECT_THAT( - results.GetMetadatas(), - testing::Optional(testing::ElementsAre(ExpectConnectionEndpointMetadata( - testing::ElementsAre(dns_protocol::kHttpsServiceDefaultAlpn), - testing::IsEmpty(), kName)))); - EXPECT_THAT(results.https_record_compatibility(), - testing::Pointee(testing::ElementsAre(true))); - - ASSERT_TRUE(results.has_ttl()); - EXPECT_EQ(results.ttl(), kTtl); + results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalMetadataResult( + kName, DnsQueryType::HTTPS, kDnsSource, + Eq(tick_clock_.NowTicks() + kTtl), Eq(clock_.Now() + kTtl), + ElementsAre( + Pair(4, ExpectConnectionEndpointMetadata( + ElementsAre(dns_protocol::kHttpsServiceDefaultAlpn), + /*ech_config_list_matcher=*/IsEmpty(), kName))))))); } -TEST(DnsResponseResultExtractorTest, ExtractsComprehensiveHttpsResponses) { +TEST_F(DnsResponseResultExtractorTest, ExtractsComprehensiveHttpsResponses) { constexpr char kName[] = "https.test"; constexpr char kAlpn[] = "foo"; constexpr uint8_t kEchConfig[] = "EEEEEEEEECH!"; @@ -791,58 +837,60 @@ {BuildTestHttpsServiceAlpnParam({kAlpn}), {dns_protocol::kHttpsServiceParamKeyNoDefaultAlpn, ""}}, /*ttl=*/base::Days(3))}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::HTTPS, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::HTTPS, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); - EXPECT_THAT(results.GetMetadatas(), - testing::Optional(testing::ElementsAre( - ExpectConnectionEndpointMetadata(testing::ElementsAre(kAlpn), - testing::IsEmpty(), kName), - ExpectConnectionEndpointMetadata( - testing::ElementsAre( - kAlpn, dns_protocol::kHttpsServiceDefaultAlpn), - testing::ElementsAreArray(kEchConfig), kName)))); - EXPECT_THAT(results.https_record_compatibility(), - testing::Pointee(testing::ElementsAre(true, true))); - - ASSERT_TRUE(results.has_ttl()); - EXPECT_EQ(results.ttl(), kTtl); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT( + results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalMetadataResult( + kName, DnsQueryType::HTTPS, kDnsSource, + Eq(tick_clock_.NowTicks() + kTtl), Eq(clock_.Now() + kTtl), + ElementsAre( + Pair(3, ExpectConnectionEndpointMetadata( + ElementsAre(kAlpn), + /*ech_config_list_matcher=*/IsEmpty(), kName)), + Pair(4, ExpectConnectionEndpointMetadata( + ElementsAre(kAlpn, + dns_protocol::kHttpsServiceDefaultAlpn), + ElementsAreArray(kEchConfig), kName))))))); } -TEST(DnsResponseResultExtractorTest, IgnoresHttpsResponseWithAlias) { +TEST_F(DnsResponseResultExtractorTest, IgnoresHttpsResponseWithAlias) { constexpr char kName[] = "https.test"; DnsResponse response = BuildTestDnsResponse(kName, dns_protocol::kTypeHttps, - {BuildTestHttpsServiceRecord(kName, /*priority=*/4, + {BuildTestHttpsServiceRecord(kName, + /*priority=*/4, /*service_name=*/".", /*params=*/{}), BuildTestHttpsAliasRecord(kName, "alias.test")}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::HTTPS, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::HTTPS, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_THAT(results.GetMetadatas(), testing::Optional(testing::IsEmpty())); - - // Expected to still output record compatibility for otherwise-ignored records - EXPECT_THAT(results.https_record_compatibility(), - testing::Pointee(testing::ElementsAre(true, true))); + // Expect empty metadata result to signify compatible HTTPS records with no + // data of use to Chrome. + ASSERT_TRUE(results.has_value()); + EXPECT_THAT(results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalMetadataResult( + kName, DnsQueryType::HTTPS, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + /*metadatas_matcher=*/IsEmpty())))); } // Expect the entire response to be ignored if all HTTPS records have the // "no-default-alpn" param. -TEST(DnsResponseResultExtractorTest, IgnoresHttpsResponseWithNoDefaultAlpn) { +TEST_F(DnsResponseResultExtractorTest, IgnoresHttpsResponseWithNoDefaultAlpn) { constexpr char kName[] = "https.test"; DnsResponse response = BuildTestDnsResponse( @@ -859,24 +907,26 @@ /*params=*/ {BuildTestHttpsServiceAlpnParam({"foo2"}), {dns_protocol::kHttpsServiceParamKeyNoDefaultAlpn, ""}})}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::HTTPS, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::HTTPS, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_THAT(results.GetMetadatas(), testing::Optional(testing::IsEmpty())); - - // Expected to still output record compatibility for otherwise-ignored records - EXPECT_THAT(results.https_record_compatibility(), - testing::Pointee(testing::ElementsAre(true, true))); + // Expect empty metadata result to signify compatible HTTPS records with no + // data of use to Chrome. + ASSERT_TRUE(results.has_value()); + EXPECT_THAT(results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalMetadataResult( + kName, DnsQueryType::HTTPS, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + /*metadatas_matcher=*/IsEmpty())))); } // Unsupported/unknown HTTPS params are simply ignored if not marked mandatory. -TEST(DnsResponseResultExtractorTest, IgnoresUnsupportedParamsInHttpsRecord) { +TEST_F(DnsResponseResultExtractorTest, IgnoresUnsupportedParamsInHttpsRecord) { constexpr char kName[] = "https.test"; constexpr uint16_t kMadeUpParamKey = 65500; // From the private-use block. @@ -886,28 +936,30 @@ /*service_name=*/".", /*params=*/ {{kMadeUpParamKey, "foo"}})}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::HTTPS, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::HTTPS, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); + ASSERT_TRUE(results.has_value()); EXPECT_THAT( - results.GetMetadatas(), - testing::Optional(testing::ElementsAre(ExpectConnectionEndpointMetadata( - testing::ElementsAre(dns_protocol::kHttpsServiceDefaultAlpn), - testing::IsEmpty(), kName)))); - EXPECT_THAT(results.https_record_compatibility(), - testing::Pointee(testing::ElementsAre(true))); + results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalMetadataResult( + kName, DnsQueryType::HTTPS, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + ElementsAre( + Pair(4, ExpectConnectionEndpointMetadata( + ElementsAre(dns_protocol::kHttpsServiceDefaultAlpn), + /*ech_config_list_matcher=*/IsEmpty(), kName))))))); } // Entire record is dropped if an unsupported/unknown HTTPS param is marked // mandatory. -TEST(DnsResponseResultExtractorTest, - IgnoresHttpsRecordWithUnsupportedMandatoryParam) { +TEST_F(DnsResponseResultExtractorTest, + IgnoresHttpsRecordWithUnsupportedMandatoryParam) { constexpr char kName[] = "https.test"; constexpr uint16_t kMadeUpParamKey = 65500; // From the private-use block. @@ -924,26 +976,28 @@ kName, /*priority=*/5, /*service_name=*/".", /*params=*/{BuildTestHttpsServiceAlpnParam({"foo"})})}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::HTTPS, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::HTTPS, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); + ASSERT_TRUE(results.has_value()); EXPECT_THAT( - results.GetMetadatas(), - testing::Optional(testing::ElementsAre(ExpectConnectionEndpointMetadata( - testing::ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn), - testing::IsEmpty(), kName)))); - EXPECT_THAT(results.https_record_compatibility(), - testing::Pointee(testing::ElementsAre(false, true))); + results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalMetadataResult( + kName, DnsQueryType::HTTPS, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + ElementsAre(Pair( + 5, ExpectConnectionEndpointMetadata( + ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn), + /*ech_config_list_matcher=*/IsEmpty(), kName))))))); } -TEST(DnsResponseResultExtractorTest, - ExtractsHttpsRecordWithMatchingServiceName) { +TEST_F(DnsResponseResultExtractorTest, + ExtractsHttpsRecordWithMatchingServiceName) { constexpr char kName[] = "https.test"; DnsResponse response = BuildTestDnsResponse( @@ -952,26 +1006,28 @@ /*service_name=*/kName, /*params=*/ {BuildTestHttpsServiceAlpnParam({"foo"})})}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::HTTPS, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::HTTPS, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); + ASSERT_TRUE(results.has_value()); EXPECT_THAT( - results.GetMetadatas(), - testing::Optional(testing::ElementsAre(ExpectConnectionEndpointMetadata( - testing::ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn), - testing::IsEmpty(), kName)))); - EXPECT_THAT(results.https_record_compatibility(), - testing::Pointee(testing::ElementsAre(true))); + results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalMetadataResult( + kName, DnsQueryType::HTTPS, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + ElementsAre(Pair( + 4, ExpectConnectionEndpointMetadata( + ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn), + /*ech_config_list_matcher=*/IsEmpty(), kName))))))); } -TEST(DnsResponseResultExtractorTest, - ExtractsHttpsRecordWithMatchingDefaultServiceName) { +TEST_F(DnsResponseResultExtractorTest, + ExtractsHttpsRecordWithMatchingDefaultServiceName) { constexpr char kName[] = "https.test"; DnsResponse response = BuildTestDnsResponse( @@ -980,26 +1036,28 @@ /*service_name=*/".", /*params=*/ {BuildTestHttpsServiceAlpnParam({"foo"})})}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::HTTPS, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::HTTPS, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); + ASSERT_TRUE(results.has_value()); EXPECT_THAT( - results.GetMetadatas(), - testing::Optional(testing::ElementsAre(ExpectConnectionEndpointMetadata( - testing::ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn), - testing::IsEmpty(), kName)))); - EXPECT_THAT(results.https_record_compatibility(), - testing::Pointee(testing::ElementsAre(true))); + results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalMetadataResult( + kName, DnsQueryType::HTTPS, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + ElementsAre(Pair( + 4, ExpectConnectionEndpointMetadata( + ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn), + /*ech_config_list_matcher=*/IsEmpty(), kName))))))); } -TEST(DnsResponseResultExtractorTest, - ExtractsHttpsRecordWithPrefixedNameAndMatchingServiceName) { +TEST_F(DnsResponseResultExtractorTest, + ExtractsHttpsRecordWithPrefixedNameAndMatchingServiceName) { constexpr char kName[] = "https.test"; constexpr char kPrefixedName[] = "_444._https.https.test"; @@ -1009,26 +1067,28 @@ /*service_name=*/kName, /*params=*/ {BuildTestHttpsServiceAlpnParam({"foo"})})}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::HTTPS, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::HTTPS, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); + ASSERT_TRUE(results.has_value()); EXPECT_THAT( - results.GetMetadatas(), - testing::Optional(testing::ElementsAre(ExpectConnectionEndpointMetadata( - testing::ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn), - testing::IsEmpty(), kName)))); - EXPECT_THAT(results.https_record_compatibility(), - testing::Pointee(testing::ElementsAre(true))); + results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalMetadataResult( + kPrefixedName, DnsQueryType::HTTPS, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + ElementsAre(Pair( + 4, ExpectConnectionEndpointMetadata( + ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn), + /*ech_config_list_matcher=*/IsEmpty(), kName))))))); } -TEST(DnsResponseResultExtractorTest, - ExtractsHttpsRecordWithAliasingAndMatchingServiceName) { +TEST_F(DnsResponseResultExtractorTest, + ExtractsHttpsRecordWithAliasingAndMatchingServiceName) { constexpr char kName[] = "https.test"; DnsResponse response = BuildTestDnsResponse( @@ -1038,26 +1098,34 @@ /*service_name=*/kName, /*params=*/ {BuildTestHttpsServiceAlpnParam({"foo"})})}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::HTTPS, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::HTTPS, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); + ASSERT_TRUE(results.has_value()); EXPECT_THAT( - results.GetMetadatas(), - testing::Optional(testing::ElementsAre(ExpectConnectionEndpointMetadata( - testing::ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn), - testing::IsEmpty(), kName)))); - EXPECT_THAT(results.https_record_compatibility(), - testing::Pointee(testing::ElementsAre(true))); + results.value(), + UnorderedElementsAre( + Pointee(ExpectHostResolverInternalAliasResult( + kName, DnsQueryType::HTTPS, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "alias.test")), + Pointee(ExpectHostResolverInternalMetadataResult( + "alias.test", DnsQueryType::HTTPS, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + ElementsAre(Pair( + 4, ExpectConnectionEndpointMetadata( + ElementsAre("foo", + dns_protocol::kHttpsServiceDefaultAlpn), + /*ech_config_list_matcher=*/IsEmpty(), kName))))))); } -TEST(DnsResponseResultExtractorTest, - IgnoreHttpsRecordWithNonMatchingServiceName) { +TEST_F(DnsResponseResultExtractorTest, + IgnoreHttpsRecordWithNonMatchingServiceName) { constexpr char kName[] = "https.test"; DnsResponse response = BuildTestDnsResponse( @@ -1071,26 +1139,28 @@ /*service_name=*/".", /*params=*/ {BuildTestHttpsServiceAlpnParam({"foo"})})}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::HTTPS, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::HTTPS, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); + ASSERT_TRUE(results.has_value()); EXPECT_THAT( - results.GetMetadatas(), - testing::Optional(testing::ElementsAre(ExpectConnectionEndpointMetadata( - testing::ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn), - testing::IsEmpty(), kName)))); - EXPECT_THAT(results.https_record_compatibility(), - testing::Pointee(testing::ElementsAre(true, true))); + results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalMetadataResult( + kName, DnsQueryType::HTTPS, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + ElementsAre(Pair( + 5, ExpectConnectionEndpointMetadata( + ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn), + /*ech_config_list_matcher=*/IsEmpty(), kName))))))); } -TEST(DnsResponseResultExtractorTest, - ExtractsHttpsRecordWithPrefixedNameAndDefaultServiceName) { +TEST_F(DnsResponseResultExtractorTest, + ExtractsHttpsRecordWithPrefixedNameAndDefaultServiceName) { constexpr char kPrefixedName[] = "_445._https.https.test"; DnsResponse response = BuildTestDnsResponse( @@ -1099,26 +1169,29 @@ /*service_name=*/".", /*params=*/ {BuildTestHttpsServiceAlpnParam({"foo"})})}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::HTTPS, - /*original_domain_name=*/"https.test", - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::HTTPS, + /*original_domain_name=*/"https.test", + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); + ASSERT_TRUE(results.has_value()); EXPECT_THAT( - results.GetMetadatas(), - testing::Optional(testing::ElementsAre(ExpectConnectionEndpointMetadata( - testing::ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn), - testing::IsEmpty(), kPrefixedName)))); - EXPECT_THAT(results.https_record_compatibility(), - testing::Pointee(testing::ElementsAre(true))); + results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalMetadataResult( + kPrefixedName, DnsQueryType::HTTPS, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + ElementsAre(Pair( + 4, + ExpectConnectionEndpointMetadata( + ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn), + /*ech_config_list_matcher=*/IsEmpty(), kPrefixedName))))))); } -TEST(DnsResponseResultExtractorTest, - ExtractsHttpsRecordWithAliasingAndDefaultServiceName) { +TEST_F(DnsResponseResultExtractorTest, + ExtractsHttpsRecordWithAliasingAndDefaultServiceName) { constexpr char kName[] = "https.test"; DnsResponse response = BuildTestDnsResponse( @@ -1128,25 +1201,34 @@ /*service_name=*/".", /*params=*/ {BuildTestHttpsServiceAlpnParam({"foo"})})}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::HTTPS, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::HTTPS, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); + ASSERT_TRUE(results.has_value()); EXPECT_THAT( - results.GetMetadatas(), - testing::Optional(testing::ElementsAre(ExpectConnectionEndpointMetadata( - testing::ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn), - testing::IsEmpty(), "alias.test")))); - EXPECT_THAT(results.https_record_compatibility(), - testing::Pointee(testing::ElementsAre(true))); + results.value(), + UnorderedElementsAre( + Pointee(ExpectHostResolverInternalAliasResult( + kName, DnsQueryType::HTTPS, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "alias.test")), + Pointee(ExpectHostResolverInternalMetadataResult( + "alias.test", DnsQueryType::HTTPS, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + ElementsAre(Pair( + 4, ExpectConnectionEndpointMetadata( + ElementsAre("foo", + dns_protocol::kHttpsServiceDefaultAlpn), + /*ech_config_list_matcher=*/IsEmpty(), + "alias.test"))))))); } -TEST(DnsResponseResultExtractorTest, ExtractsHttpsRecordWithMatchingPort) { +TEST_F(DnsResponseResultExtractorTest, ExtractsHttpsRecordWithMatchingPort) { constexpr char kName[] = "https.test"; constexpr uint16_t kPort = 4567; @@ -1157,25 +1239,27 @@ /*params=*/ {BuildTestHttpsServiceAlpnParam({"foo"}), BuildTestHttpsServicePortParam(kPort)})}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::HTTPS, - /*original_domain_name=*/kName, - /*request_port=*/kPort, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::HTTPS, + /*original_domain_name=*/kName, + /*request_port=*/kPort); - EXPECT_THAT(results.error(), test::IsOk()); + ASSERT_TRUE(results.has_value()); EXPECT_THAT( - results.GetMetadatas(), - testing::Optional(testing::ElementsAre(ExpectConnectionEndpointMetadata( - testing::ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn), - testing::IsEmpty(), kName)))); - EXPECT_THAT(results.https_record_compatibility(), - testing::Pointee(testing::ElementsAre(true))); + results.value(), + UnorderedElementsAre(Pointee(ExpectHostResolverInternalMetadataResult( + kName, DnsQueryType::HTTPS, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + ElementsAre(Pair( + 4, ExpectConnectionEndpointMetadata( + ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn), + /*ech_config_list_matcher=*/IsEmpty(), kName))))))); } -TEST(DnsResponseResultExtractorTest, IgnoresHttpsRecordWithMismatchingPort) { +TEST_F(DnsResponseResultExtractorTest, IgnoresHttpsRecordWithMismatchingPort) { constexpr char kName[] = "https.test"; DnsResponse response = BuildTestDnsResponse( @@ -1189,27 +1273,29 @@ /*service_name=*/".", /*params=*/ {BuildTestHttpsServiceAlpnParam({"foo"})})}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::HTTPS, - /*original_domain_name=*/kName, - /*request_port=*/55, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::HTTPS, + /*original_domain_name=*/kName, + /*request_port=*/55); - EXPECT_THAT(results.error(), test::IsOk()); + ASSERT_TRUE(results.has_value()); EXPECT_THAT( - results.GetMetadatas(), - testing::Optional(testing::ElementsAre(ExpectConnectionEndpointMetadata( - testing::ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn), - testing::IsEmpty(), kName)))); - EXPECT_THAT(results.https_record_compatibility(), - testing::Pointee(testing::ElementsAre(true, true))); + results.value(), + UnorderedElementsAre(Pointee(ExpectHostResolverInternalMetadataResult( + kName, DnsQueryType::HTTPS, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + ElementsAre(Pair( + 4, ExpectConnectionEndpointMetadata( + ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn), + /*ech_config_list_matcher=*/IsEmpty(), kName))))))); } // HTTPS records with "no-default-alpn" but also no "alpn" are not // "self-consistent" and should be ignored. -TEST(DnsResponseResultExtractorTest, IgnoresHttpsRecordWithNoAlpn) { +TEST_F(DnsResponseResultExtractorTest, IgnoresHttpsRecordWithNoAlpn) { constexpr char kName[] = "https.test"; DnsResponse response = BuildTestDnsResponse( @@ -1223,28 +1309,30 @@ /*service_name=*/".", /*params=*/ {BuildTestHttpsServiceAlpnParam({"foo"})})}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::HTTPS, - /*original_domain_name=*/kName, - /*request_port=*/55, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::HTTPS, + /*original_domain_name=*/kName, + /*request_port=*/55); - EXPECT_THAT(results.error(), test::IsOk()); + ASSERT_TRUE(results.has_value()); EXPECT_THAT( - results.GetMetadatas(), - testing::Optional(testing::ElementsAre(ExpectConnectionEndpointMetadata( - testing::ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn), - testing::IsEmpty(), kName)))); - EXPECT_THAT(results.https_record_compatibility(), - testing::Pointee(testing::ElementsAre(true, true))); + results.value(), + UnorderedElementsAre(Pointee(ExpectHostResolverInternalMetadataResult( + kName, DnsQueryType::HTTPS, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + ElementsAre(Pair( + 4, ExpectConnectionEndpointMetadata( + ElementsAre("foo", dns_protocol::kHttpsServiceDefaultAlpn), + /*ech_config_list_matcher=*/IsEmpty(), kName))))))); } // Expect the entire response to be ignored if all HTTPS records have the // "no-default-alpn" param. -TEST(DnsResponseResultExtractorTest, - IgnoresHttpsResponseWithNoCompatibleDefaultAlpn) { +TEST_F(DnsResponseResultExtractorTest, + IgnoresHttpsResponseWithNoCompatibleDefaultAlpn) { constexpr char kName[] = "https.test"; constexpr uint16_t kMadeUpParamKey = 65500; // From the private-use block. @@ -1278,24 +1366,24 @@ kName, /*priority=*/10, /*service_name=*/".", /*params=*/{BuildTestHttpsServicePortParam(1005)})}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::HTTPS, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::HTTPS, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_THAT(results.GetMetadatas(), testing::Optional(testing::IsEmpty())); - - // Expected to still output record compatibility for otherwise-ignored records + ASSERT_TRUE(results.has_value()); EXPECT_THAT( - results.https_record_compatibility(), - testing::Pointee(testing::ElementsAre(true, true, true, false, true))); + results.value(), + UnorderedElementsAre(Pointee(ExpectHostResolverInternalMetadataResult( + kName, DnsQueryType::HTTPS, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + /*metadatas_matcher=*/IsEmpty())))); } -TEST(DnsResponseResultExtractorTest, ExtractsNxdomainHttpsResponses) { +TEST_F(DnsResponseResultExtractorTest, ExtractsNxdomainHttpsResponses) { constexpr char kName[] = "https.test"; constexpr auto kTtl = base::Minutes(45); @@ -1304,24 +1392,23 @@ /*authority=*/ {BuildTestDnsRecord(kName, dns_protocol::kTypeSOA, "fake rdata", kTtl)}, /*additional=*/{}, dns_protocol::kRcodeNXDOMAIN); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::HTTPS, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::HTTPS, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_THAT(results.GetMetadatas(), testing::Optional(testing::IsEmpty())); - EXPECT_THAT(results.https_record_compatibility(), - testing::Pointee(testing::IsEmpty())); - - ASSERT_TRUE(results.has_ttl()); - EXPECT_EQ(results.ttl(), kTtl); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT(results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalErrorResult( + kName, DnsQueryType::HTTPS, kDnsSource, + /*expiration_matcher=*/Eq(tick_clock_.NowTicks() + kTtl), + /*timed_expiration_matcher=*/Eq(clock_.Now() + kTtl), + ERR_NAME_NOT_RESOLVED)))); } -TEST(DnsResponseResultExtractorTest, ExtractsNodataHttpsResponses) { +TEST_F(DnsResponseResultExtractorTest, ExtractsNodataHttpsResponses) { constexpr char kName[] = "https.test"; constexpr auto kTtl = base::Hours(36); @@ -1329,81 +1416,73 @@ kName, dns_protocol::kTypeHttps, /*answers=*/{}, /*authority=*/ {BuildTestDnsRecord(kName, dns_protocol::kTypeSOA, "fake rdata", kTtl)}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::HTTPS, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::HTTPS, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_THAT(results.GetMetadatas(), testing::Optional(testing::IsEmpty())); - EXPECT_THAT(results.https_record_compatibility(), - testing::Pointee(testing::IsEmpty())); - - ASSERT_TRUE(results.has_ttl()); - EXPECT_EQ(results.ttl(), kTtl); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT(results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalErrorResult( + kName, DnsQueryType::HTTPS, kDnsSource, + /*expiration_matcher=*/Eq(tick_clock_.NowTicks() + kTtl), + /*timed_expiration_matcher=*/Eq(clock_.Now() + kTtl), + ERR_NAME_NOT_RESOLVED)))); } -TEST(DnsResponseResultExtractorTest, RejectsMalformedHttpsRecord) { +TEST_F(DnsResponseResultExtractorTest, RejectsMalformedHttpsRecord) { constexpr char kName[] = "https.test"; DnsResponse response = BuildTestDnsResponse( kName, dns_protocol::kTypeHttps, {BuildTestDnsRecord(kName, dns_protocol::kTypeHttps, "malformed rdata")} /* answers */); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::HTTPS, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kMalformedRecord); - - EXPECT_THAT(results.error(), test::IsError(ERR_DNS_MALFORMED_RESPONSE)); - EXPECT_FALSE(results.has_ttl()); + EXPECT_EQ(extractor + .ExtractDnsResults(DnsQueryType::HTTPS, + /*original_domain_name=*/kName, + /*request_port=*/0) + .error_or(ExtractionError::kOk), + ExtractionError::kMalformedRecord); } -TEST(DnsResponseResultExtractorTest, RejectsWrongNameHttpsRecord) { +TEST_F(DnsResponseResultExtractorTest, RejectsWrongNameHttpsRecord) { constexpr char kName[] = "https.test"; DnsResponse response = BuildTestDnsResponse( kName, dns_protocol::kTypeHttps, {BuildTestHttpsAliasRecord("different.test", "alias.test")}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::HTTPS, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kNameMismatch); - - EXPECT_THAT(results.error(), test::IsError(ERR_DNS_MALFORMED_RESPONSE)); - EXPECT_FALSE(results.has_ttl()); + EXPECT_EQ(extractor + .ExtractDnsResults(DnsQueryType::HTTPS, + /*original_domain_name=*/kName, + /*request_port=*/0) + .error_or(ExtractionError::kOk), + ExtractionError::kNameMismatch); } -TEST(DnsResponseResultExtractorTest, IgnoresWrongTypeHttpsResponses) { +TEST_F(DnsResponseResultExtractorTest, IgnoresWrongTypeHttpsResponses) { constexpr char kName[] = "https.test"; DnsResponse response = BuildTestDnsResponse( kName, dns_protocol::kTypeHttps, {BuildTestAddressRecord(kName, IPAddress(1, 2, 3, 4))}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::HTTPS, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::HTTPS, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_THAT(results.GetMetadatas(), testing::Optional(testing::IsEmpty())); - EXPECT_THAT(results.https_record_compatibility(), - testing::Pointee(testing::IsEmpty())); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT(results.value(), IsEmpty()); } -TEST(DnsResponseResultExtractorTest, IgnoresAdditionalHttpsRecords) { +TEST_F(DnsResponseResultExtractorTest, IgnoresAdditionalHttpsRecords) { constexpr char kName[] = "https.test"; constexpr auto kTtl = base::Days(5); @@ -1419,36 +1498,37 @@ kTtl)}, /*authority=*/{}, /*additional=*/ - {BuildTestHttpsServiceRecord(kName, /*priority=*/3u, /*service_name=*/".", + {BuildTestHttpsServiceRecord(kName, /*priority=*/3u, + /*service_name=*/".", /*params=*/ {BuildTestHttpsServiceAlpnParam({"foo2"})}, base::Minutes(44)), - BuildTestHttpsServiceRecord(kName, /*priority=*/2u, /*service_name=*/".", + BuildTestHttpsServiceRecord(kName, /*priority=*/2u, + /*service_name=*/".", /*params=*/ {BuildTestHttpsServiceAlpnParam({"foo3"})}, base::Minutes(30))}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::HTTPS, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::HTTPS, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); + ASSERT_TRUE(results.has_value()); EXPECT_THAT( - results.GetMetadatas(), - testing::Optional(testing::ElementsAre(ExpectConnectionEndpointMetadata( - testing::ElementsAre("foo1", dns_protocol::kHttpsServiceDefaultAlpn), - testing::IsEmpty(), kName)))); - EXPECT_THAT(results.https_record_compatibility(), - testing::Pointee(testing::ElementsAre(true))); - - ASSERT_TRUE(results.has_ttl()); - EXPECT_EQ(results.ttl(), kTtl); + results.value(), + UnorderedElementsAre(Pointee(ExpectHostResolverInternalMetadataResult( + kName, DnsQueryType::HTTPS, kDnsSource, + Eq(tick_clock_.NowTicks() + kTtl), Eq(clock_.Now() + kTtl), + ElementsAre(Pair( + 5, + ExpectConnectionEndpointMetadata( + ElementsAre("foo1", dns_protocol::kHttpsServiceDefaultAlpn), + /*ech_config_list_matcher=*/IsEmpty(), kName))))))); } -TEST(DnsResponseResultExtractorTest, IgnoresUnsolicitedHttpsRecords) { +TEST_F(DnsResponseResultExtractorTest, IgnoresUnsolicitedHttpsRecords) { constexpr char kName[] = "name.test"; DnsResponse response = BuildTestDnsResponse( @@ -1465,22 +1545,23 @@ /*params=*/ {BuildTestHttpsServiceAlpnParam({"foo3"})}, base::Minutes(30))} /* additional */); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::TXT, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::TXT, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); - EXPECT_THAT(results.text_records(), - testing::Optional(testing::ElementsAre("foo"))); - EXPECT_FALSE(results.GetMetadatas()); - EXPECT_FALSE(results.https_record_compatibility()); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT(results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalDataResult( + kName, DnsQueryType::TXT, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + /*endpoints_matcher=*/IsEmpty(), ElementsAre("foo"))))); } -TEST(DnsResponseResultExtractorTest, HandlesInOrderCnameChain) { +TEST_F(DnsResponseResultExtractorTest, HandlesInOrderCnameChain) { constexpr char kName[] = "first.test"; DnsResponse response = @@ -1490,20 +1571,38 @@ BuildTestCnameRecord("third.test", "fourth.test"), BuildTestTextRecord("fourth.test", {"foo"}), BuildTestTextRecord("fourth.test", {"bar"})}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::TXT, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::TXT, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); - EXPECT_THAT(results.text_records(), - testing::Optional(testing::UnorderedElementsAre("foo", "bar"))); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT( + results.value(), + UnorderedElementsAre( + Pointee(ExpectHostResolverInternalAliasResult( + kName, DnsQueryType::TXT, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "second.test")), + Pointee(ExpectHostResolverInternalAliasResult( + "second.test", DnsQueryType::TXT, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "third.test")), + Pointee(ExpectHostResolverInternalAliasResult( + "third.test", DnsQueryType::TXT, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "fourth.test")), + Pointee(ExpectHostResolverInternalDataResult( + "fourth.test", DnsQueryType::TXT, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + /*endpoints_matcher=*/IsEmpty(), + UnorderedElementsAre("foo", "bar"))))); } -TEST(DnsResponseResultExtractorTest, HandlesInOrderCnameChainTypeA) { +TEST_F(DnsResponseResultExtractorTest, HandlesInOrderCnameChainTypeA) { constexpr char kName[] = "first.test"; const IPAddress kExpected(192, 168, 0, 1); @@ -1515,25 +1614,37 @@ BuildTestCnameRecord("second.test", "third.test"), BuildTestCnameRecord("third.test", "fourth.test"), BuildTestAddressRecord("fourth.test", kExpected)}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::A, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::A, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); - EXPECT_THAT(results.GetEndpoints(), - testing::Optional(testing::ElementsAre(ExpectEndpointResult( - testing::ElementsAre(expected_endpoint))))); - - EXPECT_THAT(results.aliases(), - testing::Pointee(testing::UnorderedElementsAre( - "fourth.test", "third.test", "second.test", kName))); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT( + results.value(), + UnorderedElementsAre( + Pointee(ExpectHostResolverInternalAliasResult( + kName, DnsQueryType::A, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "second.test")), + Pointee(ExpectHostResolverInternalAliasResult( + "second.test", DnsQueryType::A, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "third.test")), + Pointee(ExpectHostResolverInternalAliasResult( + "third.test", DnsQueryType::A, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "fourth.test")), + Pointee(ExpectHostResolverInternalDataResult( + "fourth.test", DnsQueryType::A, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + ElementsAre(expected_endpoint))))); } -TEST(DnsResponseResultExtractorTest, HandlesReverseOrderCnameChain) { +TEST_F(DnsResponseResultExtractorTest, HandlesReverseOrderCnameChain) { constexpr char kName[] = "first.test"; DnsResponse response = @@ -1542,20 +1653,37 @@ BuildTestCnameRecord("third.test", "fourth.test"), BuildTestCnameRecord("second.test", "third.test"), BuildTestCnameRecord(kName, "second.test")}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::TXT, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::TXT, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); - EXPECT_THAT(results.text_records(), - testing::Optional(testing::ElementsAre("foo"))); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT( + results.value(), + UnorderedElementsAre( + Pointee(ExpectHostResolverInternalAliasResult( + kName, DnsQueryType::TXT, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "second.test")), + Pointee(ExpectHostResolverInternalAliasResult( + "second.test", DnsQueryType::TXT, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "third.test")), + Pointee(ExpectHostResolverInternalAliasResult( + "third.test", DnsQueryType::TXT, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "fourth.test")), + Pointee(ExpectHostResolverInternalDataResult( + "fourth.test", DnsQueryType::TXT, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + /*endpoints_matcher=*/IsEmpty(), ElementsAre("foo"))))); } -TEST(DnsResponseResultExtractorTest, HandlesReverseOrderCnameChainTypeA) { +TEST_F(DnsResponseResultExtractorTest, HandlesReverseOrderCnameChainTypeA) { constexpr char kName[] = "first.test"; const IPAddress kExpected(192, 168, 0, 1); @@ -1567,25 +1695,37 @@ BuildTestCnameRecord("third.test", "fourth.test"), BuildTestCnameRecord("second.test", "third.test"), BuildTestCnameRecord(kName, "second.test")}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::A, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::A, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); - EXPECT_THAT(results.GetEndpoints(), - testing::Optional(testing::ElementsAre(ExpectEndpointResult( - testing::ElementsAre(expected_endpoint))))); - - EXPECT_THAT(results.aliases(), - testing::Pointee(testing::UnorderedElementsAre( - "fourth.test", "third.test", "second.test", kName))); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT( + results.value(), + UnorderedElementsAre( + Pointee(ExpectHostResolverInternalAliasResult( + kName, DnsQueryType::A, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "second.test")), + Pointee(ExpectHostResolverInternalAliasResult( + "second.test", DnsQueryType::A, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "third.test")), + Pointee(ExpectHostResolverInternalAliasResult( + "third.test", DnsQueryType::A, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "fourth.test")), + Pointee(ExpectHostResolverInternalDataResult( + "fourth.test", DnsQueryType::A, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + ElementsAre(expected_endpoint))))); } -TEST(DnsResponseResultExtractorTest, HandlesArbitraryOrderCnameChain) { +TEST_F(DnsResponseResultExtractorTest, HandlesArbitraryOrderCnameChain) { constexpr char kName[] = "first.test"; DnsResponse response = @@ -1594,20 +1734,37 @@ BuildTestTextRecord("fourth.test", {"foo"}), BuildTestCnameRecord("third.test", "fourth.test"), BuildTestCnameRecord(kName, "second.test")}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::TXT, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::TXT, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); - EXPECT_THAT(results.text_records(), - testing::Optional(testing::ElementsAre("foo"))); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT( + results.value(), + UnorderedElementsAre( + Pointee(ExpectHostResolverInternalAliasResult( + kName, DnsQueryType::TXT, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "second.test")), + Pointee(ExpectHostResolverInternalAliasResult( + "second.test", DnsQueryType::TXT, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "third.test")), + Pointee(ExpectHostResolverInternalAliasResult( + "third.test", DnsQueryType::TXT, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "fourth.test")), + Pointee(ExpectHostResolverInternalDataResult( + "fourth.test", DnsQueryType::TXT, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + /*endpoints_matcher=*/IsEmpty(), ElementsAre("foo"))))); } -TEST(DnsResponseResultExtractorTest, HandlesArbitraryOrderCnameChainTypeA) { +TEST_F(DnsResponseResultExtractorTest, HandlesArbitraryOrderCnameChainTypeA) { constexpr char kName[] = "first.test"; const IPAddress kExpected(192, 168, 0, 1); @@ -1621,25 +1778,38 @@ BuildTestAddressRecord("zfourth.test", kExpected), BuildTestCnameRecord("athird.test", "zfourth.test"), BuildTestCnameRecord(kName, "qsecond.test")}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::A, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::A, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); - EXPECT_THAT(results.GetEndpoints(), - testing::Optional(testing::ElementsAre(ExpectEndpointResult( - testing::ElementsAre(expected_endpoint))))); - - EXPECT_THAT(results.aliases(), - testing::Pointee(testing::UnorderedElementsAre( - "zfourth.test", "athird.test", "qsecond.test", kName))); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT( + results.value(), + UnorderedElementsAre( + Pointee(ExpectHostResolverInternalAliasResult( + kName, DnsQueryType::A, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "qsecond.test")), + Pointee(ExpectHostResolverInternalAliasResult( + "qsecond.test", DnsQueryType::A, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "athird.test")), + Pointee(ExpectHostResolverInternalAliasResult( + "athird.test", DnsQueryType::A, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "zfourth.test")), + Pointee(ExpectHostResolverInternalDataResult( + "zfourth.test", DnsQueryType::A, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + ElementsAre(expected_endpoint))))); } -TEST(DnsResponseResultExtractorTest, IgnoresNonResultTypesMixedWithCnameChain) { +TEST_F(DnsResponseResultExtractorTest, + IgnoresNonResultTypesMixedWithCnameChain) { constexpr char kName[] = "first.test"; DnsResponse response = BuildTestDnsResponse( @@ -1650,23 +1820,38 @@ BuildTestAddressRecord("third.test", IPAddress(1, 2, 3, 4)), BuildTestCnameRecord(kName, "second.test"), BuildTestAddressRecord("fourth.test", IPAddress(2, 3, 4, 5))}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::TXT, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::TXT, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); - EXPECT_THAT(results.text_records(), - testing::Optional(testing::ElementsAre("foo"))); - EXPECT_FALSE(results.GetEndpoints()); - EXPECT_FALSE(results.aliases()); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT( + results.value(), + UnorderedElementsAre( + Pointee(ExpectHostResolverInternalAliasResult( + kName, DnsQueryType::TXT, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "second.test")), + Pointee(ExpectHostResolverInternalAliasResult( + "second.test", DnsQueryType::TXT, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "third.test")), + Pointee(ExpectHostResolverInternalAliasResult( + "third.test", DnsQueryType::TXT, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "fourth.test")), + Pointee(ExpectHostResolverInternalDataResult( + "fourth.test", DnsQueryType::TXT, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + /*endpoints_matcher=*/IsEmpty(), ElementsAre("foo"))))); } -TEST(DnsResponseResultExtractorTest, - IgnoresNonResultTypesMixedWithCnameChainTypeA) { +TEST_F(DnsResponseResultExtractorTest, + IgnoresNonResultTypesMixedWithCnameChainTypeA) { constexpr char kName[] = "first.test"; const IPAddress kExpected(192, 168, 0, 1); @@ -1679,26 +1864,37 @@ BuildTestCnameRecord("third.test", "fourth.test"), BuildTestCnameRecord(kName, "second.test"), BuildTestAddressRecord("fourth.test", kExpected)}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::A, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::A, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); - EXPECT_FALSE(results.text_records()); - EXPECT_THAT(results.GetEndpoints(), - testing::Optional(testing::ElementsAre(ExpectEndpointResult( - testing::ElementsAre(expected_endpoint))))); - - EXPECT_THAT(results.aliases(), - testing::Pointee(testing::UnorderedElementsAre( - "fourth.test", "third.test", "second.test", kName))); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT( + results.value(), + UnorderedElementsAre( + Pointee(ExpectHostResolverInternalAliasResult( + kName, DnsQueryType::A, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "second.test")), + Pointee(ExpectHostResolverInternalAliasResult( + "second.test", DnsQueryType::A, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "third.test")), + Pointee(ExpectHostResolverInternalAliasResult( + "third.test", DnsQueryType::A, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "fourth.test")), + Pointee(ExpectHostResolverInternalDataResult( + "fourth.test", DnsQueryType::A, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + ElementsAre(expected_endpoint))))); } -TEST(DnsResponseResultExtractorTest, HandlesCnameChainWithoutResult) { +TEST_F(DnsResponseResultExtractorTest, HandlesCnameChainWithoutResult) { constexpr char kName[] = "first.test"; DnsResponse response = @@ -1706,19 +1902,32 @@ {BuildTestCnameRecord("second.test", "third.test"), BuildTestCnameRecord("third.test", "fourth.test"), BuildTestCnameRecord(kName, "second.test")}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::TXT, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::TXT, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_THAT(results.text_records(), testing::Optional(testing::IsEmpty())); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT( + results.value(), + UnorderedElementsAre( + Pointee(ExpectHostResolverInternalAliasResult( + kName, DnsQueryType::TXT, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "second.test")), + Pointee(ExpectHostResolverInternalAliasResult( + "second.test", DnsQueryType::TXT, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "third.test")), + Pointee(ExpectHostResolverInternalAliasResult( + "third.test", DnsQueryType::TXT, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "fourth.test")))); } -TEST(DnsResponseResultExtractorTest, HandlesCnameChainWithoutResultTypeA) { +TEST_F(DnsResponseResultExtractorTest, HandlesCnameChainWithoutResultTypeA) { constexpr char kName[] = "first.test"; DnsResponse response = @@ -1726,23 +1935,32 @@ {BuildTestCnameRecord("second.test", "third.test"), BuildTestCnameRecord("third.test", "fourth.test"), BuildTestCnameRecord(kName, "second.test")}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::A, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::A, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_THAT(results.GetEndpoints(), testing::Optional(testing::IsEmpty())); - - EXPECT_THAT(results.aliases(), - testing::Pointee(testing::UnorderedElementsAre( - "fourth.test", "third.test", "second.test", kName))); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT( + results.value(), + UnorderedElementsAre( + Pointee(ExpectHostResolverInternalAliasResult( + kName, DnsQueryType::A, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "second.test")), + Pointee(ExpectHostResolverInternalAliasResult( + "second.test", DnsQueryType::A, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "third.test")), + Pointee(ExpectHostResolverInternalAliasResult( + "third.test", DnsQueryType::A, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "fourth.test")))); } -TEST(DnsResponseResultExtractorTest, RejectsCnameChainWithLoop) { +TEST_F(DnsResponseResultExtractorTest, RejectsCnameChainWithLoop) { constexpr char kName[] = "first.test"; DnsResponse response = @@ -1751,18 +1969,17 @@ BuildTestTextRecord("third.test", {"foo"}), BuildTestCnameRecord("third.test", "second.test"), BuildTestCnameRecord(kName, "second.test")}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::TXT, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kBadAliasChain); - - EXPECT_THAT(results.error(), test::IsError(ERR_DNS_MALFORMED_RESPONSE)); + EXPECT_EQ(extractor + .ExtractDnsResults(DnsQueryType::TXT, + /*original_domain_name=*/kName, + /*request_port=*/0) + .error_or(ExtractionError::kOk), + ExtractionError::kBadAliasChain); } -TEST(DnsResponseResultExtractorTest, RejectsCnameChainWithLoopToBeginning) { +TEST_F(DnsResponseResultExtractorTest, RejectsCnameChainWithLoopToBeginning) { constexpr char kName[] = "first.test"; DnsResponse response = @@ -1771,19 +1988,18 @@ BuildTestTextRecord("third.test", {"foo"}), BuildTestCnameRecord("third.test", "first.test"), BuildTestCnameRecord(kName, "second.test")}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::TXT, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kBadAliasChain); - - EXPECT_THAT(results.error(), test::IsError(ERR_DNS_MALFORMED_RESPONSE)); + EXPECT_EQ(extractor + .ExtractDnsResults(DnsQueryType::TXT, + /*original_domain_name=*/kName, + /*request_port=*/0) + .error_or(ExtractionError::kOk), + ExtractionError::kBadAliasChain); } -TEST(DnsResponseResultExtractorTest, - RejectsCnameChainWithLoopToBeginningWithoutResult) { +TEST_F(DnsResponseResultExtractorTest, + RejectsCnameChainWithLoopToBeginningWithoutResult) { constexpr char kName[] = "first.test"; DnsResponse response = @@ -1791,18 +2007,17 @@ {BuildTestCnameRecord("second.test", "third.test"), BuildTestCnameRecord("third.test", "first.test"), BuildTestCnameRecord(kName, "second.test")}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::TXT, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kBadAliasChain); - - EXPECT_THAT(results.error(), test::IsError(ERR_DNS_MALFORMED_RESPONSE)); + EXPECT_EQ(extractor + .ExtractDnsResults(DnsQueryType::TXT, + /*original_domain_name=*/kName, + /*request_port=*/0) + .error_or(ExtractionError::kOk), + ExtractionError::kBadAliasChain); } -TEST(DnsResponseResultExtractorTest, RejectsCnameChainWithWrongStart) { +TEST_F(DnsResponseResultExtractorTest, RejectsCnameChainWithWrongStart) { constexpr char kName[] = "test.test"; DnsResponse response = @@ -1811,18 +2026,17 @@ BuildTestTextRecord("fourth.test", {"foo"}), BuildTestCnameRecord("third.test", "fourth.test"), BuildTestCnameRecord("first.test", "second.test")}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::TXT, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kBadAliasChain); - - EXPECT_THAT(results.error(), test::IsError(ERR_DNS_MALFORMED_RESPONSE)); + EXPECT_EQ(extractor + .ExtractDnsResults(DnsQueryType::TXT, + /*original_domain_name=*/kName, + /*request_port=*/0) + .error_or(ExtractionError::kOk), + ExtractionError::kBadAliasChain); } -TEST(DnsResponseResultExtractorTest, RejectsCnameChainWithWrongResultName) { +TEST_F(DnsResponseResultExtractorTest, RejectsCnameChainWithWrongResultName) { constexpr char kName[] = "first.test"; DnsResponse response = @@ -1831,18 +2045,17 @@ BuildTestTextRecord("third.test", {"foo"}), BuildTestCnameRecord("third.test", "fourth.test"), BuildTestCnameRecord(kName, "second.test")}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::TXT, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kNameMismatch); - - EXPECT_THAT(results.error(), test::IsError(ERR_DNS_MALFORMED_RESPONSE)); + EXPECT_EQ(extractor + .ExtractDnsResults(DnsQueryType::TXT, + /*original_domain_name=*/kName, + /*request_port=*/0) + .error_or(ExtractionError::kOk), + ExtractionError::kNameMismatch); } -TEST(DnsResponseResultExtractorTest, RejectsCnameSharedWithResult) { +TEST_F(DnsResponseResultExtractorTest, RejectsCnameSharedWithResult) { constexpr char kName[] = "first.test"; DnsResponse response = @@ -1851,18 +2064,17 @@ BuildTestTextRecord(kName, {"foo"}), BuildTestCnameRecord("third.test", "fourth.test"), BuildTestCnameRecord(kName, "second.test")}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::TXT, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kNameMismatch); - - EXPECT_THAT(results.error(), test::IsError(ERR_DNS_MALFORMED_RESPONSE)); + EXPECT_EQ(extractor + .ExtractDnsResults(DnsQueryType::TXT, + /*original_domain_name=*/kName, + /*request_port=*/0) + .error_or(ExtractionError::kOk), + ExtractionError::kNameMismatch); } -TEST(DnsResponseResultExtractorTest, RejectsDisjointCnameChain) { +TEST_F(DnsResponseResultExtractorTest, RejectsDisjointCnameChain) { constexpr char kName[] = "first.test"; DnsResponse response = BuildTestDnsResponse( @@ -1873,18 +2085,17 @@ BuildTestCnameRecord("other1.test", "other2.test"), BuildTestCnameRecord(kName, "second.test"), BuildTestCnameRecord("other2.test", "other3.test")}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::TXT, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kBadAliasChain); - - EXPECT_THAT(results.error(), test::IsError(ERR_DNS_MALFORMED_RESPONSE)); + EXPECT_EQ(extractor + .ExtractDnsResults(DnsQueryType::TXT, + /*original_domain_name=*/kName, + /*request_port=*/0) + .error_or(ExtractionError::kOk), + ExtractionError::kBadAliasChain); } -TEST(DnsResponseResultExtractorTest, RejectsDoubledCnames) { +TEST_F(DnsResponseResultExtractorTest, RejectsDoubledCnames) { constexpr char kName[] = "first.test"; DnsResponse response = @@ -1894,18 +2105,17 @@ BuildTestCnameRecord("third.test", "fourth.test"), BuildTestCnameRecord("third.test", "fifth.test"), BuildTestCnameRecord(kName, "second.test")}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::TXT, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kMultipleCnames); - - EXPECT_THAT(results.error(), test::IsError(ERR_DNS_MALFORMED_RESPONSE)); + EXPECT_EQ(extractor + .ExtractDnsResults(DnsQueryType::TXT, + /*original_domain_name=*/kName, + /*request_port=*/0) + .error_or(ExtractionError::kOk), + ExtractionError::kMultipleCnames); } -TEST(DnsResponseResultExtractorTest, IgnoresTtlFromNonResultType) { +TEST_F(DnsResponseResultExtractorTest, IgnoresTtlFromNonResultType) { constexpr char kName[] = "name.test"; constexpr base::TimeDelta kMinTtl = base::Minutes(4); @@ -1915,42 +2125,48 @@ BuildTestTextRecord(kName, {"bar"}, kMinTtl), BuildTestAddressRecord(kName, IPAddress(1, 2, 3, 4), base::Seconds(2)), BuildTestTextRecord(kName, {"baz"}, base::Minutes(15))}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::TXT, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::TXT, + /*original_domain_name=*/kName, + /*request_port=*/0); - ASSERT_TRUE(results.has_ttl()); - EXPECT_EQ(results.ttl(), kMinTtl); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT( + results.value(), + ElementsAre(Pointee(ExpectHostResolverInternalDataResult( + kName, DnsQueryType::TXT, kDnsSource, + Eq(tick_clock_.NowTicks() + kMinTtl), Eq(clock_.Now() + kMinTtl), + /*endpoints_matcher=*/IsEmpty(), + UnorderedElementsAre("foo", "bar", "baz"))))); } -TEST(DnsResponseResultExtractorTest, ExtractsTtlFromCname) { +TEST_F(DnsResponseResultExtractorTest, ExtractsTtlFromCname) { constexpr char kName[] = "name.test"; constexpr char kAlias[] = "alias.test"; - constexpr base::TimeDelta kMinTtl = base::Minutes(4); + constexpr base::TimeDelta kTtl = base::Minutes(4); - DnsResponse response = BuildTestDnsResponse( - "name.test", dns_protocol::kTypeTXT, - {BuildTestTextRecord(kAlias, {"foo"}, base::Hours(3)), - BuildTestTextRecord(kAlias, {"bar"}, base::Hours(2)), - BuildTestTextRecord(kAlias, {"baz"}, base::Minutes(15)), - BuildTestCnameRecord(kName, kAlias, kMinTtl)}); - DnsResponseResultExtractor extractor(&response); + DnsResponse response = + BuildTestDnsResponse("name.test", dns_protocol::kTypeTXT, + {BuildTestCnameRecord(kName, kAlias, kTtl)}); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::TXT, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::TXT, + /*original_domain_name=*/kName, + /*request_port=*/0); - ASSERT_TRUE(results.has_ttl()); - EXPECT_EQ(results.ttl(), kMinTtl); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT( + results.value(), + UnorderedElementsAre(Pointee(ExpectHostResolverInternalAliasResult( + kName, DnsQueryType::TXT, kDnsSource, + Eq(tick_clock_.NowTicks() + kTtl), Eq(clock_.Now() + kTtl), + kAlias)))); } -TEST(DnsResponseResultExtractorTest, ValidatesAliasNames) { +TEST_F(DnsResponseResultExtractorTest, ValidatesAliasNames) { constexpr char kName[] = "first.test"; const IPAddress kExpected(192, 168, 0, 1); @@ -1962,32 +2178,24 @@ BuildTestCnameRecord("second.test", "localhost"), BuildTestCnameRecord("localhost", "fourth.test"), BuildTestAddressRecord("fourth.test", kExpected)}); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::A, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); - - EXPECT_THAT(results.error(), test::IsOk()); - EXPECT_THAT(results.GetEndpoints(), - testing::Optional(testing::ElementsAre(ExpectEndpointResult( - testing::ElementsAre(expected_endpoint))))); - - // Expect "localhost" to be validated out of the alias list. - EXPECT_THAT(results.aliases(), testing::Pointee(testing::UnorderedElementsAre( - "fourth.test", "second.test", kName))); + EXPECT_EQ(extractor + .ExtractDnsResults(DnsQueryType::A, + /*original_domain_name=*/kName, + /*request_port=*/0) + .error_or(ExtractionError::kOk), + ExtractionError::kMalformedRecord); } -TEST(DnsResponseResultExtractorTest, CanonicalizesAliasNames) { +TEST_F(DnsResponseResultExtractorTest, CanonicalizesAliasNames) { const IPAddress kExpected(192, 168, 0, 1); constexpr char kName[] = "address.test"; constexpr char kCname[] = "\005ALIAS\004test\000"; // Need to build records directly in order to manually encode alias target - // name because BuildTestDnsAddressResponseWithCname() uses DNSDomainFromDot() - // which does not support non-URL-canonicalized names. + // name because BuildTestDnsAddressResponseWithCname() uses + // DNSDomainFromDot() which does not support non-URL-canonicalized names. std::vector<DnsResourceRecord> answers = { BuildTestDnsRecord(kName, dns_protocol::kTypeCNAME, std::string(kCname, sizeof(kCname) - 1)), @@ -1995,21 +2203,26 @@ DnsResponse response = BuildTestDnsResponse(kName, dns_protocol::kTypeA, answers); - DnsResponseResultExtractor extractor(&response); + DnsResponseResultExtractor extractor(response, clock_, tick_clock_); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - EXPECT_EQ(extractor.ExtractDnsResults(DnsQueryType::A, - /*original_domain_name=*/kName, - /*request_port=*/0, &results), - DnsResponseResultExtractor::ExtractionError::kOk); + ResultsOrError results = + extractor.ExtractDnsResults(DnsQueryType::A, + /*original_domain_name=*/kName, + /*request_port=*/0); - EXPECT_THAT(results.error(), test::IsOk()); - IPEndPoint expected_endpoint(kExpected, 0 /* port */); - EXPECT_THAT(results.GetEndpoints(), - testing::Optional(testing::ElementsAre(ExpectEndpointResult( - testing::ElementsAre(expected_endpoint))))); - EXPECT_THAT(results.aliases(), testing::Pointee(testing::UnorderedElementsAre( - kName, "alias.test"))); + ASSERT_TRUE(results.has_value()); + EXPECT_THAT( + results.value(), + UnorderedElementsAre( + Pointee(ExpectHostResolverInternalAliasResult( + kName, DnsQueryType::A, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), "alias.test")), + Pointee(ExpectHostResolverInternalDataResult( + "alias.test", DnsQueryType::A, kDnsSource, + /*expiration_matcher=*/Ne(absl::nullopt), + /*timed_expiration_matcher=*/Ne(absl::nullopt), + ElementsAre(IPEndPoint(kExpected, /*port=*/0)))))); } } // namespace
diff --git a/net/dns/dns_transaction.cc b/net/dns/dns_transaction.cc index 8ad7ca21..d89174b 100644 --- a/net/dns/dns_transaction.cc +++ b/net/dns/dns_transaction.cc
@@ -57,6 +57,7 @@ #include "net/dns/dns_udp_tracker.h" #include "net/dns/dns_util.h" #include "net/dns/host_cache.h" +#include "net/dns/host_resolver_internal_result.h" #include "net/dns/public/dns_over_https_config.h" #include "net/dns/public/dns_over_https_server_config.h" #include "net/dns/public/dns_protocol.h" @@ -1078,31 +1079,36 @@ probe_stats->probe_attempts[attempt_number].get(); const DnsResponse* response = attempt->GetResponse(); if (response) { - DnsResponseResultExtractor extractor(response); - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - DnsResponseResultExtractor::ExtractionError extraction_error = + DnsResponseResultExtractor extractor(*response); + DnsResponseResultExtractor::ResultsOrError results = extractor.ExtractDnsResults( DnsQueryType::A, /*original_domain_name=*/kDohProbeHostname, - /*request_port=*/0, &results); + /*request_port=*/0); - if (extraction_error == - DnsResponseResultExtractor::ExtractionError::kOk && - results.ip_endpoints() && !results.ip_endpoints()->empty()) { - // The DoH probe queries don't go through the standard DnsAttempt - // path, so the ServerStats have not been updated yet. - context_->RecordServerSuccess( - doh_server_index, true /* is_doh_server */, session_.get()); - context_->RecordRtt(doh_server_index, true /* is_doh_server */, - base::TimeTicks::Now() - query_start_time, rv, - session_.get()); - success = true; + if (!results.has_value()) { + return; + } - // Do not delete the ProbeStats and cancel the probe sequence. It will - // cancel itself on the next scheduled ContinueProbe() call if the - // server is still available. This way, the backoff schedule will be - // maintained if a server quickly becomes unavailable again before - // that scheduled call. + for (const auto& result : results.value()) { + if (result->type() == HostResolverInternalResult::Type::kData && + !result->AsData().endpoints().empty()) { + // The DoH probe queries don't go through the standard DnsAttempt + // path, so the ServerStats have not been updated yet. + context_->RecordServerSuccess( + doh_server_index, /*is_doh_server=*/true, session_.get()); + context_->RecordRtt(doh_server_index, /*is_doh_server=*/true, + base::TimeTicks::Now() - query_start_time, rv, + session_.get()); + success = true; + + // Do not delete the ProbeStats and cancel the probe sequence. It + // will cancel itself on the next scheduled ContinueProbe() call if + // the server is still available. This way, the backoff schedule + // will be maintained if a server quickly becomes unavailable again + // before that scheduled call. + return; + } } } }
diff --git a/net/dns/host_cache.cc b/net/dns/host_cache.cc index bbdae25..2a20476 100644 --- a/net/dns/host_cache.cc +++ b/net/dns/host_cache.cc
@@ -9,6 +9,7 @@ #include <map> #include <memory> #include <ostream> +#include <set> #include <string> #include <type_traits> #include <unordered_set> @@ -142,37 +143,27 @@ bool IPEndPointsFromLegacyAddressListValue( const base::Value::List& value, - absl::optional<std::vector<IPEndPoint>>* ip_endpoints) { - ip_endpoints->emplace(); + std::vector<IPEndPoint>& ip_endpoints) { + DCHECK(ip_endpoints.empty()); for (const auto& it : value) { IPAddress address; const std::string* addr_string = it.GetIfString(); if (!addr_string || !address.AssignFromIPLiteral(*addr_string)) { return false; } - ip_endpoints->value().emplace_back(address, 0); + ip_endpoints.emplace_back(address, 0); } return true; } template <typename T> -void MergeLists(absl::optional<T>* target, const absl::optional<T>& source) { - if (target->has_value() && source) { - target->value().insert(target->value().end(), source.value().begin(), - source.value().end()); - } else if (source) { - *target = source; - } +void MergeLists(T& target, const T& source) { + target.insert(target.end(), source.begin(), source.end()); } template <typename T> -void MergeContainers(absl::optional<T>& target, - const absl::optional<T>& source) { - if (target.has_value() && source.has_value()) { - target->insert(source->begin(), source->end()); - } else if (source) { - target = source; - } +void MergeContainers(T& target, const T& source) { + target.insert(source.begin(), source.end()); } // Used to reject empty and IP literal (whether or not surrounded by brackets) @@ -278,9 +269,10 @@ } HostCache::Entry::Entry( - std::vector<std::unique_ptr<HostResolverInternalResult>> results, + std::set<std::unique_ptr<HostResolverInternalResult>> results, base::Time now, - base::TimeTicks now_ticks) { + base::TimeTicks now_ticks, + Source empty_source) { std::unique_ptr<HostResolverInternalResult> data_result; std::unique_ptr<HostResolverInternalResult> metadata_result; std::unique_ptr<HostResolverInternalResult> error_result; @@ -288,7 +280,12 @@ absl::optional<base::TimeDelta> smallest_ttl; absl::optional<Source> source; - for (auto& result : results) { + for (auto it = results.cbegin(); it != results.cend();) { + // Increment iterator now to allow extracting `result` (std::set::extract() + // is guaranteed to not invalidate any iterators except those pointing to + // the extracted value). + const std::unique_ptr<HostResolverInternalResult>& result = *it++; + if (result->expiration().has_value()) { smallest_ttl = std::min(smallest_ttl.value_or(base::TimeDelta::Max()), result->expiration().value() - now_ticks); @@ -314,18 +311,18 @@ switch (result->type()) { case HostResolverInternalResult::Type::kData: DCHECK(!data_result); // Expect at most one data result. - data_result = std::move(result); + data_result = std::move(results.extract(result).value()); break; case HostResolverInternalResult::Type::kMetadata: DCHECK(!metadata_result); // Expect at most one metadata result. - metadata_result = std::move(result); + metadata_result = std::move(results.extract(result).value()); break; case HostResolverInternalResult::Type::kError: DCHECK(!error_result); // Expect at most one error result. - error_result = std::move(result); + error_result = std::move(results.extract(result).value()); break; case HostResolverInternalResult::Type::kAlias: - alias_results.push_back(std::move(result)); + alias_results.push_back(std::move(results.extract(result).value())); break; } @@ -335,7 +332,7 @@ } ttl_ = smallest_ttl.value_or(kUnknownTtl); - source_ = source.value_or(SOURCE_UNKNOWN); + source_ = source.value_or(empty_source); if (error_result) { DCHECK(!data_result); @@ -372,12 +369,11 @@ hostnames_ = data_result->AsData().hosts(); canonical_names_ = {data_result->domain_name()}; - aliases_.emplace(); for (const auto& alias_result : alias_results) { - aliases_.value().insert(alias_result->domain_name()); - aliases_.value().insert(alias_result->AsAlias().alias_target()); + aliases_.insert(alias_result->domain_name()); + aliases_.insert(alias_result->AsAlias().alias_target()); } - aliases_.value().insert(data_result->domain_name()); + aliases_.insert(data_result->domain_name()); } if (metadata_result) { DCHECK(!error_result); @@ -391,8 +387,9 @@ // receiving a compatible HTTPS record. https_record_compatibility_ = std::vector<bool>{true}; - if (endpoint_metadatas_.value().empty()) + if (endpoint_metadatas_.empty()) { error_ = ERR_NAME_NOT_RESOLVED; + } } } @@ -402,48 +399,40 @@ HostCache::Entry::~Entry() = default; -absl::optional<std::vector<HostResolverEndpointResult>> -HostCache::Entry::GetEndpoints() const { - if (!ip_endpoints_.has_value()) - return absl::nullopt; - +std::vector<HostResolverEndpointResult> HostCache::Entry::GetEndpoints() const { std::vector<HostResolverEndpointResult> endpoints; - if (ip_endpoints_.value().empty()) + if (ip_endpoints_.empty()) { return endpoints; - absl::optional<std::vector<ConnectionEndpointMetadata>> metadatas = - GetMetadatas(); + } - if (metadatas.has_value() && canonical_names_ && - (canonical_names_->size() == 1)) { + std::vector<ConnectionEndpointMetadata> metadatas = GetMetadatas(); + + if (!metadatas.empty() && canonical_names_.size() == 1) { // Currently Chrome uses HTTPS records only when A and AAAA records are at // the same canonical name and that matches the HTTPS target name. - for (ConnectionEndpointMetadata& metadata : metadatas.value()) { - if (canonical_names_->find(metadata.target_name) == - canonical_names_->end()) { + for (ConnectionEndpointMetadata& metadata : metadatas) { + if (canonical_names_.find(metadata.target_name) == + canonical_names_.end()) { continue; } endpoints.emplace_back(); - endpoints.back().ip_endpoints = ip_endpoints_.value(); + endpoints.back().ip_endpoints = ip_endpoints_; endpoints.back().metadata = std::move(metadata); } } - // Add a final non-protocol endpoint at the end. + // Add a final non-alternative endpoint at the end. endpoints.emplace_back(); - endpoints.back().ip_endpoints = ip_endpoints_.value(); + endpoints.back().ip_endpoints = ip_endpoints_; return endpoints; } -absl::optional<std::vector<ConnectionEndpointMetadata>> -HostCache::Entry::GetMetadatas() const { - if (!endpoint_metadatas_.has_value()) - return absl::nullopt; - +std::vector<ConnectionEndpointMetadata> HostCache::Entry::GetMetadatas() const { std::vector<ConnectionEndpointMetadata> metadatas; HttpsRecordPriority last_priority = 0; - for (const auto& metadata : endpoint_metadatas_.value()) { + for (const auto& metadata : endpoint_metadatas_) { // Ensure metadatas are iterated in priority order. DCHECK_GE(metadata.first, last_priority); last_priority = metadata.first; @@ -472,12 +461,12 @@ front.error_ = front.error() == OK || back.error() == OK ? OK : ERR_NAME_NOT_RESOLVED; - MergeLists(&front.ip_endpoints_, back.ip_endpoints_); + MergeLists(front.ip_endpoints_, back.ip_endpoints_); MergeContainers(front.endpoint_metadatas_, back.endpoint_metadatas_); MergeContainers(front.aliases_, back.aliases_); - MergeLists(&front.text_records_, back.text_records()); - MergeLists(&front.hostnames_, back.hostnames()); - MergeLists(&front.https_record_compatibility_, + MergeLists(front.text_records_, back.text_records()); + MergeLists(front.hostnames_, back.hostnames()); + MergeLists(front.https_record_compatibility_, back.https_record_compatibility_); MergeContainers(front.canonical_names_, back.canonical_names_); @@ -503,17 +492,15 @@ HostCache::Entry HostCache::Entry::CopyWithDefaultPort(uint16_t port) const { Entry copy(*this); - if (copy.ip_endpoints_) { - for (IPEndPoint& endpoint : copy.ip_endpoints_.value()) { - if (endpoint.port() == 0) - endpoint = IPEndPoint(endpoint.address(), port); + for (IPEndPoint& endpoint : copy.ip_endpoints_) { + if (endpoint.port() == 0) { + endpoint = IPEndPoint(endpoint.address(), port); } } - if (copy.hostnames_) { - for (HostPortPair& hostname : copy.hostnames_.value()) { - if (hostname.port() == 0) - hostname = HostPortPair(hostname.host(), port); + for (HostPortPair& hostname : copy.hostnames_) { + if (hostname.port() == 0) { + hostname = HostPortPair(hostname.host(), port); } } @@ -544,7 +531,7 @@ : error_(entry.error()), ip_endpoints_(entry.ip_endpoints_), endpoint_metadatas_(entry.endpoint_metadatas_), - aliases_(base::OptionalFromPtr(entry.aliases())), + aliases_(entry.aliases()), text_records_(entry.text_records()), hostnames_(entry.hostnames()), https_record_compatibility_(entry.https_record_compatibility_), @@ -557,14 +544,13 @@ HostCache::Entry::Entry( int error, - absl::optional<std::vector<IPEndPoint>> ip_endpoints, - absl::optional< - std::multimap<HttpsRecordPriority, ConnectionEndpointMetadata>> + std::vector<IPEndPoint> ip_endpoints, + std::multimap<HttpsRecordPriority, ConnectionEndpointMetadata> endpoint_metadatas, - absl::optional<std::set<std::string>> aliases, - absl::optional<std::vector<std::string>>&& text_records, - absl::optional<std::vector<HostPortPair>>&& hostnames, - absl::optional<std::vector<bool>>&& https_record_compatibility, + std::set<std::string> aliases, + std::vector<std::string>&& text_records, + std::vector<HostPortPair>&& hostnames, + std::vector<bool>&& https_record_compatibility, Source source, base::TimeTicks expires, int network_changes) @@ -580,7 +566,7 @@ network_changes_(network_changes) {} void HostCache::Entry::PrepareForCacheInsertion() { - https_record_compatibility_.reset(); + https_record_compatibility_.clear(); } bool HostCache::Entry::IsStale(base::TimeTicks now, int network_changes) const { @@ -636,58 +622,47 @@ if (error() != OK) { entry_dict.Set(kNetErrorKey, error()); } else { - if (ip_endpoints_) { - base::Value::List ip_endpoints_list; - for (const IPEndPoint& ip_endpoint : ip_endpoints_.value()) { - ip_endpoints_list.Append(IpEndpointToValue(ip_endpoint)); - } - entry_dict.Set(kIpEndpointsKey, std::move(ip_endpoints_list)); + base::Value::List ip_endpoints_list; + for (const IPEndPoint& ip_endpoint : ip_endpoints_) { + ip_endpoints_list.Append(IpEndpointToValue(ip_endpoint)); } + entry_dict.Set(kIpEndpointsKey, std::move(ip_endpoints_list)); - if (endpoint_metadatas_) { - base::Value::List endpoint_metadatas_list; - for (const auto& endpoint_metadata_pair : endpoint_metadatas_.value()) { - endpoint_metadatas_list.Append( - EndpointMetadataPairToValue(endpoint_metadata_pair)); - } - entry_dict.Set(kEndpointMetadatasKey, std::move(endpoint_metadatas_list)); + base::Value::List endpoint_metadatas_list; + for (const auto& endpoint_metadata_pair : endpoint_metadatas_) { + endpoint_metadatas_list.Append( + EndpointMetadataPairToValue(endpoint_metadata_pair)); } + entry_dict.Set(kEndpointMetadatasKey, std::move(endpoint_metadatas_list)); - if (aliases()) { - base::Value::List alias_list; - for (const std::string& alias : *aliases()) { - alias_list.Append(alias); - } - entry_dict.Set(kAliasesKey, std::move(alias_list)); + base::Value::List alias_list; + for (const std::string& alias : aliases()) { + alias_list.Append(alias); } + entry_dict.Set(kAliasesKey, std::move(alias_list)); - if (text_records()) { - // Append all resolved text records. - base::Value::List text_list_value; - for (const std::string& text_record : text_records().value()) { - text_list_value.Append(text_record); - } - entry_dict.Set(kTextRecordsKey, std::move(text_list_value)); + // Append all resolved text records. + base::Value::List text_list_value; + for (const std::string& text_record : text_records()) { + text_list_value.Append(text_record); } + entry_dict.Set(kTextRecordsKey, std::move(text_list_value)); - if (hostnames()) { - // Append all the resolved hostnames. - base::Value::List hostnames_value; - base::Value::List host_ports_value; - for (const HostPortPair& hostname : hostnames().value()) { - hostnames_value.Append(hostname.host()); - host_ports_value.Append(hostname.port()); - } - entry_dict.Set(kHostnameResultsKey, std::move(hostnames_value)); - entry_dict.Set(kHostPortsKey, std::move(host_ports_value)); + // Append all the resolved hostnames. + base::Value::List hostnames_value; + base::Value::List host_ports_value; + for (const HostPortPair& hostname : hostnames()) { + hostnames_value.Append(hostname.host()); + host_ports_value.Append(hostname.port()); } - if (canonical_names()) { - base::Value::List canonical_names_list; - for (const std::string& canonical_name : canonical_names().value()) { - canonical_names_list.Append(canonical_name); - } - entry_dict.Set(kCanonicalNamesKey, std::move(canonical_names_list)); + entry_dict.Set(kHostnameResultsKey, std::move(hostnames_value)); + entry_dict.Set(kHostPortsKey, std::move(host_ports_value)); + + base::Value::List canonical_names_list; + for (const std::string& canonical_name : canonical_names()) { + canonical_names_list.Append(canonical_name); } + entry_dict.Set(kCanonicalNamesKey, std::move(canonical_names_list)); } return entry_dict; @@ -1071,23 +1046,20 @@ tick_clock_->NowTicks() - (base::Time::Now() - base::Time::FromInternalValue(time_internal)); - absl::optional<std::vector<IPEndPoint>> ip_endpoints; + std::vector<IPEndPoint> ip_endpoints; if (ip_endpoints_list) { - ip_endpoints.emplace(); for (const base::Value& ip_endpoint_value : *ip_endpoints_list) { absl::optional<IPEndPoint> ip_endpoint = IpEndpointFromValue(ip_endpoint_value); if (!ip_endpoint) return false; - ip_endpoints->push_back(std::move(ip_endpoint).value()); + ip_endpoints.push_back(std::move(ip_endpoint).value()); } } - absl::optional< - std::multimap<HttpsRecordPriority, ConnectionEndpointMetadata>> + std::multimap<HttpsRecordPriority, ConnectionEndpointMetadata> endpoint_metadatas; if (endpoint_metadatas_list) { - endpoint_metadatas.emplace(); for (const base::Value& endpoint_metadata_value : *endpoint_metadatas_list) { absl::optional< @@ -1095,49 +1067,47 @@ pair = EndpointMetadataPairFromValue(endpoint_metadata_value); if (!pair) return false; - endpoint_metadatas->insert(std::move(pair).value()); + endpoint_metadatas.insert(std::move(pair).value()); } } - absl::optional<std::set<std::string>> aliases; + std::set<std::string> aliases; if (aliases_list) { - aliases.emplace(); for (const base::Value& alias_value : *aliases_list) { if (!alias_value.is_string()) return false; - aliases->insert(alias_value.GetString()); + aliases.insert(alias_value.GetString()); } } // `addresses` field was supported until M105. We keep reading this field // for backward compatibility for several milestones. if (legacy_addresses_list) { - if (ip_endpoints) + if (!ip_endpoints.empty()) { return false; + } if (!IPEndPointsFromLegacyAddressListValue(*legacy_addresses_list, - &ip_endpoints)) { + ip_endpoints)) { return false; } } - absl::optional<std::vector<std::string>> text_records; + std::vector<std::string> text_records; if (text_records_list) { - text_records.emplace(); for (const base::Value& value : *text_records_list) { if (!value.is_string()) return false; - text_records.value().push_back(value.GetString()); + text_records.push_back(value.GetString()); } } - absl::optional<std::vector<HostPortPair>> hostname_records; + std::vector<HostPortPair> hostname_records; if (hostname_records_list) { DCHECK(host_ports_list); if (hostname_records_list->size() != host_ports_list->size()) { return false; } - hostname_records.emplace(); for (size_t i = 0; i < hostname_records_list->size(); ++i) { if (!(*hostname_records_list)[i].is_string() || !(*host_ports_list)[i].is_int() || @@ -1145,37 +1115,25 @@ (*host_ports_list)[i].GetInt())) { return false; } - hostname_records.value().emplace_back( + hostname_records.emplace_back( (*hostname_records_list)[i].GetString(), base::checked_cast<uint16_t>((*host_ports_list)[i].GetInt())); } } - absl::optional<std::set<std::string>> canonical_names; + std::set<std::string> canonical_names; if (canonical_names_list) { - canonical_names = std::set<std::string>(); for (const auto& item : *canonical_names_list) { const std::string* name = item.GetIfString(); if (!name) return false; - canonical_names->insert(*name); + canonical_names.insert(*name); } } // We do not intend to serialize experimental results with the host cache. - absl::optional<std::vector<bool>> experimental_results; + std::vector<bool> experimental_results; - // Assume an empty endpoints list and an empty aliases if we have an address - // type and no results. - if (IsAddressType(dns_query_type.value()) && !text_records && - !hostname_records) { - if (!ip_endpoints) { - ip_endpoints.emplace(); - } - if (!aliases) { - aliases.emplace(); - } - } Key key(std::move(host), dns_query_type.value(), flags, static_cast<HostResolverSource>(host_resolver_source), network_anonymization_key);
diff --git a/net/dns/host_cache.h b/net/dns/host_cache.h index f077893d..b38a214c 100644 --- a/net/dns/host_cache.h +++ b/net/dns/host_cache.h
@@ -156,10 +156,13 @@ absl::optional<base::TimeDelta> ttl = absl::nullopt); // Adaptor to construct from HostResolverInternalResults. Only supports - // results extracted from a single DnsTransaction. - Entry(std::vector<std::unique_ptr<HostResolverInternalResult>> results, + // results extracted from a single DnsTransaction. `empty_source` is Source + // to assume if `results` is empty of any results from which Source can be + // read. + Entry(std::set<std::unique_ptr<HostResolverInternalResult>> results, base::Time now, - base::TimeTicks now_ticks); + base::TimeTicks now_ticks, + Source empty_source = SOURCE_UNKNOWN); Entry(const Entry& entry); Entry(Entry&& entry); @@ -193,52 +196,43 @@ error_ != ERR_HOST_RESOLVER_QUEUE_TOO_LARGE; } void set_error(int error) { error_ = error; } - absl::optional<std::vector<HostResolverEndpointResult>> GetEndpoints() - const; - const std::vector<IPEndPoint>* ip_endpoints() const { - return base::OptionalToPtr(ip_endpoints_); + std::vector<HostResolverEndpointResult> GetEndpoints() const; + const std::vector<IPEndPoint>& ip_endpoints() const { + return ip_endpoints_; } - void set_ip_endpoints( - absl::optional<std::vector<IPEndPoint>> ip_endpoints) { + void set_ip_endpoints(std::vector<IPEndPoint> ip_endpoints) { ip_endpoints_ = std::move(ip_endpoints); } - absl::optional<std::vector<ConnectionEndpointMetadata>> GetMetadatas() - const; - void ClearMetadatas() { endpoint_metadatas_.reset(); } - const std::set<std::string>* aliases() const { - return base::OptionalToPtr(aliases_); - } + std::vector<ConnectionEndpointMetadata> GetMetadatas() const; + void ClearMetadatas() { endpoint_metadatas_.clear(); } + const std::set<std::string>& aliases() const { return aliases_; } void set_aliases(std::set<std::string> aliases) { aliases_ = std::move(aliases); } - const absl::optional<std::vector<std::string>>& text_records() const { + const std::vector<std::string>& text_records() const { return text_records_; } - void set_text_records( - absl::optional<std::vector<std::string>> text_records) { + void set_text_records(std::vector<std::string> text_records) { text_records_ = std::move(text_records); } - const absl::optional<std::vector<HostPortPair>>& hostnames() const { - return hostnames_; - } - void set_hostnames(absl::optional<std::vector<HostPortPair>> hostnames) { + const std::vector<HostPortPair>& hostnames() const { return hostnames_; } + void set_hostnames(std::vector<HostPortPair> hostnames) { hostnames_ = std::move(hostnames); } - const std::vector<bool>* https_record_compatibility() const { - return base::OptionalToPtr(https_record_compatibility_); + const std::vector<bool>& https_record_compatibility() const { + return https_record_compatibility_; } void set_https_record_compatibility( - absl::optional<std::vector<bool>> https_record_compatibility) { + std::vector<bool> https_record_compatibility) { https_record_compatibility_ = std::move(https_record_compatibility); } absl::optional<bool> pinning() const { return pinning_; } void set_pinning(absl::optional<bool> pinning) { pinning_ = pinning; } - const absl::optional<std::set<std::string>>& canonical_names() const { + const std::set<std::string>& canonical_names() const { return canonical_names_; } - void set_canonical_names( - absl::optional<std::set<std::string>> canonical_names) { + void set_canonical_names(std::set<std::string> canonical_names) { canonical_names_ = std::move(canonical_names); } @@ -283,14 +277,13 @@ int network_changes); Entry(int error, - absl::optional<std::vector<IPEndPoint>> ip_endpoints, - absl::optional< - std::multimap<HttpsRecordPriority, ConnectionEndpointMetadata>> + std::vector<IPEndPoint> ip_endpoints, + std::multimap<HttpsRecordPriority, ConnectionEndpointMetadata> endpoint_metadatas, - absl::optional<std::set<std::string>> aliases, - absl::optional<std::vector<std::string>>&& text_results, - absl::optional<std::vector<HostPortPair>>&& hostnames, - absl::optional<std::vector<bool>>&& https_record_compatibility, + std::set<std::string> aliases, + std::vector<std::string>&& text_results, + std::vector<HostPortPair>&& hostnames, + std::vector<bool>&& https_record_compatibility, Source source, base::TimeTicks expires, int network_changes); @@ -325,13 +318,12 @@ // The resolve results for this entry. int error_ = ERR_FAILED; - absl::optional<std::vector<IPEndPoint>> ip_endpoints_; - absl::optional< - std::multimap<HttpsRecordPriority, ConnectionEndpointMetadata>> + std::vector<IPEndPoint> ip_endpoints_; + std::multimap<HttpsRecordPriority, ConnectionEndpointMetadata> endpoint_metadatas_; - absl::optional<std::set<std::string>> aliases_; - absl::optional<std::vector<std::string>> text_records_; - absl::optional<std::vector<HostPortPair>> hostnames_; + std::set<std::string> aliases_; + std::vector<std::string> text_records_; + std::vector<HostPortPair> hostnames_; // Bool of whether each HTTPS record received is compatible // (draft-ietf-dnsop-svcb-https-08#section-8), considering alias records to @@ -341,7 +333,7 @@ // successfully received records of that experimental type. // // For either usage, cleared before inserting in cache. - absl::optional<std::vector<bool>> https_record_compatibility_; + std::vector<bool> https_record_compatibility_; // Where results were obtained (e.g. DNS lookup, hosts file, etc). Source source_ = SOURCE_UNKNOWN; @@ -356,7 +348,7 @@ // The final name at the end of the alias chain that was the record name for // the A/AAAA records. - absl::optional<std::set<std::string>> canonical_names_; + std::set<std::string> canonical_names_; // TTL obtained from the nameserver. Negative if unknown. base::TimeDelta ttl_ = kUnknownTtl;
diff --git a/net/dns/host_cache_unittest.cc b/net/dns/host_cache_unittest.cc index 0230c8b8..65d75b7a 100644 --- a/net/dns/host_cache_unittest.cc +++ b/net/dns/host_cache_unittest.cc
@@ -169,13 +169,13 @@ HostCache::Entry::SOURCE_DNS); EXPECT_THAT(entry.GetEndpoints(), - Optional(ElementsAre(ExpectEndpointResult(ip_endpoints)))); + ElementsAre(ExpectEndpointResult(ip_endpoints))); } TEST(HostCacheTest, GetEmptyEndpoints) { HostCache::Entry entry(ERR_NAME_NOT_RESOLVED, /*ip_endpoints=*/{}, /*aliases=*/{}, HostCache::Entry::SOURCE_DNS); - EXPECT_THAT(entry.GetEndpoints(), Optional(IsEmpty())); + EXPECT_THAT(entry.GetEndpoints(), IsEmpty()); } TEST(HostCacheTest, GetEmptyEndpointsWithMetadata) { @@ -194,12 +194,12 @@ auto merged_entry = HostCache::Entry::MergeEntries(entry, metadata_entry); // Result should still be empty. - EXPECT_THAT(merged_entry.GetEndpoints(), Optional(IsEmpty())); + EXPECT_THAT(merged_entry.GetEndpoints(), IsEmpty()); } TEST(HostCacheTest, GetMissingEndpoints) { HostCache::Entry entry(ERR_NAME_NOT_RESOLVED, HostCache::Entry::SOURCE_DNS); - EXPECT_FALSE(entry.GetEndpoints()); + EXPECT_THAT(entry.GetEndpoints(), IsEmpty()); } TEST(HostCacheTest, GetMissingEndpointsWithMetadata) { @@ -216,8 +216,8 @@ auto merged_entry = HostCache::Entry::MergeEntries(entry, metadata_entry); - // Result should still be `nullopt`. - EXPECT_FALSE(merged_entry.GetEndpoints()); + // Result should still be empty. + EXPECT_THAT(merged_entry.GetEndpoints(), IsEmpty()); } // Test that Keys without scheme are allowed and treated as completely different @@ -1011,9 +1011,8 @@ const auto* pair1 = cache.Lookup(key, now); ASSERT_TRUE(pair1); const HostCache::Entry& result1 = pair1->second; - EXPECT_THAT( - result1.GetEndpoints(), - Optional(ElementsAre(ExpectEndpointResult(ElementsAre(endpoint1))))); + EXPECT_THAT(result1.GetEndpoints(), + ElementsAre(ExpectEndpointResult(ElementsAre(endpoint1)))); EXPECT_THAT(result1.pinning(), Optional(true)); // Insert |entry2|, and verify that it when it is retrieved, it @@ -1022,9 +1021,8 @@ const auto* pair2 = cache.Lookup(key, now); ASSERT_TRUE(pair2); const HostCache::Entry& result2 = pair2->second; - EXPECT_THAT( - result2.GetEndpoints(), - Optional(ElementsAre(ExpectEndpointResult(ElementsAre(endpoint2))))); + EXPECT_THAT(result2.GetEndpoints(), + ElementsAre(ExpectEndpointResult(ElementsAre(endpoint2)))); EXPECT_THAT(result2.pinning(), Optional(true)); } @@ -1051,9 +1049,8 @@ const auto* pair1 = cache.Lookup(key, now); ASSERT_TRUE(pair1); const HostCache::Entry& result1 = pair1->second; - EXPECT_THAT( - result1.GetEndpoints(), - Optional(ElementsAre(ExpectEndpointResult(ElementsAre(endpoint1))))); + EXPECT_THAT(result1.GetEndpoints(), + ElementsAre(ExpectEndpointResult(ElementsAre(endpoint1)))); EXPECT_THAT(result1.pinning(), Optional(true)); // Make entry1 obsolete. @@ -1065,9 +1062,8 @@ const auto* pair2 = cache.Lookup(key, now); ASSERT_TRUE(pair2); const HostCache::Entry& result2 = pair2->second; - EXPECT_THAT( - result2.GetEndpoints(), - Optional(ElementsAre(ExpectEndpointResult(ElementsAre(endpoint2))))); + EXPECT_THAT(result2.GetEndpoints(), + ElementsAre(ExpectEndpointResult(ElementsAre(endpoint2)))); EXPECT_THAT(result2.pinning(), Optional(false)); } @@ -1096,9 +1092,8 @@ const auto* pair1 = cache.Lookup(key, now); ASSERT_TRUE(pair1); const HostCache::Entry& result1 = pair1->second; - EXPECT_THAT( - result1.GetEndpoints(), - Optional(ElementsAre(ExpectEndpointResult(ElementsAre(endpoint1))))); + EXPECT_THAT(result1.GetEndpoints(), + ElementsAre(ExpectEndpointResult(ElementsAre(endpoint1)))); EXPECT_THAT(result1.pinning(), Optional(true)); // Insert |entry2|, and verify that it when it is retrieved, it @@ -1107,9 +1102,8 @@ const auto* pair2 = cache.Lookup(key, now); ASSERT_TRUE(pair2); const HostCache::Entry& result2 = pair2->second; - EXPECT_THAT( - result2.GetEndpoints(), - Optional(ElementsAre(ExpectEndpointResult(ElementsAre(endpoint2))))); + EXPECT_THAT(result2.GetEndpoints(), + ElementsAre(ExpectEndpointResult(ElementsAre(endpoint2)))); EXPECT_THAT(result2.pinning(), Optional(false)); } @@ -1511,11 +1505,10 @@ restored_cache.LookupStale(key1, now, &stale); EXPECT_TRUE(result1); EXPECT_TRUE(result1->first.secure); - ASSERT_TRUE(result1->second.ip_endpoints()); - EXPECT_FALSE(result1->second.text_records()); - EXPECT_FALSE(result1->second.hostnames()); - EXPECT_EQ(1u, result1->second.ip_endpoints()->size()); - EXPECT_EQ(endpoint_ipv4, result1->second.ip_endpoints()->front()); + EXPECT_THAT(result1->second.text_records(), IsEmpty()); + EXPECT_THAT(result1->second.hostnames(), IsEmpty()); + EXPECT_EQ(1u, result1->second.ip_endpoints().size()); + EXPECT_EQ(endpoint_ipv4, result1->second.ip_endpoints().front()); EXPECT_EQ(1, stale.network_changes); // Time to TimeTicks conversion is fuzzy, so just check that expected and // actual expiration times are close. @@ -1528,10 +1521,9 @@ restored_cache.LookupStale(key2, now, &stale); EXPECT_TRUE(result2); EXPECT_FALSE(result2->first.secure); - ASSERT_TRUE(result2->second.ip_endpoints()); - EXPECT_EQ(2u, result2->second.ip_endpoints()->size()); - EXPECT_EQ(endpoint_ipv6, result2->second.ip_endpoints()->front()); - EXPECT_EQ(endpoint_ipv4, result2->second.ip_endpoints()->back()); + EXPECT_EQ(2u, result2->second.ip_endpoints().size()); + EXPECT_EQ(endpoint_ipv6, result2->second.ip_endpoints().front()); + EXPECT_EQ(endpoint_ipv4, result2->second.ip_endpoints().back()); EXPECT_EQ(1, stale.network_changes); EXPECT_GT(base::Milliseconds(100), (base::Seconds(-3) - stale.expired_by).magnitude()); @@ -1540,17 +1532,15 @@ const std::pair<const HostCache::Key, HostCache::Entry>* result3 = restored_cache.Lookup(key3, now); EXPECT_TRUE(result3); - ASSERT_TRUE(result3->second.ip_endpoints()); - EXPECT_EQ(1u, result3->second.ip_endpoints()->size()); - EXPECT_EQ(endpoint_ipv4, result3->second.ip_endpoints()->front()); + EXPECT_EQ(1u, result3->second.ip_endpoints().size()); + EXPECT_EQ(endpoint_ipv4, result3->second.ip_endpoints().front()); // The "foobar4.com" entry is still present and usable. const std::pair<const HostCache::Key, HostCache::Entry>* result4 = restored_cache.Lookup(key4, now); EXPECT_TRUE(result4); - ASSERT_TRUE(result4->second.ip_endpoints()); - EXPECT_EQ(1u, result4->second.ip_endpoints()->size()); - EXPECT_EQ(endpoint_ipv4, result4->second.ip_endpoints()->front()); + EXPECT_EQ(1u, result4->second.ip_endpoints().size()); + EXPECT_EQ(endpoint_ipv4, result4->second.ip_endpoints().front()); EXPECT_EQ(2u, restored_cache.last_restore_size()); } @@ -1677,7 +1667,7 @@ NetworkAnonymizationKey()); key.secure = true; HostCache::Entry entry(OK, text_records, HostCache::Entry::SOURCE_DNS, ttl); - EXPECT_TRUE(entry.text_records()); + EXPECT_THAT(entry.text_records(), Not(IsEmpty())); HostCache cache(kMaxCacheEntries); cache.Set(key, entry, now, ttl); @@ -1695,7 +1685,7 @@ const std::pair<const HostCache::Key, HostCache::Entry>* result = restored_cache.LookupStale(key, now, &stale); EXPECT_THAT(result, Pointee(Pair(key, EntryContentsEqual(entry)))); - EXPECT_THAT(result->second.text_records(), Optional(text_records)); + EXPECT_THAT(result->second.text_records(), text_records); } TEST(HostCacheTest, SerializeAndDeserialize_Hostname) { @@ -1708,7 +1698,7 @@ DnsQueryType::A, 0, HostResolverSource::DNS, NetworkAnonymizationKey()); HostCache::Entry entry(OK, hostnames, HostCache::Entry::SOURCE_DNS, ttl); - EXPECT_TRUE(entry.hostnames()); + EXPECT_THAT(entry.hostnames(), Not(IsEmpty())); HostCache cache(kMaxCacheEntries); cache.Set(key, entry, now, ttl); @@ -1725,7 +1715,7 @@ const std::pair<const HostCache::Key, HostCache::Entry>* result = restored_cache.LookupStale(key, now, &stale); EXPECT_THAT(result, Pointee(Pair(key, EntryContentsEqual(entry)))); - EXPECT_THAT(result->second.hostnames(), Optional(hostnames)); + EXPECT_THAT(result->second.hostnames(), hostnames); } TEST(HostCacheTest, SerializeAndDeserializeEndpointResult) { @@ -1752,7 +1742,7 @@ std::set<std::string> canonical_names = {ipv6_alias, ipv4_alias}; entry.set_canonical_names(canonical_names); - EXPECT_TRUE(entry.GetEndpoints()); + EXPECT_THAT(entry.GetEndpoints(), Not(IsEmpty())); ConnectionEndpointMetadata metadata1; metadata1.supported_protocol_alpns = {"h3", "h2"}; @@ -1770,17 +1760,17 @@ auto merged_entry = HostCache::Entry::MergeEntries(entry, metadata_entry); EXPECT_THAT(merged_entry.GetEndpoints(), - Optional(ElementsAre(ExpectEndpointResult(ip_endpoints)))); + ElementsAre(ExpectEndpointResult(ip_endpoints))); EXPECT_THAT( merged_entry.GetMetadatas(), - testing::Optional(testing::ElementsAre( + testing::ElementsAre( ExpectConnectionEndpointMetadata(testing::ElementsAre("h3", "h2"), testing::ElementsAre('f', 'o', 'o'), ipv6_alias), ExpectConnectionEndpointMetadata(testing::ElementsAre("h2", "h4"), - IsEmpty(), ipv4_alias)))); + IsEmpty(), ipv4_alias))); EXPECT_THAT(merged_entry.canonical_names(), - testing::Optional(UnorderedElementsAre(ipv4_alias, ipv6_alias))); + UnorderedElementsAre(ipv4_alias, ipv6_alias)); HostCache cache(kMaxCacheEntries); cache.Set(key, merged_entry, now, ttl); @@ -1805,19 +1795,19 @@ ASSERT_TRUE(result); EXPECT_THAT(result, Pointee(Pair(key, EntryContentsEqual(merged_entry)))); EXPECT_THAT(result->second.GetEndpoints(), - Optional(ElementsAre(ExpectEndpointResult(ip_endpoints)))); + ElementsAre(ExpectEndpointResult(ip_endpoints))); EXPECT_THAT( result->second.GetMetadatas(), - testing::Optional(testing::ElementsAre( + testing::ElementsAre( ExpectConnectionEndpointMetadata(testing::ElementsAre("h3", "h2"), testing::ElementsAre('f', 'o', 'o'), ipv6_alias), ExpectConnectionEndpointMetadata(testing::ElementsAre("h2", "h4"), - IsEmpty(), ipv4_alias)))); + IsEmpty(), ipv4_alias))); EXPECT_THAT(result->second.canonical_names(), - testing::Optional(UnorderedElementsAre(ipv4_alias, ipv6_alias))); + UnorderedElementsAre(ipv4_alias, ipv6_alias)); - EXPECT_THAT(result->second.aliases(), Pointee(aliases)); + EXPECT_EQ(result->second.aliases(), aliases); } TEST(HostCacheTest, DeserializeNoEndpointNoAliase) { @@ -1857,8 +1847,8 @@ restored_cache.LookupStale(key, base::TimeTicks::Now(), &stale); ASSERT_TRUE(result); - EXPECT_THAT(result->second.aliases(), Pointee(ElementsAre())); - EXPECT_THAT(result->second.ip_endpoints(), Pointee(ElementsAre())); + EXPECT_THAT(result->second.aliases(), ElementsAre()); + EXPECT_THAT(result->second.ip_endpoints(), ElementsAre()); } TEST(HostCacheTest, DeserializeLegacyAddresses) { @@ -1900,8 +1890,8 @@ ASSERT_TRUE(result); EXPECT_THAT(result->second.ip_endpoints(), - Pointee(ElementsAreArray(MakeEndpoints({"2000::", "1.2.3.4"})))); - EXPECT_THAT(result->second.aliases(), Pointee(ElementsAre())); + ElementsAreArray(MakeEndpoints({"2000::", "1.2.3.4"}))); + EXPECT_THAT(result->second.aliases(), ElementsAre()); } TEST(HostCacheTest, DeserializeInvalidQueryTypeIntegrity) { @@ -2061,17 +2051,14 @@ EXPECT_EQ(OK, result.error()); EXPECT_EQ(HostCache::Entry::SOURCE_DNS, result.source()); - ASSERT_TRUE(result.ip_endpoints()); - EXPECT_THAT(*result.ip_endpoints(), + EXPECT_THAT(result.ip_endpoints(), ElementsAre(kEndpointFront, kEndpointBack)); - EXPECT_THAT(result.text_records(), Optional(ElementsAre("text1", "text2"))); + EXPECT_THAT(result.text_records(), ElementsAre("text1", "text2")); - EXPECT_THAT(result.hostnames(), - Optional(ElementsAre(kHostnameFront, kHostnameBack))); + EXPECT_THAT(result.hostnames(), ElementsAre(kHostnameFront, kHostnameBack)); - ASSERT_TRUE(result.aliases()); EXPECT_THAT( - *result.aliases(), + result.aliases(), UnorderedElementsAre("alias1", "alias2", "alias3", "alias4", "alias5")); } @@ -2089,13 +2076,11 @@ HostCache::Entry result = HostCache::Entry::MergeEntries(std::move(front), std::move(back)); - ASSERT_TRUE(result.ip_endpoints()); EXPECT_THAT( - *result.ip_endpoints(), + result.ip_endpoints(), ElementsAreArray(MakeEndpoints({"::1", "0.0.0.2", "0.0.0.4", "0.0.0.2", "0.0.0.2", "::3", "::3", "0.0.0.4"}))); - ASSERT_TRUE(result.aliases()); - EXPECT_THAT(*result.aliases(), UnorderedElementsAre("front", "back")); + EXPECT_THAT(result.aliases(), UnorderedElementsAre("front", "back")); } TEST(HostCacheTest, MergeMetadatas) { @@ -2115,11 +2100,11 @@ HostCache::Entry result = HostCache::Entry::MergeEntries(front, back); // Expect `GetEndpoints()` to ignore metadatas if no `IPEndPoint`s. - EXPECT_FALSE(result.GetEndpoints()); + EXPECT_THAT(result.GetEndpoints(), IsEmpty()); // Expect order irrelevant for endpoint metadata merging. result = HostCache::Entry::MergeEntries(back, front); - EXPECT_FALSE(result.GetEndpoints()); + EXPECT_THAT(result.GetEndpoints(), IsEmpty()); } TEST(HostCacheTest, MergeMetadatasWithIpEndpointsDifferentCanonicalName) { @@ -2136,7 +2121,7 @@ HostCache::Entry::SOURCE_DNS); // Expect `GetEndpoints()` to always ignore metadatas with no `IPEndPoint`s. - EXPECT_FALSE(metadata_entry.GetEndpoints()); + EXPECT_THAT(metadata_entry.GetEndpoints(), IsEmpty()); // Merge in an `IPEndPoint` with different canonical name. IPEndPoint ip_endpoint(IPAddress(1, 1, 1, 1), 0); @@ -2148,9 +2133,9 @@ HostCache::Entry::MergeEntries(metadata_entry, with_ip_endpoint); // Expect `GetEndpoints()` not to return the metadata. - EXPECT_THAT(result.GetEndpoints(), - Optional(ElementsAre( - ExpectEndpointResult(std::vector<IPEndPoint>{ip_endpoint})))); + EXPECT_THAT( + result.GetEndpoints(), + ElementsAre(ExpectEndpointResult(std::vector<IPEndPoint>{ip_endpoint}))); // Expect merge order irrelevant. EXPECT_EQ(result, @@ -2170,7 +2155,7 @@ HostCache::Entry::SOURCE_DNS); // Expect `GetEndpoints()` to always ignore metadatas with no `IPEndPoint`s. - EXPECT_FALSE(metadata_entry.GetEndpoints()); + EXPECT_THAT(metadata_entry.GetEndpoints(), IsEmpty()); // Merge in an `IPEndPoint` with different canonical name. IPEndPoint ip_endpoint(IPAddress(1, 1, 1, 1), 0); @@ -2181,10 +2166,10 @@ HostCache::Entry::MergeEntries(metadata_entry, with_ip_endpoint); // Expect `GetEndpoints()` to return the metadata. - EXPECT_THAT(result.GetEndpoints(), - Optional(ElementsAre( - ExpectEndpointResult(ElementsAre(ip_endpoint), metadata), - ExpectEndpointResult(ElementsAre(ip_endpoint))))); + EXPECT_THAT( + result.GetEndpoints(), + ElementsAre(ExpectEndpointResult(ElementsAre(ip_endpoint), metadata), + ExpectEndpointResult(ElementsAre(ip_endpoint)))); // Expect merge order irrelevant. EXPECT_EQ(result, @@ -2215,8 +2200,8 @@ HostCache::Entry::MergeEntries(back, front); // Expect `GetEndpoints()` to always ignore metadatas with no `IPEndPoint`s. - EXPECT_FALSE(merged_metadatas.GetEndpoints()); - EXPECT_FALSE(reversed_merged_metadatas.GetEndpoints()); + EXPECT_THAT(merged_metadatas.GetEndpoints(), IsEmpty()); + EXPECT_THAT(reversed_merged_metadatas.GetEndpoints(), IsEmpty()); // Merge in an `IPEndPoint`. IPEndPoint ip_endpoint(IPAddress(1, 1, 1, 1), 0); @@ -2231,10 +2216,10 @@ // priority number. EXPECT_THAT( result.GetEndpoints(), - Optional(ElementsAre( + ElementsAre( ExpectEndpointResult(ElementsAre(ip_endpoint), back_metadata), ExpectEndpointResult(ElementsAre(ip_endpoint), front_metadata), - ExpectEndpointResult(ElementsAre(ip_endpoint))))); + ExpectEndpointResult(ElementsAre(ip_endpoint)))); // Expect merge order irrelevant. EXPECT_EQ(result, HostCache::Entry::MergeEntries(reversed_merged_metadatas, @@ -2285,15 +2270,13 @@ EXPECT_EQ(OK, result.error()); EXPECT_EQ(HostCache::Entry::SOURCE_DNS, result.source()); - ASSERT_TRUE(result.ip_endpoints()); - EXPECT_THAT(*result.ip_endpoints(), ElementsAre(kEndpointBack)); - EXPECT_THAT(result.text_records(), Optional(ElementsAre("text2"))); - EXPECT_THAT(result.hostnames(), Optional(ElementsAre(kHostnameBack))); + EXPECT_THAT(result.ip_endpoints(), ElementsAre(kEndpointBack)); + EXPECT_THAT(result.text_records(), ElementsAre("text2")); + EXPECT_THAT(result.hostnames(), ElementsAre(kHostnameBack)); EXPECT_EQ(base::Hours(4), result.ttl()); - ASSERT_TRUE(result.aliases()); - EXPECT_THAT(*result.aliases(), + EXPECT_THAT(result.aliases(), UnorderedElementsAre("alias1", "alias2", "alias3")); } @@ -2314,15 +2297,13 @@ EXPECT_EQ(OK, result.error()); EXPECT_EQ(HostCache::Entry::SOURCE_DNS, result.source()); - ASSERT_TRUE(result.ip_endpoints()); - EXPECT_THAT(*result.ip_endpoints(), ElementsAre(kEndpointFront)); - EXPECT_THAT(result.text_records(), Optional(ElementsAre("text1"))); - EXPECT_THAT(result.hostnames(), Optional(ElementsAre(kHostnameFront))); + EXPECT_THAT(result.ip_endpoints(), ElementsAre(kEndpointFront)); + EXPECT_THAT(result.text_records(), ElementsAre("text1")); + EXPECT_THAT(result.hostnames(), ElementsAre(kHostnameFront)); EXPECT_EQ(base::Minutes(5), result.ttl()); - ASSERT_TRUE(result.aliases()); - EXPECT_THAT(*result.aliases(), + EXPECT_THAT(result.aliases(), UnorderedElementsAre("alias1", "alias2", "alias3")); } @@ -2336,9 +2317,9 @@ EXPECT_EQ(ERR_NAME_NOT_RESOLVED, result.error()); EXPECT_EQ(HostCache::Entry::SOURCE_DNS, result.source()); - EXPECT_FALSE(result.ip_endpoints()); - EXPECT_FALSE(result.text_records()); - EXPECT_FALSE(result.hostnames()); + EXPECT_THAT(result.ip_endpoints(), IsEmpty()); + EXPECT_THAT(result.text_records(), IsEmpty()); + EXPECT_THAT(result.hostnames(), IsEmpty()); EXPECT_FALSE(result.has_ttl()); } @@ -2359,13 +2340,11 @@ EXPECT_EQ(OK, result.error()); EXPECT_EQ(HostCache::Entry::SOURCE_DNS, result.source()); - ASSERT_TRUE(result.ip_endpoints()); - EXPECT_THAT(*result.ip_endpoints(), ElementsAre(kEndpointBack)); + EXPECT_THAT(result.ip_endpoints(), ElementsAre(kEndpointBack)); EXPECT_EQ(base::Hours(4), result.ttl()); - ASSERT_TRUE(result.aliases()); - EXPECT_THAT(*result.aliases(), + EXPECT_THAT(result.aliases(), UnorderedElementsAre("alias0", "alias1", "alias2", "alias3")); } @@ -2386,13 +2365,11 @@ EXPECT_EQ(OK, result.error()); EXPECT_EQ(HostCache::Entry::SOURCE_DNS, result.source()); - ASSERT_TRUE(result.ip_endpoints()); - EXPECT_THAT(*result.ip_endpoints(), ElementsAre(kEndpointFront)); + EXPECT_THAT(result.ip_endpoints(), ElementsAre(kEndpointFront)); EXPECT_EQ(base::Hours(4), result.ttl()); - ASSERT_TRUE(result.aliases()); - EXPECT_THAT(*result.aliases(), + EXPECT_THAT(result.aliases(), UnorderedElementsAre("alias0", "alias1", "alias2", "alias3")); } @@ -2413,14 +2390,12 @@ EXPECT_EQ(OK, result.error()); EXPECT_EQ(HostCache::Entry::SOURCE_DNS, result.source()); - ASSERT_TRUE(result.ip_endpoints()); - EXPECT_THAT(*result.ip_endpoints(), + EXPECT_THAT(result.ip_endpoints(), ElementsAre(kEndpointFront, kEndpointBack)); EXPECT_EQ(base::Hours(4), result.ttl()); - ASSERT_TRUE(result.aliases()); - EXPECT_THAT(*result.aliases(), + EXPECT_THAT(result.aliases(), UnorderedElementsAre("alias1", "alias2", "alias3")); } @@ -2441,14 +2416,12 @@ EXPECT_EQ(OK, result.error()); EXPECT_EQ(HostCache::Entry::SOURCE_DNS, result.source()); - ASSERT_TRUE(result.ip_endpoints()); - EXPECT_THAT(*result.ip_endpoints(), + EXPECT_THAT(result.ip_endpoints(), ElementsAre(kEndpointFront, kEndpointBack)); EXPECT_EQ(base::Hours(4), result.ttl()); - ASSERT_TRUE(result.aliases()); - EXPECT_THAT(*result.aliases(), + EXPECT_THAT(result.aliases(), UnorderedElementsAre("alias1", "alias2", "alias3")); } @@ -2474,8 +2447,7 @@ HostCache::Entry result = HostCache::Entry::MergeEntries(std::move(front), std::move(back)); - ASSERT_TRUE(result.aliases()); - EXPECT_THAT(*result.aliases(), UnorderedElementsAre("name1", "name2")); + EXPECT_THAT(result.aliases(), UnorderedElementsAre("name1", "name2")); } // Test that the back canonname can be used if there is no front cannonname. @@ -2489,8 +2461,7 @@ HostCache::Entry result = HostCache::Entry::MergeEntries(std::move(front), std::move(back)); - ASSERT_TRUE(result.aliases()); - EXPECT_THAT(*result.aliases(), UnorderedElementsAre("name2")); + EXPECT_THAT(result.aliases(), UnorderedElementsAre("name2")); } TEST(HostCacheTest, ConvertFromInternalAddressResult) { @@ -2500,16 +2471,16 @@ constexpr base::TimeDelta kTtl2 = base::Minutes(40); constexpr base::TimeDelta kTtl3 = base::Minutes(55); - std::vector<std::unique_ptr<HostResolverInternalResult>> results; - results.push_back(std::make_unique<HostResolverInternalDataResult>( + std::set<std::unique_ptr<HostResolverInternalResult>> results; + results.insert(std::make_unique<HostResolverInternalDataResult>( "endpoint.test", DnsQueryType::AAAA, base::TimeTicks() + kTtl1, base::Time() + kTtl1, HostResolverInternalResult::Source::kDns, kEndpoints, std::vector<std::string>{}, std::vector<HostPortPair>{})); - results.push_back(std::make_unique<HostResolverInternalAliasResult>( + results.insert(std::make_unique<HostResolverInternalAliasResult>( "domain1.test", DnsQueryType::AAAA, base::TimeTicks() + kTtl2, base::Time() + kTtl2, HostResolverInternalResult::Source::kDns, "domain2.test")); - results.push_back(std::make_unique<HostResolverInternalAliasResult>( + results.insert(std::make_unique<HostResolverInternalAliasResult>( "domain2.test", DnsQueryType::AAAA, base::TimeTicks() + kTtl3, base::Time() + kTtl3, HostResolverInternalResult::Source::kDns, "endpoint.test")); @@ -2542,16 +2513,16 @@ constexpr base::TimeDelta kTtl2 = base::Minutes(40); constexpr base::TimeDelta kTtl3 = base::Minutes(55); - std::vector<std::unique_ptr<HostResolverInternalResult>> results; - results.push_back(std::make_unique<HostResolverInternalMetadataResult>( + std::set<std::unique_ptr<HostResolverInternalResult>> results; + results.insert(std::make_unique<HostResolverInternalMetadataResult>( "endpoint.test", DnsQueryType::HTTPS, base::TimeTicks() + kTtl1, base::Time() + kTtl1, HostResolverInternalResult::Source::kDns, kMetadatas)); - results.push_back(std::make_unique<HostResolverInternalAliasResult>( + results.insert(std::make_unique<HostResolverInternalAliasResult>( "domain1.test", DnsQueryType::HTTPS, base::TimeTicks() + kTtl2, base::Time() + kTtl2, HostResolverInternalResult::Source::kDns, "domain2.test")); - results.push_back(std::make_unique<HostResolverInternalAliasResult>( + results.insert(std::make_unique<HostResolverInternalAliasResult>( "domain2.test", DnsQueryType::HTTPS, base::TimeTicks() + kTtl3, base::Time() + kTtl3, HostResolverInternalResult::Source::kDns, "endpoint.test")); @@ -2578,16 +2549,16 @@ constexpr base::TimeDelta kTtl2 = base::Minutes(40); constexpr base::TimeDelta kTtl3 = base::Minutes(55); - std::vector<std::unique_ptr<HostResolverInternalResult>> results; - results.push_back(std::make_unique<HostResolverInternalMetadataResult>( + std::set<std::unique_ptr<HostResolverInternalResult>> results; + results.insert(std::make_unique<HostResolverInternalMetadataResult>( "endpoint.test", DnsQueryType::HTTPS, base::TimeTicks() + kTtl1, base::Time() + kTtl1, HostResolverInternalResult::Source::kDns, kMetadatas)); - results.push_back(std::make_unique<HostResolverInternalAliasResult>( + results.insert(std::make_unique<HostResolverInternalAliasResult>( "domain1.test", DnsQueryType::HTTPS, base::TimeTicks() + kTtl2, base::Time() + kTtl2, HostResolverInternalResult::Source::kDns, "domain2.test")); - results.push_back(std::make_unique<HostResolverInternalAliasResult>( + results.insert(std::make_unique<HostResolverInternalAliasResult>( "domain2.test", DnsQueryType::HTTPS, base::TimeTicks() + kTtl3, base::Time() + kTtl3, HostResolverInternalResult::Source::kDns, "endpoint.test")); @@ -2608,16 +2579,16 @@ constexpr base::TimeDelta kTtl2 = base::Minutes(40); constexpr base::TimeDelta kTtl3 = base::Minutes(55); - std::vector<std::unique_ptr<HostResolverInternalResult>> results; - results.push_back(std::make_unique<HostResolverInternalErrorResult>( + std::set<std::unique_ptr<HostResolverInternalResult>> results; + results.insert(std::make_unique<HostResolverInternalErrorResult>( "endpoint.test", DnsQueryType::A, base::TimeTicks() + kTtl1, base::Time() + kTtl1, HostResolverInternalResult::Source::kDns, ERR_NAME_NOT_RESOLVED)); - results.push_back(std::make_unique<HostResolverInternalAliasResult>( + results.insert(std::make_unique<HostResolverInternalAliasResult>( "domain1.test", DnsQueryType::A, base::TimeTicks() + kTtl2, base::Time() + kTtl2, HostResolverInternalResult::Source::kDns, "domain2.test")); - results.push_back(std::make_unique<HostResolverInternalAliasResult>( + results.insert(std::make_unique<HostResolverInternalAliasResult>( "domain2.test", DnsQueryType::A, base::TimeTicks() + kTtl3, base::Time() + kTtl3, HostResolverInternalResult::Source::kDns, "endpoint.test")); @@ -2636,16 +2607,16 @@ constexpr base::TimeDelta kTtl1 = base::Minutes(45); constexpr base::TimeDelta kTtl2 = base::Minutes(40); - std::vector<std::unique_ptr<HostResolverInternalResult>> results; - results.push_back(std::make_unique<HostResolverInternalErrorResult>( + std::set<std::unique_ptr<HostResolverInternalResult>> results; + results.insert(std::make_unique<HostResolverInternalErrorResult>( "endpoint.test", DnsQueryType::AAAA, /*expiration=*/absl::nullopt, /*timed_expiration=*/absl::nullopt, HostResolverInternalResult::Source::kDns, ERR_NAME_NOT_RESOLVED)); - results.push_back(std::make_unique<HostResolverInternalAliasResult>( + results.insert(std::make_unique<HostResolverInternalAliasResult>( "domain1.test", DnsQueryType::AAAA, base::TimeTicks() + kTtl1, base::Time() + kTtl1, HostResolverInternalResult::Source::kDns, "domain2.test")); - results.push_back(std::make_unique<HostResolverInternalAliasResult>( + results.insert(std::make_unique<HostResolverInternalAliasResult>( "domain2.test", DnsQueryType::AAAA, base::TimeTicks() + kTtl2, base::Time() + kTtl2, HostResolverInternalResult::Source::kDns, "endpoint.test")); @@ -2664,12 +2635,12 @@ constexpr base::TimeDelta kTtl1 = base::Minutes(45); constexpr base::TimeDelta kTtl2 = base::Minutes(40); - std::vector<std::unique_ptr<HostResolverInternalResult>> results; - results.push_back(std::make_unique<HostResolverInternalAliasResult>( + std::set<std::unique_ptr<HostResolverInternalResult>> results; + results.insert(std::make_unique<HostResolverInternalAliasResult>( "domain1.test", DnsQueryType::A, base::TimeTicks() + kTtl1, base::Time() + kTtl1, HostResolverInternalResult::Source::kDns, "domain2.test")); - results.push_back(std::make_unique<HostResolverInternalAliasResult>( + results.insert(std::make_unique<HostResolverInternalAliasResult>( "domain2.test", DnsQueryType::A, base::TimeTicks() + kTtl2, base::Time() + kTtl2, HostResolverInternalResult::Source::kDns, "endpoint.test"));
diff --git a/net/dns/host_resolver.cc b/net/dns/host_resolver.cc index 03dce1c..869d77f 100644 --- a/net/dns/host_resolver.cc +++ b/net/dns/host_resolver.cc
@@ -75,18 +75,12 @@ return nullptr; } - const absl::optional<std::vector<std::string>>& GetTextResults() - const override { - static const base::NoDestructor<absl::optional<std::vector<std::string>>> - nullopt_result; - return *nullopt_result; + const std::vector<std::string>* GetTextResults() const override { + return nullptr; } - const absl::optional<std::vector<HostPortPair>>& GetHostnameResults() - const override { - static const base::NoDestructor<absl::optional<std::vector<HostPortPair>>> - nullopt_result; - return *nullopt_result; + const std::vector<HostPortPair>* GetHostnameResults() const override { + return nullptr; } const std::set<std::string>* GetDnsAliasResults() const override { @@ -522,16 +516,6 @@ } // static -std::vector<IPEndPoint> HostResolver::GetNonProtocolEndpoints( - base::span<const HostResolverEndpointResult> endpoints) { - auto non_protocol_endpoint = - base::ranges::find_if(endpoints, &EndpointResultIsNonProtocol); - if (non_protocol_endpoint == endpoints.end()) - return std::vector<IPEndPoint>(); - return non_protocol_endpoint->ip_endpoints; -} - -// static bool HostResolver::AllProtocolEndpointsHaveEch( base::span<const HostResolverEndpointResult> endpoints) { bool has_svcb = false;
diff --git a/net/dns/host_resolver.h b/net/dns/host_resolver.h index c4f7cfe..ddcab8f 100644 --- a/net/dns/host_resolver.h +++ b/net/dns/host_resolver.h
@@ -82,6 +82,11 @@ // Handler for an individual host resolution request. Created by // HostResolver::CreateRequest(). + // + // TODO(crbug.com/1290920): Most result retrieval here follows a pattern where + // it may return null or empty for requests where that result type is not + // available. Clean this up to always return empty for such cases and remove + // nullability from the return types. class ResolveHostRequest { public: // Destruction cancels the request if running asynchronously, causing the @@ -108,7 +113,8 @@ // Address record (A or AAAA) results of the request. Should only be called // after Start() signals completion, either by invoking the callback or by - // returning a result other than |ERR_IO_PENDING|. + // returning a result other than |ERR_IO_PENDING|. May return nullptr or + // empty for non-address requests. // // TODO(crbug.com/1264933): Remove and replace all usage with // GetEndpointResults(). @@ -117,25 +123,25 @@ // Endpoint results for `A`, `AAAA`, `UNSPECIFIED`, or `HTTPS` requests. // Should only be called after Start() signals completion, either by // invoking the callback or by returning a result other than - // `ERR_IO_PENDING`. + // `ERR_IO_PENDING`. May return nullptr or empty for non-address/HTTPS + // requests. virtual const std::vector<HostResolverEndpointResult>* GetEndpointResults() const = 0; // Text record (TXT) results of the request. Should only be called after // Start() signals completion, either by invoking the callback or by - // returning a result other than |ERR_IO_PENDING|. - virtual const absl::optional<std::vector<std::string>>& GetTextResults() - const = 0; + // returning a result other than |ERR_IO_PENDING|. May return nullptr or + // empty for non-TXT requests. + virtual const std::vector<std::string>* GetTextResults() const = 0; // Hostname record (SRV or PTR) results of the request. For SRV results, - // hostnames are ordered acording to their priorities and weights. See RFC - // 2782. + // hostnames are ordered according to their priorities and weights. See RFC + // 2782. May return nullptr or empty for non-SRV/PTR requests. // // Should only be called after Start() signals completion, either by // invoking the callback or by returning a result other than // |ERR_IO_PENDING|. - virtual const absl::optional<std::vector<HostPortPair>>& - GetHostnameResults() const = 0; + virtual const std::vector<HostPortPair>* GetHostnameResults() const = 0; // Any DNS record aliases, such as CNAME aliases, found as a result of an // address query. Includes all known aliases, e.g. from A, AAAA, or HTTPS, @@ -144,7 +150,8 @@ // invoking the callback or by returning a result other than // `ERR_IO_PENDING`. Returns a list of aliases that has been fixed up and // canonicalized (as URL hostnames), and thus may differ from the results - // stored directly in the AddressList. + // stored directly in the AddressList. May return nullptr or empty for + // non-address/HTTPS requests. // // If `ResolveHostParameters::include_canonical_name` was true, alias // results will always be the single "canonical name" received from the @@ -155,7 +162,8 @@ // Result of an experimental query. Meaning depends on the specific query // type, but each boolean value generally refers to a valid or invalid - // record of the experimental type. + // record of the experimental type. May return nullptr or empty for requests + // without experimental result behavior. NET_EXPORT virtual const std::vector<bool>* GetExperimentalResultsForTesting() const; @@ -167,7 +175,8 @@ virtual ResolveErrorInfo GetResolveErrorInfo() const = 0; // Information about the result's staleness in the host cache. Only - // available if results were received from the host cache. + // available if results were received from the host cache, otherwise + // returns nullopt. // // Should only be called after Start() signals completion, either by // invoking the callback or by returning a result other than @@ -508,10 +517,6 @@ base::span<const HostResolverEndpointResult> endpoints, const std::set<std::string>& aliases); - // Utility to get the non-protocol endpoints. - static std::vector<IPEndPoint> GetNonProtocolEndpoints( - base::span<const HostResolverEndpointResult> endpoints); - // Returns whether there is at least one protocol endpoint in `endpoints`, and // all such endpoints have ECH parameters. This can be used to implement the // guidance in section 10.1 of draft-ietf-dnsop-svcb-https-11.
diff --git a/net/dns/host_resolver_manager.cc b/net/dns/host_resolver_manager.cc index 525520c..d11f1bc 100644 --- a/net/dns/host_resolver_manager.cc +++ b/net/dns/host_resolver_manager.cc
@@ -84,6 +84,7 @@ #include "net/dns/dns_transaction.h" #include "net/dns/dns_util.h" #include "net/dns/host_cache.h" +#include "net/dns/host_resolver_internal_result.h" #include "net/dns/host_resolver_mdns_listener_impl.h" #include "net/dns/host_resolver_mdns_task.h" #include "net/dns/host_resolver_nat64_task.h" @@ -823,20 +824,14 @@ return base::OptionalToPtr(endpoint_results_); } - const absl::optional<std::vector<std::string>>& GetTextResults() - const override { + const std::vector<std::string>* GetTextResults() const override { DCHECK(complete_); - static const base::NoDestructor<absl::optional<std::vector<std::string>>> - nullopt_result; - return results_ ? results_.value().text_records() : *nullopt_result; + return results_ ? &results_.value().text_records() : nullptr; } - const absl::optional<std::vector<HostPortPair>>& GetHostnameResults() - const override { + const std::vector<HostPortPair>* GetHostnameResults() const override { DCHECK(complete_); - static const base::NoDestructor<absl::optional<std::vector<HostPortPair>>> - nullopt_result; - return results_ ? results_.value().hostnames() : *nullopt_result; + return results_ ? &results_.value().hostnames() : nullptr; } const std::set<std::string>* GetDnsAliasResults() const override { @@ -861,7 +856,7 @@ const std::vector<bool>* GetExperimentalResultsForTesting() const override { DCHECK(complete_); - return results_ ? results_.value().https_record_compatibility() : nullptr; + return results_ ? &results_.value().https_record_compatibility() : nullptr; } net::ResolveErrorInfo GetResolveErrorInfo() const override { @@ -963,8 +958,7 @@ endpoint_results_ = results_.value().GetEndpoints(); if (endpoint_results_.has_value()) { - DCHECK(results_.value().aliases()); - fixed_up_dns_alias_results_ = *results_.value().aliases(); + fixed_up_dns_alias_results_ = results_.value().aliases(); // Skip fixups for `include_canonical_name` requests. Just use the // canonical name exactly as it was received from the system resolver. @@ -1499,21 +1493,36 @@ } } - HostCache::Entry results(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); - DnsResponseResultExtractor extractor(response); - DnsResponseResultExtractor::ExtractionError extraction_error = + DCHECK(response); + + DnsResponseResultExtractor extractor(*response); + DnsResponseResultExtractor::ResultsOrError results = extractor.ExtractDnsResults(transaction_info.type, /*original_domain_name=*/GetHostname(host_), - request_port, &results); - DCHECK_NE(extraction_error, - DnsResponseResultExtractor::ExtractionError::kUnexpected); + request_port); + DCHECK_NE( + results.error_or(DnsResponseResultExtractor::ExtractionError::kOk), + DnsResponseResultExtractor::ExtractionError::kUnexpected); - if (results.error() != OK && results.error() != ERR_NAME_NOT_RESOLVED) { + // TODO(crbug.com/1381506): Use new results type directly instead of + // converting to HostCache::Entry. + DnsResponseResultExtractor::ExtractionError extraction_error = + results.error_or(DnsResponseResultExtractor::ExtractionError::kOk); + HostCache::Entry legacy_results(ERR_DNS_MALFORMED_RESPONSE, + HostCache::Entry::SOURCE_DNS); + if (results.has_value()) { + legacy_results = HostCache::Entry( + std::move(results).value(), base::Time::Now(), + tick_clock_->NowTicks(), HostCache::Entry::SOURCE_DNS); + } + + if (legacy_results.error() != OK && + legacy_results.error() != ERR_NAME_NOT_RESOLVED) { net_log_.AddEvent( NetLogEventType::HOST_RESOLVER_MANAGER_DNS_TASK_EXTRACTION_FAILURE, [&] { return NetLogDnsTaskExtractionFailureParams( - extraction_error, transaction_info.type, results); + extraction_error, transaction_info.type, legacy_results); }); if (transaction_info.error_behavior == TransactionErrorBehavior::kFatalOrEmpty || @@ -1523,22 +1532,22 @@ // would need to be a call to some sort of // IsFatalTransactionExtractionError() function. DCHECK(!fatal_error); - results = DnsResponseResultExtractor::CreateEmptyResult( - transaction_info.type); + DCHECK_EQ(transaction_info.type, DnsQueryType::HTTPS); + legacy_results = + HostCache::Entry(ERR_NAME_NOT_RESOLVED, std::vector<bool>(), + HostCache::Entry::SOURCE_DNS); } else { - OnFailure(results.error(), /*allow_fallback=*/true, - results.GetOptionalTtl(), transaction_info.type); + OnFailure(legacy_results.error(), /*allow_fallback=*/true, + legacy_results.GetOptionalTtl(), transaction_info.type); return; } } if (httpssvc_metrics_) { if (transaction_info.type == DnsQueryType::HTTPS) { - const std::vector<bool>* record_compatibility = - results.https_record_compatibility(); - CHECK(record_compatibility); - httpssvc_metrics_->SaveForHttps(rcode_for_httpssvc, - *record_compatibility, elapsed_time); + httpssvc_metrics_->SaveForHttps( + rcode_for_httpssvc, legacy_results.https_record_compatibility(), + elapsed_time); } else { httpssvc_metrics_->SaveForAddressQuery(elapsed_time, rcode_for_httpssvc); @@ -1548,15 +1557,15 @@ // Trigger HTTP->HTTPS upgrade if an HTTPS record is received for an "http" // or "ws" request. if (transaction_info.type == DnsQueryType::HTTPS && - ShouldTriggerHttpToHttpsUpgrade(results)) { + ShouldTriggerHttpToHttpsUpgrade(legacy_results)) { // Disallow fallback. Otherwise DNS could be reattempted without HTTPS // queries, and that would hide this error instead of triggering upgrade. OnFailure(ERR_DNS_NAME_HTTPS_ONLY, /*allow_fallback=*/false, - results.GetOptionalTtl(), transaction_info.type); + legacy_results.GetOptionalTtl(), transaction_info.type); return; } - HideMetadataResultsIfNotDesired(results); + HideMetadataResultsIfNotDesired(legacy_results); switch (transaction_info.type) { case DnsQueryType::A: @@ -1600,19 +1609,19 @@ case DnsQueryType::A: // Canonical names from A results have lower priority than those // from AAAA results, so merge to the back. - results = HostCache::Entry::MergeEntries( - std::move(saved_results_).value(), std::move(results)); + legacy_results = HostCache::Entry::MergeEntries( + std::move(saved_results_).value(), std::move(legacy_results)); break; case DnsQueryType::AAAA: // Canonical names from AAAA results take priority over those // from A results, so merge to the front. - results = HostCache::Entry::MergeEntries( - std::move(results), std::move(saved_results_).value()); + legacy_results = HostCache::Entry::MergeEntries( + std::move(legacy_results), std::move(saved_results_).value()); break; case DnsQueryType::HTTPS: // No particular importance to order. - results = HostCache::Entry::MergeEntries( - std::move(results), std::move(saved_results_).value()); + legacy_results = HostCache::Entry::MergeEntries( + std::move(legacy_results), std::move(saved_results_).value()); break; default: // Only expect address query types with multiple transactions. @@ -1620,7 +1629,7 @@ } } - saved_results_ = std::move(results); + saved_results_ = std::move(legacy_results); OnTransactionsFinished(); } @@ -1689,26 +1698,23 @@ timeout_timer_.Stop(); - absl::optional<std::vector<IPEndPoint>> ip_endpoints; - ip_endpoints = base::OptionalFromPtr(results.ip_endpoints()); + std::vector<IPEndPoint> ip_endpoints = results.ip_endpoints(); - if (ip_endpoints.has_value()) { - // If there are multiple addresses, and at least one is IPv6, need to - // sort them. - bool at_least_one_ipv6_address = base::ranges::any_of( - ip_endpoints.value(), - [](auto& e) { return e.GetFamily() == ADDRESS_FAMILY_IPV6; }); + // If there are multiple addresses, and at least one is IPv6, need to + // sort them. + bool at_least_one_ipv6_address = base::ranges::any_of( + ip_endpoints, + [](auto& e) { return e.GetFamily() == ADDRESS_FAMILY_IPV6; }); - if (at_least_one_ipv6_address) { - // Sort addresses if needed. Sort could complete synchronously. - client_->GetAddressSorter()->Sort( - ip_endpoints.value(), - base::BindOnce(&DnsTask::OnSortComplete, AsWeakPtr(), - tick_clock_->NowTicks(), std::move(results), - secure_)); - return; - } + if (at_least_one_ipv6_address) { + // Sort addresses if needed. Sort could complete synchronously. + client_->GetAddressSorter()->Sort( + ip_endpoints, + base::BindOnce(&DnsTask::OnSortComplete, AsWeakPtr(), + tick_clock_->NowTicks(), std::move(results), secure_)); + return; } + OnSuccess(std::move(results)); } @@ -1717,7 +1723,6 @@ bool secure, bool success, std::vector<IPEndPoint> sorted) { - DCHECK(results.ip_endpoints()); results.set_ip_endpoints(std::move(sorted)); if (!success) { @@ -1727,9 +1732,8 @@ } // AddressSorter prunes unusable destinations. - if ((!results.ip_endpoints() || results.ip_endpoints()->empty()) && - results.text_records().value_or(std::vector<std::string>()).empty() && - results.hostnames().value_or(std::vector<HostPortPair>()).empty()) { + if (results.ip_endpoints().empty() && results.text_records().empty() && + results.hostnames().empty()) { LOG(WARNING) << "Address list empty after RFC3484 sort"; OnFailure(ERR_NAME_NOT_RESOLVED, /*allow_fallback=*/true, results.GetOptionalTtl()); @@ -1897,8 +1901,7 @@ bool ShouldTriggerHttpToHttpsUpgrade(const HostCache::Entry& results) { // Upgrade if at least one HTTPS record was compatible, and the host uses an // upgradable scheme. - return results.https_record_compatibility() && - base::ranges::any_of(*results.https_record_compatibility(), + return base::ranges::any_of(results.https_record_compatibility(), base::identity()) && (GetScheme(host_) == url::kHttpScheme || GetScheme(host_) == url::kWsScheme); @@ -2579,7 +2582,7 @@ // transaction, e.g. a supplemental HTTPS transaction, finds results. DCHECK(!key_.query_types.Has(DnsQueryType::UNSPECIFIED)); if (HasAddressType(key_.query_types) && results.error() == OK && - (!results.ip_endpoints() || results.ip_endpoints()->empty())) { + results.ip_endpoints().empty()) { results.set_error(ERR_NAME_NOT_RESOLVED); } @@ -2603,8 +2606,7 @@ base::TimeDelta bounded_ttl = std::max(results.ttl(), base::Seconds(kMinimumTTLSeconds)); - if ((results.ip_endpoints() && - ContainsIcannNameCollisionIp(*results.ip_endpoints()))) { + if (ContainsIcannNameCollisionIp(results.ip_endpoints())) { CompleteRequestsWithError(ERR_ICANN_NAME_COLLISION, secure ? TaskType::SECURE_DNS : TaskType::DNS); return; @@ -2678,8 +2680,7 @@ HostCache::Entry results = mdns_task_->GetResults(); - if ((results.ip_endpoints() && - ContainsIcannNameCollisionIp(*results.ip_endpoints()))) { + if (ContainsIcannNameCollisionIp(results.ip_endpoints())) { CompleteRequestsWithError(ERR_ICANN_NAME_COLLISION, TaskType::MDNS); return; } @@ -2781,8 +2782,7 @@ (GetScheme(key_.host) == url::kHttpsScheme || GetScheme(key_.host) == url::kWssScheme) && IsGoogleHostWithAlpnH3(GetHostname(key_.host))) { - bool has_metadata = - results.GetMetadatas() && !results.GetMetadatas()->empty(); + bool has_metadata = !results.GetMetadatas().empty(); base::UmaHistogramExactLinear( "Net.DNS.H3SupportedGoogleHost.TaskTypeMetadataAvailability2", static_cast<int>(task_type.value()) * 2 + (has_metadata ? 1 : 0),
diff --git a/net/dns/host_resolver_manager_unittest.cc b/net/dns/host_resolver_manager_unittest.cc index 5a8eb510..f03e8d92 100644 --- a/net/dns/host_resolver_manager_unittest.cc +++ b/net/dns/host_resolver_manager_unittest.cc
@@ -101,12 +101,16 @@ using net::test::IsOk; using ::testing::_; using ::testing::AllOf; +using ::testing::AnyOf; using ::testing::Between; using ::testing::ByMove; +using ::testing::Contains; using ::testing::Eq; using ::testing::IsEmpty; +using ::testing::Not; using ::testing::Optional; using ::testing::Pair; +using ::testing::Pointee; using ::testing::Property; using ::testing::Return; using ::testing::UnorderedElementsAre; @@ -964,8 +968,10 @@ resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_FALSE(response.request()->GetStaleInfo()); EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname); @@ -983,8 +989,10 @@ EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); EXPECT_THAT(response.top_level_result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_FALSE(response.request()->GetStaleInfo()); EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname); @@ -1185,8 +1193,10 @@ resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerTest, EmptyDotsHost) { @@ -1197,8 +1207,10 @@ resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); } } @@ -1209,8 +1221,10 @@ resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerTest, DeDupeRequests) { @@ -1793,8 +1807,10 @@ proc_->SignalAll(); EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_EQ(0u, resolve_context_->host_cache()->size()); } @@ -2218,8 +2234,10 @@ resolve_context_->host_cache()))); EXPECT_THAT(responses[4]->result_error(), IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE)); // Evicts self. - EXPECT_FALSE(responses[4]->request()->GetAddressResults()); - EXPECT_FALSE(responses[4]->request()->GetEndpointResults()); + EXPECT_THAT(responses[4]->request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(responses[4]->request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); responses.emplace_back( std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( @@ -2228,8 +2246,10 @@ resolve_context_->host_cache()))); EXPECT_THAT(responses[2]->result_error(), IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE)); - EXPECT_FALSE(responses[2]->request()->GetAddressResults()); - EXPECT_FALSE(responses[2]->request()->GetEndpointResults()); + EXPECT_THAT(responses[2]->request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(responses[2]->request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); responses.emplace_back( std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( @@ -2238,8 +2258,10 @@ resolve_context_->host_cache()))); EXPECT_THAT(responses[3]->result_error(), IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE)); - EXPECT_FALSE(responses[3]->request()->GetAddressResults()); - EXPECT_FALSE(responses[3]->request()->GetEndpointResults()); + EXPECT_THAT(responses[3]->request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(responses[3]->request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); responses.emplace_back( std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest( @@ -2248,8 +2270,10 @@ resolve_context_->host_cache()))); EXPECT_THAT(responses[5]->result_error(), IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE)); - EXPECT_FALSE(responses[5]->request()->GetAddressResults()); - EXPECT_FALSE(responses[5]->request()->GetEndpointResults()); + EXPECT_THAT(responses[5]->request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(responses[5]->request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); // Unblock the resolver thread so the requests can run. proc_->SignalMultiple(4u); @@ -2303,8 +2327,10 @@ absl::nullopt, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(evict_response.result_error(), IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE)); - EXPECT_FALSE(evict_response.request()->GetAddressResults()); - EXPECT_FALSE(evict_response.request()->GetEndpointResults()); + EXPECT_THAT(evict_response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(evict_response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); proc_->SignalMultiple(1u); @@ -2394,8 +2420,10 @@ resolve_context_->host_cache())); EXPECT_TRUE(cache_miss_request.complete()); EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS)); - EXPECT_FALSE(cache_miss_request.request()->GetAddressResults()); - EXPECT_FALSE(cache_miss_request.request()->GetEndpointResults()); + EXPECT_THAT(cache_miss_request.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(cache_miss_request.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_FALSE(cache_miss_request.request()->GetStaleInfo()); // Normal query to populate the cache. @@ -2436,8 +2464,10 @@ resolve_context_->host_cache())); EXPECT_TRUE(cache_miss_request.complete()); EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS)); - EXPECT_FALSE(cache_miss_request.request()->GetAddressResults()); - EXPECT_FALSE(cache_miss_request.request()->GetEndpointResults()); + EXPECT_THAT(cache_miss_request.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(cache_miss_request.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_FALSE(cache_miss_request.request()->GetStaleInfo()); // Normal query to populate the cache. @@ -2457,8 +2487,10 @@ resolve_context_->host_cache())); EXPECT_TRUE(stale_request.complete()); EXPECT_THAT(stale_request.result_error(), IsError(ERR_DNS_CACHE_MISS)); - EXPECT_FALSE(stale_request.request()->GetAddressResults()); - EXPECT_FALSE(stale_request.request()->GetEndpointResults()); + EXPECT_THAT(stale_request.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(stale_request.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_FALSE(stale_request.request()->GetStaleInfo()); } @@ -2481,8 +2513,10 @@ // Expected to resolve synchronously. EXPECT_TRUE(response.complete()); EXPECT_EQ(response.result_error(), ERR_NAME_NOT_RESOLVED); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_FALSE(response.request()->GetStaleInfo()); base::RunLoop().RunUntilIdle(); @@ -2533,8 +2567,10 @@ // Expected to fail synchronously. EXPECT_TRUE(response.complete()); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_FALSE(response.request()->GetStaleInfo()); } @@ -2550,8 +2586,10 @@ // Expected to fail synchronously. EXPECT_TRUE(response.complete()); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_FALSE(response.request()->GetStaleInfo()); } @@ -2571,8 +2609,10 @@ resolve_context_->host_cache())); EXPECT_TRUE(cache_miss_request.complete()); EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS)); - EXPECT_FALSE(cache_miss_request.request()->GetAddressResults()); - EXPECT_FALSE(cache_miss_request.request()->GetEndpointResults()); + EXPECT_THAT(cache_miss_request.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(cache_miss_request.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_FALSE(cache_miss_request.request()->GetStaleInfo()); // Normal query to populate cache @@ -2803,8 +2843,10 @@ absl::nullopt, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(single_response.result_error(), IsError(ERR_ICANN_NAME_COLLISION)); - EXPECT_FALSE(single_response.request()->GetAddressResults()); - EXPECT_FALSE(single_response.request()->GetEndpointResults()); + EXPECT_THAT(single_response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(single_response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); // ERR_ICANN_NAME_COLLISION is cached like any other error, using a fixed TTL // for failed entries from proc-based resolver. That said, the fixed TTL is 0, @@ -3040,8 +3082,10 @@ resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsOk()); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); ASSERT_EQ(1u, proc_->GetCaptureList().size()); EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname); @@ -3374,9 +3418,12 @@ ExpectEndpointResult(testing::UnorderedElementsAre( CreateExpected("000a:0000:0000:0000:0001:0002:0003:0004", 80), CreateExpected("1.2.3.4", 80)))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerTest, Mdns_AaaaOnly) { @@ -3428,12 +3475,16 @@ sizeof(kMdnsResponseTxt)); EXPECT_THAT(response.result_error(), IsOk()); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_THAT(response.request()->GetTextResults(), - testing::Optional(testing::ElementsAre("foo", "bar"))); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + testing::Pointee(testing::ElementsAre("foo", "bar"))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerTest, Mdns_Ptr) { @@ -3456,13 +3507,17 @@ sizeof(kMdnsResponsePtr)); EXPECT_THAT(response.result_error(), IsOk()); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_THAT( response.request()->GetHostnameResults(), - testing::Optional(testing::ElementsAre(HostPortPair("foo.com", 83)))); + testing::Pointee(testing::ElementsAre(HostPortPair("foo.com", 83)))); } TEST_F(HostResolverManagerTest, Mdns_Srv) { @@ -3485,13 +3540,17 @@ sizeof(kMdnsResponseSrv)); EXPECT_THAT(response.result_error(), IsOk()); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_THAT( response.request()->GetHostnameResults(), - testing::Optional(testing::ElementsAre(HostPortPair("foo.com", 8265)))); + testing::Pointee(testing::ElementsAre(HostPortPair("foo.com", 8265)))); } // Test that we are able to create multicast DNS requests that contain @@ -3514,13 +3573,17 @@ sizeof(kMdnsResponseSrvUnrestricted)); EXPECT_THAT(response.result_error(), IsOk()); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_THAT( response.request()->GetHostnameResults(), - testing::Optional(testing::ElementsAre(HostPortPair("foo.com", 8265)))); + testing::Pointee(testing::ElementsAre(HostPortPair("foo.com", 8265)))); } // Test that we are able to create multicast DNS requests that contain @@ -3544,12 +3607,16 @@ sizeof(kMdnsResponseSrvUnrestrictedResult)); EXPECT_THAT(response.result_error(), IsOk()); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_THAT(response.request()->GetHostnameResults(), - testing::Optional( + testing::Pointee( testing::ElementsAre(HostPortPair("foo bar.local", 8265)))); } @@ -3575,8 +3642,10 @@ sizeof(kMdnsResponseNsec)); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerTest, Mdns_NoResponse) { @@ -3610,11 +3679,16 @@ kSleepFudgeFactor); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); test_task_runner->FastForwardUntilNoTasksRemain(); } @@ -3655,11 +3729,16 @@ kSleepFudgeFactor); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); test_task_runner->FastForwardUntilNoTasksRemain(); } @@ -3763,8 +3842,10 @@ resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_FAILED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerTest, Mdns_ListenFailure) { @@ -3783,8 +3864,10 @@ resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_FAILED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); } // Implementation of HostResolver::MdnsListenerDelegate that records all @@ -5354,8 +5437,10 @@ NetLogWithSource(), absl::nullopt, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response_ipv4.result_error(), IsError(ERR_ICANN_NAME_COLLISION)); - EXPECT_FALSE(response_ipv4.request()->GetAddressResults()); - EXPECT_FALSE(response_ipv4.request()->GetEndpointResults()); + EXPECT_THAT(response_ipv4.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response_ipv4.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); // When the resolver returns an AAAA record with ::127.0.53.53 it should // work just like any other IP. (Despite having the same suffix, it is not @@ -5580,7 +5665,7 @@ EXPECT_THAT(response.result_error(), IsOk()); EXPECT_THAT(response.request()->GetTextResults(), - testing::Optional(testing::ElementsAre("foo", "bar"))); + testing::Pointee(testing::ElementsAre("foo", "bar"))); } #endif // BUILDFLAG(ENABLE_MDNS) @@ -5929,8 +6014,10 @@ response.request()->GetEndpointResults(), testing::Pointee(testing::ElementsAre(ExpectEndpointResult( testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 443)))))); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetTextResults()); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), testing::Pointee(testing::ElementsAre(true))); } @@ -6972,8 +7059,10 @@ EXPECT_FALSE(cache_miss_request.request() ->GetResolveErrorInfo() .is_secure_network_error); - EXPECT_FALSE(cache_miss_request.request()->GetAddressResults()); - EXPECT_FALSE(cache_miss_request.request()->GetEndpointResults()); + EXPECT_THAT(cache_miss_request.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(cache_miss_request.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_FALSE(cache_miss_request.request()->GetStaleInfo()); } @@ -7045,10 +7134,14 @@ /*optional_parameters=*/absl::nullopt, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); // Expect result not cached. EXPECT_EQ(resolve_context_->host_cache()->size(), 0u); @@ -7723,8 +7816,10 @@ HostPortPair("empty", 80), NetworkAnonymizationKey(), NetLogWithSource(), absl::nullopt, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(no_data_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(no_data_response.request()->GetAddressResults()); - EXPECT_FALSE(no_data_response.request()->GetEndpointResults()); + EXPECT_THAT(no_data_response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(no_data_response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); HostCache::Key key("empty", DnsQueryType::UNSPECIFIED, 0, HostResolverSource::ANY, NetworkAnonymizationKey()); HostCache::EntryStaleness staleness; @@ -7742,8 +7837,10 @@ resolve_context_->host_cache())); EXPECT_THAT(no_domain_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(no_domain_response.request()->GetAddressResults()); - EXPECT_FALSE(no_domain_response.request()->GetEndpointResults()); + EXPECT_THAT(no_domain_response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(no_domain_response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); HostCache::Key nxkey("nodomain", DnsQueryType::UNSPECIFIED, 0, HostResolverSource::ANY, NetworkAnonymizationKey()); cache_result = resolve_context_->host_cache()->Lookup( @@ -8151,8 +8248,7 @@ DnsResponse expected_A_response = BuildTestDnsResponse( "host.test", dns_protocol::kTypeA, - {BuildTestAddressRecord("localhost", IPAddress::IPv4Localhost()), - BuildTestCnameRecord("host2.test", "localhost"), + {BuildTestAddressRecord("host2.test", IPAddress::IPv4Localhost()), BuildTestDnsRecord( "host.test", dns_protocol::kTypeCNAME, std::string(kNonCanonicalName, sizeof(kNonCanonicalName) - 1))}); @@ -8162,8 +8258,7 @@ DnsResponse expected_AAAA_response = BuildTestDnsResponse( "host.test", dns_protocol::kTypeAAAA, - {BuildTestAddressRecord("localhost", IPAddress::IPv6Localhost()), - BuildTestCnameRecord("host2.test", "localhost"), + {BuildTestAddressRecord("host2.test", IPAddress::IPv6Localhost()), BuildTestDnsRecord( "host.test", dns_protocol::kTypeCNAME, std::string(kNonCanonicalName, sizeof(kNonCanonicalName) - 1))}); @@ -8184,18 +8279,46 @@ ASSERT_THAT(response.result_error(), IsOk()); ASSERT_TRUE(response.request()->GetAddressResults()); - // AddressList results may or may not be fixed, depending on whether or not - // they were built from endpoint results. - EXPECT_THAT( - response.request()->GetAddressResults()->dns_aliases(), - testing::AnyOf(testing::UnorderedElementsAre("host2.test", "host.test"), - testing::UnorderedElementsAre("localhost", "HOST2.test", - "host.test"))); + EXPECT_THAT(response.request()->GetAddressResults()->dns_aliases(), + testing::UnorderedElementsAre("host2.test", "host.test")); EXPECT_THAT(response.request()->GetDnsAliasResults(), testing::Pointee( testing::UnorderedElementsAre("host2.test", "host.test"))); } +TEST_F(HostResolverManagerDnsTest, RejectsLocalhostAlias) { + MockDnsClientRuleList rules; + + DnsResponse expected_A_response = BuildTestDnsResponse( + "host.test", dns_protocol::kTypeA, + {BuildTestAddressRecord("localhost", IPAddress::IPv4Localhost()), + BuildTestCnameRecord("host.test", "localhost")}); + + AddDnsRule(&rules, "host.test", dns_protocol::kTypeA, + std::move(expected_A_response), false /* delay */); + + DnsResponse expected_AAAA_response = BuildTestDnsResponse( + "host.test", dns_protocol::kTypeAAAA, + {BuildTestAddressRecord("localhost", IPAddress::IPv6Localhost()), + BuildTestCnameRecord("host.test", "localhost")}); + + AddDnsRule(&rules, "host.test", dns_protocol::kTypeAAAA, + std::move(expected_AAAA_response), false /* delay */); + + CreateResolver(); + UseMockDnsClient(CreateValidDnsConfig(), std::move(rules)); + set_allow_fallback_to_systemtask(false); + HostResolver::ResolveHostParameters params; + params.source = HostResolverSource::DNS; + + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("host.test", 80), NetworkAnonymizationKey(), + NetLogWithSource(), params, resolve_context_.get(), + resolve_context_->host_cache())); + + ASSERT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE)); +} + TEST_F(HostResolverManagerDnsTest, NoAdditionalDnsAliases) { MockDnsClientRuleList rules; @@ -9112,20 +9235,24 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsOk()); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); // Order between separate DNS records is undefined, but each record should // stay in order as that order may be meaningful. ASSERT_THAT(response.request()->GetTextResults(), - testing::Optional(testing::UnorderedElementsAre( + testing::Pointee(testing::UnorderedElementsAre( "foo1", "foo2", "foo3", "bar1", "bar2"))); - std::vector<std::string> results = - response.request()->GetTextResults().value(); - EXPECT_NE(results.end(), base::ranges::search(results, foo_records)); - EXPECT_NE(results.end(), base::ranges::search(results, bar_records)); + const std::vector<std::string>* results = + response.request()->GetTextResults(); + EXPECT_NE(results->end(), base::ranges::search(*results, foo_records)); + EXPECT_NE(results->end(), base::ranges::search(*results, bar_records)); // Expect result to be cached. EXPECT_EQ(resolve_context_->host_cache()->size(), 1u); @@ -9135,11 +9262,11 @@ parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(cached_response.result_error(), IsOk()); ASSERT_THAT(cached_response.request()->GetTextResults(), - testing::Optional(testing::UnorderedElementsAre( + testing::Pointee(testing::UnorderedElementsAre( "foo1", "foo2", "foo3", "bar1", "bar2"))); - results = cached_response.request()->GetTextResults().value(); - EXPECT_NE(results.end(), base::ranges::search(results, foo_records)); - EXPECT_NE(results.end(), base::ranges::search(results, bar_records)); + results = cached_response.request()->GetTextResults(); + EXPECT_NE(results->end(), base::ranges::search(*results, foo_records)); + EXPECT_NE(results->end(), base::ranges::search(*results, bar_records)); } TEST_F(HostResolverManagerDnsTest, TxtQueryRejectsIpLiteral) { @@ -9163,11 +9290,16 @@ NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } // Test that TXT records can be extracted from a response that also contains @@ -9195,13 +9327,17 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsOk()); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_THAT(response.request()->GetTextResults(), - testing::Optional(testing::ElementsAre("foo"))); + testing::Pointee(testing::ElementsAre("foo"))); } TEST_F(HostResolverManagerDnsTest, TxtQuery_InvalidConfig) { @@ -9242,11 +9378,16 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); // Expect result to be cached. EXPECT_EQ(resolve_context_->host_cache()->size(), 1u); @@ -9255,11 +9396,16 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(cached_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(cached_response.request()->GetAddressResults()); - EXPECT_FALSE(cached_response.request()->GetEndpointResults()); - EXPECT_FALSE(cached_response.request()->GetTextResults()); - EXPECT_FALSE(cached_response.request()->GetHostnameResults()); - EXPECT_FALSE(cached_response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(cached_response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(cached_response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(cached_response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(cached_response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(cached_response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, TxtQuery_Failure) { @@ -9284,11 +9430,16 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); // Expect result not cached. EXPECT_EQ(resolve_context_->host_cache()->size(), 0u); @@ -9316,11 +9467,16 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); // Expect result not cached. EXPECT_EQ(resolve_context_->host_cache()->size(), 0u); @@ -9350,11 +9506,16 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); // Expect result to be cached. EXPECT_EQ(resolve_context_->host_cache()->size(), 1u); @@ -9363,11 +9524,16 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(cached_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(cached_response.request()->GetAddressResults()); - EXPECT_FALSE(cached_response.request()->GetEndpointResults()); - EXPECT_FALSE(cached_response.request()->GetTextResults()); - EXPECT_FALSE(cached_response.request()->GetHostnameResults()); - EXPECT_FALSE(cached_response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(cached_response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(cached_response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(cached_response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(cached_response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(cached_response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, TxtQuery_Malformed) { @@ -9392,11 +9558,16 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); // Expect result not cached. EXPECT_EQ(resolve_context_->host_cache()->size(), 0u); @@ -9420,11 +9591,16 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); // Expect result not cached. EXPECT_EQ(resolve_context_->host_cache()->size(), 0u); @@ -9451,11 +9627,16 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); // Expect result not cached. EXPECT_EQ(resolve_context_->host_cache()->size(), 0u); @@ -9481,11 +9662,16 @@ parameters, resolve_context_.get(), resolve_context_->host_cache())); // No non-local work is done, so ERR_DNS_CACHE_MISS is the result. EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } // Same as TxtQuery except we specify DNS HostResolverSource instead of relying @@ -9518,20 +9704,24 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsOk()); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); // Order between separate DNS records is undefined, but each record should // stay in order as that order may be meaningful. ASSERT_THAT(response.request()->GetTextResults(), - testing::Optional(testing::UnorderedElementsAre( + testing::Pointee(testing::UnorderedElementsAre( "foo1", "foo2", "foo3", "bar1", "bar2"))); - std::vector<std::string> results = - response.request()->GetTextResults().value(); - EXPECT_NE(results.end(), base::ranges::search(results, foo_records)); - EXPECT_NE(results.end(), base::ranges::search(results, bar_records)); + const std::vector<std::string>* results = + response.request()->GetTextResults(); + EXPECT_NE(results->end(), base::ranges::search(*results, foo_records)); + EXPECT_NE(results->end(), base::ranges::search(*results, bar_records)); // Expect result to be cached. EXPECT_EQ(resolve_context_->host_cache()->size(), 1u); @@ -9541,11 +9731,11 @@ EXPECT_THAT(cached_response.result_error(), IsOk()); EXPECT_TRUE(cached_response.request()->GetStaleInfo()); ASSERT_THAT(cached_response.request()->GetTextResults(), - testing::Optional(testing::UnorderedElementsAre( + testing::Pointee(testing::UnorderedElementsAre( "foo1", "foo2", "foo3", "bar1", "bar2"))); - results = cached_response.request()->GetTextResults().value(); - EXPECT_NE(results.end(), base::ranges::search(results, foo_records)); - EXPECT_NE(results.end(), base::ranges::search(results, bar_records)); + results = cached_response.request()->GetTextResults(); + EXPECT_NE(results->end(), base::ranges::search(*results, foo_records)); + EXPECT_NE(results->end(), base::ranges::search(*results, bar_records)); } TEST_F(HostResolverManagerDnsTest, PtrQuery) { @@ -9565,14 +9755,18 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsOk()); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); // Order between separate records is undefined. EXPECT_THAT(response.request()->GetHostnameResults(), - testing::Optional(testing::UnorderedElementsAre( + testing::Pointee(testing::UnorderedElementsAre( HostPortPair("foo.com", 108), HostPortPair("bar.com", 108)))); } @@ -9597,11 +9791,16 @@ NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, PtrQueryHandlesReverseIpLookup) { @@ -9624,14 +9823,18 @@ NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsOk()); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); // Order between separate records is undefined. EXPECT_THAT(response.request()->GetHostnameResults(), - testing::Optional(testing::UnorderedElementsAre( + testing::Pointee(testing::UnorderedElementsAre( HostPortPair("dns.google.test", 108), HostPortPair("foo.test", 108)))); } @@ -9658,11 +9861,16 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, PtrQuery_Failure) { @@ -9687,11 +9895,16 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, PtrQuery_Timeout) { @@ -9716,11 +9929,16 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, PtrQuery_Empty) { @@ -9745,11 +9963,16 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, PtrQuery_Malformed) { @@ -9774,11 +9997,16 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, PtrQuery_MismatchedName) { @@ -9799,11 +10027,16 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, PtrQuery_WrongType) { @@ -9827,11 +10060,16 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, @@ -9854,11 +10092,16 @@ parameters, resolve_context_.get(), resolve_context_->host_cache())); // No non-local work is done, so ERR_DNS_CACHE_MISS is the result. EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } // Same as PtrQuery except we specify DNS HostResolverSource instead of relying @@ -9883,14 +10126,18 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsOk()); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); // Order between separate records is undefined. EXPECT_THAT(response.request()->GetHostnameResults(), - testing::Optional(testing::UnorderedElementsAre( + testing::Pointee(testing::UnorderedElementsAre( HostPortPair("foo.com", 108), HostPortPair("bar.com", 108)))); } @@ -9915,26 +10162,30 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsOk()); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); // Expect ordered by priority, and random within a priority. - absl::optional<std::vector<HostPortPair>> results = + const std::vector<HostPortPair>* results = response.request()->GetHostnameResults(); ASSERT_THAT( results, - testing::Optional(testing::UnorderedElementsAre( + testing::Pointee(testing::UnorderedElementsAre( HostPortPair("foo.com", 1223), HostPortPair("bar.com", 80), HostPortPair("google.com", 5), HostPortPair("chromium.org", 12345)))); - auto priority2 = std::vector<HostPortPair>(results.value().begin(), - results.value().begin() + 2); + auto priority2 = + std::vector<HostPortPair>(results->begin(), results->begin() + 2); EXPECT_THAT(priority2, testing::UnorderedElementsAre( HostPortPair("foo.com", 1223), HostPortPair("chromium.org", 12345))); - auto priority5 = std::vector<HostPortPair>(results.value().begin() + 2, - results.value().end()); + auto priority5 = + std::vector<HostPortPair>(results->begin() + 2, results->end()); EXPECT_THAT(priority5, testing::UnorderedElementsAre(HostPortPair("bar.com", 80), HostPortPair("google.com", 5))); @@ -9962,11 +10213,16 @@ NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } // 0-weight services are allowed. Ensure that we can handle such records, @@ -9990,14 +10246,18 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsOk()); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); // Expect ordered by priority, and random within a priority. EXPECT_THAT(response.request()->GetHostnameResults(), - testing::Optional(testing::UnorderedElementsAre( + testing::Pointee(testing::UnorderedElementsAre( HostPortPair("bar.com", 80), HostPortPair("google.com", 5)))); } @@ -10023,11 +10283,16 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, SrvQuery_Failure) { @@ -10052,11 +10317,16 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, SrvQuery_Timeout) { @@ -10081,11 +10351,16 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, SrvQuery_Empty) { @@ -10110,11 +10385,16 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, SrvQuery_Malformed) { @@ -10139,11 +10419,16 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, SrvQuery_MismatchedName) { @@ -10164,11 +10449,16 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, SrvQuery_WrongType) { @@ -10192,11 +10482,16 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, @@ -10219,11 +10514,16 @@ parameters, resolve_context_.get(), resolve_context_->host_cache())); // No non-local work is done, so ERR_DNS_CACHE_MISS is the result. EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } // Same as SrvQuery except we specify DNS HostResolverSource instead of relying @@ -10252,26 +10552,30 @@ HostPortPair("host", 108), NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsOk()); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); // Expect ordered by priority, and random within a priority. - absl::optional<std::vector<HostPortPair>> results = + const std::vector<HostPortPair>* results = response.request()->GetHostnameResults(); ASSERT_THAT( results, - testing::Optional(testing::UnorderedElementsAre( + testing::Pointee(testing::UnorderedElementsAre( HostPortPair("foo.com", 1223), HostPortPair("bar.com", 80), HostPortPair("google.com", 5), HostPortPair("chromium.org", 12345)))); - auto priority2 = std::vector<HostPortPair>(results.value().begin(), - results.value().begin() + 2); + auto priority2 = + std::vector<HostPortPair>(results->begin(), results->begin() + 2); EXPECT_THAT(priority2, testing::UnorderedElementsAre( HostPortPair("foo.com", 1223), HostPortPair("chromium.org", 12345))); - auto priority5 = std::vector<HostPortPair>(results.value().begin() + 2, - results.value().end()); + auto priority5 = + std::vector<HostPortPair>(results->begin() + 2, results->end()); EXPECT_THAT(priority5, testing::UnorderedElementsAre(HostPortPair("bar.com", 80), HostPortPair("google.com", 5))); @@ -10300,10 +10604,14 @@ NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsOk()); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetTextResults()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), testing::Pointee(testing::ElementsAre(true))); } @@ -10334,10 +10642,14 @@ NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsOk()); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetTextResults()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), testing::Pointee(testing::ElementsAre(true))); } @@ -10365,11 +10677,16 @@ NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_DNS_NAME_HTTPS_ONLY)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } // Test that HTTPS requests for an http host with port 443 will result in a @@ -10401,11 +10718,16 @@ NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_DNS_NAME_HTTPS_ONLY)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, @@ -10435,11 +10757,16 @@ NetworkAnonymizationKey(), NetLogWithSource(), parameters, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_DNS_NAME_HTTPS_ONLY)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, HttpsInAddressQuery) { @@ -10485,8 +10812,10 @@ testing::ElementsAre(dns_protocol::kHttpsServiceDefaultAlpn), testing::IsEmpty(), kName)), ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), testing::Pointee(testing::ElementsAre(true))); } @@ -10546,8 +10875,10 @@ testing::ElementsAre(dns_protocol::kHttpsServiceDefaultAlpn), testing::IsEmpty(), kName)), ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), testing::Pointee(testing::ElementsAre(true))); } @@ -10605,8 +10936,10 @@ EXPECT_THAT(response.request()->GetEndpointResults(), testing::Pointee(testing::ElementsAre( ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), testing::Pointee(testing::ElementsAre(true))); } @@ -10667,8 +11000,10 @@ "foo1", "foo2", dns_protocol::kHttpsServiceDefaultAlpn), testing::ElementsAreArray(kEch), kName)), ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), testing::Pointee(testing::ElementsAre(true))); } @@ -10720,8 +11055,10 @@ EXPECT_THAT(response.request()->GetEndpointResults(), testing::Pointee(testing::ElementsAre( ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), testing::Pointee(testing::ElementsAre(true))); } @@ -10779,8 +11116,10 @@ testing::ElementsAre(dns_protocol::kHttpsServiceDefaultAlpn), testing::IsEmpty(), kName)), ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), testing::Pointee(testing::ElementsAre(true))); } @@ -10846,13 +11185,18 @@ resolve_context_.get(), resolve_context_->host_cache())); // No address results overrides overall result. EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); // No results maintained when overall error is ERR_NAME_NOT_RESOLVED (and also // because of the fallback to system resolver). - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, HttpsQueriedInAddressQueryButNoResults) { @@ -10898,8 +11242,10 @@ EXPECT_THAT(response.request()->GetEndpointResults(), testing::Pointee(testing::ElementsAre( ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), testing::Pointee(testing::IsEmpty())); } @@ -10953,8 +11299,10 @@ EXPECT_THAT(response.request()->GetEndpointResults(), testing::Pointee(testing::ElementsAre( ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), testing::Pointee(testing::IsEmpty())); } @@ -11006,8 +11354,10 @@ EXPECT_THAT(response.request()->GetEndpointResults(), testing::Pointee(testing::ElementsAre( ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), testing::Pointee(testing::IsEmpty())); } @@ -11053,11 +11403,16 @@ NetworkAnonymizationKey(), NetLogWithSource(), absl::nullopt, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); // Expect result not cached. EXPECT_EQ(resolve_context_->host_cache()->size(), 0u); @@ -11108,8 +11463,10 @@ EXPECT_THAT(response.request()->GetEndpointResults(), testing::Pointee(testing::ElementsAre( ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), testing::Pointee(testing::IsEmpty())); } @@ -11163,11 +11520,16 @@ dns_client_->CompleteDelayedTransactions(); EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); // Expect result not cached. EXPECT_EQ(resolve_context_->host_cache()->size(), 0u); @@ -11239,8 +11601,10 @@ EXPECT_THAT(response.result_error(), IsOk()); EXPECT_TRUE(response.request()->GetAddressResults()); EXPECT_TRUE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_TRUE(response.request()->GetExperimentalResultsForTesting()); } @@ -11284,11 +11648,16 @@ NetworkAnonymizationKey(), NetLogWithSource(), absl::nullopt, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); // Expect result not cached. EXPECT_EQ(resolve_context_->host_cache()->size(), 0u); @@ -11339,11 +11708,16 @@ NetworkAnonymizationKey(), NetLogWithSource(), absl::nullopt, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_DNS_SERVER_FAILED)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); // Expect result not cached. EXPECT_EQ(resolve_context_->host_cache()->size(), 0u); @@ -11396,11 +11770,16 @@ NetworkAnonymizationKey(), NetLogWithSource(), absl::nullopt, resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); // Expect result not cached. EXPECT_EQ(resolve_context_->host_cache()->size(), 0u); @@ -11455,8 +11834,10 @@ EXPECT_THAT(response.request()->GetEndpointResults(), testing::Pointee(testing::ElementsAre( ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), testing::Pointee(testing::IsEmpty())); } @@ -11513,8 +11894,10 @@ testing::ElementsAre(dns_protocol::kHttpsServiceDefaultAlpn), testing::IsEmpty(), kName)), ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), testing::Pointee(testing::ElementsAre(true))); } @@ -11562,9 +11945,12 @@ EXPECT_THAT(response.request()->GetEndpointResults(), testing::Pointee(testing::ElementsAre( ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, NoHttpsInAddressQueryForNonHttpScheme) { @@ -11611,9 +11997,12 @@ EXPECT_THAT(response.request()->GetEndpointResults(), testing::Pointee(testing::ElementsAre( ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, @@ -11660,11 +12049,16 @@ resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_DNS_NAME_HTTPS_ONLY)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, @@ -11710,11 +12104,16 @@ resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_DNS_NAME_HTTPS_ONLY)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F( @@ -11770,10 +12169,12 @@ EXPECT_THAT(response.result_error(), IsOk()); EXPECT_TRUE(response.request()->GetAddressResults()); EXPECT_TRUE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), - testing::Pointee(testing::ElementsAre(false))); + Pointee(Not(Contains(true)))); } // Even if no addresses are received for a request, finding an HTTPS record @@ -11822,11 +12223,16 @@ resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_DNS_NAME_HTTPS_ONLY)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, HttpsInSecureModeAddressQuery) { @@ -11873,8 +12279,10 @@ EXPECT_THAT(response.result_error(), IsOk()); EXPECT_TRUE(response.request()->GetAddressResults()); EXPECT_TRUE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), testing::Pointee(testing::ElementsAre(true))); } @@ -11922,11 +12330,16 @@ resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_DNS_NAME_HTTPS_ONLY)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, HttpsInInsecureAddressQuery) { @@ -11979,8 +12392,10 @@ testing::ElementsAre(dns_protocol::kHttpsServiceDefaultAlpn), testing::IsEmpty(), kName)), ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), testing::Pointee(testing::ElementsAre(true))); } @@ -12025,11 +12440,16 @@ resolve_context_.get(), resolve_context_->host_cache())); EXPECT_THAT(response.result_error(), IsError(ERR_DNS_NAME_HTTPS_ONLY)); - EXPECT_FALSE(response.request()->GetAddressResults()); - EXPECT_FALSE(response.request()->GetEndpointResults()); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetAddressResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetEndpointResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, FailedHttpsInInsecureAddressRequestIgnored) { @@ -12072,8 +12492,10 @@ EXPECT_THAT(response.request()->GetEndpointResults(), testing::Pointee(testing::ElementsAre( ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), testing::Pointee(testing::IsEmpty())); } @@ -12119,8 +12541,10 @@ EXPECT_THAT(response.request()->GetEndpointResults(), testing::Pointee(testing::ElementsAre( ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), testing::Pointee(testing::IsEmpty())); } @@ -12171,8 +12595,10 @@ EXPECT_THAT(response.request()->GetEndpointResults(), testing::Pointee(testing::ElementsAre( ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), testing::Pointee(testing::IsEmpty())); } @@ -12220,8 +12646,10 @@ EXPECT_THAT(response.request()->GetEndpointResults(), testing::Pointee(testing::ElementsAre( ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), testing::Pointee(testing::IsEmpty())); } @@ -12283,8 +12711,10 @@ EXPECT_THAT(response.request()->GetEndpointResults(), testing::Pointee(testing::ElementsAre( ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), testing::Pointee(testing::IsEmpty())); } @@ -12347,10 +12777,13 @@ EXPECT_THAT(response.request()->GetEndpointResults(), testing::Pointee(testing::ElementsAre( ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); // No experimental results if transaction did not complete. - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, @@ -12411,10 +12844,13 @@ EXPECT_THAT(response.request()->GetEndpointResults(), testing::Pointee(testing::ElementsAre( ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); // No experimental results if transaction did not complete. - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, @@ -12483,10 +12919,13 @@ EXPECT_THAT(response.request()->GetEndpointResults(), testing::Pointee(testing::ElementsAre( ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); // No experimental results if transaction did not complete. - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, @@ -12557,10 +12996,13 @@ EXPECT_THAT(response.request()->GetEndpointResults(), testing::Pointee(testing::ElementsAre( ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); // No experimental results if transaction did not complete. - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, @@ -12629,10 +13071,13 @@ EXPECT_THAT(response.request()->GetEndpointResults(), testing::Pointee(testing::ElementsAre( ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); // No experimental results if transaction did not complete. - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, @@ -12701,10 +13146,13 @@ EXPECT_THAT(response.request()->GetEndpointResults(), testing::Pointee(testing::ElementsAre( ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); // No experimental results if transaction did not complete. - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, @@ -12762,10 +13210,13 @@ EXPECT_THAT(response.request()->GetEndpointResults(), testing::Pointee(testing::ElementsAre( ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); // No experimental results if transaction did not complete. - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, @@ -12823,10 +13274,13 @@ EXPECT_THAT(response.request()->GetEndpointResults(), testing::Pointee(testing::ElementsAre( ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); // No experimental results if transaction did not complete. - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, @@ -12892,10 +13346,13 @@ EXPECT_THAT(response.request()->GetEndpointResults(), testing::Pointee(testing::ElementsAre( ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); // No experimental results if transaction did not complete. - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } // Test that HTTPS timeouts are not used when fatal for the request. @@ -12964,8 +13421,10 @@ testing::ElementsAre(dns_protocol::kHttpsServiceDefaultAlpn), testing::IsEmpty(), kName)), ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), testing::Pointee(testing::ElementsAre(true))); } @@ -13025,10 +13484,13 @@ EXPECT_THAT(response.request()->GetEndpointResults(), testing::Pointee(testing::ElementsAre( ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); // No experimental results if transaction did not complete. - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, UnsolicitedHttps) { @@ -13063,10 +13525,13 @@ EXPECT_THAT(response.request()->GetEndpointResults(), testing::Pointee(testing::ElementsAre( ExpectEndpointResult(testing::SizeIs(2))))); - EXPECT_FALSE(response.request()->GetTextResults()); - EXPECT_FALSE(response.request()->GetHostnameResults()); + EXPECT_THAT(response.request()->GetTextResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); + EXPECT_THAT(response.request()->GetHostnameResults(), + AnyOf(nullptr, Pointee(IsEmpty()))); // Unsolicited records not included in results. - EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting()); + EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(), + AnyOf(nullptr, Pointee(IsEmpty()))); } TEST_F(HostResolverManagerDnsTest, DohProbeRequest) { @@ -13409,9 +13874,9 @@ const auto* secure_result = resolve_context_->host_cache()->Lookup( MakeCacheKey(/*secure=*/true), GetMockTickClock()->NowTicks()); ASSERT_THAT(secure_result, testing::NotNull()); - EXPECT_THAT(secure_result->second.GetEndpoints(), - testing::Optional(testing::ElementsAre( - ExpectEndpointResult(AddressesMatch(kRemoteAddrs))))); + EXPECT_THAT( + secure_result->second.GetEndpoints(), + testing::ElementsAre(ExpectEndpointResult(AddressesMatch(kRemoteAddrs)))); } // The insecure cache is ignored, so the results are identical to @@ -13441,9 +13906,9 @@ const auto* secure_result = resolve_context_->host_cache()->Lookup( MakeCacheKey(/*secure=*/true), GetMockTickClock()->NowTicks()); ASSERT_THAT(secure_result, testing::NotNull()); - EXPECT_THAT(secure_result->second.GetEndpoints(), - testing::Optional(testing::ElementsAre( - ExpectEndpointResult(AddressesMatch(kRemoteAddrs))))); + EXPECT_THAT( + secure_result->second.GetEndpoints(), + testing::ElementsAre(ExpectEndpointResult(AddressesMatch(kRemoteAddrs)))); } // The bootstrap addrs are ignored, so the results are identical to @@ -13623,9 +14088,9 @@ const auto* secure_result = resolve_context_->host_cache()->Lookup( MakeCacheKey(/*secure=*/true), GetMockTickClock()->NowTicks()); ASSERT_THAT(secure_result, testing::NotNull()); - EXPECT_THAT(secure_result->second.GetEndpoints(), - testing::Optional(testing::ElementsAre( - ExpectEndpointResult(AddressesMatch(kRemoteAddrs))))); + EXPECT_THAT( + secure_result->second.GetEndpoints(), + testing::ElementsAre(ExpectEndpointResult(AddressesMatch(kRemoteAddrs)))); } void HostResolverManagerTest::IPv4AddressLiteralInIPv6OnlyNetworkTest(
diff --git a/net/dns/host_resolver_mdns_listener_impl.cc b/net/dns/host_resolver_mdns_listener_impl.cc index 6253a6b..2e9a863 100644 --- a/net/dns/host_resolver_mdns_listener_impl.cc +++ b/net/dns/host_resolver_mdns_listener_impl.cc
@@ -78,21 +78,19 @@ break; case DnsQueryType::A: case DnsQueryType::AAAA: - DCHECK(parsed_entry.ip_endpoints()); - DCHECK_EQ(1u, parsed_entry.ip_endpoints()->size()); + DCHECK_EQ(1u, parsed_entry.ip_endpoints().size()); delegate_->OnAddressResult(ConvertUpdateType(update), query_type_, - parsed_entry.ip_endpoints()->front()); + parsed_entry.ip_endpoints().front()); break; case DnsQueryType::TXT: - DCHECK(parsed_entry.text_records()); delegate_->OnTextResult(ConvertUpdateType(update), query_type_, - parsed_entry.text_records().value()); + parsed_entry.text_records()); break; case DnsQueryType::PTR: case DnsQueryType::SRV: - DCHECK(parsed_entry.hostnames()); + DCHECK(!parsed_entry.hostnames().empty()); delegate_->OnHostnameResult(ConvertUpdateType(update), query_type_, - parsed_entry.hostnames().value().front()); + parsed_entry.hostnames().front()); break; } }
diff --git a/net/dns/mock_host_resolver.cc b/net/dns/mock_host_resolver.cc index b4219b6..1b68ed1 100644 --- a/net/dns/mock_host_resolver.cc +++ b/net/dns/mock_host_resolver.cc
@@ -200,20 +200,16 @@ return base::OptionalToPtr(endpoint_results_); } - const absl::optional<std::vector<std::string>>& GetTextResults() - const override { + const std::vector<std::string>* GetTextResults() const override { DCHECK(complete_); - static const base::NoDestructor<absl::optional<std::vector<std::string>>> - nullopt_result; - return *nullopt_result; + static const base::NoDestructor<std::vector<std::string>> empty_result; + return empty_result.get(); } - const absl::optional<std::vector<HostPortPair>>& GetHostnameResults() - const override { + const std::vector<HostPortPair>* GetHostnameResults() const override { DCHECK(complete_); - static const base::NoDestructor<absl::optional<std::vector<HostPortPair>>> - nullopt_result; - return *nullopt_result; + static const base::NoDestructor<std::vector<HostPortPair>> empty_result; + return empty_result.get(); } const std::set<std::string>* GetDnsAliasResults() const override { @@ -1030,11 +1026,9 @@ if (cache_result) { rv = cache_result->second.error(); if (rv == OK) { - *out_endpoints = cache_result->second.GetEndpoints().value(); + *out_endpoints = cache_result->second.GetEndpoints(); - if (cache_result->second.aliases()) { - *out_aliases = *cache_result->second.aliases(); - } + *out_aliases = cache_result->second.aliases(); *out_stale_info = std::move(stale_info); } @@ -1444,13 +1438,11 @@ base::ImmediateCrash(); } - const absl::optional<std::vector<std::string>>& GetTextResults() - const override { + const std::vector<std::string>* GetTextResults() const override { base::ImmediateCrash(); } - const absl::optional<std::vector<HostPortPair>>& GetHostnameResults() - const override { + const std::vector<HostPortPair>* GetHostnameResults() const override { base::ImmediateCrash(); }
diff --git a/net/quic/quic_chromium_client_session.cc b/net/quic/quic_chromium_client_session.cc index 551c8a0..08fb24b 100644 --- a/net/quic/quic_chromium_client_session.cc +++ b/net/quic/quic_chromium_client_session.cc
@@ -39,6 +39,7 @@ #include "net/http/transport_security_state.h" #include "net/log/net_log_event_type.h" #include "net/log/net_log_source_type.h" +#include "net/log/net_log_values.h" #include "net/quic/address_utils.h" #include "net/quic/crypto/proof_verifier_chromium.h" #include "net/quic/quic_chromium_connection_helper.h" @@ -296,7 +297,8 @@ const quic::QuicConnectionId& client_connection_id, const quic::ParsedQuicVersionVector& supported_versions, int cert_verify_flags, - bool require_confirmation) { + bool require_confirmation, + base::span<const uint8_t> ech_config_list) { base::Value::Dict dict; dict.Set("host", session_key->server_id().host()); dict.Set("port", session_key->server_id().port()); @@ -311,6 +313,9 @@ dict.Set("client_connection_id", client_connection_id.ToString()); } dict.Set("versions", ParsedQuicVersionVectorToString(supported_versions)); + if (!ech_config_list.empty()) { + dict.Set("ech_config_list", NetLogBinaryValue(ech_config_list)); + } return dict; } @@ -1060,7 +1065,8 @@ net_log_.BeginEvent(NetLogEventType::QUIC_SESSION, [&] { return NetLogQuicClientSessionParams( &session_key, connection_id(), connection->client_connection_id(), - supported_versions(), cert_verify_flags, require_confirmation_); + supported_versions(), cert_verify_flags, require_confirmation_, + ech_config_list_); }); IPEndPoint address; if (socket_raw && socket_raw->GetLocalAddress(&address) == OK &&
diff --git a/net/quic/quic_connection_logger.cc b/net/quic/quic_connection_logger.cc index 74c06a7efb..d88a8a8a 100644 --- a/net/quic/quic_connection_logger.cc +++ b/net/quic/quic_connection_logger.cc
@@ -580,4 +580,9 @@ event_logger_.OnZeroRttRejected(reason); } +void QuicConnectionLogger::OnEncryptedClientHelloSent( + std::string_view client_hello) { + event_logger_.OnEncryptedClientHelloSent(client_hello); +} + } // namespace net
diff --git a/net/quic/quic_connection_logger.h b/net/quic/quic_connection_logger.h index a697e48..adca84b 100644 --- a/net/quic/quic_connection_logger.h +++ b/net/quic/quic_connection_logger.h
@@ -121,6 +121,8 @@ const quic::TransportParameters& transport_parameters) override; void OnTransportParametersResumed( const quic::TransportParameters& transport_parameters) override; + void OnZeroRttRejected(int reason) override; + void OnEncryptedClientHelloSent(std::string_view client_hello) override; void OnCryptoHandshakeMessageReceived( const quic::CryptoHandshakeMessage& message); @@ -134,8 +136,6 @@ // Returns connection's overall packet loss rate in fraction. float ReceivedPacketLossRate() const; - void OnZeroRttRejected(int reason) override; - private: raw_ptr<quic::QuicSession> session_; // Unowned. // The last packet number received.
diff --git a/net/quic/quic_event_logger.cc b/net/quic/quic_event_logger.cc index ccac6385..0fb6ce5 100644 --- a/net/quic/quic_event_logger.cc +++ b/net/quic/quic_event_logger.cc
@@ -4,6 +4,7 @@ #include "net/quic/quic_event_logger.h" +#include "base/containers/span.h" #include "base/strings/string_number_conversions.h" #include "net/cert/x509_certificate.h" #include "net/log/net_log_values.h" @@ -840,4 +841,14 @@ [reason] { return NetLogQuicZeroRttRejectReason(reason); }); } +void QuicEventLogger::OnEncryptedClientHelloSent( + std::string_view client_hello) { + net_log_.AddEvent(NetLogEventType::SSL_ENCRYPTED_CLIENT_HELLO, [&] { + base::Value::Dict dict; + dict.Set("bytes", + NetLogBinaryValue(base::as_bytes(base::make_span(client_hello)))); + return dict; + }); +} + } // namespace net
diff --git a/net/quic/quic_event_logger.h b/net/quic/quic_event_logger.h index 8191651..aae0cf7 100644 --- a/net/quic/quic_event_logger.h +++ b/net/quic/quic_event_logger.h
@@ -104,6 +104,7 @@ void OnTransportParametersResumed( const quic::TransportParameters& transport_parameters) override; void OnZeroRttRejected(int reason) override; + void OnEncryptedClientHelloSent(std::string_view client_hello) override; // Events that are not received via the visitor and have to be called manually // from the session.
diff --git a/net/quic/quic_stream_factory.cc b/net/quic/quic_stream_factory.cc index 9fceb5d..1d378909 100644 --- a/net/quic/quic_stream_factory.cc +++ b/net/quic/quic_stream_factory.cc
@@ -684,15 +684,19 @@ // Inform the factory of this resolution, which will set up // a session alias, if possible. - // TODO(crbug.com/1264933): Consider dealing with the other endpoints - // with protocol metadata. - if (factory_->HasMatchingIpSession( - key_, - HostResolver::GetNonProtocolEndpoints( - *resolve_host_request_->GetEndpointResults()), - *resolve_host_request_->GetDnsAliasResults(), use_dns_aliases_)) { - LogConnectionIpPooling(true); - return OK; + const bool svcb_optional = + IsSvcbOptional(*resolve_host_request_->GetEndpointResults()); + for (const auto& endpoint : *resolve_host_request_->GetEndpointResults()) { + // Only consider endpoints that would have been eligible for QUIC. + if (!SelectQuicVersion(endpoint, svcb_optional).IsKnown()) { + continue; + } + if (factory_->HasMatchingIpSession( + key_, endpoint.ip_endpoints, + *resolve_host_request_->GetDnsAliasResults(), use_dns_aliases_)) { + LogConnectionIpPooling(true); + return OK; + } } io_state_ = STATE_CREATE_SESSION; return OK;
diff --git a/net/quic/quic_stream_factory_test.cc b/net/quic/quic_stream_factory_test.cc index b6d654c..b92002d 100644 --- a/net/quic/quic_stream_factory_test.cc +++ b/net/quic/quic_stream_factory_test.cc
@@ -105,12 +105,16 @@ const char kDefaultServerHostName[] = "www.example.org"; const char kServer2HostName[] = "mail.example.org"; +const char kServer3HostName[] = "docs.example.org"; +const char kServer4HostName[] = "images.example.org"; +const char kServer5HostName[] = "accounts.example.org"; const char kDifferentHostname[] = "different.example.com"; const int kDefaultServerPort = 443; const char kDefaultUrl[] = "https://www.example.org/"; const char kServer2Url[] = "https://mail.example.org/"; const char kServer3Url[] = "https://docs.example.org/"; const char kServer4Url[] = "https://images.example.org/"; +const char kServer5Url[] = "https://images.example.org/"; const size_t kMinRetryTimeForDefaultNetworkSecs = 1; const size_t kWaitTimeForNewNetworkSecs = 10; const quic::QuicConnectionId kNewCID = quic::test::TestConnectionId(12345678); @@ -270,13 +274,6 @@ false), http_server_properties_(std::make_unique<HttpServerProperties>()), cert_verifier_(std::make_unique<MockCertVerifier>()), - scheme_host_port_(url::kHttpsScheme, - kDefaultServerHostName, - kDefaultServerPort), - url_(kDefaultUrl), - url2_(kServer2Url), - url3_(kServer3Url), - url4_(kServer4Url), failed_on_default_network_callback_(base::BindRepeating( &QuicStreamFactoryTestBase::OnFailedOnDefaultNetwork, base::Unretained(this))), @@ -968,11 +965,13 @@ std::unique_ptr<ScopedMockNetworkChangeNotifier> scoped_mock_network_change_notifier_; std::unique_ptr<QuicStreamFactory> factory_; - url::SchemeHostPort scheme_host_port_; - GURL url_; - GURL url2_; - GURL url3_; - GURL url4_; + url::SchemeHostPort scheme_host_port_{ + url::kHttpsScheme, kDefaultServerHostName, kDefaultServerPort}; + GURL url_{kDefaultUrl}; + GURL url2_{kServer2Url}; + GURL url3_{kServer3Url}; + GURL url4_{kServer4Url}; + GURL url5_{kServer5Url}; PrivacyMode privacy_mode_ = PRIVACY_MODE_DISABLED; NetLogWithSource net_log_; @@ -1754,6 +1753,7 @@ } TEST_P(QuicStreamFactoryTest, Pooling) { + quic_params_->supported_versions = {version_}; Initialize(); ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); @@ -1763,13 +1763,60 @@ socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket()); socket_data.AddSocketDataToFactory(socket_factory_.get()); + client_maker_.Reset(); + MockQuicData socket_data2(version_); + socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); + socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket()); + socket_data2.AddSocketDataToFactory(socket_factory_.get()); + + const IPEndPoint kRightIP(*IPAddress::FromIPLiteral("192.168.0.1"), + kDefaultServerPort); + const IPEndPoint kWrongIP(*IPAddress::FromIPLiteral("192.168.0.2"), + kDefaultServerPort); + const std::string kRightALPN = quic::AlpnForVersion(version_); + const std::string kWrongALPN = "h2"; + url::SchemeHostPort server2(url::kHttpsScheme, kServer2HostName, kDefaultServerPort); + url::SchemeHostPort server3(url::kHttpsScheme, kServer3HostName, + kDefaultServerPort); + url::SchemeHostPort server4(url::kHttpsScheme, kServer4HostName, + kDefaultServerPort); + url::SchemeHostPort server5(url::kHttpsScheme, kServer5HostName, + kDefaultServerPort); host_resolver_->set_synchronous_mode(true); host_resolver_->rules()->AddIPLiteralRule(scheme_host_port_.host(), "192.168.0.1", ""); + + // `server2` resolves to the same IP address via A/AAAA records, i.e. without + // ALPN information. host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", ""); + // `server3` resolves to the same IP address, but only via an alternative + // endpoint with matching ALPN. + std::vector<HostResolverEndpointResult> endpoints(1); + endpoints[0].ip_endpoints = {kRightIP}; + endpoints[0].metadata.supported_protocol_alpns = {kRightALPN}; + host_resolver_->rules()->AddRule( + server3.host(), + MockHostResolverBase::RuleResolver::RuleResult({std::move(endpoints)})); + + // `server4` resolves to the same IP address, but only via an alternative + // endpoint with a mismatching ALPN. + endpoints = std::vector<HostResolverEndpointResult>(2); + endpoints[0].ip_endpoints = {kRightIP}; + endpoints[0].metadata.supported_protocol_alpns = {kWrongALPN}; + endpoints[1].ip_endpoints = {kWrongIP}; + endpoints[1].metadata.supported_protocol_alpns = {kRightALPN}; + host_resolver_->rules()->AddRule( + server4.host(), + MockHostResolverBase::RuleResolver::RuleResult({std::move(endpoints)})); + + // `server5` resolves to the same IP address via A/AAAA records, i.e. without + // ALPN information. + host_resolver_->rules()->AddIPLiteralRule(server5.host(), "192.168.0.1", ""); + + // Establish a QUIC session to pool against. QuicStreamRequest request(factory_.get()); EXPECT_EQ(ERR_IO_PENDING, request.Request( @@ -1782,6 +1829,9 @@ std::unique_ptr<HttpStream> stream = CreateStream(&request); EXPECT_TRUE(stream.get()); + // `server2` can pool with the existing session. Although the endpoint does + // not specify ALPN, we connect here with preexisting knowledge of the version + // (from Alt-Svc), so an A/AAAA match is sufficient. TestCompletionCallback callback; QuicStreamRequest request2(factory_.get()); EXPECT_EQ(OK, @@ -1793,11 +1843,57 @@ failed_on_default_network_callback_, callback.callback())); std::unique_ptr<HttpStream> stream2 = CreateStream(&request2); EXPECT_TRUE(stream2.get()); - EXPECT_EQ(GetActiveSession(scheme_host_port_), GetActiveSession(server2)); + // `server3` can pool with the existing session. The endpoint's ALPN protocol + // matches. + QuicStreamRequest request3(factory_.get()); + EXPECT_EQ(OK, + request3.Request( + server3, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(), + NetworkAnonymizationKey(), SecureDnsPolicy::kAllow, + /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false, + /*cert_verify_flags=*/0, url3_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback.callback())); + std::unique_ptr<HttpStream> stream3 = CreateStream(&request3); + EXPECT_TRUE(stream3.get()); + EXPECT_EQ(GetActiveSession(scheme_host_port_), GetActiveSession(server3)); + + // `server4` cannot pool with the existing session. No endpoint matches both + // IP and ALPN protocol. + QuicStreamRequest request4(factory_.get()); + EXPECT_EQ(ERR_IO_PENDING, + request4.Request( + server4, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(), + NetworkAnonymizationKey(), SecureDnsPolicy::kAllow, + /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false, + /*cert_verify_flags=*/0, url4_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback_.callback())); + EXPECT_THAT(callback_.WaitForResult(), IsOk()); + std::unique_ptr<HttpStream> stream4 = CreateStream(&request4); + EXPECT_TRUE(stream4.get()); + EXPECT_NE(GetActiveSession(scheme_host_port_), GetActiveSession(server4)); + + // `server5` cannot pool with the existing session. Although the IP address + // matches, if we connect without prior knowledge of QUIC support, endpoints + // are only eligible for cross-name pooling when associated with a QUIC ALPN. + // + // Without pooling, the DNS response is insufficient to start a QUIC + // connection, so the connection will fail. + QuicStreamRequest request5(factory_.get()); + EXPECT_EQ(ERR_DNS_NO_MATCHING_SUPPORTED_ALPN, + request5.Request( + server5, quic::ParsedQuicVersion::Unsupported(), privacy_mode_, + DEFAULT_PRIORITY, SocketTag(), NetworkAnonymizationKey(), + SecureDnsPolicy::kAllow, + /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/true, + /*cert_verify_flags=*/0, url5_, net_log_, &net_error_details_, + failed_on_default_network_callback_, callback_.callback())); + EXPECT_TRUE(socket_data.AllReadDataConsumed()); EXPECT_TRUE(socket_data.AllWriteDataConsumed()); + EXPECT_TRUE(socket_data2.AllReadDataConsumed()); + EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); } // Regression test for https://crbug.com/639916.
diff --git a/net/spdy/spdy_session_pool.cc b/net/spdy/spdy_session_pool.cc index 3b3177af..9afa519 100644 --- a/net/spdy/spdy_session_pool.cc +++ b/net/spdy/spdy_session_pool.cc
@@ -296,129 +296,140 @@ return OnHostResolutionCallbackResult::kMayBeDeletedAsync; } - // TODO(crbug.com/1264933): Consider dealing with the other endpoints - // with protocol metadata. - const auto ip_endpoints = - HostResolver::GetNonProtocolEndpoints(endpoint_results); - for (const auto& address : ip_endpoints) { - auto range = aliases_.equal_range(address); - for (auto alias_it = range.first; alias_it != range.second; ++alias_it) { - // We found a potential alias. - const SpdySessionKey& alias_key = alias_it->second; + for (const auto& endpoint : endpoint_results) { + // If `endpoint` has no associated ALPN protocols, it is TCP-based and thus + // would have been eligible for connecting with HTTP/2. + if (!endpoint.metadata.supported_protocol_alpns.empty() && + !base::Contains(endpoint.metadata.supported_protocol_alpns, "h2")) { + continue; + } + for (const auto& address : endpoint.ip_endpoints) { + auto range = aliases_.equal_range(address); + for (auto alias_it = range.first; alias_it != range.second; ++alias_it) { + // We found a potential alias. + const SpdySessionKey& alias_key = alias_it->second; - auto available_session_it = LookupAvailableSessionByKey(alias_key); - // It shouldn't be in the aliases table if it doesn't exist! - DCHECK(available_session_it != available_sessions_.end()); + auto available_session_it = LookupAvailableSessionByKey(alias_key); + // It shouldn't be in the aliases table if it doesn't exist! + DCHECK(available_session_it != available_sessions_.end()); - SpdySessionKey::CompareForAliasingResult compare_result = - alias_key.CompareForAliasing(key); - // Keys must be aliasable. - if (!compare_result.is_potentially_aliasable) - continue; - - if (is_websocket && !available_session_it->second->support_websocket()) - continue; - - // Make copy of WeakPtr as call to UnmapKey() will delete original. - const base::WeakPtr<SpdySession> available_session = - available_session_it->second; - - // Need to verify that the server is authenticated to serve traffic for - // |host_port_proxy_pair| too. - if (!available_session->VerifyDomainAuthentication( - key.host_port_pair().host())) { - UMA_HISTOGRAM_ENUMERATION("Net.SpdyIPPoolDomainMatch", 0, 2); - continue; - } - - UMA_HISTOGRAM_ENUMERATION("Net.SpdyIPPoolDomainMatch", 1, 2); - - bool adding_pooled_alias = true; - - // If socket tags differ, see if session's socket tag can be changed. - if (!compare_result.is_socket_tag_match) { - SpdySessionKey old_key = available_session->spdy_session_key(); - SpdySessionKey new_key(old_key.host_port_pair(), old_key.proxy_server(), - old_key.privacy_mode(), - old_key.is_proxy_session(), key.socket_tag(), - old_key.network_anonymization_key(), - old_key.secure_dns_policy()); - - // If there is already a session with |new_key|, skip this one. - // It will be found in |aliases_| in a future iteration. - if (available_sessions_.find(new_key) != available_sessions_.end()) + SpdySessionKey::CompareForAliasingResult compare_result = + alias_key.CompareForAliasing(key); + // Keys must be aliasable. + if (!compare_result.is_potentially_aliasable) { continue; + } - if (!available_session->ChangeSocketTag(key.socket_tag())) + if (is_websocket && + !available_session_it->second->support_websocket()) { continue; + } - DCHECK(available_session->spdy_session_key() == new_key); + // Make copy of WeakPtr as call to UnmapKey() will delete original. + const base::WeakPtr<SpdySession> available_session = + available_session_it->second; - // If this isn't a pooled alias, but the actual session that needs to - // have its socket tag change, there's no need to add an alias. - if (new_key == key) - adding_pooled_alias = false; + // Need to verify that the server is authenticated to serve traffic for + // |host_port_proxy_pair| too. + if (!available_session->VerifyDomainAuthentication( + key.host_port_pair().host())) { + UMA_HISTOGRAM_ENUMERATION("Net.SpdyIPPoolDomainMatch", 0, 2); + continue; + } - // Remap main session key. - std::set<std::string> main_session_old_dns_aliases = - GetDnsAliasesForSessionKey(old_key); - UnmapKey(old_key); - MapKeyToAvailableSession(new_key, available_session, - std::move(main_session_old_dns_aliases)); + UMA_HISTOGRAM_ENUMERATION("Net.SpdyIPPoolDomainMatch", 1, 2); - // Remap alias. From this point on |alias_it| is invalid, so no more - // iterations of the loop should be allowed. - aliases_.insert(AliasMap::value_type(alias_it->first, new_key)); - aliases_.erase(alias_it); + bool adding_pooled_alias = true; - // Remap pooled session keys. - const auto& pooled_aliases = available_session->pooled_aliases(); - for (auto it = pooled_aliases.begin(); it != pooled_aliases.end();) { - // Ignore aliases this loop is inserting. - if (it->socket_tag() == key.socket_tag()) { - ++it; + // If socket tags differ, see if session's socket tag can be changed. + if (!compare_result.is_socket_tag_match) { + SpdySessionKey old_key = available_session->spdy_session_key(); + SpdySessionKey new_key(old_key.host_port_pair(), + old_key.proxy_server(), old_key.privacy_mode(), + old_key.is_proxy_session(), key.socket_tag(), + old_key.network_anonymization_key(), + old_key.secure_dns_policy()); + + // If there is already a session with |new_key|, skip this one. + // It will be found in |aliases_| in a future iteration. + if (available_sessions_.find(new_key) != available_sessions_.end()) { continue; } - std::set<std::string> pooled_alias_old_dns_aliases = - GetDnsAliasesForSessionKey(*it); - UnmapKey(*it); - SpdySessionKey new_pool_alias_key = SpdySessionKey( - it->host_port_pair(), it->proxy_server(), it->privacy_mode(), - it->is_proxy_session(), key.socket_tag(), - it->network_anonymization_key(), it->secure_dns_policy()); - MapKeyToAvailableSession(new_pool_alias_key, available_session, - std::move(pooled_alias_old_dns_aliases)); - auto old_it = it; - ++it; - available_session->RemovePooledAlias(*old_it); - available_session->AddPooledAlias(new_pool_alias_key); + if (!available_session->ChangeSocketTag(key.socket_tag())) { + continue; + } - // If this is desired key, no need to add an alias for the desired key - // at the end of this method. - if (new_pool_alias_key == key) + DCHECK(available_session->spdy_session_key() == new_key); + + // If this isn't a pooled alias, but the actual session that needs to + // have its socket tag change, there's no need to add an alias. + if (new_key == key) { adding_pooled_alias = false; + } + + // Remap main session key. + std::set<std::string> main_session_old_dns_aliases = + GetDnsAliasesForSessionKey(old_key); + UnmapKey(old_key); + MapKeyToAvailableSession(new_key, available_session, + std::move(main_session_old_dns_aliases)); + + // Remap alias. From this point on |alias_it| is invalid, so no more + // iterations of the loop should be allowed. + aliases_.insert(AliasMap::value_type(alias_it->first, new_key)); + aliases_.erase(alias_it); + + // Remap pooled session keys. + const auto& pooled_aliases = available_session->pooled_aliases(); + for (auto it = pooled_aliases.begin(); it != pooled_aliases.end();) { + // Ignore aliases this loop is inserting. + if (it->socket_tag() == key.socket_tag()) { + ++it; + continue; + } + + std::set<std::string> pooled_alias_old_dns_aliases = + GetDnsAliasesForSessionKey(*it); + UnmapKey(*it); + SpdySessionKey new_pool_alias_key = SpdySessionKey( + it->host_port_pair(), it->proxy_server(), it->privacy_mode(), + it->is_proxy_session(), key.socket_tag(), + it->network_anonymization_key(), it->secure_dns_policy()); + MapKeyToAvailableSession(new_pool_alias_key, available_session, + std::move(pooled_alias_old_dns_aliases)); + auto old_it = it; + ++it; + available_session->RemovePooledAlias(*old_it); + available_session->AddPooledAlias(new_pool_alias_key); + + // If this is desired key, no need to add an alias for the desired + // key at the end of this method. + if (new_pool_alias_key == key) { + adding_pooled_alias = false; + } + } } + + if (adding_pooled_alias) { + // Add this session to the map so that we can find it next time. + MapKeyToAvailableSession(key, available_session, aliases); + available_session->AddPooledAlias(key); + } + + // Post task to inform pending requests for session for |key| that a + // matching session is now available. + base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( + FROM_HERE, base::BindOnce(&SpdySessionPool::UpdatePendingRequests, + weak_ptr_factory_.GetWeakPtr(), key)); + + // Inform the caller that the Callback may be deleted if the consumer is + // switched over to the newly aliased session. It's not guaranteed to be + // deleted, as the session may be closed, or taken by yet another + // pending request with a different SocketTag before the the request can + // try and use the session. + return OnHostResolutionCallbackResult::kMayBeDeletedAsync; } - - if (adding_pooled_alias) { - // Add this session to the map so that we can find it next time. - MapKeyToAvailableSession(key, available_session, aliases); - available_session->AddPooledAlias(key); - } - - // Post task to inform pending requests for session for |key| that a - // matching session is now available. - base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, base::BindOnce(&SpdySessionPool::UpdatePendingRequests, - weak_ptr_factory_.GetWeakPtr(), key)); - - // Inform the caller that the Callback may be deleted if the consumer is - // switched over to the newly aliased session. It's not guaranteed to be - // deleted, as the session may be closed, or taken by yet another pending - // request with a different SocketTag before the the request can try and - // use the session. - return OnHostResolutionCallbackResult::kMayBeDeletedAsync; } } return OnHostResolutionCallbackResult::kContinue;
diff --git a/net/spdy/spdy_session_pool_unittest.cc b/net/spdy/spdy_session_pool_unittest.cc index b5dad34..c2b5ff0b 100644 --- a/net/spdy/spdy_session_pool_unittest.cc +++ b/net/spdy/spdy_session_pool_unittest.cc
@@ -125,12 +125,13 @@ // Attempts to set up an alias for |key| using an already existing session in // |pool|. To do this, simulates a host resolution that returns -// |ip_address_list|. -bool TryCreateAliasedSpdySession(SpdySessionPool* pool, - const SpdySessionKey& key, - const std::string& ip_address_list, - bool enable_ip_based_pooling = true, - bool is_websocket = false) { +// |endpoints|. +bool TryCreateAliasedSpdySession( + SpdySessionPool* pool, + const SpdySessionKey& key, + const std::vector<HostResolverEndpointResult>& endpoints, + bool enable_ip_based_pooling = true, + bool is_websocket = false) { // The requested session must not already exist. EXPECT_FALSE(pool->FindAvailableSession(key, enable_ip_based_pooling, is_websocket, NetLogWithSource())); @@ -148,16 +149,9 @@ EXPECT_TRUE(request); EXPECT_TRUE(is_blocking_request_for_session); - std::vector<IPEndPoint> ip_endpoints; - EXPECT_THAT(ParseAddressList(ip_address_list, &ip_endpoints), IsOk()); - HostResolverEndpointResult endpoint; - for (auto& ip_endpoint : ip_endpoints) { - endpoint.ip_endpoints.emplace_back(ip_endpoint.address(), 443); - } - // Simulate a host resolution completing. OnHostResolutionCallbackResult result = pool->OnHostResolutionComplete( - key, is_websocket, {endpoint}, /*aliases=*/{}); + key, is_websocket, endpoints, /*aliases=*/{}); // Spin the message loop and see if it creates an H2 session. base::RunLoop().RunUntilIdle(); @@ -181,6 +175,24 @@ return request_delegate.spdy_session() != nullptr; } +// Attempts to set up an alias for |key| using an already existing session in +// |pool|. To do this, simulates a host resolution that returns +// |ip_address_list|. +bool TryCreateAliasedSpdySession(SpdySessionPool* pool, + const SpdySessionKey& key, + const std::string& ip_address_list, + bool enable_ip_based_pooling = true, + bool is_websocket = false) { + std::vector<IPEndPoint> ip_endpoints; + EXPECT_THAT(ParseAddressList(ip_address_list, &ip_endpoints), IsOk()); + HostResolverEndpointResult endpoint; + for (auto& ip_endpoint : ip_endpoints) { + endpoint.ip_endpoints.emplace_back(ip_endpoint.address(), 443); + } + return TryCreateAliasedSpdySession(pool, key, {endpoint}, + enable_ip_based_pooling, is_websocket); +} + // A delegate that opens a new session when it is closed. class SessionOpeningDelegate : public SpdyStream::Delegate { public: @@ -832,6 +844,102 @@ histogram_tester.ExpectUniqueSample("Net.SpdySessionGet", 2, 2); } +// Test IP pooling when the DNS responses have ALPNs. +TEST_F(SpdySessionPoolTest, IPPoolingDnsAlpn) { + // Define two hosts with identical IP address. + constexpr int kTestPort = 443; + struct TestHosts { + std::string name; + std::vector<HostResolverEndpointResult> endpoints; + SpdySessionKey key; + } test_hosts[] = {{"www.example.org"}, + {"mail.example.org"}, + {"mail.example.com"}, + {"example.test"}}; + + const IPEndPoint kRightIP(*IPAddress::FromIPLiteral("192.168.0.1"), + kTestPort); + const IPEndPoint kWrongIP(*IPAddress::FromIPLiteral("192.168.0.2"), + kTestPort); + const std::string kRightALPN = "h2"; + const std::string kWrongALPN = "h3"; + + // `test_hosts[0]` and `test_hosts[1]` resolve to the same IP address, without + // any ALPN information. + test_hosts[0].endpoints.emplace_back(); + test_hosts[0].endpoints[0].ip_endpoints = {kRightIP}; + test_hosts[1].endpoints.emplace_back(); + test_hosts[1].endpoints[0].ip_endpoints = {kRightIP}; + + // `test_hosts[2]` resolves to the same IP address, but only via an + // alternative endpoint with matching ALPN. + test_hosts[2].endpoints.emplace_back(); + test_hosts[2].endpoints[0].ip_endpoints = {kRightIP}; + test_hosts[2].endpoints[0].metadata.supported_protocol_alpns = {kRightALPN}; + + // `test_hosts[3]` resolves to the same IP address, but only via an + // alternative endpoint with a mismatching ALPN. + test_hosts[3].endpoints.resize(2); + test_hosts[3].endpoints[0].ip_endpoints = {kRightIP}; + test_hosts[3].endpoints[0].metadata.supported_protocol_alpns = {kWrongALPN}; + test_hosts[3].endpoints[1].ip_endpoints = {kWrongIP}; + test_hosts[3].endpoints[1].metadata.supported_protocol_alpns = {kRightALPN}; + + // Populate the HostResolver cache. + session_deps_.host_resolver->set_synchronous_mode(true); + for (auto& test_host : test_hosts) { + session_deps_.host_resolver->rules()->AddRule( + test_host.name, + MockHostResolverBase::RuleResolver::RuleResult(test_host.endpoints)); + + test_host.key = SpdySessionKey( + HostPortPair(test_host.name, kTestPort), ProxyServer::Direct(), + PRIVACY_MODE_DISABLED, SpdySessionKey::IsProxySession::kFalse, + SocketTag(), NetworkAnonymizationKey(), SecureDnsPolicy::kAllow); + } + + MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING)}; + StaticSocketDataProvider data(reads, base::span<MockWrite>()); + MockConnect connect_data(SYNCHRONOUS, OK); + data.set_connect_data(connect_data); + + session_deps_.socket_factory->AddSocketDataProvider(&data); + AddSSLSocketData(); + + CreateNetworkSession(); + + // Open SpdySession to the first host. + base::WeakPtr<SpdySession> session0 = CreateSpdySession( + http_session_.get(), test_hosts[0].key, NetLogWithSource()); + + // The second host should pool to the existing connection. Although the + // addresses are not associated with ALPNs, the default connection flow for + // HTTPS is compatible with HTTP/2. + EXPECT_TRUE(TryCreateAliasedSpdySession(spdy_session_pool_, test_hosts[1].key, + test_hosts[1].endpoints)); + base::WeakPtr<SpdySession> session1 = + spdy_session_pool_->FindAvailableSession( + test_hosts[1].key, /*enable_ip_based_pooling=*/true, + /*is_websocket=*/false, + NetLogWithSource::Make(NetLogSourceType::NONE)); + EXPECT_EQ(session0.get(), session1.get()); + + // The third host should also pool to the existing connection. + EXPECT_TRUE(TryCreateAliasedSpdySession(spdy_session_pool_, test_hosts[2].key, + test_hosts[2].endpoints)); + base::WeakPtr<SpdySession> session2 = + spdy_session_pool_->FindAvailableSession( + test_hosts[2].key, /*enable_ip_based_pooling=*/true, + /*is_websocket=*/false, + NetLogWithSource::Make(NetLogSourceType::NONE)); + EXPECT_EQ(session0.get(), session2.get()); + + // The fourth host should not pool. The only matching endpoint is specific to + // QUIC. + EXPECT_FALSE(TryCreateAliasedSpdySession( + spdy_session_pool_, test_hosts[3].key, test_hosts[3].endpoints)); +} + TEST_F(SpdySessionPoolTest, IPPoolingDisabled) { // Define two hosts with identical IP address. constexpr int kTestPort = 443;
diff --git a/net/third_party/quiche/BUILD.gn b/net/third_party/quiche/BUILD.gn index acbddba..095fa54b 100644 --- a/net/third_party/quiche/BUILD.gn +++ b/net/third_party/quiche/BUILD.gn
@@ -1772,6 +1772,7 @@ visibility = [ ":blind_sign_auth_test_support", ":quiche_tests", + "//chrome/browser:browser" ] sources = [
diff --git a/net/url_request/redirect_info.h b/net/url_request/redirect_info.h index 501e82a..5b4dae0 100644 --- a/net/url_request/redirect_info.h +++ b/net/url_request/redirect_info.h
@@ -7,6 +7,7 @@ #include <string> +#include "base/time/time.h" #include "net/base/net_export.h" #include "net/cookies/site_for_cookies.h" #include "net/url_request/referrer_policy.h" @@ -86,6 +87,10 @@ // subsequent redirects. ReferrerPolicy new_referrer_policy = ReferrerPolicy::CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE; + + // When navigation is restarted due to a Critical-CH header this stores the + // time at which the the restart was initiated. + base::TimeTicks critical_ch_restart_time; }; } // namespace net
diff --git a/pdf/pdf.cc b/pdf/pdf.cc index 4153634..9170b05 100644 --- a/pdf/pdf.cc +++ b/pdf/pdf.cc
@@ -51,8 +51,6 @@ } #if BUILDFLAG(IS_CHROMEOS) -// TODO(crbug.com/1440430): Make sure its callers set -// `g_use_skia_renderer_enabled_by_policy` before calling this function. std::vector<uint8_t> CreateFlattenedPdf( base::span<const uint8_t> input_buffer) { ScopedSdkInitializer scoped_sdk_initializer(/*enable_v8=*/false); @@ -61,8 +59,6 @@ #endif // BUILDFLAG(IS_CHROMEOS) #if BUILDFLAG(IS_WIN) -// TODO(crbug.com/1440430): Make sure its callers set -// `g_use_skia_renderer_enabled_by_policy` before calling this function. bool RenderPDFPageToDC(base::span<const uint8_t> pdf_buffer, int page_index, HDC dc, @@ -94,8 +90,6 @@ } #endif // BUILDFLAG(IS_WIN) -// TODO(crbug.com/1440430): Make sure its callers set -// `g_use_skia_renderer_enabled_by_policy` before calling this function. bool GetPDFDocInfo(base::span<const uint8_t> pdf_buffer, int* page_count, float* max_page_width) { @@ -104,16 +98,12 @@ return engine_exports->GetPDFDocInfo(pdf_buffer, page_count, max_page_width); } -// TODO(crbug.com/1440430): Make sure its callers set -// `g_use_skia_renderer_enabled_by_policy` before calling this function. absl::optional<bool> IsPDFDocTagged(base::span<const uint8_t> pdf_buffer) { ScopedSdkInitializer scoped_sdk_initializer(/*enable_v8=*/true); PDFEngineExports* engine_exports = PDFEngineExports::Get(); return engine_exports->IsPDFDocTagged(pdf_buffer); } -// TODO(crbug.com/1440430): Make sure its callers set -// `g_use_skia_renderer_enabled_by_policy` before calling this function. base::Value GetPDFStructTreeForPage(base::span<const uint8_t> pdf_buffer, int page_index) { ScopedSdkInitializer scoped_sdk_initializer(/*enable_v8=*/true); @@ -121,8 +111,6 @@ return engine_exports->GetPDFStructTreeForPage(pdf_buffer, page_index); } -// TODO(crbug.com/1440430): Make sure its callers set -// `g_use_skia_renderer_enabled_by_policy` before calling this function. absl::optional<gfx::SizeF> GetPDFPageSizeByIndex( base::span<const uint8_t> pdf_buffer, int page_index) {
diff --git a/remoting/host/linux/BUILD.gn b/remoting/host/linux/BUILD.gn index 4736d46..dea3bd0 100644 --- a/remoting/host/linux/BUILD.gn +++ b/remoting/host/linux/BUILD.gn
@@ -51,6 +51,12 @@ } } + copy("remoting_me2me_host_copy_crash_uploader") { + sources = [ "$root_build_dir/remoting_crash_uploader" ] + outputs = [ "$root_build_dir/remoting/crash-uploader" ] + deps = [ "//remoting/host/crash:remoting_crash_uploader" ] + } + remoting_localize("url_forwarder_desktop_entry") { sources = [ "crd-url-forwarder.desktop.jinja2" ] locale_list = remoting_locales_without_pseudolocales @@ -65,6 +71,7 @@ group("remoting_dev_me2me_host") { deps = [ + ":remoting_me2me_host_copy_crash_uploader", ":remoting_me2me_host_copy_host_wrapper", ":remoting_me2me_host_copy_script", ":remoting_me2me_host_copy_setup_url_forwarder_script",
diff --git a/remoting/protocol/webrtc_video_encoder_wrapper.cc b/remoting/protocol/webrtc_video_encoder_wrapper.cc index a2863014..4b75fc0 100644 --- a/remoting/protocol/webrtc_video_encoder_wrapper.cc +++ b/remoting/protocol/webrtc_video_encoder_wrapper.cc
@@ -139,13 +139,6 @@ absl::optional<int> encoder_speed = session_options.GetInt("Av1-Encoder-Speed"); if (encoder_speed) { - { - // TODO(joedow): This is temporary code for testing crash uploads. - if (*encoder_speed == 42) { - int* blargh = nullptr; - *blargh = 42; - } - } VLOG(0) << "Setting AV1 encoder speed to " << encoder_speed.value(); encoder_->SetEncoderSpeed(encoder_speed.value()); }
diff --git a/services/device/generic_sensor/OWNERS b/services/device/generic_sensor/OWNERS index a7408f9..614fe922 100644 --- a/services/device/generic_sensor/OWNERS +++ b/services/device/generic_sensor/OWNERS
@@ -1,2 +1 @@ -raphael.kubo.da.costa@intel.com -reillyg@chromium.org +file://third_party/blink/renderer/modules/sensor/OWNERS
diff --git a/services/network/attribution/attribution_request_helper_unittest.cc b/services/network/attribution/attribution_request_helper_unittest.cc index a237c20..cb09b92 100644 --- a/services/network/attribution/attribution_request_helper_unittest.cc +++ b/services/network/attribution/attribution_request_helper_unittest.cc
@@ -6,6 +6,7 @@ #include <memory> #include <string> +#include <vector> #include "base/functional/bind.h" #include "base/strings/string_util.h" @@ -14,6 +15,7 @@ #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "base/uuid.h" +#include "net/http/structured_headers.h" #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" #include "net/url_request/redirect_info.h" #include "net/url_request/url_request.h" @@ -426,38 +428,63 @@ } TEST_F(AttributionRequestHelperTest, SetAttributionReportingHeaders) { + { + std::unique_ptr<net::URLRequest> request = + CreateTestUrlRequest(/*to_url=*/example_valid_request_url_); + + ResourceRequest resource_request; + resource_request.attribution_reporting_eligibility = + AttributionReportingEligibility::kUnset; + SetAttributionReportingHeaders(*request, resource_request); + EXPECT_FALSE(request->extra_request_headers().HasHeader( + kAttributionReportingEligible)); + } + const struct { AttributionReportingEligibility eligibility; - const char* expected_eligible_header; + std::vector<std::string> required_keys; + std::vector<std::string> prohibited_keys; } kTestCases[] = { - {AttributionReportingEligibility::kUnset, nullptr}, - {AttributionReportingEligibility::kEmpty, ""}, - {AttributionReportingEligibility::kEventSource, "event-source"}, - {AttributionReportingEligibility::kNavigationSource, "navigation-source"}, - {AttributionReportingEligibility::kTrigger, "trigger"}, + {AttributionReportingEligibility::kEmpty, + {}, + {"event-source", "navigation-source", "trigger"}}, + {AttributionReportingEligibility::kEventSource, + {"event-source"}, + {"navigation-source", "trigger"}}, + {AttributionReportingEligibility::kNavigationSource, + {"navigation-source"}, + {"event-source", "trigger"}}, + {AttributionReportingEligibility::kTrigger, + {"trigger"}, + {"event-source", "navigation-source"}}, {AttributionReportingEligibility::kEventSourceOrTrigger, - "event-source, trigger"}, + {"event-source", "trigger"}, + {"navigation-source"}}, }; for (const auto& test_case : kTestCases) { SCOPED_TRACE(test_case.eligibility); - std::unique_ptr<net::URLRequest> request = CreateTestUrlRequestFrom( - /*to_url=*/example_valid_request_url_, - /*from_url=*/GURL("https://origin.example/path/123#foo")); + std::unique_ptr<net::URLRequest> request = + CreateTestUrlRequest(/*to_url=*/example_valid_request_url_); ResourceRequest resource_request; resource_request.attribution_reporting_eligibility = test_case.eligibility; SetAttributionReportingHeaders(*request, resource_request); - if (test_case.expected_eligible_header) { - std::string actual; - request->extra_request_headers().GetHeader(kAttributionReportingEligible, - &actual); - EXPECT_EQ(actual, test_case.expected_eligible_header); - } else { - EXPECT_FALSE(request->extra_request_headers().HasHeader( - kAttributionReportingEligible)); + std::string actual; + request->extra_request_headers().GetHeader(kAttributionReportingEligible, + &actual); + + auto dict = net::structured_headers::ParseDictionary(actual); + EXPECT_TRUE(dict.has_value()); + + for (const auto& key : test_case.required_keys) { + EXPECT_TRUE(dict->contains(key)) << key; + } + + for (const auto& key : test_case.prohibited_keys) { + EXPECT_FALSE(dict->contains(key)) << key; } } }
diff --git a/services/network/host_resolver_unittest.cc b/services/network/host_resolver_unittest.cc index e462d14..acb0b7a 100644 --- a/services/network/host_resolver_unittest.cc +++ b/services/network/host_resolver_unittest.cc
@@ -515,8 +515,9 @@ expected_endpoint_results[0].metadata = expected_with_https_endpoint_metadata; EXPECT_EQ(net::OK, without_https_client.result_error()); - EXPECT_THAT(without_https_client.endpoint_results_with_metadata(), - absl::nullopt); + EXPECT_THAT( + without_https_client.endpoint_results_with_metadata(), + testing::AnyOf(absl::nullopt, testing::Optional(testing::IsEmpty()))); EXPECT_EQ(net::OK, with_https_client.result_error()); EXPECT_THAT(with_https_client.endpoint_results_with_metadata(), @@ -918,7 +919,9 @@ EXPECT_EQ(net::ERR_NAME_NOT_RESOLVED, response_client.top_level_result_error()); EXPECT_EQ(net::ERR_NAME_NOT_RESOLVED, response_client.result_error()); - EXPECT_FALSE(response_client.result_addresses()); + EXPECT_THAT( + response_client.result_addresses(), + testing::AnyOf(absl::nullopt, testing::Optional(testing::IsEmpty()))); EXPECT_EQ(0u, resolver.GetNumOutstandingRequestsForTesting()); } @@ -951,7 +954,9 @@ run_loop.Run(); EXPECT_EQ(net::ERR_NAME_NOT_RESOLVED, response_client.result_error()); - EXPECT_FALSE(response_client.result_addresses()); + EXPECT_THAT( + response_client.result_addresses(), + testing::AnyOf(absl::nullopt, testing::Optional(testing::IsEmpty()))); EXPECT_TRUE(control_handle_closed); EXPECT_EQ(0u, resolver.GetNumOutstandingRequestsForTesting()); } @@ -1112,7 +1117,9 @@ // On cancellation, should receive an ERR_FAILED result, and the internal // resolver request should have been cancelled. EXPECT_EQ(net::ERR_ABORTED, response_client.result_error()); - EXPECT_FALSE(response_client.result_addresses()); + EXPECT_THAT( + response_client.result_addresses(), + testing::AnyOf(absl::nullopt, testing::Optional(testing::IsEmpty()))); EXPECT_EQ(1, inner_resolver->num_cancellations()); EXPECT_TRUE(control_handle_closed); EXPECT_EQ(0u, resolver.GetNumOutstandingRequestsForTesting()); @@ -1201,7 +1208,9 @@ // On context destruction, should receive an ERR_FAILED result, and the // internal resolver request should have been cancelled. EXPECT_EQ(net::ERR_FAILED, response_client.result_error()); - EXPECT_FALSE(response_client.result_addresses()); + EXPECT_THAT( + response_client.result_addresses(), + testing::AnyOf(absl::nullopt, testing::Optional(testing::IsEmpty()))); EXPECT_EQ(1, inner_resolver->num_cancellations()); EXPECT_TRUE(control_handle_closed); } @@ -1368,7 +1377,9 @@ // Request should be cancelled. EXPECT_EQ(net::ERR_FAILED, response_client.result_error()); - EXPECT_FALSE(response_client.result_addresses()); + EXPECT_THAT( + response_client.result_addresses(), + testing::AnyOf(absl::nullopt, testing::Optional(testing::IsEmpty()))); EXPECT_TRUE(control_handle_closed); EXPECT_EQ(1, inner_resolver->num_cancellations()); EXPECT_EQ(0u, resolver.GetNumOutstandingRequestsForTesting()); @@ -1452,7 +1463,9 @@ run_loop.Run(); EXPECT_EQ(net::OK, response_client.result_error()); - EXPECT_FALSE(response_client.result_addresses()); + EXPECT_THAT( + response_client.result_addresses(), + testing::AnyOf(absl::nullopt, testing::Optional(testing::IsEmpty()))); EXPECT_EQ(0u, resolver.GetNumOutstandingRequestsForTesting()); } @@ -1502,7 +1515,9 @@ run_loop.Run(); EXPECT_EQ(net::OK, response_client.result_error()); - EXPECT_FALSE(response_client.result_addresses()); + EXPECT_THAT( + response_client.result_addresses(), + testing::AnyOf(absl::nullopt, testing::Optional(testing::IsEmpty()))); EXPECT_THAT(response_client.result_text(), testing::Optional(testing::ElementsAreArray(kTextRecords))); EXPECT_FALSE(response_client.result_hosts()); @@ -1545,7 +1560,9 @@ run_loop.Run(); EXPECT_EQ(net::OK, response_client.result_error()); - EXPECT_FALSE(response_client.result_addresses()); + EXPECT_THAT( + response_client.result_addresses(), + testing::AnyOf(absl::nullopt, testing::Optional(testing::IsEmpty()))); EXPECT_FALSE(response_client.result_text()); EXPECT_THAT(response_client.result_hosts(), testing::Optional(testing::UnorderedElementsAre(
diff --git a/services/network/public/cpp/net_ipc_param_traits.h b/services/network/public/cpp/net_ipc_param_traits.h index 7aac5c6..f7ab7c3 100644 --- a/services/network/public/cpp/net_ipc_param_traits.h +++ b/services/network/public/cpp/net_ipc_param_traits.h
@@ -271,6 +271,7 @@ IPC_STRUCT_TRAITS_MEMBER(insecure_scheme_was_upgraded) IPC_STRUCT_TRAITS_MEMBER(is_signed_exchange_fallback_redirect) IPC_STRUCT_TRAITS_MEMBER(new_referrer_policy) + IPC_STRUCT_TRAITS_MEMBER(critical_ch_restart_time) IPC_STRUCT_TRAITS_END() IPC_ENUM_TRAITS_MAX_VALUE(net::HttpResponseInfo::ConnectionInfo,
diff --git a/services/network/public/mojom/host_resolver.mojom b/services/network/public/mojom/host_resolver.mojom index ddfecbc4..8d4ac75c 100644 --- a/services/network/public/mojom/host_resolver.mojom +++ b/services/network/public/mojom/host_resolver.mojom
@@ -139,17 +139,27 @@ // |result| should be used when less specific error information (i.e. OK vs // ERR_NAME_NOT_RESOLVED) is sufficient. // + // If results are not in address form, e.g. for a TXT request, + // `resolved_addresses` and `endpoint_results_with_metadata` may be either + // empty or null. + // // Always called last to signal completion of the ResolveHost() request. // Unless the ResolveHostClient is closed, this method will always be called // exactly once, and afterwards, no more methods in the interface will be // called. + // + // TODO(ericorth@chromium.org): HostResolverEndpointResult is intended to be + // a full replacement for AddressList, so it should be modified to include all + // results, not just those with metadata, and be renamed accordingly. Maybe + // just delete the AddressList result entirely while at it to avoid any + // concerns of passing redundant data. OnComplete(int32 result, ResolveErrorInfo resolve_error_info, AddressList? resolved_addresses, array<HostResolverEndpointResult>? endpoint_results_with_metadata); // One or more On...Results() methods may be called when non-address results - // are available. Always called before OnComplete(). + // are available and non-empty. Always called before OnComplete(). OnTextResults(array<string> text_results); OnHostnameResults(array<HostPortPair> hosts); };
diff --git a/services/network/resolve_host_request.cc b/services/network/resolve_host_request.cc index cb4d2891..80f6285 100644 --- a/services/network/resolve_host_request.cc +++ b/services/network/resolve_host_request.cc
@@ -169,7 +169,7 @@ const net::HostResolverEndpointResults* endpoint_results = internal_request_->GetEndpointResults(); - if (!endpoint_results || endpoint_results->size() <= 1) { + if (!endpoint_results) { return absl::nullopt; } @@ -189,18 +189,20 @@ } void ResolveHostRequest::SignalNonAddressResults() { - if (cancelled_) + if (cancelled_) { return; + } DCHECK(internal_request_); - if (internal_request_->GetTextResults()) { - response_client_->OnTextResults( - internal_request_->GetTextResults().value()); + if (internal_request_->GetTextResults() && + !internal_request_->GetTextResults()->empty()) { + response_client_->OnTextResults(*internal_request_->GetTextResults()); } - if (internal_request_->GetHostnameResults()) { + if (internal_request_->GetHostnameResults() && + !internal_request_->GetHostnameResults()->empty()) { response_client_->OnHostnameResults( - internal_request_->GetHostnameResults().value()); + *internal_request_->GetHostnameResults()); } }
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h index 6ddca25a9..0efd0df8 100644 --- a/skia/config/SkUserConfig.h +++ b/skia/config/SkUserConfig.h
@@ -233,7 +233,7 @@ #define SK_ENABLE_SKSL_IN_RASTER_PIPELINE -#define SK_USE_LEGACY_PICTURE_IMAGEFILTER +#define SK_USE_LEGACY_IMAGE_IMAGEFILTER // Use the original std::vector based serializer // Remove when new streaming support operations has been verified.
diff --git a/sql/built_in_recovery_fuzzer.cc b/sql/built_in_recovery_fuzzer.cc index a46df433..2bf2db5 100644 --- a/sql/built_in_recovery_fuzzer.cc +++ b/sql/built_in_recovery_fuzzer.cc
@@ -10,7 +10,6 @@ #include "base/containers/span.h" #include "base/files/file_path.h" #include "base/files/file_util.h" -#include "base/rand_util.h" #include "base/test/bind.h" #include "sql/database.h" #include "sql/recovery.h" @@ -55,7 +54,7 @@ // Select a recovery strategy pseudorandomly. auto strategy = - base::RandGenerator(size) % 2 == 0 + size % 2 == 0 ? sql::BuiltInRecovery::Strategy::kRecoverOrRaze : sql::BuiltInRecovery::Strategy::kRecoverWithMetaVersionOrRaze;
diff --git a/testing/buildbot/chrome.json b/testing/buildbot/chrome.json index 12e28d4..af9805a 100644 --- a/testing/buildbot/chrome.json +++ b/testing/buildbot/chrome.json
@@ -2099,7 +2099,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2117,7 +2117,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2135,7 +2135,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2154,7 +2154,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2172,7 +2172,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2191,7 +2191,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2209,7 +2209,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2228,7 +2228,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2246,7 +2246,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2264,7 +2264,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2282,7 +2282,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2300,7 +2300,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2318,7 +2318,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2336,7 +2336,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2355,7 +2355,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2373,7 +2373,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2391,7 +2391,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2412,7 +2412,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2434,7 +2434,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2452,7 +2452,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2470,7 +2470,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2488,7 +2488,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2506,7 +2506,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2524,7 +2524,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2542,7 +2542,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2560,7 +2560,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2578,7 +2578,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2596,7 +2596,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2614,7 +2614,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2632,7 +2632,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2651,7 +2651,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2669,7 +2669,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2687,7 +2687,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2705,7 +2705,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2723,7 +2723,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2741,7 +2741,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2760,7 +2760,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2778,7 +2778,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2796,7 +2796,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2814,7 +2814,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2832,7 +2832,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2850,7 +2850,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2868,7 +2868,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2886,7 +2886,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2904,7 +2904,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2922,7 +2922,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2940,7 +2940,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2958,7 +2958,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2976,7 +2976,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -2997,7 +2997,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3016,7 +3016,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3034,7 +3034,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3052,7 +3052,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3071,7 +3071,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3089,7 +3089,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3107,7 +3107,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3125,7 +3125,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3143,7 +3143,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3161,7 +3161,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3179,7 +3179,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3197,7 +3197,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3215,7 +3215,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3233,7 +3233,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3254,7 +3254,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3275,7 +3275,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3293,7 +3293,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3311,7 +3311,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3329,7 +3329,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3347,7 +3347,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3365,7 +3365,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3383,7 +3383,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3401,7 +3401,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3419,7 +3419,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3437,7 +3437,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3455,7 +3455,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3473,7 +3473,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3491,7 +3491,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3509,7 +3509,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3527,7 +3527,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3545,7 +3545,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3563,7 +3563,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3582,7 +3582,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3600,7 +3600,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3618,7 +3618,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3639,7 +3639,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3657,7 +3657,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3676,7 +3676,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3694,7 +3694,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3712,7 +3712,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3730,7 +3730,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3748,7 +3748,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3766,7 +3766,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3784,7 +3784,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3802,7 +3802,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" } @@ -3828,7 +3828,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04", + "os": "Ubuntu-22.04", "pool": "chrome.tests", "ssd": "0" }
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json index ad35bfc0..e5a50ce 100644 --- a/testing/buildbot/chromium.chromiumos.json +++ b/testing/buildbot/chromium.chromiumos.json
@@ -5730,9 +5730,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5780.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5781.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 115.0.5780.0", + "description": "Run with ash-chrome version 115.0.5781.0", "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -5743,8 +5743,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v115.0.5780.0", - "revision": "version:115.0.5780.0" + "location": "lacros_version_skew_tests_v115.0.5781.0", + "revision": "version:115.0.5781.0" } ], "dimension_sets": [ @@ -5794,9 +5794,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.stable.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.114/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.134/test_ash_chrome" ], - "description": "Run with ash-chrome version 113.0.5672.114", + "description": "Run with ash-chrome version 113.0.5672.134", "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -5807,8 +5807,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v113.0.5672.114", - "revision": "version:113.0.5672.114" + "location": "lacros_version_skew_tests_v113.0.5672.134", + "revision": "version:113.0.5672.134" } ], "dimension_sets": [ @@ -5895,9 +5895,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5780.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5781.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 115.0.5780.0", + "description": "Run with ash-chrome version 115.0.5781.0", "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -5908,8 +5908,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v115.0.5780.0", - "revision": "version:115.0.5780.0" + "location": "lacros_version_skew_tests_v115.0.5781.0", + "revision": "version:115.0.5781.0" } ], "dimension_sets": [ @@ -5957,9 +5957,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.114/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.134/test_ash_chrome" ], - "description": "Run with ash-chrome version 113.0.5672.114", + "description": "Run with ash-chrome version 113.0.5672.134", "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -5970,8 +5970,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v113.0.5672.114", - "revision": "version:113.0.5672.114" + "location": "lacros_version_skew_tests_v113.0.5672.134", + "revision": "version:113.0.5672.134" } ], "dimension_sets": [ @@ -6042,9 +6042,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5780.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5781.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 115.0.5780.0", + "description": "Run with ash-chrome version 115.0.5781.0", "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -6055,8 +6055,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v115.0.5780.0", - "revision": "version:115.0.5780.0" + "location": "lacros_version_skew_tests_v115.0.5781.0", + "revision": "version:115.0.5781.0" } ], "dimension_sets": [ @@ -6106,9 +6106,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.114/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.134/test_ash_chrome" ], - "description": "Run with ash-chrome version 113.0.5672.114", + "description": "Run with ash-chrome version 113.0.5672.134", "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -6119,8 +6119,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v113.0.5672.114", - "revision": "version:113.0.5672.114" + "location": "lacros_version_skew_tests_v113.0.5672.134", + "revision": "version:113.0.5672.134" } ], "dimension_sets": [
diff --git a/testing/buildbot/chromium.coverage.json b/testing/buildbot/chromium.coverage.json index e2cd8c4..f7e1ff2 100644 --- a/testing/buildbot/chromium.coverage.json +++ b/testing/buildbot/chromium.coverage.json
@@ -25491,9 +25491,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5780.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5781.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 115.0.5780.0", + "description": "Run with ash-chrome version 115.0.5781.0", "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -25504,8 +25504,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v115.0.5780.0", - "revision": "version:115.0.5780.0" + "location": "lacros_version_skew_tests_v115.0.5781.0", + "revision": "version:115.0.5781.0" } ], "dimension_sets": [ @@ -25555,9 +25555,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.stable.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.114/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.134/test_ash_chrome" ], - "description": "Run with ash-chrome version 113.0.5672.114", + "description": "Run with ash-chrome version 113.0.5672.134", "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -25568,8 +25568,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v113.0.5672.114", - "revision": "version:113.0.5672.114" + "location": "lacros_version_skew_tests_v113.0.5672.134", + "revision": "version:113.0.5672.134" } ], "dimension_sets": [ @@ -25656,9 +25656,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5780.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5781.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 115.0.5780.0", + "description": "Run with ash-chrome version 115.0.5781.0", "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -25669,8 +25669,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v115.0.5780.0", - "revision": "version:115.0.5780.0" + "location": "lacros_version_skew_tests_v115.0.5781.0", + "revision": "version:115.0.5781.0" } ], "dimension_sets": [ @@ -25718,9 +25718,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.114/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.134/test_ash_chrome" ], - "description": "Run with ash-chrome version 113.0.5672.114", + "description": "Run with ash-chrome version 113.0.5672.134", "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -25731,8 +25731,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v113.0.5672.114", - "revision": "version:113.0.5672.114" + "location": "lacros_version_skew_tests_v113.0.5672.134", + "revision": "version:113.0.5672.134" } ], "dimension_sets": [ @@ -25803,9 +25803,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5780.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5781.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 115.0.5780.0", + "description": "Run with ash-chrome version 115.0.5781.0", "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -25816,8 +25816,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v115.0.5780.0", - "revision": "version:115.0.5780.0" + "location": "lacros_version_skew_tests_v115.0.5781.0", + "revision": "version:115.0.5781.0" } ], "dimension_sets": [ @@ -25867,9 +25867,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.114/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.134/test_ash_chrome" ], - "description": "Run with ash-chrome version 113.0.5672.114", + "description": "Run with ash-chrome version 113.0.5672.134", "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -25880,8 +25880,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v113.0.5672.114", - "revision": "version:113.0.5672.114" + "location": "lacros_version_skew_tests_v113.0.5672.134", + "revision": "version:113.0.5672.134" } ], "dimension_sets": [
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index 4c29f0a..8c8029d 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -40146,9 +40146,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5780.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5781.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 115.0.5780.0", + "description": "Run with ash-chrome version 115.0.5781.0", "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" }, @@ -40158,8 +40158,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v115.0.5780.0", - "revision": "version:115.0.5780.0" + "location": "lacros_version_skew_tests_v115.0.5781.0", + "revision": "version:115.0.5781.0" } ], "dimension_sets": [ @@ -40210,9 +40210,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.stable.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.114/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.134/test_ash_chrome" ], - "description": "Run with ash-chrome version 113.0.5672.114", + "description": "Run with ash-chrome version 113.0.5672.134", "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" }, @@ -40222,8 +40222,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v113.0.5672.114", - "revision": "version:113.0.5672.114" + "location": "lacros_version_skew_tests_v113.0.5672.134", + "revision": "version:113.0.5672.134" } ], "dimension_sets": [ @@ -40311,9 +40311,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5780.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5781.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 115.0.5780.0", + "description": "Run with ash-chrome version 115.0.5781.0", "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" }, @@ -40323,8 +40323,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v115.0.5780.0", - "revision": "version:115.0.5780.0" + "location": "lacros_version_skew_tests_v115.0.5781.0", + "revision": "version:115.0.5781.0" } ], "dimension_sets": [ @@ -40373,9 +40373,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.114/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.134/test_ash_chrome" ], - "description": "Run with ash-chrome version 113.0.5672.114", + "description": "Run with ash-chrome version 113.0.5672.134", "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" }, @@ -40385,8 +40385,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v113.0.5672.114", - "revision": "version:113.0.5672.114" + "location": "lacros_version_skew_tests_v113.0.5672.134", + "revision": "version:113.0.5672.134" } ], "dimension_sets": [ @@ -40458,9 +40458,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5780.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5781.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 115.0.5780.0", + "description": "Run with ash-chrome version 115.0.5781.0", "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" }, @@ -40470,8 +40470,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v115.0.5780.0", - "revision": "version:115.0.5780.0" + "location": "lacros_version_skew_tests_v115.0.5781.0", + "revision": "version:115.0.5781.0" } ], "dimension_sets": [ @@ -40522,9 +40522,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.114/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.134/test_ash_chrome" ], - "description": "Run with ash-chrome version 113.0.5672.114", + "description": "Run with ash-chrome version 113.0.5672.134", "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" }, @@ -40534,8 +40534,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v113.0.5672.114", - "revision": "version:113.0.5672.114" + "location": "lacros_version_skew_tests_v113.0.5672.134", + "revision": "version:113.0.5672.134" } ], "dimension_sets": [ @@ -41935,9 +41935,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5780.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5781.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 115.0.5780.0", + "description": "Run with ash-chrome version 115.0.5781.0", "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" }, @@ -41947,8 +41947,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v115.0.5780.0", - "revision": "version:115.0.5780.0" + "location": "lacros_version_skew_tests_v115.0.5781.0", + "revision": "version:115.0.5781.0" } ], "dimension_sets": [ @@ -41999,9 +41999,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.stable.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.114/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.134/test_ash_chrome" ], - "description": "Run with ash-chrome version 113.0.5672.114", + "description": "Run with ash-chrome version 113.0.5672.134", "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" }, @@ -42011,8 +42011,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v113.0.5672.114", - "revision": "version:113.0.5672.114" + "location": "lacros_version_skew_tests_v113.0.5672.134", + "revision": "version:113.0.5672.134" } ], "dimension_sets": [ @@ -42100,9 +42100,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5780.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5781.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 115.0.5780.0", + "description": "Run with ash-chrome version 115.0.5781.0", "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" }, @@ -42112,8 +42112,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v115.0.5780.0", - "revision": "version:115.0.5780.0" + "location": "lacros_version_skew_tests_v115.0.5781.0", + "revision": "version:115.0.5781.0" } ], "dimension_sets": [ @@ -42162,9 +42162,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.114/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.134/test_ash_chrome" ], - "description": "Run with ash-chrome version 113.0.5672.114", + "description": "Run with ash-chrome version 113.0.5672.134", "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" }, @@ -42174,8 +42174,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v113.0.5672.114", - "revision": "version:113.0.5672.114" + "location": "lacros_version_skew_tests_v113.0.5672.134", + "revision": "version:113.0.5672.134" } ], "dimension_sets": [ @@ -42247,9 +42247,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5780.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5781.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 115.0.5780.0", + "description": "Run with ash-chrome version 115.0.5781.0", "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" }, @@ -42259,8 +42259,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v115.0.5780.0", - "revision": "version:115.0.5780.0" + "location": "lacros_version_skew_tests_v115.0.5781.0", + "revision": "version:115.0.5781.0" } ], "dimension_sets": [ @@ -42311,9 +42311,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.114/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.134/test_ash_chrome" ], - "description": "Run with ash-chrome version 113.0.5672.114", + "description": "Run with ash-chrome version 113.0.5672.134", "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" }, @@ -42323,8 +42323,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v113.0.5672.114", - "revision": "version:113.0.5672.114" + "location": "lacros_version_skew_tests_v113.0.5672.134", + "revision": "version:113.0.5672.134" } ], "dimension_sets": [ @@ -42995,9 +42995,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5780.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5781.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 115.0.5780.0", + "description": "Run with ash-chrome version 115.0.5781.0", "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" }, @@ -43007,8 +43007,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v115.0.5780.0", - "revision": "version:115.0.5780.0" + "location": "lacros_version_skew_tests_v115.0.5781.0", + "revision": "version:115.0.5781.0" } ], "dimension_sets": [ @@ -43057,9 +43057,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.114/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.134/test_ash_chrome" ], - "description": "Run with ash-chrome version 113.0.5672.114", + "description": "Run with ash-chrome version 113.0.5672.134", "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" }, @@ -43069,8 +43069,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v113.0.5672.114", - "revision": "version:113.0.5672.114" + "location": "lacros_version_skew_tests_v113.0.5672.134", + "revision": "version:113.0.5672.134" } ], "dimension_sets": [
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json index 3c5b054..0d8373e 100644 --- a/testing/buildbot/chromium.linux.json +++ b/testing/buildbot/chromium.linux.json
@@ -15,7 +15,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -31,7 +31,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -48,7 +48,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -64,7 +64,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -80,7 +80,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -96,7 +96,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -113,7 +113,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -129,7 +129,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -145,7 +145,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -164,7 +164,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -180,7 +180,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -196,7 +196,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -212,7 +212,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -228,7 +228,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -244,7 +244,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -276,7 +276,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -292,7 +292,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -308,7 +308,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -324,7 +324,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -343,7 +343,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -360,7 +360,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -376,7 +376,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -392,7 +392,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -409,7 +409,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -425,7 +425,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -441,7 +441,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -457,7 +457,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -473,7 +473,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -489,7 +489,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -505,7 +505,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -521,7 +521,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -537,7 +537,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -554,7 +554,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -570,7 +570,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -586,7 +586,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -602,7 +602,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -618,7 +618,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -634,7 +634,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -650,7 +650,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -666,7 +666,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -682,7 +682,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -698,7 +698,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -714,7 +714,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -730,7 +730,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -746,7 +746,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -762,7 +762,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -778,7 +778,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -794,7 +794,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -810,7 +810,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -826,7 +826,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -842,7 +842,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5725,7 +5725,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5741,7 +5741,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5757,7 +5757,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5774,7 +5774,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5790,7 +5790,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5806,7 +5806,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5822,7 +5822,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5838,7 +5838,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5854,7 +5854,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5870,7 +5870,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5887,7 +5887,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5903,7 +5903,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5919,7 +5919,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5935,7 +5935,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -5955,7 +5955,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5971,7 +5971,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5987,7 +5987,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6003,7 +6003,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6019,7 +6019,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6035,7 +6035,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6051,7 +6051,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6067,7 +6067,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6083,7 +6083,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6099,7 +6099,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -6116,7 +6116,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6132,7 +6132,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6148,7 +6148,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6164,7 +6164,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6180,7 +6180,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6196,7 +6196,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6212,7 +6212,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6228,7 +6228,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6245,7 +6245,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6261,7 +6261,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6277,7 +6277,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6293,7 +6293,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6309,7 +6309,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6325,7 +6325,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6341,7 +6341,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6357,7 +6357,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6373,7 +6373,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6389,7 +6389,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6405,7 +6405,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6421,7 +6421,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6437,7 +6437,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6453,7 +6453,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -6470,7 +6470,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6486,7 +6486,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6503,7 +6503,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6519,7 +6519,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6535,7 +6535,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6551,7 +6551,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6567,7 +6567,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6583,7 +6583,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6599,7 +6599,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6615,7 +6615,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6631,7 +6631,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6647,7 +6647,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -6664,7 +6664,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6680,7 +6680,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6696,7 +6696,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6712,7 +6712,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6728,7 +6728,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6744,7 +6744,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6760,7 +6760,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6776,7 +6776,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6792,7 +6792,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6808,7 +6808,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6824,7 +6824,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6840,7 +6840,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6856,7 +6856,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6872,7 +6872,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6888,7 +6888,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6904,7 +6904,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6920,7 +6920,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -6937,7 +6937,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6953,7 +6953,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6969,7 +6969,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6985,7 +6985,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7001,7 +7001,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7017,7 +7017,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7033,7 +7033,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7049,7 +7049,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7065,7 +7065,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7082,7 +7082,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7098,7 +7098,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7121,7 +7121,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7151,7 +7151,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -7182,7 +7182,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -7204,7 +7204,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7225,7 +7225,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7245,7 +7245,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7275,7 +7275,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -7296,7 +7296,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "idempotent": false, @@ -7322,7 +7322,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "idempotent": false, @@ -7348,7 +7348,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "idempotent": false, @@ -7373,7 +7373,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7393,7 +7393,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -7417,7 +7417,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -7442,7 +7442,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -7463,7 +7463,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -7484,7 +7484,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -7506,7 +7506,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -7539,7 +7539,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -7570,7 +7570,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json index 73735d2..c316f625 100644 --- a/testing/buildbot/chromium.memory.json +++ b/testing/buildbot/chromium.memory.json
@@ -18080,12 +18080,12 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5780.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5781.0/test_ash_chrome", "--test-launcher-print-test-stdio=always", "--combine-ash-logs-on-bots", "--asan-symbolize-output" ], - "description": "Run with ash-chrome version 115.0.5780.0", + "description": "Run with ash-chrome version 115.0.5781.0", "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -18096,8 +18096,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v115.0.5780.0", - "revision": "version:115.0.5780.0" + "location": "lacros_version_skew_tests_v115.0.5781.0", + "revision": "version:115.0.5781.0" } ], "dimension_sets": [ @@ -18150,12 +18150,12 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.stable.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.114/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.134/test_ash_chrome", "--test-launcher-print-test-stdio=always", "--combine-ash-logs-on-bots", "--asan-symbolize-output" ], - "description": "Run with ash-chrome version 113.0.5672.114", + "description": "Run with ash-chrome version 113.0.5672.134", "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -18166,8 +18166,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v113.0.5672.114", - "revision": "version:113.0.5672.114" + "location": "lacros_version_skew_tests_v113.0.5672.134", + "revision": "version:113.0.5672.134" } ], "dimension_sets": [ @@ -18265,12 +18265,12 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5780.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5781.0/test_ash_chrome", "--test-launcher-print-test-stdio=always", "--combine-ash-logs-on-bots", "--asan-symbolize-output" ], - "description": "Run with ash-chrome version 115.0.5780.0", + "description": "Run with ash-chrome version 115.0.5781.0", "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -18281,8 +18281,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v115.0.5780.0", - "revision": "version:115.0.5780.0" + "location": "lacros_version_skew_tests_v115.0.5781.0", + "revision": "version:115.0.5781.0" } ], "dimension_sets": [ @@ -18333,12 +18333,12 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.114/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.134/test_ash_chrome", "--test-launcher-print-test-stdio=always", "--combine-ash-logs-on-bots", "--asan-symbolize-output" ], - "description": "Run with ash-chrome version 113.0.5672.114", + "description": "Run with ash-chrome version 113.0.5672.134", "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -18349,8 +18349,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v113.0.5672.114", - "revision": "version:113.0.5672.114" + "location": "lacros_version_skew_tests_v113.0.5672.134", + "revision": "version:113.0.5672.134" } ], "dimension_sets": [ @@ -18427,12 +18427,12 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5780.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5781.0/test_ash_chrome", "--test-launcher-print-test-stdio=always", "--combine-ash-logs-on-bots", "--asan-symbolize-output" ], - "description": "Run with ash-chrome version 115.0.5780.0", + "description": "Run with ash-chrome version 115.0.5781.0", "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -18443,8 +18443,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v115.0.5780.0", - "revision": "version:115.0.5780.0" + "location": "lacros_version_skew_tests_v115.0.5781.0", + "revision": "version:115.0.5781.0" } ], "dimension_sets": [ @@ -18497,12 +18497,12 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.114/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.134/test_ash_chrome", "--test-launcher-print-test-stdio=always", "--combine-ash-logs-on-bots", "--asan-symbolize-output" ], - "description": "Run with ash-chrome version 113.0.5672.114", + "description": "Run with ash-chrome version 113.0.5672.134", "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -18513,8 +18513,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v113.0.5672.114", - "revision": "version:113.0.5672.114" + "location": "lacros_version_skew_tests_v113.0.5672.134", + "revision": "version:113.0.5672.134" } ], "dimension_sets": [
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl index e103028..119c5c8c 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_v115.0.5780.0/test_ash_chrome', + '--ash-chrome-path-override=../../lacros_version_skew_tests_v115.0.5781.0/test_ash_chrome', ], - 'description': 'Run with ash-chrome version 115.0.5780.0', + 'description': 'Run with ash-chrome version 115.0.5781.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_v115.0.5780.0', - 'revision': 'version:115.0.5780.0', + 'location': 'lacros_version_skew_tests_v115.0.5781.0', + 'revision': 'version:115.0.5781.0', }, ], }, @@ -70,16 +70,16 @@ }, 'LACROS_VERSION_SKEW_STABLE': { 'args': [ - '--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.114/test_ash_chrome', + '--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5672.134/test_ash_chrome', ], - 'description': 'Run with ash-chrome version 113.0.5672.114', + 'description': 'Run with ash-chrome version 113.0.5672.134', 'identifier': 'Lacros version skew testing ash stable', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip', - 'location': 'lacros_version_skew_tests_v113.0.5672.114', - 'revision': 'version:113.0.5672.114', + 'location': 'lacros_version_skew_tests_v113.0.5672.134', + 'revision': 'version:113.0.5672.134', }, ], },
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index 0358669..6d338faf 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -269,7 +269,7 @@ ], 'mixins': [ 'chrome-swarming-pool', - 'linux-bionic', + 'linux-jammy', ], 'swarming': { 'dimension_sets': [ @@ -4808,7 +4808,7 @@ 'machines': { 'Cast Audio Linux': { 'mixins': [ - 'linux-bionic', + 'linux-jammy', ], 'additional_compile_targets': [ 'cast_shell', @@ -4832,9 +4832,6 @@ }, }, 'Cast Linux ARM64': { - 'mixins': [ - 'linux-bionic', - ], 'additional_compile_targets': [ 'cast_shell', 'cast_test_lists', @@ -4842,9 +4839,6 @@ ], }, 'Cast Linux Debug': { - 'mixins': [ - 'linux-bionic', - ], 'additional_compile_targets': [ 'cast_shell', 'cast_test_lists', @@ -4905,7 +4899,7 @@ }, 'Linux Tests (dbg)(1)': { 'mixins': [ - 'linux-bionic', + 'linux-jammy', ], 'test_suites': { 'gtest_tests': 'chromium_linux_gtests', @@ -4915,7 +4909,7 @@ # For documentation, see //services/network/README.md. 'Network Service Linux': { 'mixins': [ - 'linux-bionic', + 'linux-jammy', ], 'test_suites': { 'gtest_tests': 'network_service_extra_gtests', @@ -4923,7 +4917,7 @@ }, 'linux-bfcache-rel': { 'mixins': [ - 'linux-bionic', + 'linux-jammy', ], 'test_suites': { 'gtest_tests': 'bfcache_linux_gtests',
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index b2626ef..dc78d30 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -1446,11 +1446,12 @@ { "platforms": [ "mac", - "windows" + "windows", + "linux" ], "experiments": [ { - "name": "Card", + "name": "Card_20230511", "params": { "en_site_id": "F2fsskHvB0ugnJ3q1cK0NXLjUaK5", "probability": "1.0" @@ -1464,7 +1465,7 @@ ] }, { - "name": "Password", + "name": "Password_20230511", "params": { "en_site_id": "6VQ4NCCaq0ugnJ3q1cK0TR13rB8t", "probability": "1.0" @@ -1478,7 +1479,7 @@ ] }, { - "name": "Address", + "name": "Address_20230511", "params": { "en_site_id": "qQW9c2ho10ugnJ3q1cK0X48UQjZs", "probability": "1.0" @@ -3002,6 +3003,22 @@ ] } ], + "ChromeStartOnTablet": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "ShowScrollableMVTOnNTPAndroid", + "StartSurfaceOnTablet" + ] + } + ] + } + ], "ChromeStartRefactor": [ { "platforms": [ @@ -8321,6 +8338,23 @@ ] } ], + "MediaRemotingWithoutFullscreen": [ + { + "platforms": [ + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "MediaRemotingWithoutFullscreen" + ] + } + ] + } + ], "MeetDevicesMojoServices": [ { "platforms": [ @@ -12094,6 +12128,26 @@ ] } ], + "ShareThisTabDialog": [ + { + "platforms": [ + "chromeos", + "chromeos_lacros", + "fuchsia", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "ShareThisTabDialog" + ] + } + ] + } + ], "SharedHighlightingAmp": [ { "platforms": [ @@ -12262,21 +12316,6 @@ ] } ], - "ShowScrollableMVTOnNTPAndroid": [ - { - "platforms": [ - "android" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "ShowScrollableMVTOnNTPAndroid" - ] - } - ] - } - ], "ShutdownConfirmationBubble": [ { "platforms": [ @@ -12895,7 +12934,7 @@ "platforms": [ "chromeos", "chromeos_lacros", - "fuchsia", + "ios", "linux", "mac", "windows"
diff --git a/third_party/blink/common/loader/throttling_url_loader.cc b/third_party/blink/common/loader/throttling_url_loader.cc index fe93acd0..0f64724e 100644 --- a/third_party/blink/common/loader/throttling_url_loader.cc +++ b/third_party/blink/common/loader/throttling_url_loader.cc
@@ -244,6 +244,10 @@ void Detach() { loader_ = nullptr; } + void DidRestartForCriticalClientHint() override { + loader_->DidRestartForCriticalClientHint(); + } + private: // This class helps ThrottlingURLLoader to keep track of whether it is being // called by its throttles. @@ -561,6 +565,10 @@ net::HTTP_TEMPORARY_REDIRECT, throttle_will_start_redirect_url_, absl::nullopt, false, false, false); + // Set Critical-CH restart info and clear for next redirect. + redirect_info.critical_ch_restart_time = critical_ch_restart_time_; + critical_ch_restart_time_ = base::TimeTicks(); + bool should_clear_upload = false; net::RedirectUtil::UpdateHttpRequest( start_info_->url_request.url, start_info_->url_request.method,
diff --git a/third_party/blink/common/origin_trials/OWNERS b/third_party/blink/common/origin_trials/OWNERS index a30ab09..432480d2 100644 --- a/third_party/blink/common/origin_trials/OWNERS +++ b/third_party/blink/common/origin_trials/OWNERS
@@ -1,5 +1,10 @@ -# This file also covers ownership of the following directories: +# This file also covers ownership of the following: +# //chrome/browser/chrome_origin_trials_browsertest.cc # //chrome/common/origin_trials/ +# //components/embedder_support/origin_trials/ +# //components/origin_trials/ +# //content/browser/origin_trials/ +# //content/test/data/origin_trials/ # //third_party/blink/public/common/origin_trials/ # //third_party/blink/renderer/core/origin_trials/ # //tools/origin_trials/
diff --git a/third_party/blink/public/common/loader/throttling_url_loader.h b/third_party/blink/public/common/loader/throttling_url_loader.h index 4370e6e..671003e 100644 --- a/third_party/blink/public/common/loader/throttling_url_loader.h +++ b/third_party/blink/public/common/loader/throttling_url_loader.h
@@ -12,6 +12,7 @@ #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/strings/string_piece.h" +#include "base/time/time.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver.h" @@ -121,6 +122,11 @@ bool response_intercepted() const { return response_intercepted_; } + // Indicates a restart did occur due to a Critical-CH HTTP Header. + void DidRestartForCriticalClientHint() { + critical_ch_restart_time_ = base::TimeTicks::Now(); + } + private: class ForwardingThrottleDelegate; @@ -323,6 +329,8 @@ int pending_restart_flags_ = 0; bool has_pending_restart_ = false; + base::TimeTicks critical_ch_restart_time_; + base::WeakPtrFactory<ThrottlingURLLoader> weak_factory_{this}; };
diff --git a/third_party/blink/public/common/loader/url_loader_throttle.h b/third_party/blink/public/common/loader/url_loader_throttle.h index 678858e6..5fca86c 100644 --- a/third_party/blink/public/common/loader/url_loader_throttle.h +++ b/third_party/blink/public/common/loader/url_loader_throttle.h
@@ -137,6 +137,9 @@ // using a combined value of all of the |additional_load_flags|. virtual void RestartWithURLResetAndFlags(int additional_load_flags); + // Indicates a restart did occur due to a Critical-CH HTTP Header. + virtual void DidRestartForCriticalClientHint() {} + protected: virtual ~Delegate(); };
diff --git a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom index e73e210..363f0f6 100644 --- a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom +++ b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
@@ -3910,6 +3910,8 @@ kV8FileSystemHandle_GetUniqueId_Method = 4570, kV8FileSystemHandle_Remove_Method = 4571, kPerformanceNavigateSystemEntropy = 4572, + kV8InvalidatedNumberStringNotRegexpLikeProtector = 4573, + kCriticalCHRestartNavigationTiming = 4574, // Add new features immediately above this line. Don't change assigned // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/public/web/web_navigation_params.h b/third_party/blink/public/web/web_navigation_params.h index 0ddff4f..1db95dc7 100644 --- a/third_party/blink/public/web/web_navigation_params.h +++ b/third_party/blink/public/web/web_navigation_params.h
@@ -318,6 +318,9 @@ // TODO(dgozman): we only use this response for navigation timings. // Perhaps, we can just get rid of it. WebURLResponse redirect_response; + // When navigation is restarted due to a Critical-CH header this stores the + // time at which the the restart was initiated. + base::TimeTicks critical_ch_restart_time; }; // Redirects which happened while fetching the main resource. // TODO(dgozman): we are only interested in the final values instead of
diff --git a/third_party/blink/public/web/web_navigation_timings.h b/third_party/blink/public/web/web_navigation_timings.h index 8936b43a..9da1b51 100644 --- a/third_party/blink/public/web/web_navigation_timings.h +++ b/third_party/blink/public/web/web_navigation_timings.h
@@ -20,6 +20,7 @@ blink::mojom::ParentResourceTimingAccess::kDoNotReport; blink::mojom::SystemEntropy system_entropy_at_navigation_start = blink::mojom::SystemEntropy::kNormal; + base::TimeTicks critical_ch_restart; }; } // namespace blink
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer_test.cc b/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer_test.cc index 88f4dc9..dbc2b8d 100644 --- a/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer_test.cc +++ b/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer_test.cc
@@ -182,8 +182,8 @@ V8ScriptValueSerializer(script_state).Serialize(symbol, exception_state)); ASSERT_TRUE(HadDOMExceptionInCoreTest("DataCloneError", script_state, exception_state)); - DOMException* dom_exception = V8DOMException::ToWrappableUnsafe( - exception_state.GetException().As<v8::Object>()); + DOMException* dom_exception = V8DOMException::ToWrappable( + scope.GetIsolate(), exception_state.GetException()); EXPECT_TRUE(dom_exception->message().Contains("postMessage")); } @@ -2047,8 +2047,7 @@ V8ScriptValueDeserializer deserializer(scope.GetScriptState(), input, options); v8::Local<v8::Value> result = deserializer.Deserialize(); - FileList* new_file_list = - V8FileList::ToWrappableUnsafe(result.As<v8::Object>()); + FileList* new_file_list = V8FileList::ToWrappable(scope.GetIsolate(), result); EXPECT_EQ(1u, new_file_list->length()); File* new_file = new_file_list->item(0); EXPECT_TRUE(new_file->GetPath().empty());
diff --git a/third_party/blink/renderer/bindings/core/v8/use_counter_callback.cc b/third_party/blink/renderer/bindings/core/v8/use_counter_callback.cc index 732a764..189d745f 100644 --- a/third_party/blink/renderer/bindings/core/v8/use_counter_callback.cc +++ b/third_party/blink/renderer/bindings/core/v8/use_counter_callback.cc
@@ -362,6 +362,10 @@ blink_feature = WebFeature::kV8InvalidatedTypedArraySpeciesLookupChainProtector; break; + case v8::Isolate::kInvalidatedNumberStringNotRegexpLikeProtector: + blink_feature = + WebFeature::kV8InvalidatedNumberStringNotRegexpLikeProtector; + break; case v8::Isolate::kVarRedeclaredCatchBinding: blink_feature = WebFeature::kV8VarRedeclaredCatchBinding; break;
diff --git a/third_party/blink/renderer/core/animation/animation.cc b/third_party/blink/renderer/core/animation/animation.cc index 7baf6f31..4f665c3 100644 --- a/third_party/blink/renderer/core/animation/animation.cc +++ b/third_party/blink/renderer/core/animation/animation.cc
@@ -2168,7 +2168,8 @@ // the playback rate preserve current time even if the start time is set. // Asynchronous updates have an associated pending play or pending pause // task associated with them. - if (start_time_ && !PendingInternal()) { + if (start_time_ && + (timeline()->IsScrollSnapshotTimeline() || !PendingInternal())) { start_time = timeline_->ZeroTime() + start_time_.value(); if (reversed) { start_time = @@ -2297,6 +2298,7 @@ : default_offset; AnimationTimeDelta duration = timeline_->GetDuration().value(); start_time_ = duration * relative_offset; + SetCompositorPending(true); } void Animation::OnRangeUpdate() {
diff --git a/third_party/blink/renderer/core/animation/animation.h b/third_party/blink/renderer/core/animation/animation.h index 413c7ca94..96a2204 100644 --- a/third_party/blink/renderer/core/animation/animation.h +++ b/third_party/blink/renderer/core/animation/animation.h
@@ -201,6 +201,7 @@ double playbackRate() const; void setPlaybackRate(double, ExceptionState& = ASSERT_NO_EXCEPTION); + // TODO(crbug.com/1425939): Do not expose DeferredTimelines here. AnimationTimeline* timeline() { return timeline_; } AnimationTimeline* timeline() const { return timeline_; } virtual void setTimeline(AnimationTimeline* timeline);
diff --git a/third_party/blink/renderer/core/animation/css/css_animation_update.cc b/third_party/blink/renderer/core/animation/css/css_animation_update.cc index 0755f98..60075ed 100644 --- a/third_party/blink/renderer/core/animation/css/css_animation_update.cc +++ b/third_party/blink/renderer/core/animation/css/css_animation_update.cc
@@ -30,6 +30,9 @@ changed_scroll_timelines_ = update.changed_scroll_timelines_; changed_view_timelines_ = update.changed_view_timelines_; changed_deferred_timelines_ = update.changed_deferred_timelines_; + changed_timeline_attachments_ = update.changed_timeline_attachments_; + + // TODO(crbug.com/1446702): Remove scroll/view-timeline-attachment. changed_attaching_timelines_ = update.changed_attaching_timelines_; } @@ -47,6 +50,9 @@ changed_scroll_timelines_.clear(); changed_view_timelines_.clear(); changed_deferred_timelines_.clear(); + changed_timeline_attachments_.clear(); + + // TODO(crbug.com/1446702): Remove scroll/view-timeline-attachment. changed_attaching_timelines_.clear(); }
diff --git a/third_party/blink/renderer/core/animation/css/css_animation_update.h b/third_party/blink/renderer/core/animation/css/css_animation_update.h index 580c240..55f05820 100644 --- a/third_party/blink/renderer/core/animation/css/css_animation_update.h +++ b/third_party/blink/renderer/core/animation/css/css_animation_update.h
@@ -207,6 +207,11 @@ changed_deferred_timelines_ = std::move(timelines); } + void SetChangedTimelineAttachments(TimelineAttachmentMap attachments) { + changed_timeline_attachments_ = std::move(attachments); + } + + // TODO(crbug.com/1446702): Remove scroll/view-timeline-attachment. void SetChangedAttachingTimelines(AttachingTimelineMap timelines) { changed_attaching_timelines_ = std::move(timelines); } @@ -266,6 +271,11 @@ const CSSDeferredTimelineMap& ChangedDeferredTimelines() const { return changed_deferred_timelines_; } + const TimelineAttachmentMap& ChangedTimelineAttachments() const { + return changed_timeline_attachments_; + } + + // TODO(crbug.com/1446702): Remove scroll/view-timeline-attachment. const AttachingTimelineMap& ChangedAttachingTimelines() const { return changed_attaching_timelines_; } @@ -300,6 +310,7 @@ !changed_scroll_timelines_.empty() || !changed_view_timelines_.empty() || !changed_deferred_timelines_.empty() || + !changed_timeline_attachments_.empty() || !changed_attaching_timelines_.empty(); } @@ -314,6 +325,9 @@ visitor->Trace(changed_scroll_timelines_); visitor->Trace(changed_view_timelines_); visitor->Trace(changed_deferred_timelines_); + visitor->Trace(changed_timeline_attachments_); + + // TODO(crbug.com/1446702): Remove scroll/view-timeline-attachment. visitor->Trace(changed_attaching_timelines_); } @@ -341,6 +355,9 @@ CSSScrollTimelineMap changed_scroll_timelines_; CSSViewTimelineMap changed_view_timelines_; CSSDeferredTimelineMap changed_deferred_timelines_; + TimelineAttachmentMap changed_timeline_attachments_; + + // TODO(crbug.com/1446702): Remove scroll/view-timeline-attachment. AttachingTimelineMap changed_attaching_timelines_; ActiveInterpolationsMap active_interpolations_for_animations_;
diff --git a/third_party/blink/renderer/core/animation/css/css_animations.cc b/third_party/blink/renderer/core/animation/css/css_animations.cc index c3a884a..e094100 100644 --- a/third_party/blink/renderer/core/animation/css/css_animations.cc +++ b/third_party/blink/renderer/core/animation/css/css_animations.cc
@@ -860,6 +860,17 @@ return i != timelines->end() ? i->value.Get() : nullptr; } +DeferredTimeline* GetTimelineAttachment( + const TimelineAttachmentMap* timeline_attachments, + ScrollSnapshotTimeline* timeline) { + if (!timeline_attachments) { + return nullptr; + } + auto i = timeline_attachments->find(timeline); + return i != timeline_attachments->end() ? i->value.Get() : nullptr; +} + +// TODO(crbug.com/1446702): Remove scroll/view-timeline-attachment. ScrollTimeline* GetAttachingTimeline(const AttachingTimelineMap* timelines, ScrollTimelineAttachment* attachment) { if (!timelines) { @@ -869,6 +880,12 @@ return i != timelines->end() ? i->value.Get() : nullptr; } +Element* ParentElementForTimelineTraversal(Node& node) { + return RuntimeEnabledFeatures::CSSTreeScopedTimelinesEnabled() + ? node.ParentOrShadowHostElement() + : LayoutTreeBuilderTraversal::ParentElement(node); +} + Element* ResolveReferenceElement(Document& document, TimelineScroller scroller, Element* reference_element) { @@ -897,10 +914,10 @@ return ScrollTimeline::ScrollAxis::kBlock; case TimelineAxis::kInline: return ScrollTimeline::ScrollAxis::kInline; - case TimelineAxis::kVertical: - return ScrollTimeline::ScrollAxis::kVertical; - case TimelineAxis::kHorizontal: - return ScrollTimeline::ScrollAxis::kHorizontal; + case TimelineAxis::kX: + return ScrollTimeline::ScrollAxis::kX; + case TimelineAxis::kY: + return ScrollTimeline::ScrollAxis::kY; } NOTREACHED(); @@ -1146,6 +1163,66 @@ } template <typename TimelineType> +void CSSAnimations::CalculateChangedTimelineAttachments( + Element& animating_element, + const TimelineData* timeline_data, + const CSSAnimationUpdate& update, + const TimelineAttachmentMap* existing_attachments, + TimelineAttachmentMap& result) { + ForEachTimeline<TimelineType>( + timeline_data, &update, + [&animating_element, &update, &existing_attachments, &result]( + const ScopedCSSName& name, TimelineType* attaching_timeline) { + DeferredTimeline* new_deferred_timeline = + FindDeferredTimeline(name, &animating_element, &update); + DeferredTimeline* existing_deferred_timeline = + GetTimelineAttachment(existing_attachments, attaching_timeline); + if (existing_deferred_timeline == new_deferred_timeline) { + // No change, remove explicit nullptr previously added by + // CalculateTimelineAttachmentUpdate. + result.erase(attaching_timeline); + } else { + result.Set(attaching_timeline, new_deferred_timeline); + } + }); +} + +void CSSAnimations::CalculateTimelineAttachmentUpdate( + CSSAnimationUpdate& update, + Element& animating_element) { + const CSSAnimations::TimelineData* timeline_data = + GetTimelineData(animating_element); + + if (update.ChangedScrollTimelines().empty() && + update.ChangedViewTimelines().empty() && + (!timeline_data || timeline_data->IsEmpty())) { + return; + } + + // We initially assume that all existing timeline attachments will be removed. + // This is represented by populating the TimelineAttachmentMap with explicit + // nullptr values for each existing attachment. + const TimelineAttachmentMap* existing_attachments = + timeline_data ? &timeline_data->GetTimelineAttachments() : nullptr; + TimelineAttachmentMap changed_attachments = + NullifyExistingTimelines(existing_attachments); + + // Then, for each Scroll/ViewTimeline, we find the corresponding attachment + // (i.e. DeferredTimeline), and either erase the explicit nullptr from + // `changed_attachments` if it matched the existing timeline, or just add it + // otherwise. + CalculateChangedTimelineAttachments<ScrollTimeline>( + animating_element, timeline_data, update, existing_attachments, + changed_attachments); + CalculateChangedTimelineAttachments<ViewTimeline>( + animating_element, timeline_data, update, existing_attachments, + changed_attachments); + + update.SetChangedTimelineAttachments(std::move(changed_attachments)); +} + +// TODO(crbug.com/1446702): Remove scroll/view-timeline-attachment. +template <typename TimelineType> void CSSAnimations::CollectTimelinesWithAttachmentInto( const TimelineData* timeline_data, const CSSAnimationUpdate* update, @@ -1160,6 +1237,7 @@ }); } +// TODO(crbug.com/1446702): Remove scroll/view-timeline-attachment. template <typename TimelineType> void CSSAnimations::CalculateChangedAttachingTimelines( const CSSTimelineMap<TimelineType>& ancestor_attached_timelines, @@ -1189,6 +1267,7 @@ } } +// TODO(crbug.com/1446702): Remove scroll/view-timeline-attachment. void CSSAnimations::CalculateAttachingTimelinesUpdate( CSSAnimationUpdate& update, Element& animating_element) { @@ -1302,10 +1381,15 @@ if (target_name.GetName() != candidate_name.GetName()) { return; } - if (candidate->GetTimelineAttachment() == TimelineAttachment::kAncestor) { - // TODO(crbug.com/1425939): We may want to treat ancestor-attached timelines - // as "local" if they aren't attached to anything. - return; + // TODO(crbug.com/1446702): Remove scroll/view-timeline-attachment. + if (auto* scroll_timeline = DynamicTo<ScrollTimeline>( + static_cast<AnimationTimeline*>(candidate))) { + if (scroll_timeline->GetTimelineAttachment() == + TimelineAttachment::kAncestor) { + // TODO(crbug.com/1425939): We may want to treat ancestor-attached + // timelines as "local" if they aren't attached to anything. + return; + } } if (RuntimeEnabledFeatures::CSSTreeScopedTimelinesEnabled()) { size_t distance = TreeScopeDistance(candidate_name.GetTreeScope(), @@ -1321,7 +1405,7 @@ } // namespace -ScrollTimeline* CSSAnimations::FindTimelineForNode( +ScrollSnapshotTimeline* CSSAnimations::FindTimelineForNode( const ScopedCSSName& name, Node* node, const CSSAnimationUpdate* update) { @@ -1333,7 +1417,11 @@ FindTimelineForElement<ViewTimeline>(name, timeline_data, update)) { return timeline; } - return FindTimelineForElement<ScrollTimeline>(name, timeline_data, update); + if (ScrollTimeline* timeline = + FindTimelineForElement<ScrollTimeline>(name, timeline_data, update)) { + return timeline; + } + return FindTimelineForElement<DeferredTimeline>(name, timeline_data, update); } template <typename TimelineType> @@ -1355,24 +1443,23 @@ return matching_timeline; } -// Find a ScrollTimeline in inclusive ancestors. +// Find a ScrollSnapshotTimeline in inclusive ancestors. // // The reason `update` is provided from the outside rather than just fetching // it from ElementAnimations, is that for the current node we're resolving style // for, the update hasn't actually been stored on ElementAnimations yet. -ScrollTimeline* CSSAnimations::FindAncestorTimeline( +ScrollSnapshotTimeline* CSSAnimations::FindAncestorTimeline( const ScopedCSSName& name, Node* node, const CSSAnimationUpdate* update) { DCHECK(node); - if (ScrollTimeline* timeline = FindTimelineForNode(name, node, update)) + if (ScrollSnapshotTimeline* timeline = + FindTimelineForNode(name, node, update)) { return timeline; + } - Element* parent_element = - RuntimeEnabledFeatures::CSSTreeScopedTimelinesEnabled() - ? node->ParentOrShadowHostElement() - : LayoutTreeBuilderTraversal::ParentElement(*node); + Element* parent_element = ParentElementForTimelineTraversal(*node); if (!parent_element) { return nullptr; } @@ -1380,6 +1467,27 @@ GetPendingAnimationUpdate(*parent_element)); } +// Like FindAncestorTimeline, but only looks for DeferredTimelines. +// This is used to attach Scroll/ViewTimelines to any matching DeferredTimelines +// in the ancestor chain. +DeferredTimeline* CSSAnimations::FindDeferredTimeline( + const ScopedCSSName& name, + Element* element, + const CSSAnimationUpdate* update) { + DCHECK(element); + const TimelineData* timeline_data = GetTimelineData(*element); + if (DeferredTimeline* timeline = FindTimelineForElement<DeferredTimeline>( + name, timeline_data, update)) { + return timeline; + } + Element* parent_element = ParentElementForTimelineTraversal(*element); + if (!parent_element) { + return nullptr; + } + return FindDeferredTimeline(name, parent_element, + GetPendingAnimationUpdate(*parent_element)); +} + namespace { ScrollTimeline* ComputeScrollFunctionTimeline( @@ -1569,6 +1677,9 @@ CalculateScrollTimelineUpdate(update, animating_element, style_builder); CalculateViewTimelineUpdate(update, animating_element, style_builder); CalculateDeferredTimelineUpdate(update, animating_element, style_builder); + CalculateTimelineAttachmentUpdate(update, animating_element); + + // TODO(crbug.com/1446702): Remove scroll/view-timeline-attachment. CalculateAttachingTimelinesUpdate(update, animating_element); } @@ -2047,6 +2158,18 @@ for (auto [name, value] : pending_update_.ChangedDeferredTimelines()) { timeline_data_.SetDeferredTimeline(*name, value.Get()); } + for (auto [attaching_timeline, deferred_timeline] : + pending_update_.ChangedTimelineAttachments()) { + if (DeferredTimeline* existing_deferred_timeline = + timeline_data_.GetTimelineAttachment(attaching_timeline)) { + existing_deferred_timeline->DetachTimeline(attaching_timeline); + } + if (deferred_timeline) { + deferred_timeline->AttachTimeline(attaching_timeline); + } + timeline_data_.SetTimelineAttachment(attaching_timeline, deferred_timeline); + } + // TODO(crbug.com/1446702): Remove scroll/view-timeline-attachment. for (auto [attachment, timeline] : pending_update_.ChangedAttachingTimelines()) { if (ScrollTimeline* existing_timeline = @@ -2719,6 +2842,12 @@ entry.value->animation->Update(kTimingUpdateOnDemand); } + for (auto [attaching_timeline, deferred_timeline] : + timeline_data_.GetTimelineAttachments()) { + deferred_timeline->DetachTimeline(attaching_timeline); + } + + // TODO(crbug.com/1446702): Remove scroll/view-timeline-attachment. for (auto [attachment, timeline] : timeline_data_.GetAttachingTimelines()) { timeline->RemoveAttachment(attachment); } @@ -2757,6 +2886,23 @@ } } +void CSSAnimations::TimelineData::SetTimelineAttachment( + ScrollSnapshotTimeline* attached_timeline, + DeferredTimeline* deferred_timeline) { + if (deferred_timeline == nullptr) { + timeline_attachments_.erase(attached_timeline); + } else { + timeline_attachments_.Set(attached_timeline, deferred_timeline); + } +} + +DeferredTimeline* CSSAnimations::TimelineData::GetTimelineAttachment( + ScrollSnapshotTimeline* attached_timeline) { + auto i = timeline_attachments_.find(attached_timeline); + return i != timeline_attachments_.end() ? i->value.Get() : nullptr; +} + +// TODO(crbug.com/1446702): Remove scroll/view-timeline-attachment. void CSSAnimations::TimelineData::SetAttachingTimeline( ScrollTimelineAttachment* attachment, ScrollTimeline* timeline) { @@ -2767,6 +2913,7 @@ } } +// TODO(crbug.com/1446702): Remove scroll/view-timeline-attachment. ScrollTimeline* CSSAnimations::TimelineData::GetAttachingTimeline( ScrollTimelineAttachment* attachment) { auto i = attaching_timelines_.find(attachment); @@ -2777,6 +2924,8 @@ visitor->Trace(scroll_timelines_); visitor->Trace(view_timelines_); visitor->Trace(deferred_timelines_); + visitor->Trace(timeline_attachments_); + // TODO(crbug.com/1446702): Remove scroll/view-timeline-attachment. visitor->Trace(attaching_timelines_); }
diff --git a/third_party/blink/renderer/core/animation/css/css_animations.h b/third_party/blink/renderer/core/animation/css/css_animations.h index 1f2307b1..d67ca7b 100644 --- a/third_party/blink/renderer/core/animation/css/css_animations.h +++ b/third_party/blink/renderer/core/animation/css/css_animations.h
@@ -214,19 +214,30 @@ const CSSDeferredTimelineMap& GetDeferredTimelines() const { return deferred_timelines_; } + + void SetTimelineAttachment(ScrollSnapshotTimeline*, DeferredTimeline*); + DeferredTimeline* GetTimelineAttachment(ScrollSnapshotTimeline*); + const TimelineAttachmentMap& GetTimelineAttachments() const { + return timeline_attachments_; + } + + // TODO(crbug.com/1446702): Remove scroll/view-timeline-attachment. void SetAttachingTimeline(ScrollTimelineAttachment*, ScrollTimeline*); ScrollTimeline* GetAttachingTimeline(ScrollTimelineAttachment*); const AttachingTimelineMap& GetAttachingTimelines() const { return attaching_timelines_; } + bool IsEmpty() const { return scroll_timelines_.empty() && view_timelines_.empty() && - deferred_timelines_.empty() && attaching_timelines_.empty(); + deferred_timelines_.empty() && timeline_attachments_.empty() && + attaching_timelines_.empty(); } void Clear() { scroll_timelines_.clear(); view_timelines_.clear(); deferred_timelines_.clear(); + timeline_attachments_.clear(); attaching_timelines_.clear(); } void Trace(Visitor*) const; @@ -235,6 +246,9 @@ CSSScrollTimelineMap scroll_timelines_; CSSViewTimelineMap view_timelines_; CSSDeferredTimelineMap deferred_timelines_; + TimelineAttachmentMap timeline_attachments_; + + // TODO(crbug.com/1446702): Remove scroll/view-timeline-attachment. AttachingTimelineMap attaching_timelines_; }; @@ -337,12 +351,25 @@ CallbackFunc); template <typename TimelineType> + static void CalculateChangedTimelineAttachments( + Element& animating_element, + const TimelineData*, + const CSSAnimationUpdate&, + const TimelineAttachmentMap* existing_attachments, + TimelineAttachmentMap& result); + + static void CalculateTimelineAttachmentUpdate(CSSAnimationUpdate&, + Element& animating_element); + + // TODO(crbug.com/1446702): Remove scroll/view-timeline-attachment. + template <typename TimelineType> static void CollectTimelinesWithAttachmentInto( const TimelineData*, const CSSAnimationUpdate*, TimelineAttachment, CSSTimelineMap<TimelineType>& result); + // TODO(crbug.com/1446702): Remove scroll/view-timeline-attachment. template <typename TimelineType> static void CalculateChangedAttachingTimelines( const CSSTimelineMap<TimelineType>& ancestor_attached_timelines, @@ -350,22 +377,28 @@ const AttachingTimelineMap* existing_attaching_timelines, AttachingTimelineMap& changed_attaching_timelines); + // TODO(crbug.com/1446702): Remove scroll/view-timeline-attachment. static void CalculateAttachingTimelinesUpdate(CSSAnimationUpdate&, Element& animating_element); static const TimelineData* GetTimelineData(const Element&); - static ScrollTimeline* FindTimelineForNode(const ScopedCSSName& name, - Node*, - const CSSAnimationUpdate*); + static ScrollSnapshotTimeline* FindTimelineForNode(const ScopedCSSName& name, + Node*, + const CSSAnimationUpdate*); template <typename TimelineType> static TimelineType* FindTimelineForElement(const ScopedCSSName& name, const TimelineData*, const CSSAnimationUpdate*); - static ScrollTimeline* FindAncestorTimeline(const ScopedCSSName& name, - Node*, - const CSSAnimationUpdate*); + static ScrollSnapshotTimeline* FindAncestorTimeline( + const ScopedCSSName& name, + Node*, + const CSSAnimationUpdate*); + + static DeferredTimeline* FindDeferredTimeline(const ScopedCSSName& name, + Element*, + const CSSAnimationUpdate*); static AnimationTimeline* ComputeTimeline( Element*,
diff --git a/third_party/blink/renderer/core/animation/css/css_animations_test.cc b/third_party/blink/renderer/core/animation/css/css_animations_test.cc index aca48fd..60b9715 100644 --- a/third_party/blink/renderer/core/animation/css/css_animations_test.cc +++ b/third_party/blink/renderer/core/animation/css/css_animations_test.cc
@@ -1046,7 +1046,7 @@ SetBodyInnerHTML(R"HTML( <style> .defer { - scroll-timeline: t1 defer; + scroll-timeline: --t1 defer; } #scroller { overflow: auto; @@ -1058,7 +1058,7 @@ height: 200px; } .ancestor-timeline { - scroll-timeline: t1 ancestor; + scroll-timeline: --t1 ancestor; } </style> <div class=defer>
diff --git a/third_party/blink/renderer/core/animation/css/css_scroll_timeline_test.cc b/third_party/blink/renderer/core/animation/css/css_scroll_timeline_test.cc index 2c4aa741..49346e45 100644 --- a/third_party/blink/renderer/core/animation/css/css_scroll_timeline_test.cc +++ b/third_party/blink/renderer/core/animation/css/css_scroll_timeline_test.cc
@@ -43,7 +43,7 @@ <style> body { scroll-timeline-attachment: defer; - scroll-timeline-name: timeline1, timeline2; + scroll-timeline-name: --timeline1, --timeline2; } @keyframes anim1 { to { top: 200px; } } @keyframes anim2 { to { left: 200px; } } @@ -57,10 +57,10 @@ height: 200px; } #scroller1 { - scroll-timeline: timeline1; + scroll-timeline: --timeline1; } #scroller2 { - scroll-timeline: timeline2; + scroll-timeline: --timeline2; } </style> <div id=scroller1 class=scroller><div></div></div> @@ -77,7 +77,7 @@ #element1, #element2 { animation-name: anim1, anim2, anim3; animation-duration: 10s; - animation-timeline: timeline1, timeline1, timeline2; + animation-timeline: --timeline1, --timeline1, --timeline2; } </style> <div id=element1></div> @@ -118,7 +118,7 @@ #scroller { height: 100px; overflow: scroll; - scroll-timeline: timeline; + scroll-timeline: --timeline; } #scroller > div { height: 200px; @@ -126,7 +126,7 @@ #element { color: red; animation: anim 10s; - animation-timeline: timeline; + animation-timeline: --timeline; } </style> <div id=scroller> @@ -165,7 +165,7 @@ void OnResize( const HeapVector<Member<ResizeObserverEntry>>& entries) override { scroller_element_->SetInlineStyleProperty(CSSPropertyID::kScrollTimeline, - "timeline"); + "--timeline"); } void Trace(Visitor* visitor) const override { @@ -195,7 +195,7 @@ } #element { width: 1px; - animation: anim 10s timeline; + animation: anim 10s --timeline; } </style> <div id=main></div> @@ -248,10 +248,10 @@ } .target { animation: anim 10s linear; - animation-timeline: timeline; + animation-timeline: --timeline; } .scroller > div { - view-timeline: timeline horizontal; + view-timeline: --timeline x; } </style> <div class=scroller> @@ -260,7 +260,7 @@ <template shadowroot=open> <style> :host { - view-timeline: timeline vertical; + view-timeline: --timeline y; } </style> </template> @@ -273,8 +273,7 @@ ASSERT_TRUE(target); HeapVector<Member<Animation>> animations = target->getAnimations(); ASSERT_EQ(1u, animations.size()); - ASSERT_EQ(ScrollTimeline::ScrollAxis::kHorizontal, - GetTimelineAxis(*animations[0])) + ASSERT_EQ(ScrollTimeline::ScrollAxis::kX, GetTimelineAxis(*animations[0])) << "Outer animation can not see view timeline defined by :host"; } @@ -290,10 +289,10 @@ } .target { animation: anim 10s linear; - animation-timeline: timeline; + animation-timeline: --timeline; } .host { - view-timeline: timeline horizontal; + view-timeline: --timeline x; } </style> <div class=scroller> @@ -301,7 +300,7 @@ <template shadowroot=open> <style> ::slotted(.target) { - view-timeline: timeline vertical; + view-timeline: --timeline y; } </style> <slot></slot> @@ -315,8 +314,7 @@ ASSERT_TRUE(target); HeapVector<Member<Animation>> animations = target->getAnimations(); ASSERT_EQ(1u, animations.size()); - ASSERT_EQ(ScrollTimeline::ScrollAxis::kHorizontal, - GetTimelineAxis(*animations[0])) + ASSERT_EQ(ScrollTimeline::ScrollAxis::kX, GetTimelineAxis(*animations[0])) << "Outer animation can not see view timeline defined by ::slotted"; } @@ -327,10 +325,10 @@ ->setInnerHTMLWithDeclarativeShadowDOMForTesting(R"HTML( <style> .host { - view-timeline: timeline vertical; + view-timeline: --timeline y; } .host::part(foo) { - view-timeline: timeline horizontal; + view-timeline: --timeline x; } </style> <div class=host> @@ -344,7 +342,7 @@ } .target { animation: anim2 10s linear; - animation-timeline: timeline; + animation-timeline: --timeline; } </style> <div part=foo> @@ -361,8 +359,7 @@ ASSERT_TRUE(target); HeapVector<Member<Animation>> animations = target->getAnimations(); ASSERT_EQ(1u, animations.size()); - ASSERT_EQ(ScrollTimeline::ScrollAxis::kHorizontal, - GetTimelineAxis(*animations[0])) + ASSERT_EQ(ScrollTimeline::ScrollAxis::kX, GetTimelineAxis(*animations[0])) << "Inner animation can see view timeline defined by ::part"; } @@ -378,10 +375,10 @@ } .target { animation: anim 10s linear; - animation-timeline: timeline; + animation-timeline: --timeline; } main > .scroller { - scroll-timeline: timeline horizontal; + scroll-timeline: --timeline x; } </style> <main> @@ -390,7 +387,7 @@ <template shadowroot=open> <style> :host { - scroll-timeline: timeline vertical; + scroll-timeline: --timeline y; } </style> <slot></slot> @@ -405,8 +402,7 @@ ASSERT_TRUE(target); HeapVector<Member<Animation>> animations = target->getAnimations(); ASSERT_EQ(1u, animations.size()); - ASSERT_EQ(ScrollTimeline::ScrollAxis::kHorizontal, - GetTimelineAxis(*animations[0])) + ASSERT_EQ(ScrollTimeline::ScrollAxis::kX, GetTimelineAxis(*animations[0])) << "Outer animation can not see scroll timeline defined by :host"; } @@ -422,17 +418,17 @@ } .target { animation: anim 10s linear; - animation-timeline: timeline; + animation-timeline: --timeline; } .host { - scroll-timeline: timeline horizontal; + scroll-timeline: --timeline x; } </style> <div class=host> <template shadowroot=open> <style> ::slotted(.scroller) { - scroll-timeline: timeline vertical; + scroll-timeline: --timeline y; } </style> <slot></slot> @@ -447,8 +443,7 @@ ASSERT_TRUE(target); HeapVector<Member<Animation>> animations = target->getAnimations(); ASSERT_EQ(1u, animations.size()); - ASSERT_EQ(ScrollTimeline::ScrollAxis::kHorizontal, - GetTimelineAxis(*animations[0])) + ASSERT_EQ(ScrollTimeline::ScrollAxis::kX, GetTimelineAxis(*animations[0])) << "Outer animation can not see scroll timeline defined by ::slotted"; } @@ -459,10 +454,10 @@ ->setInnerHTMLWithDeclarativeShadowDOMForTesting(R"HTML( <style> .host { - scroll-timeline: timeline vertical; + scroll-timeline: --timeline y; } .host::part(foo) { - scroll-timeline: timeline horizontal; + scroll-timeline: --timeline x; } </style> <div class=host> @@ -476,7 +471,7 @@ } .target { animation: anim2 10s linear; - animation-timeline: timeline; + animation-timeline: --timeline; } </style> <div part=foo> @@ -493,8 +488,7 @@ ASSERT_TRUE(target); HeapVector<Member<Animation>> animations = target->getAnimations(); ASSERT_EQ(1u, animations.size()); - ASSERT_EQ(ScrollTimeline::ScrollAxis::kHorizontal, - GetTimelineAxis(*animations[0])) + ASSERT_EQ(ScrollTimeline::ScrollAxis::kX, GetTimelineAxis(*animations[0])) << "Inner animation can see scroll timeline defined by ::part"; }
diff --git a/third_party/blink/renderer/core/animation/css/css_timeline_map.h b/third_party/blink/renderer/core/animation/css/css_timeline_map.h index f7979fe..f761486 100644 --- a/third_party/blink/renderer/core/animation/css/css_timeline_map.h +++ b/third_party/blink/renderer/core/animation/css/css_timeline_map.h
@@ -13,6 +13,7 @@ namespace blink { class DeferredTimeline; +class ScrollSnapshotTimeline; class ScrollTimeline; class ViewTimeline; class ScrollTimelineAttachment; @@ -24,7 +25,10 @@ using CSSViewTimelineMap = CSSTimelineMap<ViewTimeline>; using CSSScrollTimelineMap = CSSTimelineMap<ScrollTimeline>; using CSSDeferredTimelineMap = CSSTimelineMap<DeferredTimeline>; +using TimelineAttachmentMap = + HeapHashMap<Member<ScrollSnapshotTimeline>, Member<DeferredTimeline>>; +// TODO(crbug.com/1446702): Remove scroll/view-timeline-attachment. using AttachingTimelineMap = HeapHashMap<Member<ScrollTimelineAttachment>, Member<ScrollTimeline>>;
diff --git a/third_party/blink/renderer/core/animation/deferred_timeline.cc b/third_party/blink/renderer/core/animation/deferred_timeline.cc index 2e22376..6a202cb 100644 --- a/third_party/blink/renderer/core/animation/deferred_timeline.cc +++ b/third_party/blink/renderer/core/animation/deferred_timeline.cc
@@ -9,9 +9,27 @@ DeferredTimeline::DeferredTimeline(Document* document) : ScrollSnapshotTimeline(document) {} +void DeferredTimeline::AttachTimeline(ScrollSnapshotTimeline* timeline) { + attached_timelines_.push_back(timeline); +} + +void DeferredTimeline::DetachTimeline(ScrollSnapshotTimeline* timeline) { + wtf_size_t i = attached_timelines_.Find(timeline); + if (i != kNotFound) { + attached_timelines_.EraseAt(i); + } +} + +void DeferredTimeline::Trace(Visitor* visitor) const { + visitor->Trace(attached_timelines_); + ScrollSnapshotTimeline::Trace(visitor); +} + DeferredTimeline::TimelineState DeferredTimeline::ComputeTimelineState() const { - // TODO(crbug.com/1425939): Grab state from the attached timeline. - // For now this timeline is always inactive. + if (const ScrollSnapshotTimeline* attached_timeline = + SingleAttachedTimeline()) { + return attached_timeline->ComputeTimelineState(); + } return TimelineState(); }
diff --git a/third_party/blink/renderer/core/animation/deferred_timeline.h b/third_party/blink/renderer/core/animation/deferred_timeline.h index 52fb279c..1a0093a 100644 --- a/third_party/blink/renderer/core/animation/deferred_timeline.h +++ b/third_party/blink/renderer/core/animation/deferred_timeline.h
@@ -7,6 +7,7 @@ #include "third_party/blink/renderer/core/animation/scroll_snapshot_timeline.h" #include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/platform/heap/collection_support/heap_vector.h" namespace blink { @@ -16,12 +17,26 @@ public: explicit DeferredTimeline(Document*); - // TODO(crbug.com/1425939): Support attaching other timelines to this - // timeline. + void AttachTimeline(ScrollSnapshotTimeline*); + void DetachTimeline(ScrollSnapshotTimeline*); + + void Trace(Visitor*) const override; protected: TimelineState ComputeTimelineState() const override; cc::AnimationTimeline* EnsureCompositorTimeline() override; + + private: + ScrollSnapshotTimeline* SingleAttachedTimeline() { + return (attached_timelines_.size() == 1u) ? attached_timelines_.back().Get() + : nullptr; + } + + const ScrollSnapshotTimeline* SingleAttachedTimeline() const { + return const_cast<DeferredTimeline*>(this)->SingleAttachedTimeline(); + } + + HeapVector<Member<ScrollSnapshotTimeline>> attached_timelines_; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/animation/scroll_snapshot_timeline.h b/third_party/blink/renderer/core/animation/scroll_snapshot_timeline.h index 2939202..7b403f75 100644 --- a/third_party/blink/renderer/core/animation/scroll_snapshot_timeline.h +++ b/third_party/blink/renderer/core/animation/scroll_snapshot_timeline.h
@@ -132,9 +132,11 @@ bool ValidateSnapshot() override; bool ShouldScheduleNextService() override; - private: + public: + // Public for DeferredTimeline::ComputeTimelineState. virtual TimelineState ComputeTimelineState() const = 0; + private: // Snapshotted value produced by the last SnapshotState call. TimelineState timeline_state_snapshotted_; };
diff --git a/third_party/blink/renderer/core/animation/scroll_timeline.cc b/third_party/blink/renderer/core/animation/scroll_timeline.cc index 2021b600..366fa80 100644 --- a/third_party/blink/renderer/core/animation/scroll_timeline.cc +++ b/third_party/blink/renderer/core/animation/scroll_timeline.cc
@@ -23,9 +23,9 @@ return is_horizontal ? kVerticalScroll : kHorizontalScroll; case ScrollAxis::kInline: return is_horizontal ? kHorizontalScroll : kVerticalScroll; - case ScrollAxis::kHorizontal: + case ScrollAxis::kX: return kHorizontalScroll; - case ScrollAxis::kVertical: + case ScrollAxis::kY: return kVerticalScroll; } }
diff --git a/third_party/blink/renderer/core/animation/scroll_timeline.idl b/third_party/blink/renderer/core/animation/scroll_timeline.idl index 80e097b..58f7cb23 100644 --- a/third_party/blink/renderer/core/animation/scroll_timeline.idl +++ b/third_party/blink/renderer/core/animation/scroll_timeline.idl
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -enum ScrollAxis { "block", "inline", "horizontal", "vertical" }; +enum ScrollAxis { "block", "inline", "x", "y" }; // https://wicg.github.io/scroll-animations/#scrolltimeline-interface [
diff --git a/third_party/blink/renderer/core/animation/scroll_timeline_test.cc b/third_party/blink/renderer/core/animation/scroll_timeline_test.cc index f812230c..7e75d74 100644 --- a/third_party/blink/renderer/core/animation/scroll_timeline_test.cc +++ b/third_party/blink/renderer/core/animation/scroll_timeline_test.cc
@@ -86,7 +86,7 @@ TimelineAttachment::kLocal, ScrollTimeline::ReferenceType::kSource, source, - ScrollAxis::kVertical) { + ScrollAxis::kY) { if (snapshot) { UpdateSnapshot(); } @@ -116,7 +116,7 @@ : ViewTimeline(document, TimelineAttachment::kLocal, subject, - ScrollAxis::kVertical, + ScrollAxis::kY, TimelineInset()) { if (snapshot) { UpdateSnapshot();
diff --git a/third_party/blink/renderer/core/animation/scroll_timeline_util.cc b/third_party/blink/renderer/core/animation/scroll_timeline_util.cc index 6280a85..dfdac8c 100644 --- a/third_party/blink/renderer/core/animation/scroll_timeline_util.cc +++ b/third_party/blink/renderer/core/animation/scroll_timeline_util.cc
@@ -52,10 +52,12 @@ ScrollAxis axis, const ComputedStyle* style) { // Easy cases; physical is always physical. - if (axis == ScrollAxis::kHorizontal) + if (axis == ScrollAxis::kX) { return CompositorScrollTimeline::ScrollRight; - if (axis == ScrollAxis::kVertical) + } + if (axis == ScrollAxis::kY) { return CompositorScrollTimeline::ScrollDown; + } // Harder cases; first work out which axis is which, and then for each check // which edge we start at.
diff --git a/third_party/blink/renderer/core/animation/scroll_timeline_util_test.cc b/third_party/blink/renderer/core/animation/scroll_timeline_util_test.cc index 3f31dc7e..c7a1d78 100644 --- a/third_party/blink/renderer/core/animation/scroll_timeline_util_test.cc +++ b/third_party/blink/renderer/core/animation/scroll_timeline_util_test.cc
@@ -115,11 +115,9 @@ style_builder.SetWritingMode(writing_mode); style_builder.SetDirection(direction); scoped_refptr<const ComputedStyle> style = style_builder.TakeStyle(); - EXPECT_EQ(ConvertOrientation(ScrollTimeline::ScrollAxis::kVertical, - style.get()), + EXPECT_EQ(ConvertOrientation(ScrollTimeline::ScrollAxis::kY, style.get()), CompositorScrollTimeline::ScrollDown); - EXPECT_EQ(ConvertOrientation(ScrollTimeline::ScrollAxis::kHorizontal, - style.get()), + EXPECT_EQ(ConvertOrientation(ScrollTimeline::ScrollAxis::kX, style.get()), CompositorScrollTimeline::ScrollRight); } } @@ -197,11 +195,10 @@ TEST_F(ScrollTimelineUtilTest, ConvertOrientationNullStyle) { // When the style is nullptr we assume horizontal-tb and ltr direction. This // means that block is ScrollDown and inline is ScrollRight - EXPECT_EQ(ConvertOrientation(ScrollTimeline::ScrollAxis::kVertical, nullptr), + EXPECT_EQ(ConvertOrientation(ScrollTimeline::ScrollAxis::kY, nullptr), CompositorScrollTimeline::ScrollDown); - EXPECT_EQ( - ConvertOrientation(ScrollTimeline::ScrollAxis::kHorizontal, nullptr), - CompositorScrollTimeline::ScrollRight); + EXPECT_EQ(ConvertOrientation(ScrollTimeline::ScrollAxis::kX, nullptr), + CompositorScrollTimeline::ScrollRight); EXPECT_EQ(ConvertOrientation(ScrollTimeline::ScrollAxis::kBlock, nullptr), CompositorScrollTimeline::ScrollDown); EXPECT_EQ(ConvertOrientation(ScrollTimeline::ScrollAxis::kInline, nullptr),
diff --git a/third_party/blink/renderer/core/animation/view_timeline.cc b/third_party/blink/renderer/core/animation/view_timeline.cc index c5769d5e..d84e07d8 100644 --- a/third_party/blink/renderer/core/animation/view_timeline.cc +++ b/third_party/blink/renderer/core/animation/view_timeline.cc
@@ -38,9 +38,9 @@ return true; case ViewTimeline::ScrollAxis::kInline: return false; - case ViewTimeline::ScrollAxis::kHorizontal: + case ViewTimeline::ScrollAxis::kX: return !blink::IsHorizontalWritingMode(writing_mode); - case ViewTimeline::ScrollAxis::kVertical: + case ViewTimeline::ScrollAxis::kY: return blink::IsHorizontalWritingMode(writing_mode); } }
diff --git a/third_party/blink/renderer/core/css/css_primitive_value_mappings.h b/third_party/blink/renderer/core/css/css_primitive_value_mappings.h index 72bf800f..d8614b4 100644 --- a/third_party/blink/renderer/core/css/css_primitive_value_mappings.h +++ b/third_party/blink/renderer/core/css/css_primitive_value_mappings.h
@@ -1772,11 +1772,11 @@ case TimelineAxis::kInline: value_id_ = CSSValueID::kInline; break; - case TimelineAxis::kVertical: - value_id_ = CSSValueID::kVertical; + case TimelineAxis::kX: + value_id_ = CSSValueID::kX; break; - case TimelineAxis::kHorizontal: - value_id_ = CSSValueID::kHorizontal; + case TimelineAxis::kY: + value_id_ = CSSValueID::kY; break; } } @@ -1788,10 +1788,10 @@ return TimelineAxis::kBlock; case CSSValueID::kInline: return TimelineAxis::kInline; - case CSSValueID::kVertical: - return TimelineAxis::kVertical; - case CSSValueID::kHorizontal: - return TimelineAxis::kHorizontal; + case CSSValueID::kX: + return TimelineAxis::kX; + case CSSValueID::kY: + return TimelineAxis::kY; default: break; }
diff --git a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc index 066b2c4..e448c58 100644 --- a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc +++ b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
@@ -4226,8 +4226,7 @@ } if (!axis) { if ((axis = ConsumeIdent<CSSValueID::kBlock, CSSValueID::kInline, - CSSValueID::kVertical, CSSValueID::kHorizontal>( - block))) { + CSSValueID::kX, CSSValueID::kY>(block))) { continue; } } @@ -4264,8 +4263,7 @@ } if (!axis) { if ((axis = ConsumeIdent<CSSValueID::kBlock, CSSValueID::kInline, - CSSValueID::kVertical, CSSValueID::kHorizontal>( - block))) { + CSSValueID::kX, CSSValueID::kY>(block))) { continue; } } @@ -4302,7 +4300,7 @@ if (auto* value = ConsumeIdent<CSSValueID::kNone, CSSValueID::kAuto>(range)) { return value; } - if (auto* value = ConsumeCustomIdent(range, context)) { + if (auto* value = ConsumeDashedIdent(range, context)) { return value; } if (auto* value = ConsumeViewFunction(range, context)) { @@ -4456,8 +4454,8 @@ } CSSValue* ConsumeSingleTimelineAxis(CSSParserTokenRange& range) { - return ConsumeIdent<CSSValueID::kBlock, CSSValueID::kInline, - CSSValueID::kVertical, CSSValueID::kHorizontal>(range); + return ConsumeIdent<CSSValueID::kBlock, CSSValueID::kInline, CSSValueID::kX, + CSSValueID::kY>(range); } CSSValue* ConsumeSingleTimelineName(CSSParserTokenRange& range, @@ -4465,7 +4463,7 @@ if (CSSValue* value = ConsumeIdent<CSSValueID::kNone>(range)) { return value; } - return ConsumeCustomIdent(range, context); + return ConsumeDashedIdent(range, context); } namespace {
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc index 70f1782..78ab1fe 100644 --- a/third_party/blink/renderer/core/dom/document.cc +++ b/third_party/blink/renderer/core/dom/document.cc
@@ -175,6 +175,7 @@ #include "third_party/blink/renderer/core/editing/serializers/serialization.h" #include "third_party/blink/renderer/core/events/before_unload_event.h" #include "third_party/blink/renderer/core/events/event_factory.h" +#include "third_party/blink/renderer/core/events/event_util.h" #include "third_party/blink/renderer/core/events/hash_change_event.h" #include "third_party/blink/renderer/core/events/overscroll_event.h" #include "third_party/blink/renderer/core/events/page_transition_event.h" @@ -3289,6 +3290,13 @@ if (ignore_opens_and_writes_for_abort_) return; + if (cookie_jar_) { + // open() can affect security context which can change cookie values. Make + // sure cached values are thrown out. see + // third_party/blink/web_tests/http/tests/security/aboutBlank/. + cookie_jar_->InvalidateCache(); + } + // If this document is fully active, then update the URL // for this document with the entered window's url. if (dom_window_ && entered_window) { @@ -5726,24 +5734,12 @@ void Document::AddListenerTypeIfNeeded(const AtomicString& event_type, EventTarget& event_target) { - if (event_type == event_type_names::kDOMSubtreeModified) { - UseCounter::Count(*this, WebFeature::kDOMSubtreeModifiedEvent); - AddMutationEventListenerTypeIfEnabled(kDOMSubtreeModifiedListener); - } else if (event_type == event_type_names::kDOMNodeInserted) { - UseCounter::Count(*this, WebFeature::kDOMNodeInsertedEvent); - AddMutationEventListenerTypeIfEnabled(kDOMNodeInsertedListener); - } else if (event_type == event_type_names::kDOMNodeRemoved) { - UseCounter::Count(*this, WebFeature::kDOMNodeRemovedEvent); - AddMutationEventListenerTypeIfEnabled(kDOMNodeRemovedListener); - } else if (event_type == event_type_names::kDOMNodeRemovedFromDocument) { - UseCounter::Count(*this, WebFeature::kDOMNodeRemovedFromDocumentEvent); - AddMutationEventListenerTypeIfEnabled(kDOMNodeRemovedFromDocumentListener); - } else if (event_type == event_type_names::kDOMNodeInsertedIntoDocument) { - UseCounter::Count(*this, WebFeature::kDOMNodeInsertedIntoDocumentEvent); - AddMutationEventListenerTypeIfEnabled(kDOMNodeInsertedIntoDocumentListener); - } else if (event_type == event_type_names::kDOMCharacterDataModified) { - UseCounter::Count(*this, WebFeature::kDOMCharacterDataModifiedEvent); - AddMutationEventListenerTypeIfEnabled(kDOMCharacterDataModifiedListener); + WebFeature mutation_event_feature; + ListenerType listener_type; + if (event_util::IsDOMMutationEventType(event_type, mutation_event_feature, + listener_type)) { + UseCounter::Count(*this, mutation_event_feature); + AddMutationEventListenerTypeIfEnabled(listener_type); } else if (event_type == event_type_names::kWebkitAnimationStart || event_type == event_type_names::kAnimationstart) { AddListenerType(kAnimationStartListener); @@ -6336,6 +6332,13 @@ "document is fully active.")); } + if (cookie_jar_) { + // Storage access might be about to change in which case the ability for + // |cookie_jar_| to retrieve values might also. Invalidate its cache in case + // that happens so it can't return data that shouldn't be accessible. + cookie_jar_->InvalidateCache(); + } + ScriptPromiseResolver* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
diff --git a/third_party/blink/renderer/core/dom/events/event_target.cc b/third_party/blink/renderer/core/dom/events/event_target.cc index 27e54bc..85fc74c 100644 --- a/third_party/blink/renderer/core/dom/events/event_target.cc +++ b/third_party/blink/renderer/core/dom/events/event_target.cc
@@ -49,6 +49,7 @@ #include "third_party/blink/renderer/core/editing/editor.h" #include "third_party/blink/renderer/core/events/event_util.h" #include "third_party/blink/renderer/core/events/pointer_event.h" +#include "third_party/blink/renderer/core/frame/deprecation/deprecation.h" #include "third_party/blink/renderer/core/frame/frame_console.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/frame/performance_monitor.h" @@ -535,15 +536,27 @@ } } - if (event_util::IsDOMMutationEventType(event_type)) { + WebFeature mutation_event_feature; + Document::ListenerType listener_type; + if (event_util::IsDOMMutationEventType(event_type, mutation_event_feature, + listener_type)) { if (ExecutionContext* context = GetExecutionContext()) { String message_text = String::Format( - "Added synchronous DOM mutation listener to a '%s' event. " - "Consider using MutationObserver to make the page more responsive.", + "Listener added for a synchronous '%s' DOM Mutation Event. " + "This event type is deprecated " + "(https://w3c.github.io/uievents/#legacy-event-types) " + "and work is underway to remove it from this browser. Usage of this " + "event listener will cause performance issues today, and represents " + "a risk of future incompatibility. Consider using MutationObserver " + "instead.", event_type.GetString().Utf8().c_str()); PerformanceMonitor::ReportGenericViolation( context, PerformanceMonitor::kDiscouragedAPIUse, message_text, base::TimeDelta(), nullptr); + context->AddConsoleMessage(MakeGarbageCollected<ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kDeprecation, + mojom::blink::ConsoleMessageLevel::kWarning, message_text)); + Deprecation::CountDeprecation(context, mutation_event_feature); } } }
diff --git a/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc b/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc index 08c5035..e14edba 100644 --- a/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc +++ b/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc
@@ -61,6 +61,7 @@ #include "third_party/blink/renderer/core/highlight/highlight_registry.h" #include "third_party/blink/renderer/core/layout/layout_object.h" #include "third_party/blink/renderer/core/layout/layout_view.h" +#include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_set.h" namespace blink { @@ -116,16 +117,18 @@ } void InvalidatePaintForNode(const Node& node) { - if (!node.GetLayoutObject()) + if (!node.GetLayoutObject()) { return; + } node.GetLayoutObject()->SetShouldDoFullPaintInvalidation( PaintInvalidationReason::kDocumentMarker); // Tell accessibility about the new marker. AXObjectCache* ax_object_cache = node.GetDocument().ExistingAXObjectCache(); - if (!ax_object_cache) + if (!ax_object_cache) { return; + } // TODO(nektar): Do major refactoring of all AX classes to comply with const // correctness. Node* non_const_node = &const_cast<Node&>(node); @@ -147,13 +150,6 @@ } // namespace -Member<DocumentMarkerList>& DocumentMarkerController::ListForType( - MarkerLists* marker_lists, - DocumentMarker::MarkerType type) { - const wtf_size_t marker_list_index = MarkerTypeToMarkerIndex(type); - return (*marker_lists)[marker_list_index]; -} - bool DocumentMarkerController::PossiblyHasMarkers( DocumentMarker::MarkerType type) const { return PossiblyHasMarkers(DocumentMarker::MarkerTypes(type)); @@ -167,12 +163,8 @@ } DocumentMarkerController::DocumentMarkerController(Document& document) - : document_(&document) {} - -void DocumentMarkerController::Clear() { - markers_.clear(); - possibly_existing_marker_types_ = DocumentMarker::MarkerTypes(); - SetDocument(nullptr); + : document_(&document) { + markers_.Grow(DocumentMarker::kMarkerTypeIndexesCount); } void DocumentMarkerController::AddSpellingMarker(const EphemeralRange& range, @@ -274,24 +266,31 @@ } void DocumentMarkerController::PrepareForDestruction() { - Clear(); + for (auto& marker_map : markers_) { + marker_map.Clear(); + } + possibly_existing_marker_types_ = DocumentMarker::MarkerTypes(); + SetDocument(nullptr); } void DocumentMarkerController::RemoveMarkers( TextIterator& marked_text, DocumentMarker::MarkerTypes marker_types) { for (; !marked_text.AtEnd(); marked_text.Advance()) { - if (!PossiblyHasMarkers(marker_types)) + if (!PossiblyHasMarkers(marker_types)) { return; - DCHECK(!markers_.empty()); + } const Node& node = marked_text.CurrentContainer(); auto* text_node = DynamicTo<Text>(node); - if (!text_node) + if (!text_node) { continue; + } int start_offset = marked_text.StartOffsetInCurrentContainer(); int end_offset = marked_text.EndOffsetInCurrentContainer(); - RemoveMarkersInternal(*text_node, start_offset, end_offset - start_offset, - marker_types); + for (DocumentMarker::MarkerType type : marker_types) { + RemoveMarkersInternal(*text_node, start_offset, end_offset - start_offset, + type); + } } } @@ -324,14 +323,16 @@ // TODO(editing-dev): TextIterator sometimes emits ranges where the start // and end offsets are the same. Investigate if TextIterator should be // changed to not do this. See crbug.com/727929 - if (end_offset_in_current_container == start_offset_in_current_container) + if (end_offset_in_current_container == start_offset_in_current_container) { continue; + } // Ignore text emitted by TextIterator for non-text nodes (e.g. implicit // newlines) const auto* text_node = DynamicTo<Text>(marked_text.CurrentContainer()); - if (!text_node) + if (!text_node) { continue; + } DocumentMarker* const new_marker = create_marker_from_offsets( start_offset_in_current_container, end_offset_in_current_container); @@ -348,19 +349,20 @@ DocumentMarker::MarkerTypes(new_marker->GetType())); SetDocument(document_); - Member<MarkerLists>& markers = - markers_.insert(&text, nullptr).stored_value->value; - if (!markers) { - markers = MakeGarbageCollected<MarkerLists>(); - markers->Grow(DocumentMarker::kMarkerTypeIndexesCount); + DocumentMarker::MarkerType new_marker_type = new_marker->GetType(); + const DocumentMarker::MarkerTypeIndex type_index = + MarkerTypeToMarkerIndex(new_marker_type); + Member<MarkerMap>& marker_map = markers_[type_index]; + if (!marker_map) { + marker_map = MakeGarbageCollected<MarkerMap>(); + markers_[type_index] = marker_map; } - const DocumentMarker::MarkerType new_marker_type = new_marker->GetType(); - if (!ListForType(markers, new_marker_type)) - ListForType(markers, new_marker_type) = CreateListForType(new_marker_type); - - DocumentMarkerList* const list = ListForType(markers, new_marker_type); - list->Add(new_marker); + MarkerList& markers = marker_map->insert(&text, nullptr).stored_value->value; + if (!markers) { + markers = CreateListForType(new_marker_type); + } + markers->Add(new_marker); InvalidatePaintForNode(text); } @@ -370,124 +372,135 @@ void DocumentMarkerController::MoveMarkers(const Text& src_node, int length, const Text& dst_node) { - if (length <= 0) + if (length <= 0) { return; - - if (!PossiblyHasMarkers(DocumentMarker::MarkerTypes::All())) - return; - DCHECK(!markers_.empty()); - - MarkerLists* const src_markers = FindMarkers(&src_node); - if (!src_markers) - return; - - auto& dst_marker_entry = - markers_.insert(&dst_node, nullptr).stored_value->value; - if (!dst_marker_entry) { - dst_marker_entry = MakeGarbageCollected<MarkerLists>( - DocumentMarker::kMarkerTypeIndexesCount); } - MarkerLists* const dst_markers = dst_marker_entry; + + if (!PossiblyHasMarkers(DocumentMarker::MarkerTypes::All())) { + return; + } bool doc_dirty = false; - for (DocumentMarker::MarkerType type : DocumentMarker::MarkerTypes::All()) { - DocumentMarkerList* const src_list = ListForType(src_markers, type); - if (!src_list) + for (auto& marker_map : markers_) { + if (!marker_map) { continue; + } - if (!ListForType(dst_markers, type)) - ListForType(dst_markers, type) = CreateListForType(type); + DocumentMarkerList* const src_markers = FindMarkers(marker_map, &src_node); + if (!src_markers) { + return; + } + DCHECK(!src_markers->IsEmpty()); - DocumentMarkerList* const dst_list = ListForType(dst_markers, type); - if (src_list->MoveMarkers(length, dst_list)) { + DocumentMarker::MarkerType type = src_markers->GetMarkers()[0]->GetType(); + auto& dst_marker_entry = + marker_map->insert(&dst_node, nullptr).stored_value->value; + if (!dst_marker_entry) { + dst_marker_entry = CreateListForType(type); + } + DocumentMarkerList* const dst_markers = dst_marker_entry; + DCHECK(src_markers != dst_markers); + + if (src_markers->MoveMarkers(length, dst_markers)) { doc_dirty = true; - for (const auto& marker : dst_list->GetMarkers()) { + for (const auto& marker : dst_markers->GetMarkers()) { auto it = marker_groups_.find(marker); if (it != marker_groups_.end()) it->value->Set(marker, &dst_node); } } + // MoveMarkers in a list can remove markers entirely when split across + // the src and dst, in which case both lists may be empty despite + // MoveMarkers returning false. + if (src_markers->IsEmpty()) { + marker_map->erase(&src_node); + DidRemoveNodeFromMap(type); + } + if (dst_markers->IsEmpty()) { + marker_map->erase(&dst_node); + DidRemoveNodeFromMap(type); + } } - if (!doc_dirty) + if (!doc_dirty) { return; + } InvalidatePaintForNode(dst_node); } +void DocumentMarkerController::DidRemoveNodeFromMap( + DocumentMarker::MarkerType type) { + DocumentMarker::MarkerTypeIndex type_index = MarkerTypeToMarkerIndex(type); + if (markers_[type_index]->empty()) { + markers_[type_index] = nullptr; + possibly_existing_marker_types_ = possibly_existing_marker_types_.Subtract( + DocumentMarker::MarkerTypes(type)); + } +} + void DocumentMarkerController::RemoveMarkersInternal( const Text& text, unsigned start_offset, int length, - DocumentMarker::MarkerTypes marker_types) { - if (length <= 0) + DocumentMarker::MarkerType marker_type) { + if (length <= 0) { return; + } - if (!PossiblyHasMarkers(marker_types)) + if (!PossiblyHasMarkers(DocumentMarker::MarkerTypes(marker_type))) { return; - DCHECK(!(markers_.empty())); + } - MarkerLists* const markers = FindMarkers(&text); - if (!markers) + MarkerMap* marker_map = markers_[MarkerTypeToMarkerIndex(marker_type)]; + DCHECK(marker_map); + + DocumentMarkerList* const list = FindMarkers(marker_map, &text); + if (!list) { return; + } - bool doc_dirty = false; - size_t empty_lists_count = 0; - for (DocumentMarker::MarkerType type : DocumentMarker::MarkerTypes::All()) { - DocumentMarkerList* const list = ListForType(markers, type); - if (!list || list->IsEmpty()) { - if (list && list->IsEmpty()) - ListForType(markers, type) = nullptr; - ++empty_lists_count; - continue; - } - if (!marker_types.Contains(type)) - continue; - - const unsigned end_offset = start_offset + length; - for (const Member<DocumentMarker>& marker : list->GetMarkers()) { - if (marker->EndOffset() > start_offset && - marker->StartOffset() < end_offset) { - auto it = marker_groups_.find(marker); - if (it != marker_groups_.end()) { - it->value->Erase(marker); - marker_groups_.erase(marker); - } + const unsigned end_offset = start_offset + length; + for (const Member<DocumentMarker>& marker : list->GetMarkers()) { + if (marker->EndOffset() > start_offset && + marker->StartOffset() < end_offset) { + auto it = marker_groups_.find(marker); + if (it != marker_groups_.end()) { + it->value->Erase(marker); + marker_groups_.erase(marker); } } - if (list->RemoveMarkers(start_offset, length)) - doc_dirty = true; - - if (list->IsEmpty()) { - ListForType(markers, type) = nullptr; - ++empty_lists_count; - } } - - if (empty_lists_count == DocumentMarker::kMarkerTypeIndexesCount) { - markers_.erase(&text); - if (markers_.empty()) { - possibly_existing_marker_types_ = DocumentMarker::MarkerTypes(); - SetDocument(nullptr); - } + if (list->RemoveMarkers(start_offset, length)) { + InvalidatePaintForNode(text); } - - if (!doc_dirty) - return; - - InvalidatePaintForNode(text); + if (list->IsEmpty()) { + marker_map->erase(&text); + DidRemoveNodeFromMap(marker_type); + } } -DocumentMarkerController::MarkerLists* DocumentMarkerController::FindMarkers( +DocumentMarkerList* DocumentMarkerController::FindMarkers( + const MarkerMap* marker_map, const Text* key) const { - auto it = markers_.find(key); - if (it != markers_.end()) { + auto it = marker_map->find(key); + if (it != marker_map->end()) { DCHECK(it->value); return it->value; } return nullptr; } +DocumentMarkerList* DocumentMarkerController::FindMarkersForType( + DocumentMarker::MarkerType type, + const Text* key) const { + const MarkerMap* marker_map = markers_[MarkerTypeToMarkerIndex(type)]; + if (!marker_map) { + return nullptr; + } + return FindMarkers(marker_map, key); +} + DocumentMarker* DocumentMarkerController::FirstMarkerAroundPosition( const PositionInFlatTree& position, DocumentMarker::MarkerTypes types) { @@ -509,8 +522,9 @@ for (const Node& node : EphemeralRangeInFlatTree(start, end).Nodes()) { auto* text_node = DynamicTo<Text>(node); - if (!text_node) + if (!text_node) { continue; + } const unsigned start_range_offset = node == start_node ? start_offset : 0; const unsigned end_range_offset = @@ -518,8 +532,9 @@ DocumentMarker* const found_marker = FirstMarkerIntersectingOffsetRange( *text_node, start_range_offset, end_range_offset, types); - if (found_marker) + if (found_marker) { return found_marker; + } } return nullptr; @@ -528,8 +543,9 @@ DocumentMarker* DocumentMarkerController::FirstMarkerIntersectingEphemeralRange( const EphemeralRange& range, DocumentMarker::MarkerTypes types) { - if (range.IsNull()) + if (range.IsNull()) { return nullptr; + } if (range.IsCollapsed()) { return FirstMarkerAroundPosition( @@ -541,8 +557,9 @@ const Node* const end_container = range.EndPosition().ComputeContainerNode(); auto* text_node = DynamicTo<Text>(start_container); - if (!text_node) + if (!text_node) { return nullptr; + } const unsigned start_offset = range.StartPosition().ComputeOffsetInContainerNode(); @@ -560,30 +577,30 @@ unsigned start_offset, unsigned end_offset, DocumentMarker::MarkerTypes types) { - if (!PossiblyHasMarkers(types)) + if (!PossiblyHasMarkers(types)) { return nullptr; + } // Minor optimization: if we have an empty range at a node boundary, it // doesn't fall in the interior of any marker. - if (start_offset == 0 && end_offset == 0) + if (start_offset == 0 && end_offset == 0) { return nullptr; + } const unsigned node_length = node.length(); - if (start_offset == node_length && end_offset == node_length) + if (start_offset == node_length && end_offset == node_length) { return nullptr; - - MarkerLists* const markers = FindMarkers(&node); - if (!markers) - return nullptr; + } for (DocumentMarker::MarkerType type : types) { - const DocumentMarkerList* const list = ListForType(markers, type); - if (!list) + const DocumentMarkerList* const list = FindMarkersForType(type, &node); + if (!list) { continue; - + } DocumentMarker* found_marker = list->FirstMarkerIntersectingRange(start_offset, end_offset); - if (found_marker) + if (found_marker) { return found_marker; + } } return nullptr; @@ -603,22 +620,13 @@ FirstMarkerIntersectingEphemeralRange(range, types)); } -DocumentMarkerGroup* -DocumentMarkerController::FirstMarkerGroupIntersectingOffsetRange( - const Text& node, - unsigned start_offset, - unsigned end_offset, - DocumentMarker::MarkerTypes types) { - return GetMarkerGroupForMarker(FirstMarkerIntersectingOffsetRange( - node, start_offset, end_offset, types)); -} - DocumentMarkerGroup* DocumentMarkerController::GetMarkerGroupForMarker( const DocumentMarker* marker) { if (marker) { auto it = marker_groups_.find(marker); - if (it != marker_groups_.end()) + if (it != marker_groups_.end()) { return it->value; + } } return nullptr; } @@ -630,11 +638,13 @@ HeapVector<std::pair<Member<const Text>, Member<DocumentMarker>>> node_marker_pairs; - if (position.IsNull()) + if (position.IsNull()) { return node_marker_pairs; + } - if (!PossiblyHasMarkers(types)) + if (!PossiblyHasMarkers(types)) { return node_marker_pairs; + } const PositionInFlatTree& start = SearchAroundPositionStart(position); const PositionInFlatTree& end = SearchAroundPositionEnd(position); @@ -652,12 +662,9 @@ for (const Node& node : EphemeralRangeInFlatTree(start, end).Nodes()) { auto* text_node = DynamicTo<Text>(node); - if (!text_node) + if (!text_node) { continue; - - MarkerLists* const marker_lists = FindMarkers(text_node); - if (!marker_lists) - continue; + } const unsigned start_range_offset = node == start_node ? start_offset : 0; const unsigned end_range_offset = @@ -672,9 +679,11 @@ continue; for (DocumentMarker::MarkerType type : types) { - const DocumentMarkerList* const list = ListForType(marker_lists, type); - if (!list) + const DocumentMarkerList* const list = + FindMarkersForType(type, text_node); + if (!list) { continue; + } const DocumentMarkerVector& marker_vector = list->MarkersIntersectingRange(start_range_offset, end_range_offset); @@ -708,27 +717,28 @@ auto* text_node = DynamicTo<Text>(node); if (!text_node) continue; - MarkerLists* const markers = FindMarkers(text_node); - if (!markers) + + const unsigned start_offset = + node == range_start_container ? range_start_offset : 0; + const unsigned max_character_offset = To<CharacterData>(node).length(); + const unsigned end_offset = + node == range_end_container ? range_end_offset : max_character_offset; + + // Minor optimization: if we have an empty offset range at the boundary + // of a text node, it doesn't fall into the interior of any marker. + if (start_offset == 0 && end_offset == 0) { continue; + } + if (start_offset == max_character_offset && end_offset == 0) { + continue; + } for (DocumentMarker::MarkerType type : types) { - const DocumentMarkerList* const list = ListForType(markers, type); - if (!list) + const DocumentMarkerList* const list = + FindMarkersForType(type, text_node); + if (!list) { continue; - - const unsigned start_offset = - node == range_start_container ? range_start_offset : 0; - const unsigned max_character_offset = To<CharacterData>(node).length(); - const unsigned end_offset = - node == range_end_container ? range_end_offset : max_character_offset; - - // Minor optimization: if we have an empty offset range at the boundary - // of a text node, it doesn't fall into the interior of any marker. - if (start_offset == 0 && end_offset == 0) - continue; - if (start_offset == max_character_offset && end_offset == 0) - continue; + } const DocumentMarkerVector& markers_from_this_list = list->MarkersIntersectingRange(start_offset, end_offset); @@ -747,14 +757,11 @@ if (!PossiblyHasMarkers(marker_types)) return result; - MarkerLists* markers = FindMarkers(&text); - if (!markers) - return result; - for (DocumentMarker::MarkerType type : marker_types) { - DocumentMarkerList* const list = ListForType(markers, type); - if (!list || list->IsEmpty()) + DocumentMarkerList* const list = FindMarkersForType(type, &text); + if (!list) { continue; + } result.AppendVector(list->GetMarkers()); } @@ -769,12 +776,12 @@ DocumentMarkerVector DocumentMarkerController::Markers() const { DocumentMarkerVector result; - for (const auto& node_markers : markers_) { - MarkerLists* markers = node_markers.value; - for (DocumentMarker::MarkerType type : DocumentMarker::MarkerTypes::All()) { - DocumentMarkerList* const list = ListForType(markers, type); - if (!list) - continue; + for (auto& marker_map : markers_) { + if (!marker_map) { + continue; + } + for (const auto& node_markers : *marker_map) { + DocumentMarkerList* list = node_markers.value; result.AppendVector(list->GetMarkers()); } } @@ -919,13 +926,15 @@ // (marker endpoints don't count as overlapping). // Marker is overlapped by a suggestion marker, do not paint. - if (number_suggestions_currently_inside) + if (number_suggestions_currently_inside) { continue; + } // Verify that no suggestion marker starts before the current marker ends. if (suggestion_starts_index < suggestion_starts.size() && - suggestion_starts[suggestion_starts_index] < marker->EndOffset()) + suggestion_starts[suggestion_starts_index] < marker->EndOffset()) { continue; + } markers_to_paint.push_back(marker); } @@ -953,23 +962,25 @@ Vector<gfx::Rect> result; - if (!PossiblyHasMarkers(DocumentMarker::kTextMatch)) + if (!PossiblyHasMarkers(DocumentMarker::kTextMatch)) { return result; - DCHECK(!(markers_.empty())); + } - // outer loop: process each node - MarkerMap::iterator end = markers_.end(); - for (MarkerMap::iterator node_iterator = markers_.begin(); + MarkerMap* marker_map = + markers_[MarkerTypeToMarkerIndex(DocumentMarker::kTextMatch)]; + DCHECK(marker_map); + MarkerMap::iterator end = marker_map->end(); + for (MarkerMap::iterator node_iterator = marker_map->begin(); node_iterator != end; ++node_iterator) { // inner loop; process each marker in this node const Node& node = *node_iterator->key; - if (!node.isConnected()) + if (!node.isConnected()) { continue; - MarkerLists* markers = node_iterator->value.Get(); - DocumentMarkerList* const list = - ListForType(markers, DocumentMarker::kTextMatch); - if (!list) + } + DocumentMarkerList* const list = node_iterator->value.Get(); + if (!list) { continue; + } result.AppendVector(To<TextMatchMarkerListImpl>(list)->LayoutRects(node)); } @@ -983,12 +994,15 @@ void DocumentMarkerController::InvalidateRectsForTextMatchMarkersInNode( const Text& node) { - MarkerLists* markers = markers_.at(&node); + if (!PossiblyHasMarkers(DocumentMarker::kTextMatch)) { + return; + } const DocumentMarkerList* const marker_list = - ListForType(markers, DocumentMarker::kTextMatch); - if (!marker_list || marker_list->IsEmpty()) + FindMarkersForType(DocumentMarker::kTextMatch, &node); + if (!marker_list) { return; + } const HeapVector<Member<DocumentMarker>>& markers_in_list = marker_list->GetMarkers(); @@ -999,23 +1013,21 @@ } void DocumentMarkerController::InvalidateRectsForAllTextMatchMarkers() { - for (auto& node_markers : markers_) { + if (!PossiblyHasMarkers(DocumentMarker::kTextMatch)) { + return; + } + + const MarkerMap* marker_map = + markers_[MarkerTypeToMarkerIndex(DocumentMarker::kTextMatch)]; + DCHECK(marker_map); + + for (auto& node_markers : *marker_map) { const Text& node = *node_markers.key; InvalidateRectsForTextMatchMarkersInNode(node); } } -void DocumentMarkerController::DidProcessMarkerMap(const LivenessBroker&) { - if (markers_.empty()) - Clear(); -} - void DocumentMarkerController::Trace(Visitor* visitor) const { - // Note: To make |DidProcessMarkerMap()| called after weak members callback - // of |markers_|, we should register it before tracing |markers_|. - visitor->template RegisterWeakCallbackMethod< - DocumentMarkerController, &DocumentMarkerController::DidProcessMarkerMap>( - this); visitor->Trace(markers_); visitor->Trace(marker_groups_); visitor->Trace(document_); @@ -1025,30 +1037,49 @@ void DocumentMarkerController::RemoveMarkersForNode( const Text& text, DocumentMarker::MarkerTypes marker_types) { - if (!PossiblyHasMarkers(marker_types)) + if (!PossiblyHasMarkers(marker_types)) { return; - DCHECK(!markers_.empty()); + } - MarkerMap::iterator iterator = markers_.find(&text); - if (iterator != markers_.end()) - RemoveMarkersFromList(iterator, marker_types); + for (auto type : marker_types) { + MarkerMap* marker_map = markers_[MarkerTypeToMarkerIndex(type)]; + if (!marker_map) { + continue; + } + MarkerMap::iterator iterator = marker_map->find(&text); + if (iterator != marker_map->end()) { + RemoveMarkersFromList(iterator, type); + } + } } void DocumentMarkerController::RemoveSpellingMarkersUnderWords( const Vector<String>& words) { - for (auto& node_markers : markers_) { - const Text& text = *node_markers.key; - MarkerLists* markers = node_markers.value; - for (DocumentMarker::MarkerType type : - DocumentMarker::MarkerTypes::Misspelling()) { - DocumentMarkerList* const list = ListForType(markers, type); - if (!list) - continue; + for (DocumentMarker::MarkerType type : + DocumentMarker::MarkerTypes::Misspelling()) { + MarkerMap* marker_map = markers_[MarkerTypeToMarkerIndex(type)]; + if (!marker_map) { + continue; + } + HeapHashSet<WeakMember<Text>> nodes_to_remove; + for (auto& node_markers : *marker_map) { + const Text& text = *node_markers.key; + DocumentMarkerList* const list = node_markers.value; if (To<SpellCheckMarkerListImpl>(list)->RemoveMarkersUnderWords( text.data(), words)) { InvalidatePaintForNode(text); + if (list->IsEmpty()) { + nodes_to_remove.insert(node_markers.key); + } } } + if (nodes_to_remove.size()) { + for (auto node : nodes_to_remove) { + marker_map->erase(node); + } + nodes_to_remove.clear(); + DidRemoveNodeFromMap(type); + } } } @@ -1059,18 +1090,23 @@ const HeapVector<std::pair<Member<const Text>, Member<DocumentMarker>>>& node_marker_pairs = MarkersIntersectingRange( range, DocumentMarker::MarkerTypes::Suggestion()); + MarkerMap* marker_map = + markers_[MarkerTypeToMarkerIndex(DocumentMarker::kSuggestion)]; for (const auto& node_marker_pair : node_marker_pairs) { auto* suggestion_marker = To<SuggestionMarker>(node_marker_pair.second.Get()); if (suggestion_marker->NeedsRemovalOnFinishComposing()) { const Text& text = *node_marker_pair.first; - DocumentMarkerList* const list = - ListForType(markers_.at(&text), DocumentMarker::kSuggestion); + DocumentMarkerList* const list = FindMarkers(marker_map, &text); // RemoveMarkerByTag() might be expensive. In practice, we have at most // one suggestion marker needs to be removed. To<SuggestionMarkerListImpl>(list)->RemoveMarkerByTag( suggestion_marker->Tag()); InvalidatePaintForNode(text); + if (list->IsEmpty()) { + marker_map->erase(&text); + DidRemoveNodeFromMap(DocumentMarker::kSuggestion); + } } } } @@ -1083,31 +1119,38 @@ const HeapVector<std::pair<Member<const Text>, Member<DocumentMarker>>>& node_marker_pairs = MarkersIntersectingRange( range, DocumentMarker::MarkerTypes::Suggestion()); + MarkerMap* marker_map = + markers_[MarkerTypeToMarkerIndex(DocumentMarker::kSuggestion)]; for (const auto& node_marker_pair : node_marker_pairs) { const Text& text = *node_marker_pair.first; - DocumentMarkerList* const list = - ListForType(markers_.at(&text), DocumentMarker::kSuggestion); + DocumentMarkerList* const list = FindMarkers(marker_map, &text); // RemoveMarkerByType() might be expensive. In practice, we have at most // one suggestion marker needs to be removed. To<SuggestionMarkerListImpl>(list)->RemoveMarkerByType(type); InvalidatePaintForNode(text); + if (list->IsEmpty()) { + marker_map->erase(node_marker_pair.first); + DidRemoveNodeFromMap(DocumentMarker::kSuggestion); + } } } void DocumentMarkerController::RemoveSuggestionMarkerByType( const SuggestionMarker::SuggestionType& type) { - if (!PossiblyHasMarkers(DocumentMarker::kSuggestion)) + if (!PossiblyHasMarkers(DocumentMarker::kSuggestion)) { return; - DCHECK(!markers_.empty()); - - for (const auto& node_markers : markers_) { - MarkerLists* markers = node_markers.value; - DocumentMarkerList* const list = - ListForType(markers, DocumentMarker::kSuggestion); - if (!list) - continue; + } + MarkerMap* marker_map = + markers_[MarkerTypeToMarkerIndex(DocumentMarker::kSuggestion)]; + DCHECK(marker_map); + for (const auto& node_markers : *marker_map) { + DocumentMarkerList* const list = node_markers.value; if (To<SuggestionMarkerListImpl>(list)->RemoveMarkerByType(type)) { InvalidatePaintForNode(*node_markers.key); + if (list->IsEmpty()) { + marker_map->erase(node_markers.key); + DidRemoveNodeFromMap(DocumentMarker::kSuggestion); + } return; } } @@ -1115,97 +1158,75 @@ void DocumentMarkerController::RemoveSuggestionMarkerByTag(const Text& text, int32_t marker_tag) { - MarkerLists* markers = markers_.at(&text); - auto* const list = To<SuggestionMarkerListImpl>( - ListForType(markers, DocumentMarker::kSuggestion).Get()); - if (!list->RemoveMarkerByTag(marker_tag)) + if (!PossiblyHasMarkers(DocumentMarker::kSuggestion)) { return; + } + MarkerMap* marker_map = + markers_[MarkerTypeToMarkerIndex(DocumentMarker::kSuggestion)]; + DCHECK(marker_map); + + DocumentMarkerList* markers = marker_map->at(&text); + auto* const list = To<SuggestionMarkerListImpl>(markers); + if (!list->RemoveMarkerByTag(marker_tag)) { + return; + } + if (list->IsEmpty()) { + marker_map->erase(&text); + DidRemoveNodeFromMap(DocumentMarker::kSuggestion); + } InvalidatePaintForNode(text); } void DocumentMarkerController::RemoveMarkersOfTypes( DocumentMarker::MarkerTypes marker_types) { - if (!PossiblyHasMarkers(marker_types)) + if (!PossiblyHasMarkers(marker_types)) { return; - DCHECK(!markers_.empty()); - - HeapVector<Member<const Text>> nodes_with_markers; - CopyKeysToVector(markers_, nodes_with_markers); - unsigned size = nodes_with_markers.size(); - for (unsigned i = 0; i < size; ++i) { - MarkerMap::iterator iterator = markers_.find(nodes_with_markers[i]); - if (iterator != markers_.end()) - RemoveMarkersFromList(iterator, marker_types); } - if (PossiblyHasMarkers(DocumentMarker::MarkerTypes::AllBut(marker_types))) - return; - SetDocument(nullptr); + HeapVector<Member<const Text>> nodes_with_markers; + for (DocumentMarker::MarkerType type : marker_types) { + MarkerMap* marker_map = markers_[MarkerTypeToMarkerIndex(type)]; + if (!marker_map) { + continue; + } + CopyKeysToVector(*marker_map, nodes_with_markers); + for (const auto& node : nodes_with_markers) { + MarkerMap::iterator iterator = marker_map->find(node); + if (iterator != marker_map->end()) { + RemoveMarkersFromList(iterator, type); + } + } + } } void DocumentMarkerController::RemoveMarkersFromList( MarkerMap::iterator iterator, - DocumentMarker::MarkerTypes marker_types) { - bool needs_repainting = false; - bool node_can_be_removed; + DocumentMarker::MarkerType marker_type) { + DocumentMarkerList* const list = iterator->value.Get(); + list->Clear(); - size_t empty_lists_count = 0; - if (marker_types == DocumentMarker::MarkerTypes::All()) { - needs_repainting = true; - node_can_be_removed = true; - } else { - MarkerLists* markers = iterator->value.Get(); + const Text& node = *iterator->key; + InvalidatePaintForNode(node); + InvalidatePaintForTickmarks(node); - for (DocumentMarker::MarkerType type : DocumentMarker::MarkerTypes::All()) { - DocumentMarkerList* const list = ListForType(markers, type); - if (!list || list->IsEmpty()) { - if (list && list->IsEmpty()) - ListForType(markers, type) = nullptr; - ++empty_lists_count; - continue; - } - if (marker_types.Contains(type)) { - list->Clear(); - ListForType(markers, type) = nullptr; - ++empty_lists_count; - needs_repainting = true; - } - } - - node_can_be_removed = - empty_lists_count == DocumentMarker::kMarkerTypeIndexesCount; - } - - if (needs_repainting) { - const Text& node = *iterator->key; - InvalidatePaintForNode(node); - InvalidatePaintForTickmarks(node); - } - - if (node_can_be_removed) { - markers_.erase(iterator); - if (markers_.empty()) { - possibly_existing_marker_types_ = DocumentMarker::MarkerTypes(); - SetDocument(nullptr); - } - } + MarkerMap* marker_map = markers_[MarkerTypeToMarkerIndex(marker_type)]; + marker_map->erase(iterator); + DidRemoveNodeFromMap(marker_type); } void DocumentMarkerController::RepaintMarkers( DocumentMarker::MarkerTypes marker_types) { - if (!PossiblyHasMarkers(marker_types)) + if (!PossiblyHasMarkers(marker_types)) { return; + } DCHECK(!markers_.empty()); - // outer loop: process each markered Text in the document - for (auto& iterator : markers_) { - // inner loop: process each marker in the current Text - MarkerLists* markers = iterator.value.Get(); - for (DocumentMarker::MarkerType type : DocumentMarker::MarkerTypes::All()) { - DocumentMarkerList* const list = ListForType(markers, type); - if (!list || list->IsEmpty() || !marker_types.Contains(type)) - continue; - + for (auto type : marker_types) { + const MarkerMap* marker_map = markers_[MarkerTypeToMarkerIndex(type)]; + if (!marker_map) { + continue; + } + for (auto& iterator : *marker_map) { InvalidatePaintForNode(*iterator.key); } } @@ -1214,8 +1235,9 @@ bool DocumentMarkerController::SetTextMatchMarkersActive( const EphemeralRange& range, bool active) { - if (!PossiblyHasMarkers(DocumentMarker::kTextMatch)) + if (!PossiblyHasMarkers(DocumentMarker::kTextMatch)) { return false; + } DCHECK(!markers_.empty()); @@ -1233,8 +1255,9 @@ bool marker_found = false; for (Node& node : range.Nodes()) { auto* text_node = DynamicTo<Text>(node); - if (!text_node) + if (!text_node) { continue; + } int start_offset = node == start_container ? container_start_offset : 0; int end_offset = node == end_container ? container_end_offset : INT_MAX; marker_found |= @@ -1247,20 +1270,18 @@ unsigned start_offset, unsigned end_offset, bool active) { - MarkerLists* markers = FindMarkers(&text); - if (!markers) - return false; - DocumentMarkerList* const list = - ListForType(markers, DocumentMarker::kTextMatch); - if (!list) + FindMarkersForType(DocumentMarker::kTextMatch, &text); + if (!list) { return false; + } bool doc_dirty = To<TextMatchMarkerListImpl>(list)->SetTextMatchMarkersActive( start_offset, end_offset, active); - if (!doc_dirty) + if (!doc_dirty) { return false; + } InvalidatePaintForNode(text); return true; } @@ -1268,21 +1289,22 @@ #if DCHECK_IS_ON() void DocumentMarkerController::ShowMarkers() const { StringBuilder builder; - for (auto& node_iterator : markers_) { - const Text* node = node_iterator.key; - builder.AppendFormat("%p", node); - MarkerLists* markers = markers_.at(node); - for (DocumentMarker::MarkerType type : DocumentMarker::MarkerTypes::All()) { - DocumentMarkerList* const list = ListForType(markers, type); - if (!list) - continue; - + for (DocumentMarker::MarkerType type : DocumentMarker::MarkerTypes::All()) { + const MarkerMap* marker_map = markers_[MarkerTypeToMarkerIndex(type)]; + if (!marker_map) { + continue; + } + for (auto& node_iterator : *marker_map) { + const Text* node = node_iterator.key; + builder.AppendFormat("%p", node); + DocumentMarkerList* const list = node_iterator.value; const HeapVector<Member<DocumentMarker>>& markers_in_list = list->GetMarkers(); for (const DocumentMarker* marker : markers_in_list) { bool is_active_match = false; - if (auto* text_match = DynamicTo<TextMatchMarker>(marker)) + if (auto* text_match = DynamicTo<TextMatchMarker>(marker)) { is_active_match = text_match->IsActiveMatch(); + } builder.AppendFormat( " %u:[%u:%u](%d)", static_cast<uint32_t>(marker->GetType()), @@ -1291,8 +1313,7 @@ } builder.Append("\n"); } - LOG(INFO) << markers_.size() << " nodes have markers:\n" - << builder.ToString().Utf8(); + LOG(INFO) << builder.ToString().Utf8(); } #endif @@ -1303,21 +1324,29 @@ unsigned new_length) { if (!PossiblyHasMarkers(DocumentMarker::MarkerTypes::All())) return; - DCHECK(!markers_.empty()); + auto* text_node = DynamicTo<Text>(node); if (!text_node) return; - MarkerLists* markers = FindMarkers(text_node); - if (!markers) - return; bool did_shift_marker = false; - for (DocumentMarkerList* const list : *markers) { - if (!list) + for (auto& marker_map : markers_) { + if (!marker_map) { continue; - - if (list->ShiftMarkers(node->data(), offset, old_length, new_length)) + } + DocumentMarkerList* const list = FindMarkers(marker_map, text_node); + if (!list) { + continue; + } + DCHECK(!list->IsEmpty()); + DocumentMarker::MarkerType type = list->GetMarkers()[0]->GetType(); + if (list->ShiftMarkers(node->data(), offset, old_length, new_length)) { did_shift_marker = true; + } + if (list->IsEmpty()) { + marker_map->erase(text_node); + DidRemoveNodeFromMap(type); + } } if (!did_shift_marker)
diff --git a/third_party/blink/renderer/core/editing/markers/document_marker_controller.h b/third_party/blink/renderer/core/editing/markers/document_marker_controller.h index 6dc5a12..881b490eb 100644 --- a/third_party/blink/renderer/core/editing/markers/document_marker_controller.h +++ b/third_party/blink/renderer/core/editing/markers/document_marker_controller.h
@@ -61,7 +61,6 @@ DocumentMarkerController(const DocumentMarkerController&) = delete; DocumentMarkerController& operator=(const DocumentMarkerController&) = delete; - void Clear(); void AddSpellingMarker(const EphemeralRange&, const String& description = g_empty_string); void AddGrammarMarker(const EphemeralRange&, @@ -154,11 +153,6 @@ DocumentMarkerGroup* FirstMarkerGroupIntersectingEphemeralRange( const EphemeralRange&, DocumentMarker::MarkerTypes); - DocumentMarkerGroup* FirstMarkerGroupIntersectingOffsetRange( - const Text&, - unsigned start_offset, - unsigned end_offset, - DocumentMarker::MarkerTypes); // If the given position is either at the boundary or inside a word, expands // the position to the surrounding word and then looks for all markers having // the specified type. If the position is neither at the boundary or inside a @@ -211,27 +205,33 @@ void AddMarkerToNode(const Text&, DocumentMarker*); DocumentMarkerGroup* GetMarkerGroupForMarker(const DocumentMarker* marker); - using MarkerLists = HeapVector<Member<DocumentMarkerList>, - DocumentMarker::kMarkerTypeIndexesCount>; - using MarkerMap = HeapHashMap<WeakMember<const Text>, Member<MarkerLists>>; - static Member<DocumentMarkerList>& ListForType(MarkerLists*, - DocumentMarker::MarkerType); + // We have a hash map per marker type, mapping from nodes to a list of markers + // for that node. + using MarkerList = Member<DocumentMarkerList>; + using MarkerMap = HeapHashMap<WeakMember<const Text>, MarkerList>; + using MarkerMaps = HeapVector<Member<MarkerMap>>; + bool PossiblyHasMarkers(DocumentMarker::MarkerTypes) const; bool PossiblyHasMarkers(DocumentMarker::MarkerType) const; - void RemoveMarkersFromList(MarkerMap::iterator, DocumentMarker::MarkerTypes); + void RemoveMarkersFromList(MarkerMap::iterator, DocumentMarker::MarkerType); void RemoveMarkers(TextIterator&, DocumentMarker::MarkerTypes); void RemoveMarkersInternal(const Text&, unsigned start_offset, int length, - DocumentMarker::MarkerTypes); - // Searches `markers_` for `key`. Returns the mapped value if it is present, - // otherwise nullptr. Crashes if the value is present and it is nullptr. - MarkerLists* FindMarkers(const Text* key) const; + DocumentMarker::MarkerType); + // Searches marker_map for key. Returns the mapped value if it is present, + // otherwise nullptr. + DocumentMarkerList* FindMarkers(const MarkerMap* marker_map, + const Text* key) const; + // Find the marker list of the given type for the given text node, + // or nullptr if the node has no markers of that type. + DocumentMarkerList* FindMarkersForType(DocumentMarker::MarkerType, + const Text* key) const; - // Called after weak processing of |markers_| is done. - void DidProcessMarkerMap(const LivenessBroker&); + // Called when a node is removed from a marker map. + void DidRemoveNodeFromMap(DocumentMarker::MarkerType); - MarkerMap markers_; + MarkerMaps markers_; using MarkerGroup = HeapHashMap<WeakMember<const DocumentMarker>, Member<DocumentMarkerGroup>>;
diff --git a/third_party/blink/renderer/core/events/event_util.cc b/third_party/blink/renderer/core/events/event_util.cc index 22dbcac..55cd1bb 100644 --- a/third_party/blink/renderer/core/events/event_util.cc +++ b/third_party/blink/renderer/core/events/event_util.cc
@@ -6,7 +6,9 @@ #include "base/containers/contains.h" #include "third_party/blink/renderer/core/event_type_names.h" +#include "third_party/blink/renderer/core/frame/web_feature.h" #include "third_party/blink/renderer/platform/wtf/std_lib_extras.h" +#include "third_party/blink/renderer/platform/wtf/text/atomic_string.h" namespace blink { @@ -37,13 +39,35 @@ event_type == event_type_names::kPointerup; } -bool IsDOMMutationEventType(const AtomicString& event_type) { - return event_type == event_type_names::kDOMCharacterDataModified || - event_type == event_type_names::kDOMNodeInserted || - event_type == event_type_names::kDOMNodeInsertedIntoDocument || - event_type == event_type_names::kDOMNodeRemoved || - event_type == event_type_names::kDOMNodeRemovedFromDocument || - event_type == event_type_names::kDOMSubtreeModified; +bool IsDOMMutationEventType(const AtomicString& event_type, + WebFeature& web_feature, + Document::ListenerType& listener_type) { + if (event_type == event_type_names::kDOMSubtreeModified) { + web_feature = WebFeature::kDOMSubtreeModifiedEvent; + listener_type = Document::kDOMSubtreeModifiedListener; + return true; + } else if (event_type == event_type_names::kDOMNodeInserted) { + web_feature = WebFeature::kDOMNodeInsertedEvent; + listener_type = Document::kDOMNodeInsertedListener; + return true; + } else if (event_type == event_type_names::kDOMNodeRemoved) { + web_feature = WebFeature::kDOMNodeRemovedEvent; + listener_type = Document::kDOMNodeRemovedListener; + return true; + } else if (event_type == event_type_names::kDOMNodeRemovedFromDocument) { + web_feature = WebFeature::kDOMNodeRemovedFromDocumentEvent; + listener_type = Document::kDOMNodeRemovedFromDocumentListener; + return true; + } else if (event_type == event_type_names::kDOMNodeInsertedIntoDocument) { + web_feature = WebFeature::kDOMNodeInsertedIntoDocumentEvent; + listener_type = Document::kDOMNodeInsertedIntoDocumentListener; + return true; + } else if (event_type == event_type_names::kDOMCharacterDataModified) { + web_feature = WebFeature::kDOMCharacterDataModifiedEvent; + listener_type = Document::kDOMCharacterDataModifiedListener; + return true; + } + return false; } } // namespace event_util
diff --git a/third_party/blink/renderer/core/events/event_util.h b/third_party/blink/renderer/core/events/event_util.h index f4c1ea8..1fbe637 100644 --- a/third_party/blink/renderer/core/events/event_util.h +++ b/third_party/blink/renderer/core/events/event_util.h
@@ -6,7 +6,9 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_EVENTS_EVENT_UTIL_H_ #include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/event_type_names.h" +#include "third_party/blink/renderer/core/frame/web_feature.h" #include "third_party/blink/renderer/platform/wtf/forward.h" namespace blink { @@ -19,7 +21,12 @@ CORE_EXPORT bool IsPointerEventType(const AtomicString& event_type); -CORE_EXPORT bool IsDOMMutationEventType(const AtomicString& event_type); +// |web_feature| and |listener_type| are outputs, corresponding to the +// provided |event_type|. They will not be changed if the provided |event_type| +// is not a DOM Mutation Event. +bool IsDOMMutationEventType(const AtomicString& event_type, + WebFeature& web_feature, + Document::ListenerType& listener_type); } // namespace event_util
diff --git a/third_party/blink/renderer/core/fetch/request.cc b/third_party/blink/renderer/core/fetch/request.cc index 9ac3786e..6d1b997c9 100644 --- a/third_party/blink/renderer/core/fetch/request.cc +++ b/third_party/blink/renderer/core/fetch/request.cc
@@ -207,11 +207,11 @@ std::move(form_data)), nullptr /* AbortSignal */, /*cached_metadata_handler=*/nullptr); content_type = "application/x-www-form-urlencoded;charset=UTF-8"; - } else if (RuntimeEnabledFeatures::FetchUploadStreamingEnabled( - execution_context) && - V8ReadableStream::HasInstance(isolate, body)) { - ReadableStream* readable_stream = - V8ReadableStream::ToWrappableUnsafe(body.As<v8::Object>()); + } else if (ReadableStream* readable_stream = + V8ReadableStream::ToWrappable(isolate, body); + readable_stream && + RuntimeEnabledFeatures::FetchUploadStreamingEnabled( + execution_context)) { // This is implemented in Request::CreateRequestWithRequestOrString(): // "If the |keepalive| flag is set, then throw a TypeError."
diff --git a/third_party/blink/renderer/core/frame/deprecation/deprecation.json5 b/third_party/blink/renderer/core/frame/deprecation/deprecation.json5 index 1d2898f1..474b2a7 100644 --- a/third_party/blink/renderer/core/frame/deprecation/deprecation.json5 +++ b/third_party/blink/renderer/core/frame/deprecation/deprecation.json5
@@ -162,6 +162,21 @@ milestone: 109, }, { + name: "DOMMutationEvents", + message: "DOM Mutation Events, including `DOMSubtreeModified`, `DOMNodeInserted`, `DOMNodeRemoved`, `DOMNodeRemovedFromDocument`, `DOMNodeInsertedIntoDocument`, and `DOMCharacterDataModified` are deprecated (https://w3c.github.io/uievents/#legacy-event-types) and will be removed. Please use `MutationObserver` instead.", + translation_note: "Warning displayed to developers when non-standard Mutation Events are used. These are deprecated and will be removed.", + web_features: [ + "kDOMCharacterDataModifiedEvent", + "kDOMNodeInsertedEvent", + "kDOMNodeInsertedIntoDocumentEvent", + "kDOMNodeRemovedEvent", + "kDOMNodeRemovedFromDocumentEvent", + "kDOMSubtreeModifiedEvent", + ], + chrome_status_feature: 5083947249172480, + milestone: 127, + }, + { name: "EventPath", message: "`Event.path` is deprecated and will be removed. Please use `Event.composedPath()` instead.", translation_note: "Warning displayed to developers when the non-standard `Event.path` API is used to notify them that this API is deprecated.",
diff --git a/third_party/blink/renderer/core/html/html_details_element.idl b/third_party/blink/renderer/core/html/html_details_element.idl index 20036a9..b1bb982 100644 --- a/third_party/blink/renderer/core/html/html_details_element.idl +++ b/third_party/blink/renderer/core/html/html_details_element.idl
@@ -23,4 +23,5 @@ HTMLConstructor ] interface HTMLDetailsElement : HTMLElement { [CEReactions, Reflect] attribute boolean open; + [CEReactions, Reflect, RuntimeEnabled=AccordionPattern] attribute DOMString name; };
diff --git a/third_party/blink/renderer/core/loader/cookie_jar.cc b/third_party/blink/renderer/core/loader/cookie_jar.cc index edb35e3b..1394416 100644 --- a/third_party/blink/renderer/core/loader/cookie_jar.cc +++ b/third_party/blink/renderer/core/loader/cookie_jar.cc
@@ -154,6 +154,10 @@ document_->GetTaskRunner(TaskType::kInternalDefault)); } +void CookieJar::InvalidateCache() { + last_cookies_hash_.reset(); +} + bool CookieJar::RequestRestrictedCookieManagerIfNeeded() { if (!backend_.is_bound() || !backend_.is_connected()) { backend_.reset();
diff --git a/third_party/blink/renderer/core/loader/cookie_jar.h b/third_party/blink/renderer/core/loader/cookie_jar.h index e4a0aed..cd06a56 100644 --- a/third_party/blink/renderer/core/loader/cookie_jar.h +++ b/third_party/blink/renderer/core/loader/cookie_jar.h
@@ -29,6 +29,15 @@ mojo::PendingRemote<network::mojom::blink::RestrictedCookieManager> cookie_manager); + // Invalidate cached string. To be called explicitly from Document. This is + // used in cases where a Document action could change the ability for + // CookieJar to return values to JS without changing the value of the cookies + // themselves. For example changing storage access can stop the JS from being + // able to access the document's Cookie without the value ever changing. In + // that case it's faulty to treat a subsequent request as a cache hit so we + // invalidate. + void InvalidateCache(); + private: bool RequestRestrictedCookieManagerIfNeeded();
diff --git a/third_party/blink/renderer/core/loader/document_load_timing.cc b/third_party/blink/renderer/core/loader/document_load_timing.cc index 5cf974b9..dbbaa5b9 100644 --- a/third_party/blink/renderer/core/loader/document_load_timing.cc +++ b/third_party/blink/renderer/core/loader/document_load_timing.cc
@@ -291,4 +291,10 @@ NotifyDocumentTimingChanged(); } +void DocumentLoadTiming::SetCriticalCHRestart( + base::TimeTicks critical_ch_restart) { + critical_ch_restart_ = critical_ch_restart; + NotifyDocumentTimingChanged(); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/loader/document_load_timing.h b/third_party/blink/renderer/core/loader/document_load_timing.h index e91b8005..f67ab7b 100644 --- a/third_party/blink/renderer/core/loader/document_load_timing.h +++ b/third_party/blink/renderer/core/loader/document_load_timing.h
@@ -96,6 +96,8 @@ system_entropy_at_navigation_start_ = value; } + void SetCriticalCHRestart(base::TimeTicks critical_ch_restart); + base::TimeTicks InputStart() const { return input_start_; } absl::optional<base::TimeDelta> UserTimingMarkFullyLoaded() const { return user_timing_mark_fully_loaded_; @@ -126,6 +128,7 @@ bool CanRequestFromPreviousDocument() const { return can_request_from_previous_document_; } + base::TimeTicks CriticalCHRestart() const { return critical_ch_restart_; } base::TimeTicks ReferenceMonotonicTime() const { return reference_monotonic_time_; @@ -166,6 +169,7 @@ base::TimeTicks load_event_start_; base::TimeTicks load_event_end_; base::TimeTicks activation_start_; + base::TimeTicks critical_ch_restart_; const base::Clock* clock_; const base::TickClock* tick_clock_;
diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc index 8668f53..3a8bc17 100644 --- a/third_party/blink/renderer/core/loader/document_loader.cc +++ b/third_party/blink/renderer/core/loader/document_loader.cc
@@ -561,6 +561,9 @@ document_load_timing_.SetSystemEntropyAtNavigationStart( params_->navigation_timings.system_entropy_at_navigation_start); + document_load_timing_.SetCriticalCHRestart( + params_->navigation_timings.critical_ch_restart); + if (was_blocked_by_document_policy_) ReplaceWithEmptyDocument();
diff --git a/third_party/blink/renderer/core/paint/nine_piece_image_painter.cc b/third_party/blink/renderer/core/paint/nine_piece_image_painter.cc index 4815d676..09c3850 100644 --- a/third_party/blink/renderer/core/paint/nine_piece_image_painter.cc +++ b/third_party/blink/renderer/core/paint/nine_piece_image_painter.cc
@@ -158,12 +158,6 @@ if (!h_tile || !v_tile) continue; - // TODO(cavalcantii): see crbug.com/662507. - absl::optional<ScopedInterpolationQuality> interpolation_quality_override; - if (draw_info.tile_rule.horizontal == kRoundImageRule || - draw_info.tile_rule.vertical == kRoundImageRule) - interpolation_quality_override.emplace(context, kInterpolationMedium); - ImageTilingInfo tiling_info; tiling_info.image_rect = draw_info.source; tiling_info.scale = gfx::ScaleVector2d(
diff --git a/third_party/blink/renderer/core/streams/readable_stream_default_controller_with_script_scope.cc b/third_party/blink/renderer/core/streams/readable_stream_default_controller_with_script_scope.cc index b91d1ee..b51b953 100644 --- a/third_party/blink/renderer/core/streams/readable_stream_default_controller_with_script_scope.cc +++ b/third_party/blink/renderer/core/streams/readable_stream_default_controller_with_script_scope.cc
@@ -15,16 +15,10 @@ namespace blink { ReadableStreamDefaultControllerWithScriptScope:: - ReadableStreamDefaultControllerWithScriptScope(ScriptState* script_state, - ScriptValue controller) - : script_state_(script_state) { - v8::Local<v8::Object> controller_object = - controller.V8Value().As<v8::Object>(); - controller_ = - V8ReadableStreamDefaultController::ToWrappableUnsafe(controller_object); - - DCHECK(controller_); -} + ReadableStreamDefaultControllerWithScriptScope( + ScriptState* script_state, + ReadableStreamDefaultController* controller) + : script_state_(script_state), controller_(controller) {} void ReadableStreamDefaultControllerWithScriptScope::Deactivate() { controller_ = nullptr;
diff --git a/third_party/blink/renderer/core/streams/readable_stream_default_controller_with_script_scope.h b/third_party/blink/renderer/core/streams/readable_stream_default_controller_with_script_scope.h index 39e4114..4c3a3a1 100644 --- a/third_party/blink/renderer/core/streams/readable_stream_default_controller_with_script_scope.h +++ b/third_party/blink/renderer/core/streams/readable_stream_default_controller_with_script_scope.h
@@ -19,8 +19,9 @@ class CORE_EXPORT ReadableStreamDefaultControllerWithScriptScope : public GarbageCollected<ReadableStreamDefaultControllerWithScriptScope> { public: - ReadableStreamDefaultControllerWithScriptScope(ScriptState* script_state, - ScriptValue controller); + ReadableStreamDefaultControllerWithScriptScope( + ScriptState* script_state, + ReadableStreamDefaultController* controller); // After calling this the other methods will no longer do anything. void Deactivate();
diff --git a/third_party/blink/renderer/core/streams/transferable_streams.cc b/third_party/blink/renderer/core/streams/transferable_streams.cc index 846fba62..b5d1b01e 100644 --- a/third_party/blink/renderer/core/streams/transferable_streams.cc +++ b/third_party/blink/renderer/core/streams/transferable_streams.cc
@@ -823,9 +823,7 @@ CHECK(controller); resolver_->Resolve( script_state, - ToV8(source_->source2_ - ->startWrapper(script_state, - ScriptValue::From(script_state, controller)) + ToV8(source_->source2_->startWrapper(script_state, controller) .Then(CreateFunction<PullSource2>(script_state, source_)), script_state->GetContext()->Global(), script_state->GetIsolate()));
diff --git a/third_party/blink/renderer/core/streams/underlying_source_base.cc b/third_party/blink/renderer/core/streams/underlying_source_base.cc index 18875653..fb5d0f55 100644 --- a/third_party/blink/renderer/core/streams/underlying_source_base.cc +++ b/third_party/blink/renderer/core/streams/underlying_source_base.cc
@@ -12,15 +12,16 @@ namespace blink { -ScriptPromise UnderlyingSourceBase::startWrapper(ScriptState* script_state, - ScriptValue js_controller) { +ScriptPromise UnderlyingSourceBase::startWrapper( + ScriptState* script_state, + ReadableStreamDefaultController* controller) { // Cannot call start twice (e.g., cannot use the same UnderlyingSourceBase to // construct multiple streams). DCHECK(!controller_); controller_ = MakeGarbageCollected<ReadableStreamDefaultControllerWithScriptScope>( - script_state, js_controller); + script_state, controller); return Start(script_state); }
diff --git a/third_party/blink/renderer/core/streams/underlying_source_base.h b/third_party/blink/renderer/core/streams/underlying_source_base.h index 27d5f352..8e44407 100644 --- a/third_party/blink/renderer/core/streams/underlying_source_base.h +++ b/third_party/blink/renderer/core/streams/underlying_source_base.h
@@ -16,6 +16,7 @@ namespace blink { +class ReadableStreamDefaultController; class ReadableStreamDefaultControllerWithScriptScope; class ScriptState; @@ -28,7 +29,7 @@ void Trace(Visitor*) const override; ~UnderlyingSourceBase() override = default; - ScriptPromise startWrapper(ScriptState*, ScriptValue controller); + ScriptPromise startWrapper(ScriptState*, ReadableStreamDefaultController*); virtual ScriptPromise Start(ScriptState*); virtual ScriptPromise pull(ScriptState*);
diff --git a/third_party/blink/renderer/core/streams/underlying_source_base.idl b/third_party/blink/renderer/core/streams/underlying_source_base.idl index ef9d9bf..337733c 100644 --- a/third_party/blink/renderer/core/streams/underlying_source_base.idl +++ b/third_party/blink/renderer/core/streams/underlying_source_base.idl
@@ -11,7 +11,7 @@ LegacyNoInterfaceObject ] interface UnderlyingSourceBase { - [CallWith=ScriptState, ImplementedAs=startWrapper] Promise<void> start(any stream); + [CallWith=ScriptState, ImplementedAs=startWrapper] Promise<void> start(ReadableStreamDefaultController stream); [CallWith=ScriptState] Promise<void> pull(); [CallWith=ScriptState, ImplementedAs=cancelWrapper] Promise<void> cancel(optional any reason);
diff --git a/third_party/blink/renderer/core/style/computed_style.cc b/third_party/blink/renderer/core/style/computed_style.cc index 17b6fbfd..fe68ff44 100644 --- a/third_party/blink/renderer/core/style/computed_style.cc +++ b/third_party/blink/renderer/core/style/computed_style.cc
@@ -294,6 +294,10 @@ new_style.ViewTimelineAttachment())) { return true; } + if (!base::ValuesEquivalent(old_style.TimelineScope(), + new_style.TimelineScope())) { + return true; + } return false; }
diff --git a/third_party/blink/renderer/core/style/computed_style_constants.h b/third_party/blink/renderer/core/style/computed_style_constants.h index 8765511..1d84812 100644 --- a/third_party/blink/renderer/core/style/computed_style_constants.h +++ b/third_party/blink/renderer/core/style/computed_style_constants.h
@@ -403,7 +403,7 @@ kDynamic = 0x2, }; -enum class TimelineAxis { kBlock, kInline, kVertical, kHorizontal }; +enum class TimelineAxis { kBlock, kInline, kX, kY }; enum class TimelineAttachment { // The timeline is not attached to another timeline, and other timelines // can not be attached to this timeline.
diff --git a/third_party/blink/renderer/core/style/computed_style_test.cc b/third_party/blink/renderer/core/style/computed_style_test.cc index 397b2e8..ca485113 100644 --- a/third_party/blink/renderer/core/style/computed_style_test.cc +++ b/third_party/blink/renderer/core/style/computed_style_test.cc
@@ -1846,10 +1846,8 @@ ComputedStyleBuilder builder1(*InitialComputedStyle()); ComputedStyleBuilder builder2(*InitialComputedStyle()); - builder1.SetScrollTimelineAxis( - Vector<TimelineAxis>(1u, TimelineAxis::kVertical)); - builder2.SetScrollTimelineAxis( - Vector<TimelineAxis>(1u, TimelineAxis::kVertical)); + builder1.SetScrollTimelineAxis(Vector<TimelineAxis>(1u, TimelineAxis::kY)); + builder2.SetScrollTimelineAxis(Vector<TimelineAxis>(1u, TimelineAxis::kY)); scoped_refptr<const ComputedStyle> style1 = builder1.TakeStyle(); scoped_refptr<const ComputedStyle> style2 = builder2.TakeStyle(); @@ -1898,10 +1896,8 @@ ComputedStyleBuilder builder1(*InitialComputedStyle()); ComputedStyleBuilder builder2(*InitialComputedStyle()); - builder1.SetViewTimelineAxis( - Vector<TimelineAxis>(1u, TimelineAxis::kVertical)); - builder2.SetViewTimelineAxis( - Vector<TimelineAxis>(1u, TimelineAxis::kVertical)); + builder1.SetViewTimelineAxis(Vector<TimelineAxis>(1u, TimelineAxis::kY)); + builder2.SetViewTimelineAxis(Vector<TimelineAxis>(1u, TimelineAxis::kY)); scoped_refptr<const ComputedStyle> style1 = builder1.TakeStyle(); scoped_refptr<const ComputedStyle> style2 = builder2.TakeStyle();
diff --git a/third_party/blink/renderer/core/timing/performance_navigation_timing.cc b/third_party/blink/renderer/core/timing/performance_navigation_timing.cc index be125d4..e56a135 100644 --- a/third_party/blink/renderer/core/timing/performance_navigation_timing.cc +++ b/third_party/blink/renderer/core/timing/performance_navigation_timing.cc
@@ -347,6 +347,19 @@ return AtomicString(GetSystemEntropy(GetDocumentLoader())); } +DOMHighResTimeStamp PerformanceNavigationTiming::criticalCHRestart( + ScriptState* script_state) const { + ExecutionContext::From(script_state) + ->CountUse(WebFeature::kCriticalCHRestartNavigationTiming); + DocumentLoadTiming* timing = GetDocumentLoadTiming(); + if (!timing) { + return 0.0; + } + return Performance::MonotonicTimeToDOMHighResTimeStamp( + TimeOrigin(), timing->CriticalCHRestart(), AllowNegativeValues(), + CrossOriginIsolatedCapability()); +} + void PerformanceNavigationTiming::BuildJSONValue( V8ObjectBuilder& builder) const { PerformanceResourceTiming::BuildJSONValue(builder); @@ -377,6 +390,12 @@ ExecutionContext::From(builder.GetScriptState()))) { builder.Add("systemEntropy", GetSystemEntropy(GetDocumentLoader())); } + + if (RuntimeEnabledFeatures::CriticalCHRestartNavigationTimingEnabled( + ExecutionContext::From(builder.GetScriptState()))) { + builder.Add("criticalCHRestart", + criticalCHRestart(builder.GetScriptState())); + } } } // namespace blink
diff --git a/third_party/blink/renderer/core/timing/performance_navigation_timing.h b/third_party/blink/renderer/core/timing/performance_navigation_timing.h index 84ec7c3f..27aaaea 100644 --- a/third_party/blink/renderer/core/timing/performance_navigation_timing.h +++ b/third_party/blink/renderer/core/timing/performance_navigation_timing.h
@@ -51,6 +51,7 @@ uint16_t redirectCount() const; ScriptValue notRestoredReasons(ScriptState* script_state) const; AtomicString systemEntropy() const; + DOMHighResTimeStamp criticalCHRestart(ScriptState* script_state) const; // PerformanceResourceTiming overrides: DOMHighResTimeStamp fetchStart() const override;
diff --git a/third_party/blink/renderer/core/timing/performance_navigation_timing.idl b/third_party/blink/renderer/core/timing/performance_navigation_timing.idl index 9e72f30..c6c0f8e 100644 --- a/third_party/blink/renderer/core/timing/performance_navigation_timing.idl +++ b/third_party/blink/renderer/core/timing/performance_navigation_timing.idl
@@ -32,5 +32,6 @@ readonly attribute unsigned short redirectCount; [RuntimeEnabled=BackForwardCacheNotRestoredReasons, CallWith=ScriptState] readonly attribute object? notRestoredReasons; [RuntimeEnabled=PerformanceNavigateSystemEntropy] readonly attribute NavigationEntropy systemEntropy; + [RuntimeEnabled=CriticalCHRestartNavigationTiming, CallWith=ScriptState] readonly attribute DOMHighResTimeStamp criticalCHRestart; [CallWith=ScriptState, ImplementedAs=toJSONForBinding] object toJSON(); };
diff --git a/third_party/blink/renderer/core/workers/threaded_worklet_messaging_proxy.h b/third_party/blink/renderer/core/workers/threaded_worklet_messaging_proxy.h index 1e53bc34..82468e6c3 100644 --- a/third_party/blink/renderer/core/workers/threaded_worklet_messaging_proxy.h +++ b/third_party/blink/renderer/core/workers/threaded_worklet_messaging_proxy.h
@@ -8,11 +8,11 @@ #include "base/task/single_thread_task_runner.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/workers/threaded_messaging_proxy_base.h" +#include "third_party/blink/renderer/core/workers/threaded_worklet_object_proxy.h" #include "third_party/blink/renderer/core/workers/worklet_global_scope_proxy.h" namespace blink { -class ThreadedWorkletObjectProxy; class WorkerClients; class WorkletModuleResponsesMap;
diff --git a/third_party/blink/renderer/modules/ad_auction/auction_ad.idl b/third_party/blink/renderer/modules/ad_auction/auction_ad.idl index dda1b1d..7ba3cd7 100644 --- a/third_party/blink/renderer/modules/ad_auction/auction_ad.idl +++ b/third_party/blink/renderer/modules/ad_auction/auction_ad.idl
@@ -6,7 +6,10 @@ // https://github.com/WICG/turtledove/blob/main/FLEDGE.md#12-interest-group-attributes dictionary AuctionAd { - required USVString renderUrl; + /* required */ USVString renderURL; + // TODO(crbug.com/1446741): Add DeprecatedAs when supported. + [ImplementedAs=renderUrlDeprecated] + USVString renderUrl; USVString sizeGroup; USVString buyerReportingId; USVString buyerAndSellerReportingId;
diff --git a/third_party/blink/renderer/modules/ad_auction/auction_ad_config.idl b/third_party/blink/renderer/modules/ad_auction/auction_ad_config.idl index 7b52ca5..ab29a10 100644 --- a/third_party/blink/renderer/modules/ad_auction/auction_ad_config.idl +++ b/third_party/blink/renderer/modules/ad_auction/auction_ad_config.idl
@@ -16,7 +16,11 @@ dictionary AuctionAdConfig { required USVString seller; - required USVString decisionLogicUrl; + /* required */ USVString decisionLogicURL; + [ImplementedAs=decisionLogicUrlDeprecated] + USVString decisionLogicUrl; + USVString trustedScoringSignalsURL; + [ImplementedAs=trustedScoringSignalsUrlDeprecated] USVString trustedScoringSignalsUrl; sequence<USVString> interestGroupBuyers; any auctionSignals;
diff --git a/third_party/blink/renderer/modules/ad_auction/auction_ad_interest_group.idl b/third_party/blink/renderer/modules/ad_auction/auction_ad_interest_group.idl index 88a6a75..a11e69b 100644 --- a/third_party/blink/renderer/modules/ad_auction/auction_ad_interest_group.idl +++ b/third_party/blink/renderer/modules/ad_auction/auction_ad_interest_group.idl
@@ -36,6 +36,9 @@ // API users. record<USVString, sequence<DOMString>> sellerCapabilities; DOMString executionMode; + USVString biddingLogicURL; + + [ImplementedAs=biddingLogicUrlDeprecated] USVString biddingLogicUrl; USVString biddingWasmHelperUrl; USVString updateUrl;
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 fbe4b26..5529ad83 100644 --- a/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc +++ b/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc
@@ -359,6 +359,21 @@ config.seller().Utf8().c_str(), error.Utf8().c_str()); } +String ErrorRenameMismatch(const String& old_field_name, + const String& old_field_value, + const String& new_field_name, + const String& new_field_value) { + return String::Format( + "%s doesn't have the same value as %s ('%s' vs '%s')", + old_field_name.Utf8().c_str(), new_field_name.Utf8().c_str(), + old_field_value.Utf8().c_str(), new_field_value.Utf8().c_str()); +} + +String ErrorMissingRequired(const String& required_field_name) { + return String::Format("Missing required field %s", + required_field_name.Utf8().c_str()); +} + String WarningPermissionsPolicy(const String& feature, const String& api) { return String::Format( "In the future, Permissions Policy feature %s will not be enabled by " @@ -573,12 +588,13 @@ ExceptionState& exception_state, const AuctionAdInterestGroup& input, mojom::blink::InterestGroup& output) { - if (!input.hasBiddingLogicUrl()) + if (!input.hasBiddingLogicURL()) { return true; - KURL bidding_url = context.CompleteURL(input.biddingLogicUrl()); + } + KURL bidding_url = context.CompleteURL(input.biddingLogicURL()); if (!bidding_url.IsValid()) { exception_state.ThrowTypeError(ErrorInvalidInterestGroup( - input, "biddingLogicUrl", input.biddingLogicUrl(), + input, "biddingLogicURL", input.biddingLogicURL(), "cannot be resolved to a valid URL.")); return false; } @@ -696,10 +712,10 @@ output.ads.emplace(); for (const auto& ad : input.ads()) { auto mojo_ad = mojom::blink::InterestGroupAd::New(); - KURL render_url = context.CompleteURL(ad->renderUrl()); + KURL render_url = context.CompleteURL(ad->renderURL()); if (!render_url.IsValid()) { exception_state.ThrowTypeError( - ErrorInvalidInterestGroup(input, "ad renderUrl", ad->renderUrl(), + ErrorInvalidInterestGroup(input, "ad renderURL", ad->renderURL(), "cannot be resolved to a valid URL.")); return false; } @@ -738,10 +754,10 @@ output.ad_components.emplace(); for (const auto& ad : input.adComponents()) { auto mojo_ad = mojom::blink::InterestGroupAd::New(); - KURL render_url = context.CompleteURL(ad->renderUrl()); + KURL render_url = context.CompleteURL(ad->renderURL()); if (!render_url.IsValid()) { exception_state.ThrowTypeError( - ErrorInvalidInterestGroup(input, "ad renderUrl", ad->renderUrl(), + ErrorInvalidInterestGroup(input, "ad renderURL", ad->renderURL(), "cannot be resolved to a valid URL.")); return false; } @@ -985,10 +1001,10 @@ ExceptionState& exception_state, const AuctionAdConfig& input, mojom::blink::AuctionAdConfig& output) { - KURL decision_logic_url = context.CompleteURL(input.decisionLogicUrl()); + KURL decision_logic_url = context.CompleteURL(input.decisionLogicURL()); if (!decision_logic_url.IsValid()) { exception_state.ThrowTypeError(ErrorInvalidAuctionConfig( - input, "decisionLogicUrl", input.decisionLogicUrl(), + input, "decisionLogicURL", input.decisionLogicURL(), "cannot be resolved to a valid URL.")); return false; } @@ -1000,7 +1016,7 @@ !output.seller->IsSameOriginWith( SecurityOrigin::Create(decision_logic_url).get())) { exception_state.ThrowTypeError(ErrorInvalidAuctionConfig( - input, "decisionLogicUrl", input.decisionLogicUrl(), + input, "decisionLogicURL", input.decisionLogicURL(), "must match seller origin.")); return false; } @@ -1014,13 +1030,14 @@ ExceptionState& exception_state, const AuctionAdConfig& input, mojom::blink::AuctionAdConfig& output) { - if (!input.hasTrustedScoringSignalsUrl()) + if (!input.hasTrustedScoringSignalsURL()) { return true; + } KURL trusted_scoring_signals_url = - context.CompleteURL(input.trustedScoringSignalsUrl()); + context.CompleteURL(input.trustedScoringSignalsURL()); if (!trusted_scoring_signals_url.IsValid()) { exception_state.ThrowTypeError(ErrorInvalidAuctionConfig( - input, "trustedScoringSignalsUrl", input.trustedScoringSignalsUrl(), + input, "trustedScoringSignalsURL", input.trustedScoringSignalsURL(), "cannot be resolved to a valid URL.")); return false; } @@ -1032,7 +1049,7 @@ !output.seller->IsSameOriginWith( SecurityOrigin::Create(trusted_scoring_signals_url).get())) { exception_state.ThrowTypeError(ErrorInvalidAuctionConfig( - input, "trustedScoringSignalsUrl", input.trustedScoringSignalsUrl(), + input, "trustedScoringSignalsURL", input.trustedScoringSignalsURL(), "must match seller origin.")); return false; } @@ -2040,6 +2057,131 @@ } } +// Several dictionary members are being renamed -- to maintain compatibility +// with existing scripts, both the new names and the old names will need to be +// supported for a time before support for the older names are dropped. +// +// If both names are supplied, they must have the same value (this allows +// scripts to be compatible with newer and older browsers). +// +// Some fields that were "required" in WebIDL also get checked -- during the +// rename, these fields aren't marked as required in WebIDL, but at least one +// of the old or new name versions must be specified. +bool HandleOldDictNamesJoin(AuctionAdInterestGroup* group, + ExceptionState& exception_state) { + if (group->hasAds()) { + for (auto& ad : group->ads()) { + if (ad->hasRenderUrlDeprecated()) { + if (ad->hasRenderURL()) { + if (ad->renderURL() != ad->renderUrlDeprecated()) { + exception_state.ThrowTypeError(ErrorRenameMismatch( + /*old_field_name=*/"ad renderUrl", + /*old_field_value=*/ad->renderUrlDeprecated(), + /*new_field_name=*/"ad renderURL", + /*new_field_value=*/ad->renderURL())); + return false; + } + } else { + ad->setRenderURL(ad->renderUrlDeprecated()); + } + } + if (!ad->hasRenderURL()) { + exception_state.ThrowTypeError(ErrorMissingRequired("ad renderURL")); + return false; + } + } + } + + if (group->hasAdComponents()) { + for (auto& ad : group->adComponents()) { + if (ad->hasRenderUrlDeprecated()) { + if (ad->hasRenderURL()) { + if (ad->renderURL() != ad->renderUrlDeprecated()) { + exception_state.ThrowTypeError(ErrorRenameMismatch( + /*old_field_name=*/"ad component renderUrl", + /*old_field_value=*/ad->renderUrlDeprecated(), + /*new_field_name=*/"ad component renderURL", + /*new_field_value=*/ad->renderURL())); + return false; + } + } else { + ad->setRenderURL(ad->renderUrlDeprecated()); + } + } + if (!ad->hasRenderURL()) { + exception_state.ThrowTypeError( + ErrorMissingRequired("ad component renderURL")); + return false; + } + } + } + + if (group->hasBiddingLogicUrlDeprecated()) { + if (group->hasBiddingLogicURL()) { + if (group->biddingLogicURL() != group->biddingLogicUrlDeprecated()) { + exception_state.ThrowTypeError(ErrorRenameMismatch( + /*old_field_name=*/"interest group biddingLogicUrl", + /*old_field_value=*/group->biddingLogicUrlDeprecated(), + /*new_field_name=*/"interest group biddingLogicURL", + /*new_field_value=*/group->biddingLogicURL())); + return false; + } + } else { + group->setBiddingLogicURL(group->biddingLogicUrlDeprecated()); + } + } + + return true; +} + +bool HandleOldDictNamesRun(AuctionAdConfig* config, + ExceptionState& exception_state) { + if (config->hasComponentAuctions()) { + for (AuctionAdConfig* component_auction : config->componentAuctions()) { + HandleOldDictNamesRun(component_auction, exception_state); + } + } + + if (config->hasDecisionLogicUrlDeprecated()) { + if (config->hasDecisionLogicURL()) { + if (config->decisionLogicURL() != config->decisionLogicUrlDeprecated()) { + exception_state.ThrowTypeError(ErrorRenameMismatch( + /*old_field_name=*/"ad auction config decisionLogicUrl", + /*old_field_value=*/config->decisionLogicUrlDeprecated(), + /*new_field_name=*/"ad auction config decisionLogicURL", + /*new_field_value=*/config->decisionLogicURL())); + return false; + } + } else { + config->setDecisionLogicURL(config->decisionLogicUrlDeprecated()); + } + } + if (!config->hasDecisionLogicURL()) { + exception_state.ThrowTypeError( + ErrorMissingRequired("ad auction config decisionLogicURL")); + return false; + } + + if (config->hasTrustedScoringSignalsUrlDeprecated()) { + if (config->hasTrustedScoringSignalsURL()) { + if (config->trustedScoringSignalsURL() != + config->trustedScoringSignalsUrlDeprecated()) { + exception_state.ThrowTypeError(ErrorRenameMismatch( + /*old_field_name=*/"ad auction config trustedScoringSignalsUrl", + /*old_field_value=*/config->trustedScoringSignalsUrlDeprecated(), + /*new_field_name=*/"ad auction config trustedScoringSignalsURL", + /*new_field_value=*/config->trustedScoringSignalsURL())); + return false; + } + } else { + config->setTrustedScoringSignalsURL( + config->trustedScoringSignalsUrlDeprecated()); + } + } + + return true; +} + } // namespace NavigatorAuction::AuctionHandle::JsonResolved::JsonResolved( @@ -2352,11 +2494,17 @@ ScriptPromise NavigatorAuction::joinAdInterestGroup( ScriptState* script_state, - const AuctionAdInterestGroup* group, + AuctionAdInterestGroup* mutable_group, double duration_seconds, ExceptionState& exception_state) { const ExecutionContext* context = ExecutionContext::From(script_state); + // TODO(crbug.com/1441988): Remove this code after rename is complete. + if (!HandleOldDictNamesJoin(mutable_group, exception_state)) { + return ScriptPromise(); + } + const AuctionAdInterestGroup* group = mutable_group; + auto mojo_group = mojom::blink::InterestGroup::New(); mojo_group->expiry = base::Time::Now() + base::Seconds(duration_seconds); if (!CopyOwnerFromIdlToMojo(*context, exception_state, *group, *mojo_group)) @@ -2459,7 +2607,7 @@ ScriptPromise NavigatorAuction::joinAdInterestGroup( ScriptState* script_state, Navigator& navigator, - const AuctionAdInterestGroup* group, + AuctionAdInterestGroup* group, double duration_seconds, ExceptionState& exception_state) { if (!navigator.DomWindow()) { @@ -2632,10 +2780,15 @@ } ScriptPromise NavigatorAuction::runAdAuction(ScriptState* script_state, - const AuctionAdConfig* config, + AuctionAdConfig* mutable_config, ExceptionState& exception_state) { ExecutionContext* context = ExecutionContext::From(script_state); + if (!HandleOldDictNamesRun(mutable_config, exception_state)) { + return ScriptPromise(); + } + const AuctionAdConfig* config = mutable_config; + mojo::PendingReceiver<mojom::blink::AbortableAdAuction> abort_receiver; auto* auction_handle = MakeGarbageCollected<AuctionHandle>( context, abort_receiver.InitWithNewPipeAndPassRemote()); @@ -2694,7 +2847,7 @@ /* static */ ScriptPromise NavigatorAuction::runAdAuction(ScriptState* script_state, Navigator& navigator, - const AuctionAdConfig* config, + AuctionAdConfig* config, ExceptionState& exception_state) { if (!navigator.DomWindow()) { exception_state.ThrowDOMException(DOMExceptionCode::kInvalidAccessError, @@ -2946,7 +3099,7 @@ const ExecutionContext* context = ExecutionContext::From(script_state); auto mojo_config = mojom::blink::AuctionAdConfig::New(); - // For finalizing an Ad PARAKEET only really cares about the decisionLogicUrl, + // For finalizing an Ad PARAKEET only really cares about the decisionLogicURL, // auctionSignals, sellerSignals, and perBuyerSignals. Also need seller, since // it's used to validate the decision logic URL. We can ignore // copying/validating other fields on AuctionAdConfig.
diff --git a/third_party/blink/renderer/modules/ad_auction/navigator_auction.h b/third_party/blink/renderer/modules/ad_auction/navigator_auction.h index 2c85c7a..a28e3042 100644 --- a/third_party/blink/renderer/modules/ad_auction/navigator_auction.h +++ b/third_party/blink/renderer/modules/ad_auction/navigator_auction.h
@@ -47,13 +47,14 @@ // See platform/Supplementable.h static NavigatorAuction& From(ExecutionContext*, Navigator&); + // TODO(crbug.com/1441988): Make `const AuctionAdInterestGroup*` after rename. ScriptPromise joinAdInterestGroup(ScriptState*, - const AuctionAdInterestGroup*, + AuctionAdInterestGroup*, double, ExceptionState&); static ScriptPromise joinAdInterestGroup(ScriptState*, Navigator&, - const AuctionAdInterestGroup*, + AuctionAdInterestGroup*, double, ExceptionState&); ScriptPromise leaveAdInterestGroup(ScriptState*, @@ -72,12 +73,11 @@ void updateAdInterestGroups(); static void updateAdInterestGroups(ScriptState*, Navigator&, ExceptionState&); - ScriptPromise runAdAuction(ScriptState*, - const AuctionAdConfig*, - ExceptionState&); + // TODO(crbug.com/1441988): Make `const AuctionAdConfig*` after rename. + ScriptPromise runAdAuction(ScriptState*, AuctionAdConfig*, ExceptionState&); static ScriptPromise runAdAuction(ScriptState*, Navigator&, - const AuctionAdConfig*, + AuctionAdConfig*, ExceptionState&); // If called from a FencedFrame that was navigated to the URN resulting from
diff --git a/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group.cc b/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group.cc index 167ad27..bce5bf7 100644 --- a/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group.cc +++ b/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group.cc
@@ -231,9 +231,9 @@ for (WTF::wtf_size_t i = 0; i < group.ads.value().size(); ++i) { const KURL& render_url = group.ads.value()[i]->render_url; if (!IsUrlAllowedForRenderUrls(render_url)) { - error_field_name = String::Format("ads[%u].renderUrl", i); + error_field_name = String::Format("ads[%u].renderURL", i); error_field_value = render_url.GetString(); - error = "renderUrls must be HTTPS and have no embedded credentials."; + error = "renderURLs must be HTTPS and have no embedded credentials."; return false; } const WTF::String& ad_size_group = group.ads.value()[i]->size_group; @@ -258,9 +258,9 @@ for (WTF::wtf_size_t i = 0; i < group.ad_components.value().size(); ++i) { const KURL& render_url = group.ad_components.value()[i]->render_url; if (!IsUrlAllowedForRenderUrls(render_url)) { - error_field_name = String::Format("adComponents[%u].renderUrl", i); + error_field_name = String::Format("adComponents[%u].renderURL", i); error_field_value = render_url.GetString(); - error = "renderUrls must be HTTPS and have no embedded credentials."; + error = "renderURLs must be HTTPS and have no embedded credentials."; return false; } const WTF::String& ad_component_size_group =
diff --git a/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group_test.cc b/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group_test.cc index 0248f793..d7c6869 100644 --- a/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group_test.cc +++ b/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group_test.cc
@@ -363,7 +363,7 @@ // Tests valid and invalid ad render URLs. TEST_F(ValidateBlinkInterestGroupTest, AdRenderUrlValidation) { const char kBadAdUrlError[] = - "renderUrls must be HTTPS and have no embedded credentials."; + "renderURLs must be HTTPS and have no embedded credentials."; const struct { bool expect_allowed; @@ -409,7 +409,7 @@ } else { ExpectInterestGroupIsNotValid( blink_interest_group, - /*expected_error_field_name=*/"ads[0].renderUrl", + /*expected_error_field_name=*/"ads[0].renderURL", /*expected_error_field_value=*/test_case_url.GetString().Utf8(), /*expected_error=*/kBadAdUrlError); } @@ -425,7 +425,7 @@ } else { ExpectInterestGroupIsNotValid( blink_interest_group, - /*expected_error_field_name=*/"ads[1].renderUrl", + /*expected_error_field_name=*/"ads[1].renderURL", /*expected_error_field_value=*/test_case_url.GetString().Utf8(), /*expected_error=*/kBadAdUrlError); } @@ -435,7 +435,7 @@ // Tests valid and invalid ad render URLs. TEST_F(ValidateBlinkInterestGroupTest, AdComponentRenderUrlValidation) { const char kBadAdUrlError[] = - "renderUrls must be HTTPS and have no embedded credentials."; + "renderURLs must be HTTPS and have no embedded credentials."; const struct { bool expect_allowed; @@ -483,7 +483,7 @@ } else { ExpectInterestGroupIsNotValid( blink_interest_group, - /*expected_error_field_name=*/"adComponents[0].renderUrl", + /*expected_error_field_name=*/"adComponents[0].renderURL", /*expected_error_field_value=*/test_case_url.GetString().Utf8(), /*expected_error=*/kBadAdUrlError); } @@ -501,7 +501,7 @@ } else { ExpectInterestGroupIsNotValid( blink_interest_group, - /*expected_error_field_name=*/"adComponents[1].renderUrl", + /*expected_error_field_name=*/"adComponents[1].renderURL", /*expected_error_field_value=*/test_case_url.GetString().Utf8(), /*expected_error=*/kBadAdUrlError); } @@ -520,7 +520,7 @@ // First, check against mojom::blink::InterestGroup. constexpr char kBadAdUrlError[] = - "renderUrls must be HTTPS and have no embedded credentials."; + "renderURLs must be HTTPS and have no embedded credentials."; mojom::blink::InterestGroupPtr blink_interest_group = mojom::blink::InterestGroup::New(); blink_interest_group->owner = kOrigin; @@ -532,7 +532,7 @@ String error; EXPECT_FALSE(ValidateBlinkInterestGroup( *blink_interest_group, error_field_name, error_field_value, error)); - EXPECT_EQ(error_field_name, String::FromUTF8("ads[0].renderUrl")); + EXPECT_EQ(error_field_name, String::FromUTF8("ads[0].renderURL")); // The invalid ^ gets escaped. EXPECT_EQ(error_field_value, String::FromUTF8("https://invalid%5E/")); EXPECT_EQ(error, String::FromUTF8(kBadAdUrlError));
diff --git a/third_party/blink/renderer/modules/device_orientation/OWNERS b/third_party/blink/renderer/modules/device_orientation/OWNERS index ff41043..c82c4e3 100644 --- a/third_party/blink/renderer/modules/device_orientation/OWNERS +++ b/third_party/blink/renderer/modules/device_orientation/OWNERS
@@ -1 +1,3 @@ +chengweih@chromium.org +mattreynolds@chromium.org reillyg@chromium.org
diff --git a/third_party/blink/renderer/modules/mediastream/media_devices_test.cc b/third_party/blink/renderer/modules/mediastream/media_devices_test.cc index 0ab4e4da..edf33825 100644 --- a/third_party/blink/renderer/modules/mediastream/media_devices_test.cc +++ b/third_party/blink/renderer/modules/mediastream/media_devices_test.cc
@@ -895,8 +895,8 @@ EXPECT_TRUE(tester.IsFulfilled()); EXPECT_FALSE(scope.GetExceptionState().HadException()); - const CropTarget* const crop_target = V8CropTarget::ToWrappableUnsafe( - tester.Value().V8Value().As<v8::Object>()); + const CropTarget* const crop_target = + V8CropTarget::ToWrappable(scope.GetIsolate(), tester.Value().V8Value()); const WTF::String& crop_id = crop_target->GetCropId(); EXPECT_TRUE(crop_id.ContainsOnlyASCIIOrEmpty()); EXPECT_TRUE(base::Uuid::ParseLowercase(crop_id.Ascii()).is_valid());
diff --git a/third_party/blink/renderer/modules/nfc/OWNERS b/third_party/blink/renderer/modules/nfc/OWNERS index 80925a60..9114a96 100644 --- a/third_party/blink/renderer/modules/nfc/OWNERS +++ b/third_party/blink/renderer/modules/nfc/OWNERS
@@ -1,4 +1,6 @@ rijubrata.bhaumik@intel.com +chengweih@chromium.org +mattreynolds@chromium.org reillyg@chromium.org beaufort.francois@gmail.com
diff --git a/third_party/blink/renderer/modules/sensor/OWNERS b/third_party/blink/renderer/modules/sensor/OWNERS index 8120bc8..1a115a7 100644 --- a/third_party/blink/renderer/modules/sensor/OWNERS +++ b/third_party/blink/renderer/modules/sensor/OWNERS
@@ -1,3 +1,5 @@ raphael.kubo.da.costa@intel.com +chengweih@chromium.org +mattreynolds@chromium.org reillyg@chromium.org rijubrata.bhaumik@intel.com
diff --git a/third_party/blink/renderer/modules/shapedetection/OWNERS b/third_party/blink/renderer/modules/shapedetection/OWNERS index 3931a46..0aebb83d 100644 --- a/third_party/blink/renderer/modules/shapedetection/OWNERS +++ b/third_party/blink/renderer/modules/shapedetection/OWNERS
@@ -1,3 +1,5 @@ +chengweih@chromium.org +mattreynolds@chromium.org reillyg@chromium.org per-file *_type_converter*.*=set noparent
diff --git a/third_party/blink/renderer/modules/wake_lock/OWNERS b/third_party/blink/renderer/modules/wake_lock/OWNERS index a7408f9..1480d6e8 100644 --- a/third_party/blink/renderer/modules/wake_lock/OWNERS +++ b/third_party/blink/renderer/modules/wake_lock/OWNERS
@@ -1,2 +1,4 @@ raphael.kubo.da.costa@intel.com +chengweih@chromium.org +mattreynolds@chromium.org reillyg@chromium.org
diff --git a/third_party/blink/renderer/modules/webaudio/audio_worklet_handler.cc b/third_party/blink/renderer/modules/webaudio/audio_worklet_handler.cc index f1c3e6b..0bf86b7 100644 --- a/third_party/blink/renderer/modules/webaudio/audio_worklet_handler.cc +++ b/third_party/blink/renderer/modules/webaudio/audio_worklet_handler.cc
@@ -200,8 +200,8 @@ void AudioWorkletHandler::SetProcessorOnRenderThread( AudioWorkletProcessor* processor) { - // TODO(hongchan): unify the thread ID check. The thread ID for this call - // is different from `Context()->IsAudiothread()`. + // TODO(crbug.com/1071917): unify the thread ID check. The thread ID for this + // call may be different from `Context()->IsAudiothread()`. DCHECK(!IsMainThread()); // `processor` can be `nullptr` when the invocation of user-supplied
diff --git a/third_party/blink/renderer/modules/webaudio/audio_worklet_handler.h b/third_party/blink/renderer/modules/webaudio/audio_worklet_handler.h index b52f39f..896486c 100644 --- a/third_party/blink/renderer/modules/webaudio/audio_worklet_handler.h +++ b/third_party/blink/renderer/modules/webaudio/audio_worklet_handler.h
@@ -85,8 +85,9 @@ HashMap<String, scoped_refptr<AudioParamHandler>> param_handler_map_; HashMap<String, std::unique_ptr<AudioFloatArray>> param_value_map_; - // TODO(): Adjust this if needed based on the result of the process - // method or the value of `tail_time_`. + // TODO(crbug.com/1447088): The tail time of AudioWorkletNode is decided by + // the active processing flag. So it doesn't need an automatic tail time + // management from the renderer. bool RequiresTailProcessing() const override { return true; } scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner_;
diff --git a/third_party/blink/renderer/modules/webaudio/biquad_dsp_kernel.cc b/third_party/blink/renderer/modules/webaudio/biquad_dsp_kernel.cc index ac8f548a..5cdb238 100644 --- a/third_party/blink/renderer/modules/webaudio/biquad_dsp_kernel.cc +++ b/third_party/blink/renderer/modules/webaudio/biquad_dsp_kernel.cc
@@ -36,7 +36,7 @@ namespace { bool HasConstantValues(float* values, int frames_to_process) { - // TODO(rtoy): Use SIMD to optimize this. This would speed up + // TODO(crbug.com/1447094): Use SIMD to optimize this. This would speed up // processing by a factor of 4 because we can process 4 floats at a // time. float value = values[0]; @@ -155,11 +155,10 @@ } void BiquadDSPKernel::UpdateTailTime(int coef_index) { - // A reasonable upper limit for the tail time. While it's easy to - // create biquad filters whose tail time can be much larger than - // this, limit the maximum to this value so that we don't keep such - // nodes alive "forever". - // TODO: What is a reasonable upper limit? + // TODO(crbug.com/1447095): A reasonable upper limit for the tail time. While + // it's easy to create biquad filters whose tail time can be much larger than + // this, limit the maximum to this value so that we don't keep such nodes + // alive "forever". Investigate if we can adjust this to a smaller value. constexpr double kMaxTailTime = 30.0; double sample_rate = SampleRate();
diff --git a/third_party/blink/renderer/modules/webaudio/convolver_handler.cc b/third_party/blink/renderer/modules/webaudio/convolver_handler.cc index 325e3fd..57c70161 100644 --- a/third_party/blink/renderer/modules/webaudio/convolver_handler.cc +++ b/third_party/blink/renderer/modules/webaudio/convolver_handler.cc
@@ -292,7 +292,7 @@ unsigned number_of_channels = 1; bool lock_successfully_acquired = false; - // TODO(hongchan): Check what to do when the lock cannot be acquired. + // TODO(crbug.com/1447093): Check what to do when the lock cannot be acquired. base::AutoTryLock try_locker(process_lock_); if (try_locker.is_acquired()) { lock_successfully_acquired = true;
diff --git a/third_party/blink/renderer/modules/webaudio/cpu/x86/oscillator_kernel_sse2.cc b/third_party/blink/renderer/modules/webaudio/cpu/x86/oscillator_kernel_sse2.cc index b12df79..0886aea 100644 --- a/third_party/blink/renderer/modules/webaudio/cpu/x86/oscillator_kernel_sse2.cc +++ b/third_party/blink/renderer/modules/webaudio/cpu/x86/oscillator_kernel_sse2.cc
@@ -124,7 +124,6 @@ // Temporary arrays where we can gather up the wave data we need for // interpolation. Align these for best efficiency on older CPUs where aligned // access is much faster than unaliged. - // TODO(1013118): Is there a faster way to do this? float sample1_lower[4] __attribute__((aligned(16))); float sample2_lower[4] __attribute__((aligned(16))); float sample1_higher[4] __attribute__((aligned(16)));
diff --git a/third_party/blink/renderer/modules/webaudio/periodic_wave.cc b/third_party/blink/renderer/modules/webaudio/periodic_wave.cc index c39e832..02dd39c 100644 --- a/third_party/blink/renderer/modules/webaudio/periodic_wave.cc +++ b/third_party/blink/renderer/modules/webaudio/periodic_wave.cc
@@ -407,8 +407,7 @@ const float* imag_data, unsigned number_of_components, bool disable_normalization) { - // TODO(rtoy): Figure out why this needs to be 0.5 when normalization is - // disabled. + // The default scale factor for when normalization is disabled. float normalization_scale = 0.5; unsigned fft_size = PeriodicWaveSize(); @@ -433,9 +432,11 @@ // arrays. Need to scale the data by fftSize to remove the scaling that the // inverse IFFT would do. float scale = fft_size; - vector_math::Vsmul(real_data, 1, &scale, real.Data(), 1, number_of_components); + vector_math::Vsmul( + real_data, 1, &scale, real.Data(), 1, number_of_components); scale = -scale; - vector_math::Vsmul(imag_data, 1, &scale, imag.Data(), 1, number_of_components); + vector_math::Vsmul( + imag_data, 1, &scale, imag.Data(), 1, number_of_components); // Find the starting bin where we should start culling. We need to clear // out the highest frequencies to band-limit the waveform.
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_adapter.cc b/third_party/blink/renderer/modules/webgpu/gpu_adapter.cc index 51164e7b7..5e39c676 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_adapter.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_adapter.cc
@@ -54,6 +54,8 @@ return V8GPUFeatureName::Enum::kChromiumExperimentalDp4A; case WGPUFeatureName_ShaderF16: return V8GPUFeatureName::Enum::kShaderF16; + case WGPUFeatureName_Float32Filterable: + return V8GPUFeatureName::Enum::kFloat32Filterable; default: return absl::nullopt; }
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn index 241ca94..ed90c5a 100644 --- a/third_party/blink/renderer/platform/BUILD.gn +++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -1581,7 +1581,10 @@ } if (current_cpu == "loong64") { - cflags = [ "-mlsx", "-flax-vector-conversions" ] + cflags = [ + "-mlsx", + "-flax-vector-conversions", + ] } if (is_apple) {
diff --git a/third_party/blink/renderer/platform/bindings/v8_interface_bridge.h b/third_party/blink/renderer/platform/bindings/v8_interface_bridge.h index 49ef075..dfad3b6 100644 --- a/third_party/blink/renderer/platform/bindings/v8_interface_bridge.h +++ b/third_party/blink/renderer/platform/bindings/v8_interface_bridge.h
@@ -22,6 +22,9 @@ : nullptr; } + // This method will cause a bad cast if called on an object of the wrong type. + // For use only inside bindings/, and only when the type of the object is + // absolutely certain. static T* ToWrappableUnsafe(v8::Local<v8::Object> value) { return ToScriptWrappable(value)->ToImpl<T>(); }
diff --git a/third_party/blink/renderer/platform/graphics/cpu/loongarch64/webgl_image_conversion_lsx.h b/third_party/blink/renderer/platform/graphics/cpu/loongarch64/webgl_image_conversion_lsx.h index 5b01d6c..fcbabae 100644 --- a/third_party/blink/renderer/platform/graphics/cpu/loongarch64/webgl_image_conversion_lsx.h +++ b/third_party/blink/renderer/platform/graphics/cpu/loongarch64/webgl_image_conversion_lsx.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 THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_CPU_LA64_WEBGL_IMAGE_CONVERSION_LSX_H_ -#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_CPU_LA64_WEBGL_IMAGE_CONVERSION_LSX_H_ +#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_CPU_LOONGARCH64_WEBGL_IMAGE_CONVERSION_LSX_H_ +#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_CPU_LOONGARCH64_WEBGL_IMAGE_CONVERSION_LSX_H_ #include "build/build_config.h" @@ -227,4 +227,4 @@ #endif // ARCH_CPU_LOONG_FAMILY -#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_CPU_LA64_WEBGL_IMAGE_CONVERSION_LSX_H_ +#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_CPU_LOONGARCH64_WEBGL_IMAGE_CONVERSION_LSX_H_
diff --git a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc index 16a2478..d2560cd7 100644 --- a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc +++ b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc
@@ -1850,13 +1850,12 @@ front_buffer_mailbox = mailboxes.front_buffer; } else { if (ShouldUseChromiumImage()) { - gfx::BufferFormat buffer_format = - BufferFormat(color_buffer_format_.resource_format()); - if (buffer_format == gfx::BufferFormat::RGBX_8888 && + viz::SharedImageFormat si_format = color_buffer_format_; + if (si_format == viz::SinglePlaneFormat::kRGBX_8888 && gpu::IsImageFromGpuMemoryBufferFormatSupported( gfx::BufferFormat::BGRX_8888, ContextProvider()->GetCapabilities())) { - buffer_format = gfx::BufferFormat::BGRX_8888; + si_format = viz::SinglePlaneFormat::kBGRX_8888; } // TODO(crbug.com/911176): When RGB emulation is not needed, we should use // the non-GMB CreateSharedImage with gpu::SHARED_IMAGE_USAGE_SCANOUT in @@ -1870,16 +1869,17 @@ } if (gpu::IsImageFromGpuMemoryBufferFormatSupported( - buffer_format, ContextProvider()->GetCapabilities())) { + viz::BufferFormat(si_format.resource_format()), + ContextProvider()->GetCapabilities())) { gpu_memory_buffer = gpu_memory_buffer_manager->CreateGpuMemoryBuffer( - size, buffer_format, buffer_usage, gpu::kNullSurfaceHandle, - nullptr); + size, viz::BufferFormat(si_format.resource_format()), buffer_usage, + gpu::kNullSurfaceHandle, nullptr); if (gpu_memory_buffer) { gpu_memory_buffer->SetColorSpace(color_space_); back_buffer_mailbox = sii->CreateSharedImage( - gpu_memory_buffer.get(), gpu_memory_buffer_manager, color_space_, - origin, back_buffer_alpha_type, usage | additional_usage_flags, - "WebGLDrawingBuffer"); + si_format, size, color_space_, origin, back_buffer_alpha_type, + usage | additional_usage_flags, "WebGLDrawingBuffer", + gpu_memory_buffer->CloneHandle()); #if BUILDFLAG(IS_MAC) // A CHROMIUM_image backed texture requires a specialized set of // parameters on OSX.
diff --git a/third_party/blink/renderer/platform/graphics/static_bitmap_image_to_video_frame_copier.cc b/third_party/blink/renderer/platform/graphics/static_bitmap_image_to_video_frame_copier.cc index cea929c..048732b 100644 --- a/third_party/blink/renderer/platform/graphics/static_bitmap_image_to_video_frame_copier.cc +++ b/third_party/blink/renderer/platform/graphics/static_bitmap_image_to_video_frame_copier.cc
@@ -272,7 +272,7 @@ DLOG(ERROR) << "Couldn't read SkImage using async callback"; return; } - yuv_frame->set_color_space(gfx::ColorSpace::CreateREC709()); + yuv_frame->set_color_space(gfx::ColorSpace::CreateREC601()); std::move(callback).Run(yuv_frame); }
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 51661e2..15055e8c 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -734,6 +734,10 @@ base_feature: "none", }, { + name: "CriticalCHRestartNavigationTiming", + status: "experimental", + }, + { name: "CrossFramePerformanceTimeline", status: "experimental", },
diff --git a/third_party/blink/web_tests/SlowTests b/third_party/blink/web_tests/SlowTests index 4f61db79..410e45b8 100644 --- a/third_party/blink/web_tests/SlowTests +++ b/third_party/blink/web_tests/SlowTests
@@ -119,7 +119,6 @@ crbug.com/24182 [ Debug Mac13-arm64 ] fast/events/tabindex-focus-blur-all.html [ Slow ] crbug.com/24182 [ Linux ] fast/events/tabindex-focus-blur-all.html [ Slow ] crbug.com/24182 [ Mac10.13 Release ] fast/events/tabindex-focus-blur-all.html [ Slow ] -crbug.com/24182 [ Mac10.14 Release ] fast/events/tabindex-focus-blur-all.html [ Slow ] crbug.com/24182 [ Mac10.15 Release ] fast/events/tabindex-focus-blur-all.html [ Slow ] crbug.com/24182 [ Mac11 Release ] fast/events/tabindex-focus-blur-all.html [ Slow ] crbug.com/24182 [ Mac12 ] fast/events/tabindex-focus-blur-all.html [ Slow ] @@ -298,7 +297,6 @@ crbug.com/802029 [ Linux ] fast/dom/shadow/focus-controller-recursion-crash.html [ Slow ] crbug.com/802029 [ Mac10.13 Release ] fast/dom/shadow/focus-controller-recursion-crash.html [ Slow ] -crbug.com/802029 [ Mac10.14 Release ] fast/dom/shadow/focus-controller-recursion-crash.html [ Slow ] crbug.com/802029 [ Mac10.15 Release ] fast/dom/shadow/focus-controller-recursion-crash.html [ Slow ] crbug.com/802029 [ Mac11 Release ] fast/dom/shadow/focus-controller-recursion-crash.html [ Slow ] crbug.com/802029 [ Mac12 ] fast/dom/shadow/focus-controller-recursion-crash.html [ Slow ] @@ -345,7 +343,6 @@ crbug.com/1081534 [ Mac11 Release ] virtual/oopr-canvas2d/fast/canvas/canvas-composite-shadow-part4.html [ Slow ] crbug.com/1081534 [ Mac12 ] virtual/oopr-canvas2d/fast/canvas/canvas-composite-shadow-part4.html [ Slow ] crbug.com/1081534 [ Mac10.13 Release ] virtual/oopr-canvas2d/fast/canvas/canvas-composite-transformclip.html [ Slow ] -crbug.com/1081534 [ Mac10.14 Release ] virtual/oopr-canvas2d/fast/canvas/canvas-composite-transformclip.html [ Slow ] crbug.com/1081534 [ Mac10.15 Release ] virtual/oopr-canvas2d/fast/canvas/canvas-composite-transformclip.html [ Slow ] crbug.com/1081534 [ Mac11 Release ] virtual/oopr-canvas2d/fast/canvas/canvas-composite-transformclip.html [ Slow ] crbug.com/1081534 [ Mac12 ] virtual/oopr-canvas2d/fast/canvas/canvas-composite-transformclip.html [ Slow ] @@ -356,7 +353,6 @@ crbug.com/1081534 [ Mac ] virtual/oopr-canvas2d/fast/canvas/canvas-blending-image-over-gradient.html [ Slow ] crbug.com/1081534 [ Mac ] virtual/oopr-canvas2d/fast/canvas/canvas-blending-pattern-over-color.html [ Slow ] crbug.com/1081534 [ Mac ] virtual/oopr-canvas2d/fast/canvas/canvas-blending-pattern-over-pattern.html [ Slow ] -crbug.com/1081534 [ Mac ] virtual/oopr-canvas2d/fast/canvas/canvas-blending-transforms.html [ Slow ] crbug.com/1081534 [ Mac ] virtual/oopr-canvas2d/fast/canvas/canvas-blend-image.html [ Slow ] crbug.com/1081534 [ Linux ] virtual/oopr-canvas2d/fast/canvas/canvas-blend-image.html [ Slow ] crbug.com/1081534 [ Mac ] virtual/oopr-canvas2d/fast/canvas/canvas-incremental-repaint.html [ Slow ] @@ -438,7 +434,6 @@ crbug.com/866850 [ Mac12 Release ] virtual/gpu/fast/canvas/canvas-blending-image-over-gradient.html [ Slow ] crbug.com/866850 [ Linux ] virtual/gpu/fast/canvas/canvas-blending-image-over-image.html [ Slow ] crbug.com/866850 [ Linux ] virtual/gpu/fast/canvas/canvas-blending-image-over-pattern.html [ Slow ] -crbug.com/866850 [ Mac10.15 Release ] virtual/gpu/fast/canvas/canvas-blending-image-over-pattern.html [ Slow ] crbug.com/866850 [ Linux ] virtual/gpu/fast/canvas/canvas-blending-pattern-over-color.html [ Slow ] crbug.com/866850 [ Mac ] virtual/gpu/fast/canvas/canvas-blending-pattern-over-color.html [ Slow ] crbug.com/866850 [ Linux ] virtual/gpu/fast/canvas/canvas-blending-pattern-over-gradient.html [ Slow ] @@ -603,7 +598,6 @@ crbug.com/874695 [ Mac12 Release ] fast/peerconnection/RTCRtpSender-setParameters.html [ Slow ] crbug.com/874695 [ Release Win ] fast/peerconnection/RTCRtpSender-setParameters.html [ Slow ] crbug.com/874695 [ Linux ] fast/scroll-behavior/overscroll-behavior.html [ Slow ] -crbug.com/874695 [ Mac10.14 Release ] fast/scroll-behavior/overscroll-behavior.html [ Slow ] crbug.com/874695 [ Mac10.15 Release ] fast/scroll-behavior/overscroll-behavior.html [ Slow ] crbug.com/874695 [ Mac11 Release ] fast/scroll-behavior/overscroll-behavior.html [ Slow ] crbug.com/874695 [ Mac11-arm64 Release ] fast/scroll-behavior/overscroll-behavior.html [ Slow ]
diff --git a/third_party/blink/web_tests/SmokeTests/Mac.txt b/third_party/blink/web_tests/SmokeTests/Mac.txt index 853d326..d041588 100644 --- a/third_party/blink/web_tests/SmokeTests/Mac.txt +++ b/third_party/blink/web_tests/SmokeTests/Mac.txt
@@ -928,7 +928,6 @@ http/tests/devtools/tracing/frame-model-instrumentation.js http/tests/devtools/tracing/timeline-js/timeline-gc-event.js http/tests/devtools/tracing/timeline-js/timeline-microtasks.js -http/tests/devtools/tracing/timeline-js/timeline-script-id.js http/tests/devtools/tracing/timeline-layout/timeline-layout-with-invalidations.js http/tests/devtools/tracing/timeline-paint/paint-profiler-update.js http/tests/devtools/tracing/timeline-paint/timeline-paint.js
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 76976c6..877b14e 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -722,8 +722,6 @@ crbug.com/492187 external/wpt/css/CSS2/backgrounds/background-intrinsic-004.xht [ Failure ] crbug.com/492187 external/wpt/css/CSS2/backgrounds/background-intrinsic-006.xht [ Failure ] -# Minor bleed on left/top side of the edge pieces (computed spacing is 16px / 3). -crbug.com/1175040 external/wpt/css/css-backgrounds/border-image-repeat-space-10.html [ Failure Pass ] # No emoji flag symbols available in the Windows system emoji font. @@ -1230,7 +1228,6 @@ crbug.com/1306037 external/wpt/css/css-flexbox/abspos/dynamic-align-self-001.html [ Failure ] -crbug.com/1299946 [ Mac10.14 Release ] external/wpt/css/css-sizing/min-content-negative-margin-crash.html [ Pass Timeout ] crbug.com/1299946 [ Mac10.15 Release ] external/wpt/css/css-sizing/min-content-negative-margin-crash.html [ Pass Timeout ] crbug.com/1299946 [ Mac11 Release ] external/wpt/css/css-sizing/min-content-negative-margin-crash.html [ Pass Timeout ] crbug.com/1299946 [ Mac12 ] external/wpt/css/css-sizing/min-content-negative-margin-crash.html [ Pass Timeout ] @@ -2061,7 +2058,6 @@ crbug.com/805756 external/wpt/html/semantics/tabular-data/processing-model-1/span-limits.html [ Pass Timeout ] # crbug.com/1218716: These fail when TrustTokenOriginTrial is enabled. -crbug.com/1218716 external/wpt/trust-tokens/trust-token-parameter-validation-xhr.tentative.https.html [ Failure ] crbug.com/1218716 external/wpt/trust-tokens/trust-token-parameter-validation.tentative.https.html [ Failure ] crbug.com/1218716 external/wpt/feature-policy/experimental-features/trust-token-redemption-default-feature-policy.tentative.https.sub.html [ Failure ] crbug.com/1218716 external/wpt/feature-policy/experimental-features/trust-token-redemption-supported-by-feature-policy.tentative.html [ Failure ] @@ -2902,6 +2898,10 @@ crbug.com/626703 [ Win ] virtual/partitioned-cookies/http/tests/inspector-protocol/network/disabled-cache-navigation.js [ Failure ] # ====== New tests from wpt-importer added here ====== +crbug.com/626703 external/wpt/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html [ Failure Pass ] +crbug.com/626703 virtual/threaded/external/wpt/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html [ Failure Pass ] +crbug.com/626703 external/wpt/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html [ Failure Pass ] +crbug.com/626703 virtual/threaded/external/wpt/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html [ Failure Pass ] crbug.com/626703 [ Mac13 ] virtual/threaded/external/wpt/scroll-animations/css/animation-timeline-view-functional-notation.tentative.html [ Timeout ] crbug.com/626703 [ Linux ] external/wpt/svg/pservers/reftests/pattern-opacity-01.svg [ Failure ] crbug.com/626703 [ Win ] external/wpt/svg/pservers/reftests/pattern-opacity-01.svg [ Failure ] @@ -2948,7 +2948,6 @@ crbug.com/626703 [ Mac10.15 ] external/wpt/font-access/font_access_query_select.tentative.https.window.html [ Timeout ] crbug.com/626703 [ Linux ] external/wpt/html/semantics/forms/form-submission-0/multipart-formdata.window.html [ Timeout ] crbug.com/626703 [ Mac11 ] external/wpt/html/semantics/forms/form-submission-0/multipart-formdata.window.html [ Timeout ] -crbug.com/626703 [ Mac10.14 ] external/wpt/video-rvfc/request-video-frame-callback-webrtc.https.html [ Timeout ] crbug.com/626703 [ Linux ] virtual/fenced-frame-mparch/external/wpt/fenced-frame/default-enabled-features-allow-self.https.html [ Timeout ] crbug.com/626703 [ Linux ] virtual/keepalive-in-browser-migration/external/wpt/fetch/local-network-access/iframe.tentative.https.window.html [ Timeout ] crbug.com/626703 [ Mac10.15 ] virtual/keepalive-in-browser-migration/external/wpt/fetch/local-network-access/iframe.tentative.https.window.html [ Timeout ] @@ -2970,22 +2969,17 @@ crbug.com/626703 external/wpt/css/selectors/selectors-4/lang-015.html [ Failure ] crbug.com/626703 external/wpt/css/css-color/system-color-hightlights-vs-getSelection-001.html [ Failure ] crbug.com/626703 [ Linux ] external/wpt/mediacapture-record/MediaRecorder-mimetype.html [ Timeout ] -crbug.com/626703 [ Mac10.14 ] external/wpt/mediacapture-record/MediaRecorder-mimetype.html [ Timeout ] crbug.com/626703 [ Linux ] external/wpt/mediacapture-streams/MediaStreamTrack-MediaElement-disabled-video-is-black.https.html [ Timeout ] crbug.com/626703 [ Mac ] external/wpt/mediacapture-streams/MediaStreamTrack-MediaElement-disabled-video-is-black.https.html [ Timeout ] # `win-rel` fails but `win*-blink-rel` passes on this test. crbug.com/626703 [ Win ] external/wpt/mediacapture-streams/MediaStreamTrack-MediaElement-disabled-video-is-black.https.html [ Failure ] crbug.com/626703 external/wpt/svg/text/reftests/opacity.svg [ Failure ] crbug.com/626703 [ Linux ] external/wpt/webvtt/rendering/cues-with-video/processing-model/embedded_style_media_queries.html [ Failure ] -crbug.com/626703 [ Mac10.14 ] external/wpt/css/compositing/mix-blend-mode/mix-blend-mode-video-sibling.html [ Crash ] crbug.com/626703 [ Mac10.14 ] external/wpt/html/semantics/embedded-content/media-elements/preserves-pitch.html [ Crash Timeout ] crbug.com/1232504 [ Mac10.14 ] external/wpt/html/semantics/embedded-content/media-elements/ready-states/autoplay-hidden.optional.html [ Crash Timeout ] crbug.com/626703 [ Mac10.14 ] external/wpt/mediacapture-fromelement/capture.html [ Crash ] crbug.com/626703 [ Mac10.14 ] external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html [ Crash ] -crbug.com/626703 [ Mac10.14 ] external/wpt/video-rvfc/request-video-frame-callback-during-xr-session.https.html [ Crash Timeout ] crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-simulcast.https.html [ Crash ] -crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc/protocol/video-codecs.https.html [ Crash ] -crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc/simplecall.https.html [ Crash ] crbug.com/626703 external/wpt/css/css-fonts/font-size-adjust-013.html [ Failure ] crbug.com/626703 external/wpt/css/css-text/white-space/pre-wrap-align-center-001.html [ Failure ] crbug.com/626703 external/wpt/css/css-text/white-space/pre-wrap-align-center-002.html [ Failure ] @@ -3105,7 +3099,6 @@ crbug.com/626703 external/wpt/geolocation-API/enabled-on-self-origin-by-permissions-policy.https.sub.html [ Timeout ] crbug.com/626703 [ Linux ] external/wpt/shape-detection/detection-HTMLVideoElement.https.html [ Timeout ] crbug.com/626703 [ Linux ] external/wpt/webxr/ar-module/xrSession_interactionMode.https.html [ Timeout ] -crbug.com/1410224 [ Mac10.14 ] external/wpt/webxr/ar-module/xrSession_interactionMode.https.html [ Timeout ] crbug.com/626703 [ Linux ] external/wpt/webxr/dom-overlay/ar_dom_overlay.https.html [ Timeout ] crbug.com/626703 [ Linux ] external/wpt/webxr/dom-overlay/ar_dom_overlay_hit_test.https.html [ Timeout ] crbug.com/626703 [ Linux ] external/wpt/webxr/hit-test/ar_hittest_source_cancel.https.html [ Timeout ] @@ -3121,7 +3114,6 @@ crbug.com/626703 [ Linux ] wpt_internal/webxr/ar/ar_hittestsource_lifetimes.https.html [ Timeout ] crbug.com/626703 [ Linux ] wpt_internal/webxr/xrDevice_supportsSession_immersive.https.html [ Timeout ] crbug.com/626703 [ Linux ] wpt_internal/webxr/xrSession_dataProviderDisconnect_immersive.https.html [ Timeout ] -crbug.com/626703 [ Linux ] wpt_internal/webxr/xrSession_environmentProviderDisconnect.https.html [ Timeout ] crbug.com/626703 [ Mac11 ] external/wpt/fetch/local-network-access/iframe.tentative.https.window.html [ Timeout ] crbug.com/626703 [ Mac12 ] external/wpt/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-video.https.html [ Timeout ] crbug.com/626703 [ Mac12 ] virtual/pending-beacon/external/wpt/pending-beacon/pending_beacon-sendonhidden.tentative.https.window.html [ Timeout ] @@ -3251,7 +3243,6 @@ crbug.com/626703 external/wpt/websockets/cookies/003.html?wss&wpt_flags=https [ Failure ] crbug.com/626703 external/wpt/websockets/cookies/005.html?wss&wpt_flags=https [ Failure ] crbug.com/626703 external/wpt/websockets/cookies/007.html?wss&wpt_flags=https [ Failure ] -crbug.com/626703 [ Mac10.14 Release ] virtual/threaded/external/wpt/css/css-scroll-snap/input/keyboard.html [ Timeout ] crbug.com/626703 [ Mac ] external/wpt/preload/download-resources.html [ Failure Pass Timeout ] crbug.com/626703 external/wpt/uievents/keyboard/modifier-keys-combinations.html [ Timeout ] crbug.com/626703 external/wpt/uievents/keyboard/modifier-keys.html [ Timeout ] @@ -3515,8 +3506,10 @@ crbug.com/435547 http/tests/cachestorage/serviceworker/ignore-search-with-credentials.html [ Crash Failure Pass Timeout ] -crbug.com/1160916 virtual/threaded/external/wpt/css/css-backgrounds/border-bottom-left-radius-010.xht [ Failure Pass ] -crbug.com/1160916 external/wpt/css/css-backgrounds/border-bottom-left-radius-010.xht [ Failure Pass ] +crbug.com/1160916 [ Debug Mac13-arm64 ] virtual/threaded/external/wpt/css/css-backgrounds/border-bottom-left-radius-010.xht [ Failure Pass ] +crbug.com/1160916 [ Mac10.15 Release ] virtual/threaded/external/wpt/css/css-backgrounds/border-bottom-left-radius-010.xht [ Failure Pass ] +crbug.com/1160916 [ Debug Mac13-arm64 ] external/wpt/css/css-backgrounds/border-bottom-left-radius-010.xht [ Failure Pass ] +crbug.com/1160916 [ Mac10.15 Release ] external/wpt/css/css-backgrounds/border-bottom-left-radius-010.xht [ Failure Pass ] crbug.com/1160916 virtual/threaded/external/wpt/css/css-backgrounds/border-bottom-right-radius-010.xht [ Failure Pass ] crbug.com/1160916 external/wpt/css/css-backgrounds/border-bottom-right-radius-010.xht [ Failure Pass ] crbug.com/1160916 virtual/threaded/external/wpt/css/css-backgrounds/border-radius-clip-001.html [ Failure Pass ] @@ -4514,8 +4507,6 @@ crbug.com/1084637 compositing/video/video-reflection.html [ Failure Pass ] crbug.com/1083362 compositing/reflections/load-video-in-reflection.html [ Failure Pass ] -# Sheriff 2020-06-09 -crbug.com/1093003 [ Mac10.14 ] external/wpt/html/rendering/replaced-elements/embedded-content/cross-domain-iframe.sub.html [ Pass Timeout ] # Ecosystem-Infra Rotation 2020-06-15 crbug.com/924472 external/wpt/css/css-transforms/transform-box/cssbox-content-box.html [ Failure ] @@ -4874,13 +4865,10 @@ # For SkiaRenderer on MacOS crbug.com/1208173 [ Mac ] animations/animation-paused-hardware.html [ Failure ] crbug.com/1208173 [ Mac ] css3/filters/backdrop-filter-boundary.html [ Failure ] -crbug.com/1208173 [ Mac10.14 Release ] external/wpt/css/css-paint-api/background-image-alpha.https.html [ Failure ] crbug.com/1208173 [ Mac ] external/wpt/css/filter-effects/backdrop-filter-basic-opacity-2.html [ Failure ] -crbug.com/1208173 [ Mac10.14 Release ] external/wpt/css/filter-effects/css-filters-animation-opacity.html [ Failure ] crbug.com/1208173 [ Mac ] svg/custom/svg-root-with-opacity.html [ Failure ] crbug.com/1208173 [ Mac ] virtual/prefer_compositing_to_lcd_text/compositing/overflow/nested-render-surfaces-with-rotation.html [ Failure ] crbug.com/1208173 [ Mac ] virtual/scalefactor200/external/wpt/css/filter-effects/backdrop-filter-basic-opacity-2.html [ Failure ] -crbug.com/1208173 [ Mac10.14 Release ] virtual/scalefactor200/external/wpt/css/filter-effects/css-filters-animation-opacity.html [ Failure ] # Fix to unblock wpt-importer @@ -5116,8 +5104,6 @@ crbug.com/1231431 virtual/plz-dedicated-worker/external/wpt/html/cross-origin-embedder-policy/reporting-to-endpoint.https.html [ Failure ] # Sheriff 2021-07-22 -crbug.com/1231596 [ Mac10.13 ] external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-cues-sorted-before-dispatch.html [ Failure Pass ] -crbug.com/1231596 [ Mac10.14 ] external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-cues-sorted-before-dispatch.html [ Failure Pass Timeout ] crbug.com/1231596 [ Mac10.15 ] external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-cues-sorted-before-dispatch.html [ Failure Pass ] crbug.com/1231596 [ Mac11-arm64 ] external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-cues-sorted-before-dispatch.html [ Failure Pass ] crbug.com/1231596 [ Mac12 ] external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-cues-sorted-before-dispatch.html [ Failure Pass ] @@ -5345,7 +5331,6 @@ # Sheriff 2021-11-19 crbug.com/1186771 [ Debug Mac13-arm64 ] fast/scroll-snap/snaps-after-scrollbar-scrolling-track.html [ Crash ] -crbug.com/1186771 [ Mac10.14 Release ] fast/scroll-snap/snaps-after-scrollbar-scrolling-track.html [ Crash ] crbug.com/1186771 [ Mac10.15 Release ] fast/scroll-snap/snaps-after-scrollbar-scrolling-track.html [ Crash ] crbug.com/1186771 [ Mac11 Release ] fast/scroll-snap/snaps-after-scrollbar-scrolling-track.html [ Crash ] crbug.com/1186771 [ Mac11-arm64 Release ] fast/scroll-snap/snaps-after-scrollbar-scrolling-track.html [ Crash ] @@ -5598,7 +5583,6 @@ # Sheriff 2022-04-05 crbug.com/1313282 inspector-protocol/input/dispatchMouseEvent.js [ Failure Pass Timeout ] -crbug.com/1254163 [ Mac10.13 ] ietestcenter/css3/bordersbackgrounds/background-attachment-local-scrolling.htm [ Failure ] crbug.com/1194945 external/wpt/dom/events/scrolling/overscroll-event-fired-to-scrolled-element.html [ Failure Pass ] crbug.com/1244896 fast/mediacapturefromelement/CanvasCaptureMediaStream-set-size-too-large.html [ Failure Pass Timeout ] @@ -5981,7 +5965,6 @@ crbug.com/1406027 [ Win ] virtual/media-foundation-for-clear-dcomp/media/controls/overflow-menu-hide-on-resize.html [ Failure ] crbug.com/1289607 [ Linux ] external/wpt/cookie-store/cookieStore_subscribe_arguments.https.any.html [ Failure ] crbug.com/1408294 [ Debug Linux ] virtual/gpu/external/wpt/mediacapture-record/MediaRecorder-canvas-media-source.https.html [ Failure ] -crbug.com/1408800 [ Mac10.14 ] virtual/web-bluetooth-new-permissions-backend/external/wpt/bluetooth/requestDevice/canonicalizeFilter/empty-services-member.https.window.html [ Timeout ] crbug.com/1392781 [ Win ] http/tests/fetch/serviceworker-proxied/thorough/cors-preflight2-base-https-other-https.html [ Crash Failure Pass Timeout ] crbug.com/1392781 [ Win ] http/tests/fetch/serviceworker/thorough/auth-base-https-other-https.html [ Crash Failure Pass Timeout ] crbug.com/1392781 [ Win ] http/tests/fetch/window/thorough/auth-nocors-base-https-other-https.html [ Crash Failure Pass Timeout ] @@ -6550,10 +6533,6 @@ # TODO(crbug.com/1401396): Re-enable this test external/wpt/webrtc/simulcast/setParameters-active.https.html [ Pass Timeout ] -# Flaky CSP tests. To be re-enabled. -crbug.com/1400930 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-general.html [ Pass Timeout ] -crbug.com/1399780 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-nonces.html [ Pass Timeout ] - # TODO(crbug.com/1403877): Deflake this test. virtual/portals/http/tests/devtools/portals/portals-elements-nesting.js [ Failure Pass ] @@ -6631,9 +6610,6 @@ # Sheriff 2023-03-27 crbug.com/1427936 external/wpt/js-self-profiling/function-expression-names.https.html [ Crash Failure Pass ] -# Flaky on Mac14.10 -crbug.com/1384162 [ Mac10.14 ] external/wpt/css/css-fonts/matching/range-descriptor-reversed.html [ Pass Timeout ] -crbug.com/1384162 [ Mac10.14 ] external/wpt/css/css-fonts/matching/style-ranges-over-weight-direction.html [ Pass Timeout ] # TODO(crbug.com/1428795): Re-enable this test crbug.com/1428795 [ Linux ] external/wpt/dom/events/Event-dispatch-on-disabled-elements.html [ Failure Pass ] @@ -6676,7 +6652,6 @@ # Flake suppressor for Mac12 Tests (dbg) builder 2023-04-26 [ Debug Mac12 ] compositing/video/video-controls-squashing.html [ Failure ] [ Debug Mac12 ] editing/selection/caret-at-bidi-boundary.html [ Failure ] -[ Debug Mac12 ] external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_inline.html [ Failure ] [ Debug Mac12 ] external/wpt/content-security-policy/inheritance/history-iframe.sub.html [ Failure ] [ Debug Mac12 ] external/wpt/cookies/attributes/domain.sub.html [ Failure ] [ Debug Mac12 ] external/wpt/credential-management/fedcm-network-requests.https.html [ Failure ] @@ -6783,7 +6758,7 @@ crbug.com/1443871 [ Mac10.15 ] virtual/text-antialias/mac-system-ui-weight.html [ Failure ] # Sheriff 2023-05-11 -crbug.com/1444592 [ Linux ] external/wpt/js-self-profiling/function-anonymous-names.https.html [ Failure ] +crbug.com/1444592 [ Debug Linux ] external/wpt/js-self-profiling/function-anonymous-names.https.html [ Failure ] # Fails on win-10-rel (only) with no stack trace or other help crbug.com/1444368 [ Win ] fast/selectors/specificity-overflow.html [ Crash Pass ] @@ -6802,8 +6777,8 @@ crbug.com/1446026 [ Mac13 ] webaudio/AudioWorkletProcessor/invalid-audioworkletprocessor-constructor.html [ Crash Failure ] crbug.com/1446026 [ Mac13 ] webaudio/internals/audioworkletnode-gc.https.html [ Crash Failure ] crbug.com/1446026 [ Mac13 ] webaudio/internals/audioworkletprocessor-gc.https.html [ Crash Failure ] -crbug.com/1446037 [ Mac13 Debug ] external/wpt/css/css-sizing/min-content-negative-margin-crash.html [ Timeout ] -crbug.com/1446037 [ Mac13 Debug ] external/wpt/css/css-tables/crashtests/textarea-intrinsic-size-crash.html [ Timeout ] +crbug.com/1446037 [ Debug Mac13 ] external/wpt/css/css-sizing/min-content-negative-margin-crash.html [ Timeout ] +crbug.com/1446037 [ Debug Mac13 ] external/wpt/css/css-tables/crashtests/textarea-intrinsic-size-crash.html [ Timeout ] crbug.com/1446037 [ Mac13 ] external/wpt/html/semantics/embedded-content/the-canvas-element/security.pattern.fillStyle.sub.html [ Failure Pass ] crbug.com/1446038 [ Mac13 ] external/wpt/webaudio/idlharness.https.window.html [ Crash Failure ] crbug.com/1446038 [ Mac13 ] external/wpt/webaudio/the-audio-api/the-audiobuffersourcenode-interface/active-processing.https.html [ Crash Failure ] @@ -6831,3 +6806,7 @@ crbug.com/1446038 [ Mac13 ] external/wpt/webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/no-cors.https.html [ Crash Failure ] crbug.com/1446039 [ Mac13 ] external/wpt/webtransport/streams-close.https.any.html [ Failure Pass ] crbug.com/1446040 [ Mac13 ] virtual/oopr-canvas2d/external/wpt/mediacapture-record/MediaRecorder-canvas-media-source.https.html [ Failure ] + +crbug.com/1446742 virtual/gpu/fast/canvas/canvas-drawImage-svg.html [ Pass Failure ] +crbug.com/1446742 virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-svg.html [ Pass Failure ] +crbug.com/1446742 virtual/no-alloc-direct-call/fast/canvas/canvas-drawImage-svg.html [ Pass Failure ]
diff --git a/third_party/blink/web_tests/VIRTUAL_OWNERS b/third_party/blink/web_tests/VIRTUAL_OWNERS index 1e778243..6b2de1d8 100644 --- a/third_party/blink/web_tests/VIRTUAL_OWNERS +++ b/third_party/blink/web_tests/VIRTUAL_OWNERS
@@ -33,6 +33,7 @@ andruud@chromium.org dom@chromium.org +flackr@chromium.org ikilpatrick@chromium.org kojii@chromium.org masonf@chromium.org
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites index 784ee17..3dedaf5 100644 --- a/third_party/blink/web_tests/VirtualTestSuites +++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -197,7 +197,8 @@ "bases": ["fast/scroll-behavior", "fast/scroll-snap", "fast/scrolling", - "external/wpt/css/cssom-view"], + "external/wpt/css/cssom-view", + "external/wpt/scroll-animations"], "exclusive_tests": ["fast/scrolling/scrollbars/mouse-scrolling-on-div-scrollbar-thumb-scaled.html"], "args": ["--enable-threaded-compositing", "--enable-prefer-compositing-to-lcd-text"],
diff --git a/third_party/blink/web_tests/accessibility/details-summary-crash-expected.txt b/third_party/blink/web_tests/accessibility/details-summary-crash-expected.txt index 15d8618..0b44f3d 100644 --- a/third_party/blink/web_tests/accessibility/details-summary-crash-expected.txt +++ b/third_party/blink/web_tests/accessibility/details-summary-crash-expected.txt
@@ -1,3 +1,27 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. This test passes if it doesn't crash. summary 1 summary 1
diff --git a/third_party/blink/web_tests/dom/attr/id-update-map-crash-expected.txt b/third_party/blink/web_tests/dom/attr/id-update-map-crash-expected.txt index d1940e3..49ee609 100644 --- a/third_party/blink/web_tests/dom/attr/id-update-map-crash-expected.txt +++ b/third_party/blink/web_tests/dom/attr/id-update-map-crash-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. This test passes if the renderer does not crash.
diff --git a/third_party/blink/web_tests/dom/node/DOMNodeRemovedEvent-expected.txt b/third_party/blink/web_tests/dom/node/DOMNodeRemovedEvent-expected.txt index 9945552..a088c24 100644 --- a/third_party/blink/web_tests/dom/node/DOMNodeRemovedEvent-expected.txt +++ b/third_party/blink/web_tests/dom/node/DOMNodeRemovedEvent-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. This test checks that DOMNodeRemovedEvent is emitted once (and only once). On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/dom/node/fragment-mutation-expected.txt b/third_party/blink/web_tests/dom/node/fragment-mutation-expected.txt index 39fd153..2e7ddc4 100644 --- a/third_party/blink/web_tests/dom/node/fragment-mutation-expected.txt +++ b/third_party/blink/web_tests/dom/node/fragment-mutation-expected.txt
@@ -1,3 +1,9 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. This test creates a fragment containing three elements: "B", "U", and "P", attempts to appendChild this fragment and studies effects of mutation events on the fragment. Inserting an element in front of the next item in fragment should not affect the result: PASS
diff --git a/third_party/blink/web_tests/dom/node/textContent-single-DOMSubtreeModified-expected.html b/third_party/blink/web_tests/dom/node/textContent-single-DOMSubtreeModified-expected.html deleted file mode 100644 index c25534ac..0000000 --- a/third_party/blink/web_tests/dom/node/textContent-single-DOMSubtreeModified-expected.html +++ /dev/null
@@ -1,2 +0,0 @@ -<!doctype html> -<div id="test">PASS</div>
diff --git a/third_party/blink/web_tests/dom/node/textContent-single-DOMSubtreeModified-expected.txt b/third_party/blink/web_tests/dom/node/textContent-single-DOMSubtreeModified-expected.txt new file mode 100644 index 0000000..15cec15 --- /dev/null +++ b/third_party/blink/web_tests/dom/node/textContent-single-DOMSubtreeModified-expected.txt
@@ -0,0 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +PASS
diff --git a/third_party/blink/web_tests/dom/node/textContent-single-DOMSubtreeModified.html b/third_party/blink/web_tests/dom/node/textContent-single-DOMSubtreeModified.html index e87fb59..16897bc 100644 --- a/third_party/blink/web_tests/dom/node/textContent-single-DOMSubtreeModified.html +++ b/third_party/blink/web_tests/dom/node/textContent-single-DOMSubtreeModified.html
@@ -1,5 +1,6 @@ <!doctype html> <script> +testRunner.dumpAsText(); onload = function () { var testElement = document.querySelector('#test'); var i=0;
diff --git a/third_party/blink/web_tests/editing/deleting/delete-key-crash-expected.txt b/third_party/blink/web_tests/editing/deleting/delete-key-crash-expected.txt index 0724b25..1094abd 100644 --- a/third_party/blink/web_tests/editing/deleting/delete-key-crash-expected.txt +++ b/third_party/blink/web_tests/editing/deleting/delete-key-crash-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASS if not crashed
diff --git a/third_party/blink/web_tests/editing/deleting/delete-node-after-DOMNodeRemoved-expected.txt b/third_party/blink/web_tests/editing/deleting/delete-node-after-DOMNodeRemoved-expected.txt index c575c22..4458bbfd 100644 --- a/third_party/blink/web_tests/editing/deleting/delete-node-after-DOMNodeRemoved-expected.txt +++ b/third_party/blink/web_tests/editing/deleting/delete-node-after-DOMNodeRemoved-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. This tests for a bug where delete would crash if a node just after the selection to delete is removed in a DOMNodeRemoved event handler for the last node in the selection to delete. <rdar://problem/5156801> foo
diff --git a/third_party/blink/web_tests/editing/execCommand/5120591-expected.txt b/third_party/blink/web_tests/editing/execCommand/5120591-expected.txt index fe3e296..1e51ebe 100644 --- a/third_party/blink/web_tests/editing/execCommand/5120591-expected.txt +++ b/third_party/blink/web_tests/editing/execCommand/5120591-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Tests for a crash when creating a link inside a region with a subtree modified event listener. This should be a link.
diff --git a/third_party/blink/web_tests/editing/execCommand/editing-command-while-executing-typing-command-crash-expected.txt b/third_party/blink/web_tests/editing/execCommand/editing-command-while-executing-typing-command-crash-expected.txt index dcb9e340..574b1e6 100644 --- a/third_party/blink/web_tests/editing/execCommand/editing-command-while-executing-typing-command-crash-expected.txt +++ b/third_party/blink/web_tests/editing/execCommand/editing-command-while-executing-typing-command-crash-expected.txt
@@ -1,2 +1,3 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. This tests executing an editing command while executing a typing command. PASS
diff --git a/third_party/blink/web_tests/editing/execCommand/insert-ordered-list-crash-expected.txt b/third_party/blink/web_tests/editing/execCommand/insert-ordered-list-crash-expected.txt index 0eb9b06..81e97ea 100644 --- a/third_party/blink/web_tests/editing/execCommand/insert-ordered-list-crash-expected.txt +++ b/third_party/blink/web_tests/editing/execCommand/insert-ordered-list-crash-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Should not crash if we load a test case from crbug.com/344280. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/editing/execCommand/insertHTML-mutation-crash-expected.txt b/third_party/blink/web_tests/editing/execCommand/insertHTML-mutation-crash-expected.txt index 9ceb737..3147704 100644 --- a/third_party/blink/web_tests/editing/execCommand/insertHTML-mutation-crash-expected.txt +++ b/third_party/blink/web_tests/editing/execCommand/insertHTML-mutation-crash-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASS: No crash.
diff --git a/third_party/blink/web_tests/editing/execCommand/window-open-insert-list-crash-expected.txt b/third_party/blink/web_tests/editing/execCommand/window-open-insert-list-crash-expected.txt index c2f6648..ecf7d614 100644 --- a/third_party/blink/web_tests/editing/execCommand/window-open-insert-list-crash-expected.txt +++ b/third_party/blink/web_tests/editing/execCommand/window-open-insert-list-crash-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. CONSOLE WARNING: We don't execute document.execCommand() this time, because it is called recursively. CONSOLE WARNING: We don't execute document.execCommand() this time, because it is called recursively. CONSOLE WARNING: We don't execute document.execCommand() this time, because it is called recursively.
diff --git a/third_party/blink/web_tests/editing/inserting/delete-insignificant-text-crash-expected.txt b/third_party/blink/web_tests/editing/inserting/delete-insignificant-text-crash-expected.txt index af609de..3b1bcc4 100644 --- a/third_party/blink/web_tests/editing/inserting/delete-insignificant-text-crash-expected.txt +++ b/third_party/blink/web_tests/editing/inserting/delete-insignificant-text-crash-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. This tests deleting a node in DOMCharacterDataModified doesn't result in a crash. PASS
diff --git a/third_party/blink/web_tests/editing/inserting/insert-html-crash-expected.txt b/third_party/blink/web_tests/editing/inserting/insert-html-crash-expected.txt index 61754d4..f7dae52b 100644 --- a/third_party/blink/web_tests/editing/inserting/insert-html-crash-expected.txt +++ b/third_party/blink/web_tests/editing/inserting/insert-html-crash-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASS successfullyParsed is true TEST COMPLETE
diff --git a/third_party/blink/web_tests/editing/inserting/insert-paragraph-separator-crash-expected.txt b/third_party/blink/web_tests/editing/inserting/insert-paragraph-separator-crash-expected.txt index 2afa0bfd..448a42b 100644 --- a/third_party/blink/web_tests/editing/inserting/insert-paragraph-separator-crash-expected.txt +++ b/third_party/blink/web_tests/editing/inserting/insert-paragraph-separator-crash-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASS. WebKit didn't crash.
diff --git a/third_party/blink/web_tests/editing/inserting/insert-with-mutation-event-expected.txt b/third_party/blink/web_tests/editing/inserting/insert-with-mutation-event-expected.txt index 66146b5..042f5247 100644 --- a/third_party/blink/web_tests/editing/inserting/insert-with-mutation-event-expected.txt +++ b/third_party/blink/web_tests/editing/inserting/insert-with-mutation-event-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASS; NOT CRASHED
diff --git a/third_party/blink/web_tests/editing/pasteboard/drag-and-drop-image-contenteditable-expected.txt b/third_party/blink/web_tests/editing/pasteboard/drag-and-drop-image-contenteditable-expected.txt index 185e4ab..022690b 100644 --- a/third_party/blink/web_tests/editing/pasteboard/drag-and-drop-image-contenteditable-expected.txt +++ b/third_party/blink/web_tests/editing/pasteboard/drag-and-drop-image-contenteditable-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. This test verify dragging an image in the page keeps its attributes. To test manually, drag the image and drop it in the rect with a blue border. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/editing/pasteboard/drag-and-drop-inputimage-contenteditable-expected.txt b/third_party/blink/web_tests/editing/pasteboard/drag-and-drop-inputimage-contenteditable-expected.txt index 7ec2bff..b3f5d35b 100644 --- a/third_party/blink/web_tests/editing/pasteboard/drag-and-drop-inputimage-contenteditable-expected.txt +++ b/third_party/blink/web_tests/editing/pasteboard/drag-and-drop-inputimage-contenteditable-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. This test verify dragging an image in the page keeps its attributes. To test manually, drag the image and drop it in the rect with a blue border. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/editing/pasteboard/drag-and-drop-objectimage-contenteditable-expected.txt b/third_party/blink/web_tests/editing/pasteboard/drag-and-drop-objectimage-contenteditable-expected.txt index 7c47c02..fb6a062 100644 --- a/third_party/blink/web_tests/editing/pasteboard/drag-and-drop-objectimage-contenteditable-expected.txt +++ b/third_party/blink/web_tests/editing/pasteboard/drag-and-drop-objectimage-contenteditable-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. This test verifies dropping an image does nothing. To test manually, drag the image and drop it in the rect with a blue border. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/editing/selection/crash-on-drag-with-mutation-events-expected.txt b/third_party/blink/web_tests/editing/selection/crash-on-drag-with-mutation-events-expected.txt index b45728fa..b2ca68b 100644 --- a/third_party/blink/web_tests/editing/selection/crash-on-drag-with-mutation-events-expected.txt +++ b/third_party/blink/web_tests/editing/selection/crash-on-drag-with-mutation-events-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASSED, no crash
diff --git a/third_party/blink/web_tests/editing/selection/deleteFromDocument-scoped-dispatch-event-crash-expected.txt b/third_party/blink/web_tests/editing/selection/deleteFromDocument-scoped-dispatch-event-crash-expected.txt index 47db8a3..9fd83e6 100644 --- a/third_party/blink/web_tests/editing/selection/deleteFromDocument-scoped-dispatch-event-crash-expected.txt +++ b/third_party/blink/web_tests/editing/selection/deleteFromDocument-scoped-dispatch-event-crash-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Should not crash if we load a test case from crbug.com/339186. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/editing/selection/selection-forces-unrooted-repaint-expected.txt b/third_party/blink/web_tests/editing/selection/selection-forces-unrooted-repaint-expected.txt index b2c2aa9..1e0bf2b 100644 --- a/third_party/blink/web_tests/editing/selection/selection-forces-unrooted-repaint-expected.txt +++ b/third_party/blink/web_tests/editing/selection/selection-forces-unrooted-repaint-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Test passes if no crash.
diff --git a/third_party/blink/web_tests/editing/style/apply-style-crash3-expected.txt b/third_party/blink/web_tests/editing/style/apply-style-crash3-expected.txt index 03917b5..8a92e92 100644 --- a/third_party/blink/web_tests/editing/style/apply-style-crash3-expected.txt +++ b/third_party/blink/web_tests/editing/style/apply-style-crash3-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Verify that changing the style over an unknown element does not crash. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/editing/style/apply-style-join-child-text-nodes-crash-expected.txt b/third_party/blink/web_tests/editing/style/apply-style-join-child-text-nodes-crash-expected.txt index 61754d4..f7dae52b 100644 --- a/third_party/blink/web_tests/editing/style/apply-style-join-child-text-nodes-crash-expected.txt +++ b/third_party/blink/web_tests/editing/style/apply-style-join-child-text-nodes-crash-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASS successfullyParsed is true TEST COMPLETE
diff --git a/third_party/blink/web_tests/editing/style/bold-with-dom-changes-expected.txt b/third_party/blink/web_tests/editing/style/bold-with-dom-changes-expected.txt index 2b3950b..8958b7f 100644 --- a/third_party/blink/web_tests/editing/style/bold-with-dom-changes-expected.txt +++ b/third_party/blink/web_tests/editing/style/bold-with-dom-changes-expected.txt
@@ -1,2 +1,3 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. This test verifies that deleting DOM elements in a DOMSubtreeModified handler triggered by and execCommand('bold') does not produce a crash. PASS
diff --git a/third_party/blink/web_tests/editing/undo/undo-after-event-edited-expected.txt b/third_party/blink/web_tests/editing/undo/undo-after-event-edited-expected.txt index d8577f5e..cee5404 100644 --- a/third_party/blink/web_tests/editing/undo/undo-after-event-edited-expected.txt +++ b/third_party/blink/web_tests/editing/undo/undo-after-event-edited-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. CONSOLE WARNING: We don't execute document.execCommand() this time, because it is called recursively. CONSOLE WARNING: We don't execute document.execCommand() this time, because it is called recursively. Pass. Test didn't crash.
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 3186506..bf561280 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
@@ -84245,6 +84245,32 @@ {} ] ], + "color-mix-currentcolor-background-repaint-parent.html": [ + "44399c198862837fcf5f25e9af0cb83c8e62f9cf", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "color-mix-currentcolor-background-repaint.html": [ + "a8f742b6c53effac1e23491fc5a3843c90a82129", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "color-mix-currentcolor-border-repaint-parent.html": [ "5182dd8d0fbd968bff3931a0a32884d7aa4cf6f2", [ @@ -84271,6 +84297,32 @@ {} ] ], + "color-mix-currentcolor-outline-repaint-parent.html": [ + "0d434b1d351e9853426fe99d7f889649eaceda10", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "color-mix-currentcolor-outline-repaint.html": [ + "8892d818f9bbda92b02404347586d5c953d4793c", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "css-border-radius-001.html": [ "8b0e2e9a36c67393f0497b174784c5245cee1d7c", [ @@ -136080,6 +136132,19 @@ ], {} ] + ], + "writing-directions-002.html": [ + "078d5808b04ad21ce4ed0814691d2842ccd8bc57", + [ + null, + [ + [ + "/css/css-grid/subgrid/writing-directions-002-ref.html", + "==" + ] + ], + {} + ] ] }, "table-grid-item-dynamic-001.html": [ @@ -251980,6 +252045,97 @@ {} ] ], + "2d.layer.render-opportunities.createImageBitmap.html": [ + "4ffcaa3e3c0defe2355eb9c2d8a6886a5c2e097a", + [ + null, + [ + [ + "/html/canvas/element/layers/2d.layer.render-opportunities.createImageBitmap-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.drawImage.html": [ + "4eb0b6f721b974e013e18fabc9d283ce2b13d20c", + [ + null, + [ + [ + "/html/canvas/element/layers/2d.layer.render-opportunities.drawImage-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.getImageData.html": [ + "3cf514a03f4f626133733245ce297e2def1d3252", + [ + null, + [ + [ + "/html/canvas/element/layers/2d.layer.render-opportunities.getImageData-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.putImageData.html": [ + "8da3dafbb7c1d1c16eb357be595bf6c29f7b4a90", + [ + null, + [ + [ + "/html/canvas/element/layers/2d.layer.render-opportunities.putImageData-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.requestAnimationFrame.html": [ + "889ff5ba09cdf89ec31cc4fbb2d6fb2475a8c552", + [ + null, + [ + [ + "/html/canvas/element/layers/2d.layer.render-opportunities.requestAnimationFrame-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.toBlob.html": [ + "908730424a8de315866b819f4f7b3a393a3c0abc", + [ + null, + [ + [ + "/html/canvas/element/layers/2d.layer.render-opportunities.toBlob-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.toDataURL.html": [ + "152f66a12b3d7d1d94c752a364f5ec9adaeb0269", + [ + null, + [ + [ + "/html/canvas/element/layers/2d.layer.render-opportunities.toDataURL-expected.html", + "==" + ] + ], + {} + ] + ], "2d.layer.restore-style.html": [ "2537f409d6d99e0175667725ffedd5c384071864", [ @@ -252037,6 +252193,19 @@ ] } ] + ], + "2d.layer.unclosed.html": [ + "788889ee7ef1ca5fe1b33dd011dafa10e9d141df", + [ + null, + [ + [ + "/html/canvas/element/layers/2d.layer.unclosed-expected.html", + "==" + ] + ], + {} + ] ] }, "manual": { @@ -253753,6 +253922,162 @@ {} ] ], + "2d.layer.render-opportunities.convertToBlob.html": [ + "c1a139a3de8db540284dd7100f11232ccc9aed10", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.convertToBlob.w.html": [ + "404fef3ad6a597ed99a1a66be6e3ff5264644d02", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.createImageBitmap.html": [ + "876b027170edc6d2021dd233299b4256c73b9a92", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.createImageBitmap.w.html": [ + "9a89492e399222bc9252ec92c3336098dc07e070", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.drawImage.html": [ + "dd178206073801c5e0eafda4abc39f25ef4bac71", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.drawImage.w.html": [ + "80fbfbd272ed7ee29497f6a6989a94113c07f5ca", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.getImageData.html": [ + "b6f3c1b5626ffb0f7e75eaadea73651baf3b48de", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.getImageData.w.html": [ + "187eb0fce96bff4c105ce154c1b101a24b3095f1", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.putImageData.html": [ + "b4600156136c3aadb98db5e6a9de4beb54a95a69", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.putImageData.w.html": [ + "9ffac071c36b2e2f85280be0ba511c664e0a42e2", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.transferToImageBitmap.html": [ + "27830644b0553d125995a87055b65b752cfd5b41", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.render-opportunities.transferToImageBitmap.w.html": [ + "06e016020db2ed99a47b1c8c336b168735a973ca", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap-expected.html", + "==" + ] + ], + {} + ] + ], "2d.layer.restore-style.html": [ "a3593cd2a82748df9db8bd74a67dbc29dcaefb31", [ @@ -253868,6 +254193,32 @@ ] } ] + ], + "2d.layer.unclosed.html": [ + "689ee801cf27dcb8b61e9e89c5655a31708d689b", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.unclosed-expected.html", + "==" + ] + ], + {} + ] + ], + "2d.layer.unclosed.w.html": [ + "0c7812e88c7bd34d18ebee8c8730547a4295fe30", + [ + null, + [ + [ + "/html/canvas/offscreen/layers/2d.layer.unclosed-expected.html", + "==" + ] + ], + {} + ] ] } } @@ -272215,11 +272566,11 @@ "support": { ".cache": { "gitignore2.json": [ - "ce9241589403c2fc91426480419b47dff9566b07", + "b98f54f069c1329d6bdfa1c6d965b0a3a3d90438", [] ], "mtime.json": [ - "8765b246b2c24c1f67e50b8cfcaf93f7dda8c7c3", + "ccc9e5e8eda2da09d4c1a547df62ea477ca75819", [] ] }, @@ -275298,6 +275649,10 @@ [] ] }, + "accept-ch.wildcard.https.sub.html.sub.headers": [ + "66ad9243c7dc54e59052fa4fe64124cd63d0e84e", + [] + ], "critical-ch": { "request-count.https.window.js.ini": [ "9750a6e892e8e7127cafe8823fffd477900bef94", @@ -275483,6 +275838,14 @@ "f5beb4c3654c53ed136374519516505593b24a0b", [] ], + "accept-ch.wildcard.iframe.https.sub.html": [ + "250a9d9e2247db9c9d8bd65e11141ff2e4ff5087", + [] + ], + "accept-ch.wildcard.iframe.https.sub.html.sub.headers": [ + "c1c0fcd5c2ae6298f124de4ec74a05bd29d47ea8", + [] + ], "clienthintslist.py": [ "3d1f7caf4680fcdff15995aa08a31630f547e8f6", [] @@ -276783,7 +277146,7 @@ [] ], "testharness-helper.sub.js": [ - "4adc52169612c91237460e9f6b04fc86171eba6d", + "7d2307ebbc974446d59fd7b023fe9f7ce088c193", [] ] } @@ -279369,6 +279732,10 @@ "72fa50e66ebf5b552e930f63ce06e93298f1fdcb", [] ], + "list-cookies-for-script.py": [ + "b325d1f7450faaf9a932b48f8699a49a7221f88f", + [] + ], "list.py": [ "4cb6639659abb611a5f3245f4e437f2544664b24", [] @@ -279844,6 +280211,10 @@ "2ea5cc8b91d349c40df1e8a0ee03f3b4c6a2557b", [] ], + "background-022.xht.ini": [ + "b94a73473cf6103ff48b6df0eca630d413ca558c", + [] + ], "background-026-ref.xht": [ "028757ca371809ae4ac88c4dd5d5b8f119529e08", [] @@ -282612,6 +282983,10 @@ "00fc8fe6b7b558fe49c44b35f5fc3364f3bea072", [] ], + "floats-wrap-bfc-001-right-overflow.xht.ini": [ + "f57db9eb691ca49f7368e956ccb5c39a02383bb7", + [] + ], "floats-wrap-bfc-001-right-table-ref.xht": [ "0b98fa080f3315b90395a4d3ad89a1c36b54fc41", [] @@ -289347,6 +289722,30 @@ "10324966edb042c1c7298ce22dad76766c2a777b", [] ], + "color-mix-currentcolor-background-repaint-expected.xht": [ + "05a13794482a94f6c10bd9d4c98704e63ef60331", + [] + ], + "color-mix-currentcolor-background-repaint-parent-expected.xht": [ + "05a13794482a94f6c10bd9d4c98704e63ef60331", + [] + ], + "color-mix-currentcolor-background-repaint-parent.html.ini": [ + "ea362eff183317ffc0919c6ae727160906cbc850", + [] + ], + "color-mix-currentcolor-outline-repaint-expected.xht": [ + "05a13794482a94f6c10bd9d4c98704e63ef60331", + [] + ], + "color-mix-currentcolor-outline-repaint-parent-expected.xht": [ + "05a13794482a94f6c10bd9d4c98704e63ef60331", + [] + ], + "color-mix-currentcolor-outline-repaint-parent.html.ini": [ + "1c0bd8a1e3a997a5ba8c741773128a76585583f8", + [] + ], "css-border-radius-001.html.ini": [ "109ddfb9a6bb8b8c7ff553d39a0f86da152efaa7", [] @@ -307721,6 +308120,10 @@ "writing-directions-001-ref.html": [ "90612516889e8feb5b5b0ce6820b44d8531ab8be", [] + ], + "writing-directions-002-ref.html": [ + "cd1ee527ab1053bc5aa4b3e10466b09cfaa605e0", + [] ] }, "support": { @@ -311083,7 +311486,7 @@ [] ], "clip-path-document-element-will-change.html.ini": [ - "6c9f43aa148af94811aa5ed403d664d38b9eb50b", + "2ad544e0901818581b06255c9f46588685ce4710", [] ], "clip-path-element-userSpaceOnUse-003.html.ini": [ @@ -323347,7 +323750,7 @@ [] ], "text-transform-capitalize-007.html.ini": [ - "59933dbf456a7ffd32f3db8b49c5342f05034449", + "9edfbd87cbb5246167786c021d89d6c6f4a2e334", [] ], "text-transform-capitalize-009.html.ini": [ @@ -323358,6 +323761,10 @@ "52f0349faf6e1b203b0dbf208b1195a7ab0ceaf5", [] ], + "text-transform-capitalize-011.html.ini": [ + "1391e15d18006567e3cef3b72cb9233283c5ffb3", + [] + ], "text-transform-capitalize-014.html.ini": [ "4080d27f0bc429516e18336bf4fff03742a3a083", [] @@ -329649,7 +330056,7 @@ [] ], "kind-of-widget-fallback-input-search-border-start-start-radius-001.html.ini": [ - "0c9ed13930a5fa9a4a7978088c7bbf731290d3af", + "932853391b78cdba80cd779abc1a50ca3034c7cb", [] ], "kind-of-widget-fallback-input-search-border-top-color-001.html.ini": [ @@ -329712,6 +330119,10 @@ "b186f227e4d9c0a2e083e1db4bb0b8d439ad42a8", [] ], + "kind-of-widget-fallback-input-search-text-border-bottom-color-001.html.ini": [ + "71bccd7de6d205ba3d4c98b3a76d7c4ddd586a2e", + [] + ], "kind-of-widget-fallback-input-search-text-border-bottom-left-radius-001.html.ini": [ "9d37fdd0c88c9339108a74b2db534e9f58bb6697", [] @@ -330316,6 +330727,10 @@ "80bbbdb712546ad4e5705ab2e2622ee889985b77", [] ], + "kind-of-widget-fallback-textarea-border-top-style-001.html.ini": [ + "c626880fbd5cf4f99827c84e72a30427f00ea52a", + [] + ], "kind-of-widget-fallback-textarea-border-top-width-001.html.ini": [ "f7e8bfa755ee6b0da9a7d366848455598f3852dd", [] @@ -337001,6 +337416,10 @@ "acdf050313697e97083ca28655e079a641c3d394", [] ], + "backdrop-filters-opacity.html.ini": [ + "07002e42106132c80e38d42a5666411f0147edab", + [] + ], "backdrop-filters-saturate-ref.html": [ "f3407f344906e0a3e362a7d18c35e7fad9a6068e", [] @@ -337073,6 +337492,10 @@ "9d4efb433e08dadac9e9d69b3f7e7e7791d2d002", [] ], + "css-backdrop-filters-animation-invert.html.ini": [ + "73347d4c6195d54d7ac8a42478eadf1cfe94439c", + [] + ], "css-backdrop-filters-animation-opacity-ref.html": [ "d95b01ab4cb2c355dbf8c9c41b622d767a13bd94", [] @@ -350056,18 +350479,6 @@ "8b258500c2d6e9834ccb712dba9a70a99a987570", [] ], - "FileSystemDirectoryHandle-removeEntry.https.any-expected.txt": [ - "cc38797fcf4c0281d60a289a06c01a0d17c3b236", - [] - ], - "FileSystemDirectoryHandle-removeEntry.https.any.js.ini": [ - "520d00feaec82704d376c619984df6df0b69fde7", - [] - ], - "FileSystemDirectoryHandle-removeEntry.https.any.worker-expected.txt": [ - "cc38797fcf4c0281d60a289a06c01a0d17c3b236", - [] - ], "META.yml": [ "23d7765cdfa39689ef72ae6a0beb15b8b4292ecd", [] @@ -354739,6 +355150,34 @@ "65525d4d6a23db56e5717147a60fa8e22d0519a2", [] ], + "2d.layer.render-opportunities.createImageBitmap-expected.html": [ + "8ce0c51e8e4f8dbea647b19b75b86c0e53415b25", + [] + ], + "2d.layer.render-opportunities.drawImage-expected.html": [ + "1ddc6d1b44964c2fe9708be8a7cc9262eea3273a", + [] + ], + "2d.layer.render-opportunities.getImageData-expected.html": [ + "ea0e78e0f28b02dffada148b1cb0872bfc6b7a26", + [] + ], + "2d.layer.render-opportunities.putImageData-expected.html": [ + "3d63bbe776672c9af514714ca96446179eb72eb2", + [] + ], + "2d.layer.render-opportunities.requestAnimationFrame-expected.html": [ + "138f3a7ccbb11c075119245fdbce9e9feba7265f", + [] + ], + "2d.layer.render-opportunities.toBlob-expected.html": [ + "fda8e8d7c6da225d60ef5de884ba4cbd2d5117c1", + [] + ], + "2d.layer.render-opportunities.toDataURL-expected.html": [ + "22a9770331d82a0965e6f06f4f98dfe8c681da09", + [] + ], "2d.layer.restore-style-expected.html": [ "1d0ac3558d1d4c15609c364a6e5678ed329fa272", [] @@ -354746,6 +355185,10 @@ "2d.layer.several-complex-expected.html": [ "84ad6244740e997d62cd0bdf4f017a7a6c15d713", [] + ], + "2d.layer.unclosed-expected.html": [ + "c41b253c95ba2b4f970b6ae59b58e444df14d866", + [] ] }, "manual": { @@ -355893,6 +356336,30 @@ "65525d4d6a23db56e5717147a60fa8e22d0519a2", [] ], + "2d.layer.render-opportunities.convertToBlob-expected.html": [ + "1e61775165527caed9da4cb1cde38f6a09438904", + [] + ], + "2d.layer.render-opportunities.createImageBitmap-expected.html": [ + "8ce0c51e8e4f8dbea647b19b75b86c0e53415b25", + [] + ], + "2d.layer.render-opportunities.drawImage-expected.html": [ + "1ddc6d1b44964c2fe9708be8a7cc9262eea3273a", + [] + ], + "2d.layer.render-opportunities.getImageData-expected.html": [ + "ea0e78e0f28b02dffada148b1cb0872bfc6b7a26", + [] + ], + "2d.layer.render-opportunities.putImageData-expected.html": [ + "3d63bbe776672c9af514714ca96446179eb72eb2", + [] + ], + "2d.layer.render-opportunities.transferToImageBitmap-expected.html": [ + "2833849da67f06693a228d9d3cec8c5ba56c8a8c", + [] + ], "2d.layer.restore-style-expected.html": [ "1d0ac3558d1d4c15609c364a6e5678ed329fa272", [] @@ -355900,6 +356367,10 @@ "2d.layer.several-complex-expected.html": [ "84ad6244740e997d62cd0bdf4f017a7a6c15d713", [] + ], + "2d.layer.unclosed-expected.html": [ + "c41b253c95ba2b4f970b6ae59b58e444df14d866", + [] ] }, "manual": { @@ -356263,7 +356734,7 @@ [] ], "templates-new.yaml": [ - "581c1d710cf6f7f3c41687558073f1128e6c6047", + "7d8ebfccf565a293138aecc3eaecc54d0176c573", [] ], "templates.yaml": [ @@ -356354,7 +356825,7 @@ [] ], "layers.yaml": [ - "d398ef2b5a2a62aed4d675a2cb71b9d7a5e805e1", + "fe1902c61b7548a33e8b6d39c35c0c4ce270e85c", [] ], "line-styles.yaml": [ @@ -357556,7 +358027,7 @@ [] ], "iframe-popup.https.html.ini": [ - "64c1ac29baa1c8cc7fd0652244996b1da0b5068b", + "91a6ef0f5d6ceecf9002ba3c898d6e14f671932e", [] ], "iframe-popup.https_3-4-expected.txt": [ @@ -370613,6 +371084,22 @@ "30c2785c020fedc64755569419cc88e6d4019428", [] ], + "integration-with-the-javascript-agent-formalism": { + "atomics-wait-async.https.any.js.headers": [ + "5f8621ef83660c66f0d037ea28fafefb558140f1", + [] + ], + "resources": { + "notify-worker.js": [ + "2780e5bc34eec9e49d4311459cd7fc285fbe3f65", + [] + ], + "notify-worker.js.headers": [ + "6604450991a122e3e241e40b1b9e0516c525389d", + [] + ] + } + }, "integration-with-the-javascript-job-queue": { "promise-job-incumbent-expected.txt": [ "3e245477fa306119d4b7b8af9099b790b0d3d825", @@ -373642,7 +374129,7 @@ ] }, "lint.ignore": [ - "27296d363502fcb0e7ae9c521df22e0b319b133f", + "1672f3b52e7a09b0e98ff6bd14c1ca6a9a5ab160", [] ], "loading": { @@ -379781,7 +380268,7 @@ [] ], "modulepreload-as.html.ini": [ - "88b6dcd34c6b280da1c6c949f87ae67abfc1fec0", + "cbdfc9afd2d7370d588e48a89dea1ed4fe2e7436", [] ], "modulepreload-expected.txt": [ @@ -386193,15 +386680,15 @@ [] ], "partitioned-cookies-3p-credentialless-frame.html": [ - "72043378562e8de0bdecf41104052327b1c03f56", + "25ddf601457c484160490a267cd8053f84c01063", [] ], "partitioned-cookies-3p-frame.html": [ - "dab694f685aa223431432676ebd7e9bec6867290", + "00b3412c41fb566fcab380e83f3ca9bbcd4aa859", [] ], "partitioned-cookies-3p-sw.js": [ - "bc2a2831568f4cc438933b88b7cad6997beb041b", + "767dbf443275a427facf340d72cb63d6bdc10df2", [] ], "partitioned-cookies-3p-window.html": [ @@ -386209,7 +386696,7 @@ [] ], "partitioned-cookies-sw.js": [ - "bc2a2831568f4cc438933b88b7cad6997beb041b", + "767dbf443275a427facf340d72cb63d6bdc10df2", [] ], "partitioned-service-worker-iframe-claim.html": [ @@ -395494,6 +395981,10 @@ ] } }, + "event.origin.sub.htm.ini": [ + "ca6b6f5bbf3700b95a9af372a1ab52483f320181", + [] + ], "message-channels": { "close-expected.txt": [ "ee08c8fa753db852519246d713ef0f6202b36b6c", @@ -404809,7 +405300,7 @@ ] ], "filereader_readAsDataURL.any.js": [ - "d6812121295beedc38164a41cea20c848533369f", + "4f9dbf7a754a87694c737487a903467a4725cc7a", [ "FileAPI/reading-data-section/filereader_readAsDataURL.any.html", { @@ -425843,6 +426334,13 @@ ] ] }, + "accept-ch.wildcard.https.sub.html": [ + "36eccd6a5229ea39e6d94ad8d8e4bb9ae188f428", + [ + null, + {} + ] + ], "critical-ch": { "iframe.https.window.js": [ "cbf128149e983fa1fb4e4ef085f5179c16b50016", @@ -429502,7 +430000,7 @@ }, "embedded-enforcement": { "allow_csp_from-header.html": [ - "dd66bb77ac76f7fd9f8b626d41952298ff54d53f", + "b2abcbece0e3866b000096889465227c47ac7178", [ null, {} @@ -439567,6 +440065,13 @@ {} ] ], + "anchor-scroll-basics.html": [ + "6b2d96708bd44808f0cb7ce10a1b52e708e09eba", + [ + null, + {} + ] + ], "anchor-scroll-fallback-position-001.html": [ "a9a5d8c0ff4e84858c180eb440b514400ab97779", [ @@ -565701,6 +566206,31 @@ ] ], "integration-with-the-javascript-agent-formalism": { + "atomics-wait-async.https.any.js": [ + "3a3ea40d773f9b36314e714a17212f8ceed1f660", + [ + "html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/atomics-wait-async.https.any.html", + { + "script_metadata": [ + [ + "global", + "window,dedicatedworker" + ] + ] + } + ], + [ + "html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/atomics-wait-async.https.any.worker.html", + { + "script_metadata": [ + [ + "global", + "window,dedicatedworker" + ] + ] + } + ] + ], "requires-failure.https.any.js": [ "fddf85dbede1a36d4f161b638f19c39f8300ac47", [ @@ -583860,7 +584390,7 @@ ] ], "pointerevent_auxclick_is_a_pointerevent.html": [ - "b3b7481d6ab19cc81688ed6819d81aa16ead35f0", + "5ec1bab1649effa65bd8c6dd579a003ea815085c", [ "pointerevents/pointerevent_auxclick_is_a_pointerevent.html?mouse", { @@ -583941,7 +584471,7 @@ ] ], "pointerevent_click_is_a_pointerevent.html": [ - "9e4b023a25af7551e3737eb0d43df4a81b6c1510", + "2571c9c9034200e03bf2ad904cd859da9ccf6ddf", [ "pointerevents/pointerevent_click_is_a_pointerevent.html?mouse", { @@ -583990,7 +584520,7 @@ ] ], "pointerevent_contextmenu_is_a_pointerevent.html": [ - "fe3a69942ef6338561041d3fdf640dae76958d25", + "d951be542a367cd0e30a6b169bded298de365984", [ "pointerevents/pointerevent_contextmenu_is_a_pointerevent.html?mouse", { @@ -607226,7 +607756,7 @@ ] ], "partitioned-cookies.tentative.https.html": [ - "f1ef87292263832ee012de845673c7f3bb7309ed", + "5f6371cb428335bc33f3ed2220473a1a48fad85c", [ null, { @@ -634258,7 +634788,7 @@ ] ], "public-key-credential-to-json.https.window.js": [ - "339f16df838b156760711e40c0f0574452cbfb70", + "8de3b8c3cd09ac92fc2f1ade93e3ab7888cddc72", [ "webauthn/public-key-credential-to-json.https.window.html", {
diff --git a/third_party/blink/web_tests/external/wpt/client-hints/critical-ch/critical-ch.navigation-timing.no-restart.https.html b/third_party/blink/web_tests/external/wpt/client-hints/critical-ch/critical-ch.navigation-timing.no-restart.https.html new file mode 100644 index 0000000..a7c2ad70 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/client-hints/critical-ch/critical-ch.navigation-timing.no-restart.https.html
@@ -0,0 +1,13 @@ +<!DOCTYPE html> +<body> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +promise_test(async t => { + var navigationTiming = window.performance.getEntriesByType('navigation')[0]; + assert_not_equals(navigationTiming, undefined); + assert_equals(navigationTiming.criticalCHRestart, 0, "This should be 0 as there was no restart."); +}, "Critical-CH no-restart navigation timing test"); +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/client-hints/critical-ch/critical-ch.navigation-timing.restart.https.html b/third_party/blink/web_tests/external/wpt/client-hints/critical-ch/critical-ch.navigation-timing.restart.https.html new file mode 100644 index 0000000..d3a49a2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/client-hints/critical-ch/critical-ch.navigation-timing.restart.https.html
@@ -0,0 +1,14 @@ +<!DOCTYPE html> +<body> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +promise_test(async t => { + var navigationTiming = window.performance.getEntriesByType('navigation')[0]; + assert_not_equals(navigationTiming, undefined); + assert_less_than(navigationTiming.startTime, navigationTiming.criticalCHRestart, "Restarts happen after the beginning of the navigation"); + assert_less_than(navigationTiming.criticalCHRestart, navigationTiming.fetchStart, "Restarts happen before fetch"); +}, "Critical-CH restart navigation timing test"); +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/client-hints/critical-ch/critical-ch.navigation-timing.restart.https.html.headers b/third_party/blink/web_tests/external/wpt/client-hints/critical-ch/critical-ch.navigation-timing.restart.https.html.headers new file mode 100644 index 0000000..b221a32 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/client-hints/critical-ch/critical-ch.navigation-timing.restart.https.html.headers
@@ -0,0 +1,2 @@ +Accept-CH: sec-ch-device-memory +Critical-CH: sec-ch-device-memory
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/backgrounds/background-022.xht.ini b/third_party/blink/web_tests/external/wpt/css/CSS2/backgrounds/background-022.xht.ini new file mode 100644 index 0000000..b94a734 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/CSS2/backgrounds/background-022.xht.ini
@@ -0,0 +1,3 @@ +[background-022.xht] + expected: + if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-wrap-bfc-001-right-overflow.xht.ini b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-wrap-bfc-001-right-overflow.xht.ini new file mode 100644 index 0000000..f57db9eb --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-wrap-bfc-001-right-overflow.xht.ini
@@ -0,0 +1,3 @@ +[floats-wrap-bfc-001-right-overflow.xht] + expected: + if (product == "content_shell") and (os == "mac") and (port == "mac12"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/color-mix-currentcolor-background-repaint-expected.xht b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/color-mix-currentcolor-background-repaint-expected.xht new file mode 100644 index 0000000..05a1379 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/color-mix-currentcolor-background-repaint-expected.xht
@@ -0,0 +1,19 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <title>CSS Reftest Reference</title> + <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> + <style type="text/css"><![CDATA[ + div + { + background-color: green; + height: 100px; + width: 100px; + } + ]]></style> + </head> + <body> + <p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + <div></div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent-expected.xht b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent-expected.xht new file mode 100644 index 0000000..05a1379 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent-expected.xht
@@ -0,0 +1,19 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <title>CSS Reftest Reference</title> + <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> + <style type="text/css"><![CDATA[ + div + { + background-color: green; + height: 100px; + width: 100px; + } + ]]></style> + </head> + <body> + <p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + <div></div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html new file mode 100644 index 0000000..44399c19 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html
@@ -0,0 +1,39 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>currentColor in color-mix() used in background-color repaints properly when parent color changes</title> +<link rel="author" title="Tim Nguyen" href="https://github.com/nt1m"> +<link rel="help" href="https://drafts.csswg.org/css-color/#currentcolor-color"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<style> + #container { + color: red; + } + + #container.green { + color: green; + } + + #target { + background-color: color-mix(in hsl, transparent 0%, currentColor 100%); + width: 100px; + height: 100px; + } +</style> + +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + +<div id="container"> + <div id="target"></div> +</div> + +<script> + addEventListener("load", () => { + setTimeout(() => { + requestAnimationFrame(() => { + container.classList.add("green"); + document.documentElement.classList.remove("reftest-wait"); + }); + }, 0); + }); +</script> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html.ini b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html.ini new file mode 100644 index 0000000..ea362ef --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html.ini
@@ -0,0 +1,4 @@ +[color-mix-currentcolor-background-repaint-parent.html] + expected: + if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): PASS + FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/color-mix-currentcolor-background-repaint.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/color-mix-currentcolor-background-repaint.html new file mode 100644 index 0000000..a8f742b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/color-mix-currentcolor-background-repaint.html
@@ -0,0 +1,34 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>currentColor in color-mix() used in background-color repaints properly when color changes</title> +<link rel="author" title="Tim Nguyen" href="https://github.com/nt1m"> +<link rel="help" href="https://drafts.csswg.org/css-color/#currentcolor-color"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<style> + #target { + color: red; + background-color: color-mix(in hsl, transparent 0%, currentColor 100%); + width: 100px; + height: 100px; + } + + #target.green { + color: green; + } +</style> + +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + +<div id="target"></div> + +<script> + addEventListener("load", () => { + setTimeout(() => { + requestAnimationFrame(() => { + target.classList.add("green"); + document.documentElement.classList.remove("reftest-wait"); + }); + }, 0); + }); +</script> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/color-mix-currentcolor-outline-repaint-expected.xht b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/color-mix-currentcolor-outline-repaint-expected.xht new file mode 100644 index 0000000..05a1379 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/color-mix-currentcolor-outline-repaint-expected.xht
@@ -0,0 +1,19 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <title>CSS Reftest Reference</title> + <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> + <style type="text/css"><![CDATA[ + div + { + background-color: green; + height: 100px; + width: 100px; + } + ]]></style> + </head> + <body> + <p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + <div></div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent-expected.xht b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent-expected.xht new file mode 100644 index 0000000..05a1379 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent-expected.xht
@@ -0,0 +1,19 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <title>CSS Reftest Reference</title> + <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> + <style type="text/css"><![CDATA[ + div + { + background-color: green; + height: 100px; + width: 100px; + } + ]]></style> + </head> + <body> + <p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + <div></div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html new file mode 100644 index 0000000..0d434b1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html
@@ -0,0 +1,40 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>currentColor in color-mix() used in outline repaints properly when parent color changes</title> +<link rel="author" title="Tim Nguyen" href="https://github.com/nt1m"> +<link rel="help" href="https://drafts.csswg.org/css-color/#currentcolor-color"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<style> + #container { + color: red; + } + + #container.green { + color: green; + } + + #target { + outline: 50px solid color-mix(in hsl, transparent 0%, currentColor 100%); + outline-offset: -50px; + width: 100px; + height: 100px; + } +</style> + +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + +<div id="container"> + <div id="target"></div> +</div> + +<script> + addEventListener("load", () => { + setTimeout(() => { + requestAnimationFrame(() => { + container.classList.add("green"); + document.documentElement.classList.remove("reftest-wait"); + }); + }, 0); + }); +</script> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html.ini b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html.ini new file mode 100644 index 0000000..1c0bd8a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html.ini
@@ -0,0 +1,5 @@ +[color-mix-currentcolor-outline-repaint-parent.html] + expected: + if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): PASS + if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): PASS + FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/color-mix-currentcolor-outline-repaint.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/color-mix-currentcolor-outline-repaint.html new file mode 100644 index 0000000..8892d81 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/color-mix-currentcolor-outline-repaint.html
@@ -0,0 +1,35 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>currentColor in color-mix() used in outline repaints properly when color changes</title> +<link rel="author" title="Tim Nguyen" href="https://github.com/nt1m"> +<link rel="help" href="https://drafts.csswg.org/css-color/#currentcolor-color"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<style> + #target { + color: red; + outline: 50px solid color-mix(in hsl, transparent 0%, currentColor 100%); + outline-offset: -50px; + width: 100px; + height: 100px; + } + + #target.green { + color: green; + } +</style> + +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + +<div id="target"></div> + +<script> + addEventListener("load", () => { + setTimeout(() => { + requestAnimationFrame(() => { + target.classList.add("green"); + document.documentElement.classList.remove("reftest-wait"); + }); + }, 0); + }); +</script> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/clip-path-document-element-will-change.html.ini b/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/clip-path-document-element-will-change.html.ini index 6c9f43a..2ad544e0 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/clip-path-document-element-will-change.html.ini +++ b/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/clip-path-document-element-will-change.html.ini
@@ -1,7 +1,6 @@ [clip-path-document-element-will-change.html] expected: - if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac13"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac12"): FAIL + if (product == "content_shell") and (os == "win"): PASS + if (product == "content_shell") and (os == "linux"): PASS + if product == "chrome": PASS + FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-007.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-007.html.ini index 59933dbf..9edfbd8 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-007.html.ini +++ b/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-007.html.ini
@@ -1,4 +1,5 @@ [text-transform-capitalize-007.html] expected: if (product == "content_shell") and (os == "win") and (port == "win11"): FAIL + if (product == "content_shell") and (os == "mac") and (port == "mac13"): FAIL if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-011.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-011.html.ini new file mode 100644 index 0000000..1391e15d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-011.html.ini
@@ -0,0 +1,3 @@ +[text-transform-capitalize-011.html] + expected: + if (product == "content_shell") and (os == "win") and (port == "win11"): 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-start-start-radius-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-start-start-radius-001.html.ini index 0c9ed13..9328533 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-search-border-start-start-radius-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-start-start-radius-001.html.ini
@@ -1,3 +1,4 @@ [kind-of-widget-fallback-input-search-border-start-start-radius-001.html] expected: if (product == "content_shell") and (os == "win") and (port == "win11"): FAIL + if (product == "content_shell") and (os == "linux"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-search-text-border-bottom-color-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-search-text-border-bottom-color-001.html.ini new file mode 100644 index 0000000..71bccd7d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-search-text-border-bottom-color-001.html.ini
@@ -0,0 +1,3 @@ +[kind-of-widget-fallback-input-search-text-border-bottom-color-001.html] + expected: + if (product == "content_shell") and (os == "linux"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-textarea-border-top-style-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-textarea-border-top-style-001.html.ini new file mode 100644 index 0000000..c626880 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-textarea-border-top-style-001.html.ini
@@ -0,0 +1,3 @@ +[kind-of-widget-fallback-textarea-border-top-style-001.html] + expected: + if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-opacity.html.ini b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-opacity.html.ini new file mode 100644 index 0000000..07002e42 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-opacity.html.ini
@@ -0,0 +1,3 @@ +[backdrop-filters-opacity.html] + expected: + if (product == "content_shell") and (os == "mac") and (port == "mac12"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/css-backdrop-filters-animation-invert.html.ini b/third_party/blink/web_tests/external/wpt/css/filter-effects/css-backdrop-filters-animation-invert.html.ini new file mode 100644 index 0000000..73347d4 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/css-backdrop-filters-animation-invert.html.ini
@@ -0,0 +1,3 @@ +[css-backdrop-filters-animation-invert.html] + expected: + if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/tools/gentest.py b/third_party/blink/web_tests/external/wpt/html/canvas/tools/gentest.py index bca7b9e..6574ff5 100644 --- a/third_party/blink/web_tests/external/wpt/html/canvas/tools/gentest.py +++ b/third_party/blink/web_tests/external/wpt/html/canvas/tools/gentest.py
@@ -5,4 +5,4 @@ 'name2dir-canvas.yaml', False) genTestUtils('../offscreen', '../offscreen', 'templates.yaml', 'name2dir-offscreen.yaml', True) -genTestUtils_union('templates-new.yaml', 'name2dir.yaml') +genTestUtils_union('name2dir.yaml')
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/tools/gentest_union.py b/third_party/blink/web_tests/external/wpt/html/canvas/tools/gentest_union.py index 62c1cde..bde7c1b 100644 --- a/third_party/blink/web_tests/external/wpt/html/canvas/tools/gentest_union.py +++ b/third_party/blink/web_tests/external/wpt/html/canvas/tools/gentest_union.py
@@ -1,3 +1,3 @@ from gentestutilsunion import genTestUtils_union -genTestUtils_union('templates-new.yaml', 'name2dir-canvas.yaml') +genTestUtils_union('name2dir-canvas.yaml')
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/tools/gentestutilsunion.py b/third_party/blink/web_tests/external/wpt/html/canvas/tools/gentestutilsunion.py index bf5fdeee..73c28e3 100644 --- a/third_party/blink/web_tests/external/wpt/html/canvas/tools/gentestutilsunion.py +++ b/third_party/blink/web_tests/external/wpt/html/canvas/tools/gentestutilsunion.py
@@ -36,6 +36,7 @@ import enum import importlib import itertools +import jinja2 import os import pathlib import sys @@ -61,12 +62,12 @@ """Raised on invalid test definition.""" -def _simpleEscapeJS(string: str) -> str: +def _doubleQuoteEscape(string: str) -> str: return string.replace('\\', '\\\\').replace('"', '\\"') def _escapeJS(string: str) -> str: - string = _simpleEscapeJS(string) + string = _doubleQuoteEscape(string) # Kind of an ugly hack, for nicer failure-message output. string = re.sub(r'\[(\w+)\]', r'[\\""+(\1)+"\\"]', string) return string @@ -263,111 +264,71 @@ return match.group('width'), match.group('height') -def _write_reference_test(is_js_ref: bool, templates: Mapping[str, str], - template_params: MutableMapping[str, str], - ref_code: str, canvas_path: Optional[str], +def _write_reference_test(test: Mapping[str, Any], + jinja_env: jinja2.Environment, + template_params: MutableMapping[str, Any], + canvas_path: Optional[str], offscreen_path: Optional[str]): - ref_code = ref_code.strip() - ref_code = textwrap.indent(ref_code, ' ') if is_js_ref else ref_code - ref_template_name = 'element_ref_test' if is_js_ref else 'html_ref_test' + name = template_params["name"] + js_ref = test.get('reference') + html_ref = test.get('html_reference') + if js_ref is not None and html_ref is not None: + raise InvalidTestDefinitionError( + f'Test {name} is invalid, "reference" and "html_reference" can\'t ' + 'both be specified at the same time.') - code = template_params['code'] - template_params['code'] = textwrap.indent(code, ' ') - if canvas_path: - pathlib.Path(f'{canvas_path}.html').write_text( - templates['element_ref_test'] % template_params, 'utf-8') - if offscreen_path: - pathlib.Path(f'{offscreen_path}.html').write_text( - templates['offscreen_ref_test'] % template_params, 'utf-8') - template_params['code'] = textwrap.indent(code, ' ') - pathlib.Path(f'{offscreen_path}.w.html').write_text( - templates['worker_ref_test'] % template_params, 'utf-8') - - template_params['code'] = ref_code - template_params['links'] = '' - template_params['fuzzy'] = '' + ref_params = template_params | {'code': js_ref or html_ref} + ref_template_name = 'reftest_element.html' if js_ref else 'reftest.html' if canvas_path: pathlib.Path(f'{canvas_path}-expected.html').write_text( - templates[ref_template_name] % template_params, 'utf-8') + jinja_env.get_template(ref_template_name).render(ref_params), + 'utf-8') if offscreen_path: pathlib.Path(f'{offscreen_path}-expected.html').write_text( - templates[ref_template_name] % template_params, 'utf-8') + jinja_env.get_template(ref_template_name).render(ref_params), + 'utf-8') + + params = template_params | { + 'ref_link': f'{name}-expected.html', + 'fuzzy': test.get('fuzzy') + } + if canvas_path: + pathlib.Path(f'{canvas_path}.html').write_text( + jinja_env.get_template("reftest_element.html").render(params), + 'utf-8') + if offscreen_path: + pathlib.Path(f'{offscreen_path}.html').write_text( + jinja_env.get_template("reftest_offscreen.html").render(params), + 'utf-8') + pathlib.Path(f'{offscreen_path}.w.html').write_text( + jinja_env.get_template("reftest_worker.html").render(params), + 'utf-8') -def _write_testharness_test(templates: Mapping[str, str], - template_params: MutableMapping[str, str], +def _write_testharness_test(jinja_env: jinja2.Environment, + template_params: MutableMapping[str, Any], canvas_path: Optional[str], offscreen_path: Optional[str]): # Create test cases for canvas and offscreencanvas. - code = template_params['code'] - template_params['code'] = textwrap.indent(code, ' ') if canvas_path: pathlib.Path(f'{canvas_path}.html').write_text( - templates['element'] % template_params, 'utf-8') + jinja_env.get_template("testharness_element.html").render( + template_params), 'utf-8') if offscreen_path: - offscreen_template = templates['offscreen'] - worker_template = templates['worker'] - - if ('then(t_pass, t_fail);' in code): - offscreen_template = offscreen_template.replace('t.done();\n', '') - worker_template = worker_template.replace('t.done();\n', '') + template_params['done_needed'] = ('then(t_pass, t_fail);' + not in template_params['code']) pathlib.Path(f'{offscreen_path}.html').write_text( - offscreen_template % template_params, 'utf-8') + jinja_env.get_template("testharness_offscreen.html").render( + template_params), 'utf-8') + pathlib.Path(f'{offscreen_path}.worker.js').write_text( - worker_template % template_params, 'utf-8') + jinja_env.get_template("testharness_worker.js").render( + template_params), 'utf-8') -def _expand_template(template: str, template_params: Mapping[str, str]) -> str: - # Remove whole line comments. - template = re.sub(r'^ *#.*?\n', '', template, flags=re.MULTILINE) - # Remove trailing line comments. - template = re.sub(r' *#.*?$', '', template, flags=re.MULTILINE) - - # Unwrap lines ending with a backslash. - template = _remove_extra_newlines(template) - - content_without_nested_if = r'((?:(?!{%\s*(?:if|else|endif)[^%]*%}).)*?)' - - # Resolve {% if <cond> %}<content>{% else %}<alternate content>{% endif %} - if_else_regex = re.compile( - r'{%\s*if\s*([^\s%]+)\s*%}' + # {% if <cond> %} - content_without_nested_if + # content - r'{%\s*else\s*%}' + # {% else %} - content_without_nested_if + # alternate - r'{%\s*endif\s*%}', # {% endif %} - flags=re.MULTILINE | re.DOTALL) - while match := if_else_regex.search(template): - condition, content, alternate = match.groups() - substitution = content if template_params[condition] else alternate - template = ( - template[:match.start(0)] + substitution + template[match.end(0):]) - - # Resolve {% if <cond> %}<content>{% endif %} - if_regex = re.compile( - r'{%\s*if\s*([^\s%]+)\s*%}' + # {% if <cond> %} - content_without_nested_if + # content - r'{%\s*endif\s*%}', # {% endif %} - flags=re.MULTILINE | re.DOTALL) - while match := if_regex.search(template): - condition, content = match.groups() - substitution = content if template_params[condition] else '' - template = ( - template[:match.start(0)] + substitution + template[match.end(0):]) - - return template - - -def _expand_templates(templates: Mapping[str, str], - params: Mapping[str, str]) -> Mapping[str, str]: - return { - name: _expand_template(template, params) - for name, template in templates.items() - } - - -def _generate_test(test: Mapping[str, Any], templates: Mapping[str, str], +def _generate_test(test: Mapping[str, Any], jinja_env: jinja2.Environment, sub_dir: str, html_canvas_cfg: TestConfig, offscreen_canvas_cfg: TestConfig) -> None: name = test['name'] @@ -376,8 +337,6 @@ r'@assert pixel .* 0,0,0,0;', test['code']): print('Probable incorrect pixel test in %s' % name) - code_canvas = _expand_test_code(test['code']).strip() - expectation_html = '' if 'expected' in test and test['expected'] is not None: expected = test['expected'] @@ -414,19 +373,8 @@ '<img src="%s" class="output expected" id="expected" ' 'alt="">' % expected_img) - canvas = ' ' + test['canvas'] if 'canvas' in test else '' width, height = _get_canvas_size(test) - notes = '<p class="notes">%s' % test['notes'] if 'notes' in test else '' - - links = f'<link rel="match" href="{name}-expected.html">\n' - fuzzy = ('<meta name=fuzzy content="%s">\n' % - test['fuzzy'] if 'fuzzy' in test else '') - timeout = ('<meta name="timeout" content="%s">\n' % - test['timeout'] if 'timeout' in test else '') - timeout_js = ('// META: timeout=%s\n' % test['timeout'] - if 'timeout' in test else '') - images = '' for src in test.get('images', []): img_id = src.split('/')[-1] @@ -441,31 +389,6 @@ '</svg>\n' % (src, img_id)) images = images.replace('../images/', '/images/') - fonts = '' - fonthack = '' - for font in test.get('fonts', []): - fonts += ('@font-face {\n font-family: %s;\n' - ' src: url("/fonts/%s.ttf");\n}\n' % (font, font)) - # Browsers require the font to actually be used in the page. - if test.get('fonthack', 1): - fonthack += ('<span style="font-family: %s; position: ' - 'absolute; visibility: hidden">A</span>\n' % font) - if fonts: - fonts = '<style>\n%s</style>\n' % fonts - - fallback = test.get('fallback', - '<p class="fallback">FAIL (fallback content)</p>') - - desc = test.get('desc', '') - escaped_desc = _simpleEscapeJS(desc) - - attributes = test.get('attributes', '') - if attributes: - context_args = "'2d', %s" % attributes.strip() - attributes = ', ' + attributes.strip() - else: - context_args = "'2d'" - is_promise_test = False if 'test_type' in test: if test['test_type'] == 'promise': @@ -478,24 +401,16 @@ template_params = { 'name': name, - 'desc': desc, - 'escaped_desc': escaped_desc, - 'notes': notes, + 'desc': test.get('desc', ''), + 'notes': test.get('notes', ''), 'images': images, - 'fonts': fonts, - 'fonthack': fonthack, - 'timeout': timeout, - 'timeout_js': timeout_js, - 'fuzzy': fuzzy, - 'links': links, - 'canvas': canvas, + 'timeout': test.get('timeout'), + 'canvas': test.get('canvas', ''), 'width': width, 'height': height, 'expected': expectation_html, - 'code': code_canvas, - 'fallback': fallback, - 'attributes': attributes, - 'context_args': context_args, + 'code': _expand_test_code(test['code']), + 'attributes': test.get('attributes', ''), 'promise_test': is_promise_test } @@ -505,41 +420,38 @@ canvas_path += '-manual' offscreen_path += '-manual' - js_reference = test.get('reference') - html_reference = test.get('html_reference') - if js_reference is not None and html_reference is not None: - raise InvalidTestDefinitionError( - f'Test {name} is invalid, "reference" and "html_reference" can\'t ' - 'both be specified at the same time.') - - templates = _expand_templates(templates, template_params) - - ref_code = js_reference or html_reference - if ref_code is not None: + if 'reference' in test or 'html_reference' in test: _write_reference_test( - js_reference is not None, templates, template_params, ref_code, + test, jinja_env, template_params, canvas_path if html_canvas_cfg.enabled else None, offscreen_path if offscreen_canvas_cfg.enabled else None) else: _write_testharness_test( - templates, template_params, + jinja_env, template_params, canvas_path if html_canvas_cfg.enabled else None, offscreen_path if offscreen_canvas_cfg.enabled else None) -def genTestUtils_union(TEMPLATEFILE: str, NAME2DIRFILE: str) -> None: +def genTestUtils_union(NAME2DIRFILE: str) -> None: CANVASOUTPUTDIR = '../element' CANVASIMAGEOUTPUTDIR = '../element' OFFSCREENCANVASOUTPUTDIR = '../offscreen' OFFSCREENCANVASIMAGEOUTPUTDIR = '../offscreen' + jinja_env = jinja2.Environment( + loader=jinja2.PackageLoader("gentestutilsunion"), + keep_trailing_newline=True, + trim_blocks=True, + lstrip_blocks=True) + + jinja_env.filters['double_quote_escape'] = _doubleQuoteEscape + # Run with --test argument to run unit tests. if len(sys.argv) > 1 and sys.argv[1] == '--test': doctest = importlib.import_module('doctest') doctest.testmod() sys.exit() - templates = yaml.safe_load(pathlib.Path(TEMPLATEFILE).read_text()) name_to_sub_dir = yaml.safe_load(pathlib.Path(NAME2DIRFILE).read_text()) tests = [] @@ -602,7 +514,7 @@ sub_dir = _get_test_sub_dir(name, name_to_sub_dir) _generate_test( test, - templates, + jinja_env, sub_dir, html_canvas_cfg=TestConfig( out_dir=CANVASOUTPUTDIR,
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/tools/templates-new.yaml b/third_party/blink/web_tests/external/wpt/html/canvas/tools/templates-new.yaml deleted file mode 100644 index 7d8ebfc..0000000 --- a/third_party/blink/web_tests/external/wpt/html/canvas/tools/templates-new.yaml +++ /dev/null
@@ -1,237 +0,0 @@ -offscreen: | - <!DOCTYPE html> - <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> - <title>OffscreenCanvas test: %(name)s</title> - %(timeout)s\ - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> - <script src="/html/canvas/resources/canvas-tests.js"></script> - - <h1>%(name)s</h1> - <p class="desc">%(desc)s</p> - - %(notes)s - <script>\ - - ## Promise vs. async test header: - {% if promise_test %}\ - promise_test(async t => { - {% else %}\ - var t = async_test("%(escaped_desc)s"); - var t_pass = t.done.bind(t); - var t_fail = t.step_func(function(reason) { - throw reason; - }); - t.step(function() { - {% endif %}\ - - ## Test body: - var canvas = new OffscreenCanvas(%(width)s, %(height)s); - var ctx = canvas.getContext(%(context_args)s); - - %(code)s\ - - ## Promise vs. async test footer: - {% if promise_test %}\ - - }, "%(desc)s"); - {% else %}\ - t.done(); - - }); - {% endif %}\ - </script> - -worker: | - %(timeout_js)s\ - // DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. - // OffscreenCanvas test in a worker:%(name)s - // Description:%(desc)s - // Note:%(notes)s - - importScripts("/resources/testharness.js"); - importScripts("/html/canvas/resources/canvas-tests.js"); - - ## Promise vs. async test header: - {% if promise_test %}\ - promise_test(async t => { - {% else %}\ - var t = async_test("%(escaped_desc)s"); - var t_pass = t.done.bind(t); - var t_fail = t.step_func(function(reason) { - throw reason; - }); - t.step(function() { - {% endif %}\ - - ## Test body: - var canvas = new OffscreenCanvas(%(width)s, %(height)s); - var ctx = canvas.getContext(%(context_args)s); - - %(code)s - t.done();\ - - ## Promise vs. async test footer: - {% if promise_test %}\ - }, "%(desc)s"); - {% else %}\ - }); - {% endif %}\ - done(); - -element: | - <!DOCTYPE html> - <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> - <title>Canvas test: %(name)s</title> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> - <script src="/html/canvas/resources/canvas-tests.js"></script> - <link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> - %(fonts)s\ - <body class="show_output"> - - <h1>%(name)s</h1> - <p class="desc">%(desc)s</p> - - %(notes)s - %(fonthack)s\ - <p class="output">Actual output:</p> - <canvas id="c" class="output" width="%(width)s" height="%(height)s"%(canvas)s>\- - %(fallback)s\ - </canvas> - %(expected)s - <ul id="d"></ul>\ - - <script>\ - - ## Promise vs. async test header: - {% if promise_test %}\ - promise_test(async t => { - - var canvas = document.getElementById('c'); - var ctx = canvas.getContext('2d'%(attributes)s); - {% else %}\ - var t = async_test("%(escaped_desc)s"); - _addTest(function(canvas, ctx) { - {% endif %}\ - - ## Test body: - %(code)s - - ## Promise vs. async test footer: - {% if promise_test %}\ - }, "%(desc)s"); - {% else %}\ - }%(attributes)s); - {% endif %}\ - \ - </script> - %(images)s - -offscreen_ref_test: |- - <!DOCTYPE html> - <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> - {% if promise_test %}\ - <html class="reftest-wait"> - {% endif %}\ - %(links)s\ - %(fuzzy)s\ - %(timeout)s\ - <title>Canvas test: %(name)s</title> - <h1>%(name)s</h1> - <p class="desc">%(desc)s</p> - %(fonts)s%(fonthack)s%(notes)s<canvas id="canvas" width="%(width)s" height="%(height)s"%(canvas)s> - %(fallback)s - </canvas> - <script{% if promise_test %} type="module"{% endif %}> - const canvas = new OffscreenCanvas(%(width)s, %(height)s); - const ctx = canvas.getContext(%(context_args)s); - - %(code)s - - const outputCanvas = document.getElementById("canvas"); - outputCanvas.getContext(%(context_args)s).drawImage(canvas, 0, 0); - {% if promise_test %}\ - document.documentElement.classList.remove("reftest-wait"); - {% endif %}\ - </script> - %(images)s\ - {% if promise_test %}</html>{% endif %} - -worker_ref_test: | - <!DOCTYPE html> - <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> - <html class="reftest-wait"> - %(links)s\ - %(fuzzy)s\ - %(timeout)s\ - <title>Canvas test: %(name)s</title> - <h1>%(name)s</h1> - <p class="desc">%(desc)s</p> - %(fonts)s%(fonthack)s%(notes)s<canvas id="canvas" width="%(width)s" height="%(height)s"%(canvas)s> - %(fallback)s - </canvas> - <script id='myWorker' type='text/worker'> - self.onmessage = {% if promise_test %}async {% endif %}function(e) { - const canvas = new OffscreenCanvas(%(width)s, %(height)s); - const ctx = canvas.getContext('2d'); - - %(code)s - - const bitmap = canvas.transferToImageBitmap(); - self.postMessage(bitmap, bitmap); - }; - </script> - <script> - const blob = new Blob([document.getElementById('myWorker').textContent]); - const worker = new Worker(URL.createObjectURL(blob)); - worker.addEventListener('message', msg => { - const outputCtx = document.getElementById("canvas").getContext('2d'); - outputCtx.drawImage(msg.data, 0, 0); - document.documentElement.classList.remove("reftest-wait"); - }); - worker.postMessage(null); - </script> - %(images)s\ - </html> - -element_ref_test: |- - <!DOCTYPE html> - <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> - {% if promise_test %}\ - <html class="reftest-wait"> - {% endif %}\ - %(links)s\ - %(fuzzy)s\ - %(timeout)s\ - <title>Canvas test: %(name)s</title> - <h1>%(name)s</h1> - <p class="desc">%(desc)s</p> - %(fonts)s%(fonthack)s%(notes)s<canvas id="canvas" width="%(width)s" height="%(height)s"%(canvas)s> - %(fallback)s - </canvas> - <script{% if promise_test %} type="module"{% endif %}> - const canvas = document.getElementById("canvas"); - const ctx = canvas.getContext(%(context_args)s); - - %(code)s - {% if promise_test %}\ - document.documentElement.classList.remove("reftest-wait"); - {% endif %}\ - </script> - %(images)s\ - {% if promise_test %}</html>{% endif %} - - -html_ref_test: |- - <!DOCTYPE html> - <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> - %(links)s\ - %(fuzzy)s\ - %(timeout)s\ - <title>Canvas test: %(name)s</title> - <h1>%(name)s</h1> - <p class="desc">%(desc)s</p> - %(fonts)s%(fonthack)s%(notes)s - %(code)s - %(images)s
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/tools/templates/reftest.html b/third_party/blink/web_tests/external/wpt/html/canvas/tools/templates/reftest.html new file mode 100644 index 0000000..8f98e16 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/tools/templates/reftest.html
@@ -0,0 +1,15 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +{% if ref_link %}<link rel="match" href="{{ ref_link }}"> +{% endif %} +{% if fuzzy %}<meta name=fuzzy content="{{ fuzzy }}"> +{% endif %} +{% if timeout %}<meta name="timeout" content="{{ timeout }}"> +{% endif %} +<title>Canvas test: {{ name }}</title> +<h1>{{ name }}</h1> +<p class="desc">{{ desc }}</p> +{% if notes %}<p class="notes">{{ notes }}{% endif %} + +{{ code | trim }} +{{ images -}}
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/tools/templates/reftest_element.html b/third_party/blink/web_tests/external/wpt/html/canvas/tools/templates/reftest_element.html new file mode 100644 index 0000000..25445af6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/tools/templates/reftest_element.html
@@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +{% if promise_test %}<html class="reftest-wait"> +{% endif %} +{% if ref_link %}<link rel="match" href="{{ ref_link }}"> +{% endif %} +{% if fuzzy %}<meta name=fuzzy content="{{ fuzzy }}"> +{% endif %} +{% if timeout %}<meta name="timeout" content="{{ timeout }}"> +{% endif %} +<title>Canvas test: {{ name }}</title> +<h1>{{ name }}</h1> +<p class="desc">{{ desc }}</p> +{% if notes %}<p class="notes">{{ notes }}{% endif %} +<canvas id="canvas" width="{{ width }}" height="{{ height }}"{{ canvas }}> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script{% if promise_test %} type="module"{% endif %}> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'{% if attributes %}, {{ attributes }}{% endif %}); + + {{ code | trim | indent(2) }} + {% if promise_test %} + document.documentElement.classList.remove("reftest-wait"); + {% endif %} +</script> +{{ images -}} +{% if promise_test %}</html>{% endif %}
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/tools/templates/reftest_offscreen.html b/third_party/blink/web_tests/external/wpt/html/canvas/tools/templates/reftest_offscreen.html new file mode 100644 index 0000000..4d8b7c9d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/tools/templates/reftest_offscreen.html
@@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +{% if promise_test %}<html class="reftest-wait"> +{% endif %} +{% if ref_link %}<link rel="match" href="{{ ref_link }}"> +{% endif %} +{% if fuzzy %}<meta name=fuzzy content="{{ fuzzy }}"> +{% endif %} +{% if timeout %}<meta name="timeout" content="{{ timeout }}"> +{% endif %} +<title>Canvas test: {{ name }}</title> +<h1>{{ name }}</h1> +<p class="desc">{{ desc }}</p> +{% if notes %}<p class="notes">{{ notes }}{% endif %} +<canvas id="canvas" width="{{ width }}" height="{{ height }}"{{ canvas }}> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script{% if promise_test %} type="module"{% endif %}> + const canvas = new OffscreenCanvas({{ width }}, {{ height }}); + const ctx = canvas.getContext('2d'{% if attributes %}, {{ attributes }}{% endif %}); + + {{ code | trim | indent(2) }} + + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d'{% if attributes %}, {{ attributes }}{% endif %}).drawImage(canvas, 0, 0); + {% if promise_test %} + document.documentElement.classList.remove("reftest-wait"); + {% endif %} +</script> +{{ images -}} +{% if promise_test %}</html>{% endif %}
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/tools/templates/reftest_worker.html b/third_party/blink/web_tests/external/wpt/html/canvas/tools/templates/reftest_worker.html new file mode 100644 index 0000000..7ce9ca5b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/tools/templates/reftest_worker.html
@@ -0,0 +1,39 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<html class="reftest-wait"> +{% if ref_link %}<link rel="match" href="{{ ref_link }}"> +{% endif %} +{% if fuzzy %}<meta name=fuzzy content="{{ fuzzy }}"> +{% endif %} +{% if timeout %}<meta name="timeout" content="{{ timeout }}"> +{% endif %} +<title>Canvas test: {{ name }}</title> +<h1>{{ name }}</h1> +<p class="desc">{{ desc }}</p> +{% if notes %}<p class="notes">{{ notes }}{% endif %} +<canvas id="canvas" width="{{ width }}" height="{{ height }}"{{ canvas }}> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script id='myWorker' type='text/worker'> + self.onmessage = {% if promise_test %}async {% endif %}function(e) { + const canvas = new OffscreenCanvas({{ width }}, {{ height }}); + const ctx = canvas.getContext('2d'{% if attributes %}, {{ attributes }}{% endif %}); + + {{ code | trim | indent(4) }} + + const bitmap = canvas.transferToImageBitmap(); + self.postMessage(bitmap, bitmap); + }; +</script> +<script> + const blob = new Blob([document.getElementById('myWorker').textContent]); + const worker = new Worker(URL.createObjectURL(blob)); + worker.addEventListener('message', msg => { + const outputCtx = document.getElementById("canvas").getContext('2d'{% if attributes %}, {{ attributes }}{% endif %}); + outputCtx.drawImage(msg.data, 0, 0); + document.documentElement.classList.remove("reftest-wait"); + }); + worker.postMessage(null); +</script> +{{ images -}} +</html>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/tools/templates/testharness_element.html b/third_party/blink/web_tests/external/wpt/html/canvas/tools/templates/testharness_element.html new file mode 100644 index 0000000..521fece --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/tools/templates/testharness_element.html
@@ -0,0 +1,46 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: {{ name }}</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/html/canvas/resources/canvas-tests.js"></script> +<link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> +<body class="show_output"> + +<h1>{{ name }}</h1> +<p class="desc">{{ desc }}</p> + +{% if notes %}<p class="notes">{{ notes }} +{% else %} + +{% endif %} +<p class="output">Actual output:</p> +<canvas id="c" class="output" width="{{ width }}" height="{{ height }}" + {{- canvas}}><p class="fallback">FAIL (fallback content)</p></canvas> +{{ expected }} +<ul id="d"></ul> +<script> + +{#- Promise vs. async test header: +#} +{% if promise_test %} +promise_test(async t => { + + var canvas = document.getElementById('c'); + var ctx = canvas.getContext('2d'{% if attributes %}, {{ attributes }}{% endif %}); +{% else %} +var t = async_test("{{ desc | double_quote_escape }}"); +_addTest(function(canvas, ctx) { +{% endif %} + + {# Test body: #} + {{ code | trim | indent(2) }} + +{# Promise vs. async test footer: #} +{% if promise_test %} +}, "{{ desc }}"); +{% else %} +}{% if attributes %}, {{ attributes }}{% endif %}); +{% endif -%} + +</script> +{{ images }}
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/tools/templates/testharness_offscreen.html b/third_party/blink/web_tests/external/wpt/html/canvas/tools/templates/testharness_offscreen.html new file mode 100644 index 0000000..a6de83c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/tools/templates/testharness_offscreen.html
@@ -0,0 +1,42 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>OffscreenCanvas test: {{ name }}</title> +{% if timeout %}<meta name="timeout" content="{{ timeout }}">{% endif %} +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/html/canvas/resources/canvas-tests.js"></script> + +<h1>{{ name }}</h1> +<p class="desc">{{ desc }}</p> + +{% if notes %}<p class="notes">{{ notes }}{% endif +%} +<script> + +{#- Promise vs. async test header: +#} +{% if promise_test %} +promise_test(async t => { +{% else %} +var t = async_test("{{ desc | double_quote_escape }}"); +var t_pass = t.done.bind(t); +var t_fail = t.step_func(function(reason) { + throw reason; +}); +t.step(function() { +{% endif %} + +{# Test body: #} + var canvas = new OffscreenCanvas({{ width }}, {{ height }}); + var ctx = canvas.getContext('2d'{% if attributes %}, {{ attributes }}{% endif %}); + + {{ code | trim | indent(2)}} + +{#- Promise vs. async test footer: +#} +{% if promise_test %} + +}, "{{ desc }}"); +{% else %} + t.done(); + +}); +{% endif %} +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/tools/templates/testharness_worker.js b/third_party/blink/web_tests/external/wpt/html/canvas/tools/templates/testharness_worker.js new file mode 100644 index 0000000..b6575b9 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/tools/templates/testharness_worker.js
@@ -0,0 +1,35 @@ +{% if timeout %}// META: timeout={{ timeout }}{% endif %} +// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. +// OffscreenCanvas test in a worker:{{ name }} +// Description:{{ desc }} +// Note:{% if notes %}<p class="notes">{{ notes }}{% endif +%} + +importScripts("/resources/testharness.js"); +importScripts("/html/canvas/resources/canvas-tests.js"); + +{# Promise vs. async test header: #} +{% if promise_test %} +promise_test(async t => { +{% else %} +var t = async_test("{{ desc | double_quote_escape }}"); +var t_pass = t.done.bind(t); +var t_fail = t.step_func(function(reason) { + throw reason; +}); +t.step(function() { +{% endif %} + +{# Test body: #} + var canvas = new OffscreenCanvas({{ width }}, {{ height }}); + var ctx = canvas.getContext('2d'{% if attributes %}, {{ attributes }}{% endif %}); + + {{ code | trim | indent(2)}} + t.done(); + +{#- Promise vs. async test footer: +#} +{% if promise_test %} +}, "{{ desc }}"); +{% else %} +}); +{% endif %} +done();
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml-new/color_space.yaml b/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml-new/color_space.yaml index ba5d93e..39556ca 100644 --- a/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml-new/color_space.yaml +++ b/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml-new/color_space.yaml
@@ -1,7 +1,6 @@ - name: 2d.color.space.p3.to.p3 desc: test getImageData with display-p3 and uint8 from display p3 uint8 canvas - attributes: | - {colorSpace: "display-p3"} + attributes: '{colorSpace: "display-p3"}' code: | var color_style = 'rgb(50, 100, 150)'; // [0.24304, 0.38818, 0.57227, 1.0] * 255 = [62, 99, 146, 255] @@ -19,8 +18,7 @@ - name: 2d.color.space.p3.to.srgb desc: test getImageData with srsb and uint8 from display p3 uint8 canvas - attributes: | - {colorSpace: "display-p3"} + attributes: '{colorSpace: "display-p3"}' code: | var color_style = 'rgb(50, 100, 150)'; var pixel_expected = [50, 100, 150, 255]; @@ -37,8 +35,7 @@ - name: 2d.color.space.p3.toBlob.p3.canvas desc: test if toblob returns p3 data from p3 color space canvas - attributes: | - {colorSpace: "display-p3"} + attributes: '{colorSpace: "display-p3"}' canvasType: ['HTMLCanvas'] code: | @@ -70,8 +67,7 @@ - name: 2d.color.space.p3.toDataURL.p3.canvas desc: test if toDataURL returns p3 data from canvas with p3 color space - attributes: | - {colorSpace: "display-p3"} + attributes: '{colorSpace: "display-p3"}' canvasType: ['HTMLCanvas'] code: | @@ -99,8 +95,7 @@ - name: 2d.color.space.p3.toDataURL.jpeg.p3.canvas desc: test if toDataURL('image/jpeg') returns p3 data from canvas with p3 color space - attributes: | - {colorSpace: "display-p3"} + attributes: '{colorSpace: "display-p3"}' canvasType: ['HTMLCanvas'] code: | @@ -128,8 +123,7 @@ - name: 2d.color.space.p3.toBlob.with.putImageData desc: Use putImageData to put some p3 data in canvas and test if toBlob returns the same data - attributes: | - {colorSpace: "display-p3"} + attributes: '{colorSpace: "display-p3"}' canvasType: ['HTMLCanvas'] code: | @@ -167,8 +161,7 @@ - name: 2d.color.space.p3.toDataURL.with.putImageData desc: Use putImageData to put some p3 data in canvas and test if toDataURL returns the same data - attributes: | - {colorSpace: "display-p3"} + attributes: '{colorSpace: "display-p3"}' canvasType: ['HTMLCanvas'] code: | @@ -203,8 +196,7 @@ - name: 2d.color.space.p3.fillText desc: Test if fillText can be used with a solid display-p3 color - attributes: | - {colorSpace: "display-p3"} + attributes: '{colorSpace: "display-p3"}' canvasType: ['HTMLCanvas'] code: | deferTest(); @@ -243,8 +235,7 @@ - name: 2d.color.space.p3.strokeText desc: Test if strokeText can be used with a solid display-p3 color - attributes: | - {colorSpace: "display-p3"} + attributes: '{colorSpace: "display-p3"}' canvasType: ['HTMLCanvas'] code: | @@ -285,8 +276,7 @@ - name: 2d.color.space.p3.fillText.shadow desc: Test if fillText can be used with a display-p3 shadow color - attributes: | - {colorSpace: "display-p3"} + attributes: '{colorSpace: "display-p3"}' canvasType: ['HTMLCanvas'] code: |
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html.ini b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html.ini index 64c1ac2..91a6ef0 100644 --- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html.ini +++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html.ini
@@ -80,16 +80,12 @@ [iframe-popup.https.html?9-last] expected: - if product == "chrome": ERROR + if product == "chrome": [OK, CRASH] [COOP: restrict-properties to popup COOP: restrict-properties via an iframe, with cross origin iframe, cross origin popup with anchor] - expected: - if product == "chrome": PASS - FAIL + expected: FAIL [COOP: restrict-properties to popup COOP: restrict-properties via an iframe, with cross origin iframe, cross origin popup with form] - expected: - if product == "chrome": PASS - FAIL + expected: FAIL [COOP: restrict-properties to popup COOP: restrict-properties via an iframe, with cross origin iframe, cross origin popup with window_open] expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/dom/elements/name-content-attribute-and-property.html b/third_party/blink/web_tests/external/wpt/html/dom/elements/name-content-attribute-and-property.html index 3319c18..082ed281 100644 --- a/third_party/blink/web_tests/external/wpt/html/dom/elements/name-content-attribute-and-property.html +++ b/third_party/blink/web_tests/external/wpt/html/dom/elements/name-content-attribute-and-property.html
@@ -26,7 +26,20 @@ "iframe", "img", "input", "map", "meta", "object", "output", "param", "select", "slot", "textarea", ]; + + // Optionally add "details" to reflectingTagNames since Chromium is + // prototyping the proposal at + // https://open-ui.org/components/accordion.explainer that adds this + // reflection to "details" as well. + // TODO(https://crbug.com/1444057): This runtime check should eventually be + // removed, and depending on the outcome of the proposal details should + // possibly be added to reflectingTagNames unconditionally. + if ("name" in HTMLDetailsElement.prototype) { + reflectingTagNames.push("details"); + } + const old_and_new_elements = [...HTML5_ELEMENTS, ...HTML5_DEPRECATED_ELEMENTS]; + const nonReflectingTagNames = old_and_new_elements.filter(x => !reflectingTagNames.includes(x)); reflectingTagNames.forEach(function(tagName) {
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-details-element/name-attribute.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-details-element/name-attribute.tentative.html index 280c315..9aa5ce42 100644 --- a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-details-element/name-attribute.tentative.html +++ b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-details-element/name-attribute.tentative.html
@@ -135,7 +135,7 @@ `; let e2 = document.createElement("details"); e2.id = "e2"; - e2.setAttribute("name", "a"); + e2.name = "a"; e2.open = true; let elements = [ document.getElementById("e0"), document.getElementById("e1"),
diff --git a/third_party/blink/web_tests/external/wpt/lint.ignore b/third_party/blink/web_tests/external/wpt/lint.ignore index 27296d36..1672f3b 100644 --- a/third_party/blink/web_tests/external/wpt/lint.ignore +++ b/third_party/blink/web_tests/external/wpt/lint.ignore
@@ -427,8 +427,12 @@ SET TIMEOUT: css/compositing/mix-blend-mode/mix-blend-mode-parent-with-3D-transform-and-transition.html SET TIMEOUT: css/compositing/mix-blend-mode/mix-blend-mode-sibling-with-3D-transform-and-transition.html +SET TIMEOUT: css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html +SET TIMEOUT: css/css-backgrounds/color-mix-currentcolor-background-repaint.html SET TIMEOUT: css/css-backgrounds/color-mix-currentcolor-border-repaint-parent.html SET TIMEOUT: css/css-backgrounds/color-mix-currentcolor-border-repaint.html +SET TIMEOUT: css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html +SET TIMEOUT: css/css-backgrounds/color-mix-currentcolor-outline-repaint.html SET TIMEOUT: css/css-backgrounds/currentcolor-border-repaint-parent.html SET TIMEOUT: css/css-transitions/events-007.html SET TIMEOUT: css/css-transitions/support/generalParallelTest.js
diff --git a/third_party/blink/web_tests/external/wpt/orientation-event/OWNERS b/third_party/blink/web_tests/external/wpt/orientation-event/OWNERS index ff41043..9b5206f 100644 --- a/third_party/blink/web_tests/external/wpt/orientation-event/OWNERS +++ b/third_party/blink/web_tests/external/wpt/orientation-event/OWNERS
@@ -1 +1 @@ -reillyg@chromium.org +file://third_party/blink/renderer/modules/device_orientation/OWNERS
diff --git a/third_party/blink/web_tests/external/wpt/preload/modulepreload-as.html.ini b/third_party/blink/web_tests/external/wpt/preload/modulepreload-as.html.ini index 88b6dcd..cbdfc9a 100644 --- a/third_party/blink/web_tests/external/wpt/preload/modulepreload-as.html.ini +++ b/third_party/blink/web_tests/external/wpt/preload/modulepreload-as.html.ini
@@ -1,197 +1,169 @@ [modulepreload-as.html] expected: - if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): OK - if (product == "content_shell") and (os == "mac") and (port == "mac12"): OK + if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [ERROR, TIMEOUT] + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [ERROR, TIMEOUT] if (product == "content_shell") and (os == "mac") and (port == "mac11"): OK - if (product == "content_shell") and (os == "mac") and (port == "mac13"): [ERROR, OK, TIMEOUT] + if (product == "content_shell") and (os == "mac") and (port == "mac12"): OK + if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): OK + if (product == "content_shell") and (os == "win") and (port == "win11"): [ERROR, TIMEOUT] if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): TIMEOUT - if product == "chrome": [ERROR, TIMEOUT] ERROR - [Modulepreload with as=""] - expected: - if product == "chrome": [PASS, TIMEOUT] - [Modulepreload with as="audio"] expected: - if product == "chrome": [FAIL, NOTRUN] + if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [FAIL, PASS] FAIL [Modulepreload with as="audioworklet"] - expected: - if product == "chrome": [FAIL, NOTRUN] - FAIL + expected: FAIL [Modulepreload with as="document"] expected: - if product == "chrome": [FAIL, NOTRUN, PASS] + if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [FAIL, PASS] + if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [FAIL, PASS] FAIL [Modulepreload with as="embed"] expected: - if product == "chrome": [FAIL, NOTRUN, 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"): [FAIL, PASS] + if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [FAIL, PASS] FAIL [Modulepreload with as="fetch"] expected: - if (product == "content_shell") and (os == "mac") and (port == "mac13"): [FAIL, PASS] - if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [PASS, FAIL] - if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): PASS - 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"): PASS - if (product == "content_shell") and (os == "linux") and (flag_specific == ""): PASS - if product == "chrome": [PASS, NOTRUN] + if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): PASS + if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [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 == "content_shell") and (os == "win") and (port == "win11"): [PASS, FAIL] + if product == "chrome": PASS FAIL [Modulepreload with as="font"] expected: - if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): PASS - if product == "chrome": [PASS, NOTRUN] + 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 == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS] + if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [PASS, FAIL] + if product == "chrome": PASS FAIL [Modulepreload with as="frame"] expected: - if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): PASS - if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): PASS - if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS] if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): PASS if (product == "content_shell") and (os == "win") and (port == "win11"): [PASS, FAIL] - if product == "chrome": [PASS, NOTRUN, FAIL] + 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 == "mac") and (port == "mac12-arm64"): [FAIL, PASS] + if product == "chrome": PASS FAIL [Modulepreload with as="iMaGe"] expected: - if (product == "content_shell") and (os == "win") and (port == "win11"): [PASS, FAIL] - if (product == "content_shell") and (os == "mac") and (port == "mac11"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac13"): [FAIL, PASS] - if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): FAIL if (product == "content_shell") and (os == "mac") and (port == "mac12"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [PASS, FAIL] - if product == "chrome": [PASS, NOTRUN] + if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [PASS, FAIL] + if (product == "content_shell") and (os == "mac") and (port == "mac11"): FAIL + if (product == "content_shell") and (os == "mac") and (port == "mac13"): FAIL + if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): FAIL [Modulepreload with as="iframe"] 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 + if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [FAIL, PASS] if (product == "content_shell") and (os == "win") and (port == "win11"): [PASS, FAIL] if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): PASS - if (product == "content_shell") and (os == "mac") and (port == "mac13"): [FAIL, PASS] - if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS] - if (product == "content_shell") and (os == "linux"): PASS - if product == "chrome": [PASS, NOTRUN] + if product == "chrome": PASS FAIL [Modulepreload with as="image"] expected: - if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac13"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac12"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac11"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS] + if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [FAIL, PASS] if (product == "content_shell") and (os == "win") and (port == "win11"): [PASS, FAIL] - if product == "chrome": [PASS, NOTRUN] + if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): 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": PASS + FAIL [Modulepreload with as="invalid-dest"] - expected: - if product == "chrome": [FAIL, NOTRUN] - FAIL + expected: FAIL [Modulepreload with as="manifest"] expected: + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] + if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): PASS if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): PASS if (product == "content_shell") and (os == "win") and (port == "win11"): [PASS, FAIL] - if (product == "content_shell") and (os == "linux") and (flag_specific == ""): PASS - if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): PASS - if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS] - if product == "chrome": [PASS, NOTRUN] + if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [PASS, FAIL] + if product == "chrome": PASS FAIL [Modulepreload with as="object"] expected: - if (product == "content_shell") and (os == "mac") and (port == "mac11"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac13"): [PASS, FAIL] if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): FAIL + if (product == "content_shell") and (os == "mac") and (port == "mac11"): FAIL + if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [PASS, FAIL] if (product == "content_shell") and (os == "mac") and (port == "mac12"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [PASS, FAIL] - if product == "chrome": [PASS, NOTRUN] + if (product == "content_shell") and (os == "win") and (port == "win11"): [PASS, FAIL] + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] [Modulepreload with as="paintworklet"] - expected: - if product == "chrome": [FAIL, NOTRUN] - FAIL + expected: FAIL [Modulepreload with as="report"] expected: - if (product == "content_shell") and (os == "mac") and (port == "mac12"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): FAIL - if (product == "content_shell") and (os == "mac") and (port == "mac13"): [PASS, FAIL] + if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [PASS, FAIL] if (product == "content_shell") and (os == "mac") and (port == "mac11"): FAIL - if product == "chrome": [PASS, NOTRUN] - - [Modulepreload with as="sCrIpT"] - expected: - if product == "chrome": [PASS, NOTRUN] - - [Modulepreload with as="script"] - expected: - if product == "chrome": [PASS, NOTRUN] + if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): FAIL + if (product == "content_shell") and (os == "mac") and (port == "mac12"): FAIL [Modulepreload with as="serviceworker"] - expected: - if product == "chrome": [FAIL, NOTRUN] - FAIL + expected: FAIL [Modulepreload with as="sharedworker"] - expected: - if product == "chrome": [FAIL, NOTRUN] - FAIL + expected: FAIL [Modulepreload with as="style"] expected: - if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS] - 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"): PASS - if product == "chrome": [PASS, NOTRUN, FAIL] + 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 == ""): [FAIL, PASS] + if product == "chrome": PASS FAIL [Modulepreload with as="track"] expected: - if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS] - if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): PASS - if (product == "content_shell") and (os == "win") and (port == "win11"): [FAIL, PASS] - if product == "chrome": [PASS, NOTRUN, FAIL] + if (product == "content_shell") and (os == "win") and (port == "win11"): [PASS, FAIL] + 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 [Modulepreload with as="video"] expected: - if (product == "content_shell") and (os == "win") and (port == "win11"): [FAIL, PASS] - if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS] - if (product == "content_shell") and (os == "mac") and (port == "mac13"): [FAIL, PASS] - if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): PASS - if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): PASS - if product == "chrome": [PASS, NOTRUN] + if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [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": PASS FAIL [Modulepreload with as="webidentity"] 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"): PASS - if (product == "content_shell") and (os == "linux") and (flag_specific == ""): PASS - if (product == "content_shell") and (os == "mac") and (port == "mac13"): [FAIL, PASS] - if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): PASS - if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS] - if product == "chrome": [PASS, NOTRUN] + if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [FAIL, PASS] + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] + 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"): [PASS, FAIL] + if product == "chrome": PASS FAIL [Modulepreload with as="worker"] - expected: - if product == "chrome": [FAIL, NOTRUN] - FAIL + expected: FAIL [Modulepreload with as="xslt"] expected: - if (product == "content_shell") and (os == "linux") and (flag_specific == ""): PASS - if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): PASS - if (product == "content_shell") and (os == "win") and (port == "win11"): [FAIL, PASS] - if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): PASS - if (product == "content_shell") and (os == "mac") and (port == "mac13"): [FAIL, PASS] - if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS] - if product == "chrome": [PASS, NOTRUN] + if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL] + if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL] + if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [FAIL, PASS] + if (product == "content_shell") and (os == "win") and (port == "win11"): [PASS, FAIL] + if product == "chrome": PASS FAIL
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-duration-auto.tentative.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-duration-auto.tentative.html index 375489c..cfb7cf2c 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-duration-auto.tentative.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-duration-auto.tentative.html
@@ -24,14 +24,14 @@ } #scroller { - scroll-timeline: timeline; + scroll-timeline: --timeline; } #element { z-index: -1; animation-name: anim; animation-duration: auto; - animation-timeline: timeline; + animation-timeline: --timeline; } </style> <main>
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-range-ignored.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-range-ignored.html index f086596..dabb4ec 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-range-ignored.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-range-ignored.html
@@ -32,8 +32,8 @@ } .animate { animation: anim auto linear; - view-timeline: timeline; - animation-timeline: timeline; + view-timeline: --timeline; + animation-timeline: --timeline; animation-range-start: entry 0%; animation-range-end: entry 100%; }
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-range-normal-matches-cover.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-range-normal-matches-cover.html index 44b08ca..a91e3d3 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-range-normal-matches-cover.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-range-normal-matches-cover.html
@@ -37,8 +37,8 @@ background-color: green; animation: anim-1 auto linear, anim-2 auto linear; animation-range: normal, cover; - view-timeline: t1; - animation-timeline: t1, t1; + view-timeline: --t1; + animation-timeline: --t1, --t1; } </style> <body>
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-range-visual-test-ref.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-range-visual-test-ref.html new file mode 100644 index 0000000..c246f7f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-range-visual-test-ref.html
@@ -0,0 +1,72 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<link rel="help" src="https://drafts.csswg.org/scroll-animations-1/#named-timeline-range"> +<link rel="stylesheet" href="support/animation-range.css"> +<style> +.meter { + animation: active-interval linear 100s paused; + animation-timeline: auto; +} + +.bar { + animation: slide-in linear 100s paused; + animation-timeline: auto; +} +</style> +</head> +<body> +<h3>View timeline</h3> +<template id="meters"> + <div class="meters"> + <div class="cover"><div class="meter"><div class="bar"></div></div><div>Cover</div></div> + <div class="contain"><div class="meter"><div class="bar"></div></div><div>Contain</div></div> + <div class="entry"><div class="meter"><div class="bar"></div></div><div>Entry</div></div> + <div class="exit"><div class="meter"><div class="bar"></div></div><div>Exit</div></div> + </div> +</template> +<div class="flex"> + <div> + <div class="scroller"> + <div class="subject" style="margin-top: 90px;" data-progress=".08333,-1,.5,-1"></div> + <div class="spacer"></div> + </div> + </div> + <div> + <div class="scroller"> + <div class="subject" style="margin-top: 70px;" data-progress=".25,.125,2,-1"></div> + <div class="spacer"></div> + </div> + </div> + <div> + <div class="scroller"> + <div class="subject" style="margin-top: 10px;" data-progress=".75,.875,2,-1"></div> + <div class="spacer"></div> + </div> + </div> + <div> + <div class="scroller"> + <div class="subject" style="margin-top: -10px;" data-progress=".91667,2,2,.5"></div> + <div class="spacer"></div> + </div> + </div> +</div> +</body> +<script> + let template = document.querySelector('#meters'); + let subjects = document.querySelectorAll('.subject'); + for (let i = 0; i < subjects.length; i++) { + let clone = template.content.cloneNode(true); + let meters = clone.querySelectorAll('.meter'); + let progress = subjects[i].getAttribute('data-progress').split(',').map(s => parseFloat(s)); + for (let meter of meters) { + let bar = meter.querySelector('.bar'); + let startTime = -progress.splice(0, 1)[0] * 100; + meter.style.animationDelay = `${startTime}s`; + bar.style.animationDelay = `${startTime}s`; + } + subjects[i].appendChild(clone); + } +</script> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-range-visual-test.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-range-visual-test.html new file mode 100644 index 0000000..f675f51 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-range-visual-test.html
@@ -0,0 +1,57 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<head> +<meta charset="utf-8"> +<meta name="viewport" content="width=device-width, initial-scale=1"> +<link rel="help" src="https://drafts.csswg.org/scroll-animations-1/#named-timeline-range"> +<link rel="match" href="animation-range-visual-test-ref.html"> +<link rel="stylesheet" href="support/animation-range.css"> +<script src="/common/reftest-wait.js"></script> +<script src="/web-animations/testcommon.js"></script> +</head> +<body> +<h3>View timeline</h3> +<template id="meters"> + <div class="meters"> + <div class="cover"><div class="meter"><div class="bar"></div></div><div>Cover</div></div> + <div class="contain"><div class="meter"><div class="bar"></div></div><div>Contain</div></div> + <div class="entry"><div class="meter"><div class="bar"></div></div><div>Entry</div></div> + <div class="exit"><div class="meter"><div class="bar"></div></div><div>Exit</div></div> + </div> +</template> +<div class="flex"> + <div> + <div class="scroller"> + <div class="subject" style="margin-top: 90px;"></div> + <div class="spacer"></div> + </div> + </div> + <div> + <div class="scroller"> + <div class="subject" style="margin-top: 70px;"></div> + <div class="spacer"></div> + </div> + </div> + <div> + <div class="scroller"> + <div class="subject" style="margin-top: 10px;"></div> + <div class="spacer"></div> + </div> + </div> + <div> + <div class="scroller"> + <div class="subject" style="margin-top: -10px;"></div> + <div class="spacer"></div> + </div> + </div> +</div> +</body> +<script> + let template = document.querySelector('#meters'); + let subjects = document.querySelectorAll('.subject'); + for (let i = 0; i < subjects.length; i++) { + subjects[i].appendChild(template.content.cloneNode(true)); + } + waitForCompositorReady().then(takeScreenshot); +</script> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-shorthand.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-shorthand.html index 7bd17b9..a17dd43 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-shorthand.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-shorthand.html
@@ -49,7 +49,7 @@ }); target.style.animation = 'anim 1s'; - target.style.animationTimeline = 'timeline'; + target.style.animationTimeline = '--timeline'; assert_equals(target.style.animation, ''); assert_equals(target.style.animationName, 'anim'); assert_equals(target.style.animationDuration, '1s'); @@ -61,7 +61,7 @@ }); target.style.animation = 'anim 1s'; - target.style.animationTimeline = 'timeline'; + target.style.animationTimeline = '--timeline'; assert_equals(getComputedStyle(target).animation, ''); assert_equals(getComputedStyle(target).animationName, 'anim'); assert_equals(getComputedStyle(target).animationDuration, '1s');
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-computed.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-computed.html index 7759e799c6..1e621ee 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-computed.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-computed.html
@@ -5,15 +5,15 @@ <script src="/css/support/computed-testcommon.js"></script> </head> <style> - #outer { animation-timeline: foo; } - #target { animation-timeline: bar; } + #outer { animation-timeline: --foo; } + #target { animation-timeline: --bar; } </style> <div id="outer"> <div id="target"></div> </div> <script> test_computed_value('animation-timeline', 'initial', 'auto'); -test_computed_value('animation-timeline', 'inherit', 'foo'); +test_computed_value('animation-timeline', 'inherit', '--foo'); test_computed_value('animation-timeline', 'unset', 'auto'); test_computed_value('animation-timeline', 'revert', 'auto'); test_computed_value('animation-timeline', 'auto'); @@ -22,9 +22,9 @@ test_computed_value('animation-timeline', 'none, none'); test_computed_value('animation-timeline', 'auto, none'); test_computed_value('animation-timeline', 'none, auto'); -test_computed_value('animation-timeline', 'test'); -test_computed_value('animation-timeline', 'test1, test2'); -test_computed_value('animation-timeline', 'test1, test2, none, test3, auto', 'test1, test2, none, test3, auto'); +test_computed_value('animation-timeline', '--test'); +test_computed_value('animation-timeline', '--test1, --test2'); +test_computed_value('animation-timeline', '--test1, --test2, none, --test3, auto'); test(() => { let style = getComputedStyle(document.getElementById('target')); @@ -39,13 +39,13 @@ // https://drafts.csswg.org/scroll-animations-1/#scroll-notation // // animation-timeline: scroll(<axis>? <scroller>?); -// <axis> = block | inline | vertical | horizontal +// <axis> = block | inline | x | y // <scroller> = root | nearest | self test_computed_value('animation-timeline', 'scroll()'); test_computed_value('animation-timeline', 'scroll(block)', 'scroll()'); test_computed_value('animation-timeline', 'scroll(inline)'); -test_computed_value('animation-timeline', 'scroll(horizontal)'); -test_computed_value('animation-timeline', 'scroll(vertical)'); +test_computed_value('animation-timeline', 'scroll(x)'); +test_computed_value('animation-timeline', 'scroll(y)'); test_computed_value('animation-timeline', 'scroll(root)'); test_computed_value('animation-timeline', 'scroll(nearest)', 'scroll()'); test_computed_value('animation-timeline', 'scroll(self)'); @@ -54,20 +54,20 @@ test_computed_value('animation-timeline', 'scroll(nearest inline)', 'scroll(inline)'); test_computed_value('animation-timeline', 'scroll(block self)', 'scroll(self)'); test_computed_value('animation-timeline', 'scroll(self block)', 'scroll(self)'); -test_computed_value('animation-timeline', 'scroll(vertical root)', 'scroll(root vertical)'); +test_computed_value('animation-timeline', 'scroll(y root)', 'scroll(root y)'); // https://drafts.csswg.org/scroll-animations-1/#view-notation test_computed_value('animation-timeline', 'view()'); test_computed_value('animation-timeline', 'view(block)', 'view()'); test_computed_value('animation-timeline', 'view(inline)', 'view(inline)'); -test_computed_value('animation-timeline', 'view(horizontal)', 'view(horizontal)'); -test_computed_value('animation-timeline', 'view(vertical)', 'view(vertical)'); -test_computed_value('animation-timeline', 'view(vertical 1px)'); +test_computed_value('animation-timeline', 'view(x)', 'view(x)'); +test_computed_value('animation-timeline', 'view(y)', 'view(y)'); +test_computed_value('animation-timeline', 'view(y 1px)'); test_computed_value('animation-timeline', 'view(1px auto)'); test_computed_value('animation-timeline', 'view(auto 1px)'); -test_computed_value('animation-timeline', 'view(vertical 1px auto)'); -test_computed_value('animation-timeline', 'view(1px vertical)', 'view(vertical 1px)'); -test_computed_value('animation-timeline', 'view(vertical auto)', 'view(vertical)'); -test_computed_value('animation-timeline', 'view(vertical auto auto)', 'view(vertical)'); +test_computed_value('animation-timeline', 'view(y 1px auto)'); +test_computed_value('animation-timeline', 'view(1px y)', 'view(y 1px)'); +test_computed_value('animation-timeline', 'view(y auto)', 'view(y)'); +test_computed_value('animation-timeline', 'view(y auto auto)', 'view(y)'); </script>
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-ignored.tentative.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-ignored.tentative.html index 0ac7a9d..8992cdc 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-ignored.tentative.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-ignored.tentative.html
@@ -8,7 +8,7 @@ overflow: hidden; height: 0px; scroll-timeline-attachment: defer; - scroll-timeline-name: timeline1, timeline2, timeline3; + scroll-timeline-name: --timeline1, --timeline2, --timeline3; } .scroller { overflow: hidden; @@ -24,13 +24,13 @@ to { width: 200px; } } #scroller1 { - scroll-timeline-name: timeline1; + scroll-timeline-name: --timeline1; } #scroller2 { - scroll-timeline-name: timeline2; + scroll-timeline-name: --timeline2; } #scroller3 { - scroll-timeline-name: timeline3; + scroll-timeline-name: --timeline3; } #element { width: 0px; @@ -38,10 +38,10 @@ animation-name: expand; animation-duration: 1000s; animation-timing-function: linear; - animation-timeline: timeline1; + animation-timeline: --timeline1; } /* Ensure stable expectations if feature is not supported */ - @supports not (animation-timeline:foo) { + @supports not (animation-timeline:--foo) { #element { animation-play-state: paused; } } </style> @@ -82,7 +82,7 @@ test_animation_timeline(async () => { await waitForNextFrame(); assert_equals(getComputedStyle(element).width, '120px'); - element.style = 'animation-timeline:timeline2'; + element.style = 'animation-timeline:--timeline2'; assert_equals(getComputedStyle(element).width, '140px'); }, 'Changing animation-timeline changes the timeline (sanity check)'); @@ -100,7 +100,7 @@ assert_equals(getComputedStyle(element).width, '180px'); // Changing the animation-timeline property should have no effect. - element.style = 'animation-timeline:timeline2'; + element.style = 'animation-timeline:--timeline2'; assert_equals(getComputedStyle(element).width, '180px'); }, 'animation-timeline ignored after setting timeline with JS (ScrollTimeline from JS)'); @@ -110,14 +110,14 @@ let animation = element.getAnimations()[0]; let timeline1 = animation.timeline; - element.style = 'animation-timeline:timeline2'; + element.style = 'animation-timeline:--timeline2'; assert_equals(getComputedStyle(element).width, '140px'); animation.timeline = timeline1; assert_equals(getComputedStyle(element).width, '120px'); // Should have no effect. - element.style = 'animation-timeline:timeline3'; + element.style = 'animation-timeline:--timeline3'; assert_equals(getComputedStyle(element).width, '120px'); }, 'animation-timeline ignored after setting timeline with JS (ScrollTimeline from CSS)'); @@ -130,7 +130,7 @@ assert_equals(getComputedStyle(element).width, '120px'); // Changing the animation-timeline property should have no effect. - element.style = 'animation-timeline:timeline2'; + element.style = 'animation-timeline:--timeline2'; assert_equals(getComputedStyle(element).width, '120px'); }, 'animation-timeline ignored after setting timeline with JS (document timeline)'); @@ -141,7 +141,7 @@ assert_equals(getComputedStyle(element).width, '120px'); // Changing the animation-timeline property should have no effect. - element.style = 'animation-timeline:timeline2'; + element.style = 'animation-timeline:--timeline2'; assert_equals(getComputedStyle(element).width, '120px'); }, 'animation-timeline ignored after setting timeline with JS (null)'); </script>
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-in-keyframe.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-in-keyframe.html index 7548333..04b430c 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-in-keyframe.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-in-keyframe.html
@@ -6,8 +6,8 @@ </head> <style> @keyframes test { - from { width: 100px; animation-timeline: foo; } - to { width: 100px; animation-timeline: foo; } + from { width: 100px; animation-timeline: --foo; } + to { width: 100px; animation-timeline: --foo; } } #target { width: 50px;
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-multiple.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-multiple.html index 50a829c5..e812c7d 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-multiple.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-multiple.html
@@ -7,7 +7,7 @@ <style> main { scroll-timeline-attachment: defer; - scroll-timeline-name: top_timeline, bottom_timeline, left_timeline, right_timeline; + scroll-timeline-name: --top_timeline, --bottom_timeline, --left_timeline, --right_timeline; } .scroller { @@ -39,19 +39,19 @@ } #top_scroller { - scroll-timeline-name: top_timeline; + scroll-timeline-name: --top_timeline; scroll-timeline-axis: block; } #bottom_scroller { - scroll-timeline-name: bottom_timeline; + scroll-timeline-name: --bottom_timeline; scroll-timeline-axis: inline; } #left_scroller { - scroll-timeline-name: left_timeline; + scroll-timeline-name: --left_timeline; scroll-timeline-axis: block; } #right_scroller { - scroll-timeline-name: right_timeline; + scroll-timeline-name: --right_timeline; scroll-timeline-axis: inline; } @@ -59,10 +59,10 @@ animation-name: top, bottom, left, right; animation-duration: 10s; animation-timing-function: linear; - animation-timeline: top_timeline, bottom_timeline, left_timeline, right_timeline; + animation-timeline: --top_timeline, --bottom_timeline, --left_timeline, --right_timeline; } /* Ensure stable expectations if feature is not supported */ - @supports not (animation-timeline:foo) { + @supports not (animation-timeline:--foo) { #element { animation-play-state: paused; } } </style>
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-named-scroll-progress-timeline.tentative.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-named-scroll-progress-timeline.tentative.html index 8dcf48c4..71df9ce 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-named-scroll-progress-timeline.tentative.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-named-scroll-progress-timeline.tentative.html
@@ -108,9 +108,9 @@ document.body.appendChild(target); target.appendChild(content); - target.style.scrollTimelineName = 'timeline'; + target.style.scrollTimelineName = '--timeline'; target.style.animation = "anim 10s linear"; - target.style.animationTimeline = 'timeline'; + target.style.animationTimeline = '--timeline'; target.scrollTop = 50; // 50% await waitForNextFrame(); @@ -131,9 +131,9 @@ document.body.appendChild(parent); parent.insertBefore(target, parent.firstElementChild); - parent.style.scrollTimelineName = 'timeline'; + parent.style.scrollTimelineName = '--timeline'; target.style.animation = "anim 10s linear"; - target.style.animationTimeline = 'timeline'; + target.style.animationTimeline = '--timeline'; parent.scrollTop = 100; // 50% await waitForNextFrame(); @@ -152,9 +152,9 @@ // Resolvable if using a deferred timeline, but otherwise can only resolve // if an ancestor container of the target element. - sibling.style.scrollTimelineName = 'timeline'; + sibling.style.scrollTimelineName = '--timeline'; target.style.animation = "anim 10s linear"; - target.style.animationTimeline = 'timeline'; + target.style.animationTimeline = '--timeline'; sibling.scrollTop = 50; // 50% await waitForNextFrame(); @@ -176,9 +176,9 @@ document.body.appendChild(parent); parent.appendChild(target); - parent.style.scrollTimelineName = 'timeline'; + parent.style.scrollTimelineName = '--timeline'; target.style.animation = "anim 10s linear"; - target.style.animationTimeline = 'timeline'; + target.style.animationTimeline = '--timeline'; await waitForNextFrame(); assert_equals(getComputedStyle(target).translate, 'none', @@ -198,10 +198,10 @@ document.body.appendChild(scroller); scroller.appendChild(target); - scroller.style.scrollTimelineName = 'timeline-A'; + scroller.style.scrollTimelineName = '--timeline-A'; scroller.scrollTop = 50; // 25% target.style.animation = "anim 10s linear"; - target.style.animationTimeline = 'timeline-B'; + target.style.animationTimeline = '--timeline-B'; await waitForNextFrame(); @@ -211,7 +211,7 @@ // Hold time of animation is zero. assert_equals(getComputedStyle(target).translate, '50px'); - scroller.style.scrollTimelineName = 'timeline-B'; + scroller.style.scrollTimelineName = '--timeline-B'; await waitForNextFrame(); assert_true(!!anim.timeline, 'Failed to create timeline'); @@ -228,10 +228,10 @@ document.body.appendChild(scroller); scroller.appendChild(target); - scroller.style.scrollTimelineName = 'timeline-A'; + scroller.style.scrollTimelineName = '--timeline-A'; scroller.scrollTop = 50; // 25% target.style.animation = "anim 10s linear"; - target.style.animationTimeline = 'timeline-A'; + target.style.animationTimeline = '--timeline-A'; await waitForNextFrame(); @@ -242,7 +242,7 @@ assert_percents_equal(anim.startTime, 0); assert_percents_equal(anim.currentTime, 25); - scroller.style.scrollTimelineName = 'timeline-B'; + scroller.style.scrollTimelineName = '--timeline-B'; await waitForNextFrame(); // Switching to a null timeline pauses the animation. @@ -258,8 +258,8 @@ let scroller2 = createScroller(t); target.style.animation = 'anim 10s linear'; - target.style.animationTimeline = 'timeline'; - scroller1.style.scrollTimelineName = 'timeline'; + target.style.animationTimeline = '--timeline'; + scroller1.style.scrollTimelineName = '--timeline'; scroller1.id = 'A'; scroller2.id = 'B'; @@ -272,7 +272,7 @@ scroller1.appendChild(scroller2); scroller2.appendChild(target); - scroller1.style.scrollTimelineName = 'timeline'; + scroller1.style.scrollTimelineName = '--timeline'; scroller1.scrollTop = 50; // 25% scroller2.scrollTop = 100; // 50% @@ -284,7 +284,7 @@ assert_equals(anim.timeline.source.id, 'A'); assert_equals(getComputedStyle(target).translate, '75px'); - scroller2.style.scrollTimelineName = 'timeline'; + scroller2.style.scrollTimelineName = '--timeline'; await waitForNextFrame(); // The timeline should be updated to scroller2. @@ -304,7 +304,7 @@ document.body.appendChild(wrapper); wrapper.appendChild(target); target.style.animation = "anim 10s linear"; - target.style.animationTimeline = 'timeline'; + target.style.animationTimeline = '--timeline'; await waitForNextFrame(); @@ -316,7 +316,7 @@ await waitForNextFrame(); wrapper.classList.add('scroller'); - wrapper.style.scrollTimelineName = 'timeline'; + wrapper.style.scrollTimelineName = '--timeline'; // <div id='wrapper' class="scroller"> ... // <div id='target'></div> @@ -343,9 +343,9 @@ document.body.appendChild(scroller); scroller.appendChild(target); - scroller.style.scrollTimeline = 'timeline block'; + scroller.style.scrollTimeline = '--timeline block'; target.style.animation = "anim-2 10s linear"; - target.style.animationTimeline = 'timeline'; + target.style.animationTimeline = '--timeline'; await waitForScrollLeft(scroller, 50); assert_equals(getComputedStyle(target).zIndex, '50'); @@ -361,9 +361,9 @@ document.body.appendChild(scroller); scroller.appendChild(target); - scroller.style.scrollTimeline = 'timeline inline'; + scroller.style.scrollTimeline = '--timeline inline'; target.style.animation = "anim-2 10s linear"; - target.style.animationTimeline = 'timeline'; + target.style.animationTimeline = '--timeline'; await waitForScrollTop(scroller, 50); assert_equals(getComputedStyle(target).zIndex, '50'); @@ -379,13 +379,13 @@ document.body.appendChild(scroller); scroller.appendChild(target); - scroller.style.scrollTimeline = 'timeline horizontal'; + scroller.style.scrollTimeline = '--timeline x'; target.style.animation = "anim-2 10s linear"; - target.style.animationTimeline = 'timeline'; + target.style.animationTimeline = '--timeline'; await waitForScrollLeft(scroller, 50); assert_equals(getComputedStyle(target).zIndex, '50'); -}, 'scroll-timeline-axis is horizontal'); +}, 'scroll-timeline-axis is x'); promise_test(async t => { let [scroller, target] = createScrollerAndTarget(t); @@ -397,13 +397,13 @@ document.body.appendChild(scroller); scroller.appendChild(target); - scroller.style.scrollTimeline = 'timeline vertical'; + scroller.style.scrollTimeline = '--timeline y'; target.style.animation = "anim-2 10s linear"; - target.style.animationTimeline = 'timeline'; + target.style.animationTimeline = '--timeline'; await waitForScrollTop(scroller, 50); assert_equals(getComputedStyle(target).zIndex, '50'); -}, 'scroll-timeline-axis is vertical'); +}, 'scroll-timeline-axis is y'); promise_test(async t => { let [scroller, target] = createScrollerAndTarget(t); @@ -414,9 +414,9 @@ document.body.appendChild(scroller); scroller.appendChild(target); - scroller.style.scrollTimeline = 'timeline block'; + scroller.style.scrollTimeline = '--timeline block'; target.style.animation = "anim-2 10s linear"; - target.style.animationTimeline = 'timeline'; + target.style.animationTimeline = '--timeline'; await waitForScrollTop(scroller, 25); await waitForScrollLeft(scroller, 75);
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-none.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-none.html index a8e07a4..7092523 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-none.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-none.html
@@ -20,7 +20,7 @@ animation-timeline: none; } #element_unknown_timeline { - animation-timeline: unknown_timeline; + animation-timeline: --unknown_timeline; } </style>
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-parsing.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-parsing.html index 4916f77..f0061c5 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-parsing.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-parsing.html
@@ -16,10 +16,11 @@ test_valid_value('animation-timeline', 'none, none'); test_valid_value('animation-timeline', 'auto, none'); test_valid_value('animation-timeline', 'none, auto'); -test_valid_value('animation-timeline', 'test'); -test_valid_value('animation-timeline', 'test1, test2'); -test_valid_value('animation-timeline', 'test1, test2, none, test3, auto', ["test1, test2, none, test3, auto", 'test1, test2, none, test3, auto']); +test_valid_value('animation-timeline', '--test'); +test_valid_value('animation-timeline', '--test1, --test2'); +test_valid_value('animation-timeline', '--test1, --test2, none, --test3, auto'); +test_invalid_value('animation-timeline', 'test1'); test_invalid_value('animation-timeline', '10px'); test_invalid_value('animation-timeline', 'auto auto'); test_invalid_value('animation-timeline', 'none none'); @@ -32,13 +33,13 @@ // https://drafts.csswg.org/scroll-animations-1/#scroll-notation // // animation-timeline: scroll(<axis>? <scroller>?); -// <axis> = block | inline | vertical | horizontal +// <axis> = block | inline | x | y // <scroller> = root | nearest | self test_valid_value('animation-timeline', 'scroll()'); test_valid_value('animation-timeline', 'scroll(block)', 'scroll()'); test_valid_value('animation-timeline', 'scroll(inline)'); -test_valid_value('animation-timeline', 'scroll(horizontal)'); -test_valid_value('animation-timeline', 'scroll(vertical)'); +test_valid_value('animation-timeline', 'scroll(x)'); +test_valid_value('animation-timeline', 'scroll(y)'); test_valid_value('animation-timeline', 'scroll(root)'); test_valid_value('animation-timeline', 'scroll(nearest)', 'scroll()'); test_valid_value('animation-timeline', 'scroll(self)'); @@ -46,27 +47,27 @@ test_valid_value('animation-timeline', 'scroll(nearest inline)', 'scroll(inline)'); test_valid_value('animation-timeline', 'scroll(block self)', 'scroll(self)'); test_valid_value('animation-timeline', 'scroll(self block)', 'scroll(self)'); -test_valid_value('animation-timeline', 'scroll(vertical root)', 'scroll(root vertical)'); +test_valid_value('animation-timeline', 'scroll(y root)', 'scroll(root y)'); test_invalid_value('animation-timeline', 'scroll(abc root)'); test_invalid_value('animation-timeline', 'scroll(abc)'); -test_invalid_value('animation-timeline', 'scroll(vertical abc)'); +test_invalid_value('animation-timeline', 'scroll(y abc)'); test_invalid_value('animation-timeline', 'scroll("string")'); // https://drafts.csswg.org/scroll-animations-1/#view-notation test_valid_value('animation-timeline', 'view()'); test_valid_value('animation-timeline', 'view(block)', 'view()'); test_valid_value('animation-timeline', 'view(inline)'); -test_valid_value('animation-timeline', 'view(horizontal)'); -test_valid_value('animation-timeline', 'view(vertical)'); -test_valid_value('animation-timeline', 'view(vertical 1px 2px)'); -test_valid_value('animation-timeline', 'view(vertical 1px)'); -test_valid_value('animation-timeline', 'view(vertical auto)', 'view(vertical)'); -test_valid_value('animation-timeline', 'view(vertical auto auto)', 'view(vertical)'); -test_valid_value('animation-timeline', 'view(vertical auto 1px)'); -test_valid_value('animation-timeline', 'view(1px 2px vertical)', 'view(vertical 1px 2px)'); -test_valid_value('animation-timeline', 'view(1px vertical)', 'view(vertical 1px)'); -test_valid_value('animation-timeline', 'view(auto horizontal)', 'view(horizontal)'); +test_valid_value('animation-timeline', 'view(x)'); +test_valid_value('animation-timeline', 'view(y)'); +test_valid_value('animation-timeline', 'view(y 1px 2px)'); +test_valid_value('animation-timeline', 'view(y 1px)'); +test_valid_value('animation-timeline', 'view(y auto)', 'view(y)'); +test_valid_value('animation-timeline', 'view(y auto auto)', 'view(y)'); +test_valid_value('animation-timeline', 'view(y auto 1px)'); +test_valid_value('animation-timeline', 'view(1px 2px y)', 'view(y 1px 2px)'); +test_valid_value('animation-timeline', 'view(1px y)', 'view(y 1px)'); +test_valid_value('animation-timeline', 'view(auto x)', 'view(x)'); test_valid_value('animation-timeline', 'view(1px 2px)'); test_valid_value('animation-timeline', 'view(1px)'); test_valid_value('animation-timeline', 'view(1px 1px)', 'view(1px)'); @@ -75,11 +76,11 @@ test_valid_value('animation-timeline', 'view(auto)', 'view()'); test_valid_value('animation-timeline', 'view(auto auto)', 'view()'); -test_invalid_value('animation-timeline', 'view(vertical 1px 2px 3px)'); -test_invalid_value('animation-timeline', 'view(1px vertical 3px)'); +test_invalid_value('animation-timeline', 'view(y 1px 2px 3px)'); +test_invalid_value('animation-timeline', 'view(1px y 3px)'); test_invalid_value('animation-timeline', 'view(1px 2px 3px)'); test_invalid_value('animation-timeline', 'view(abc block)'); test_invalid_value('animation-timeline', 'view(abc)'); -test_invalid_value('animation-timeline', 'view(vertical abc)'); +test_invalid_value('animation-timeline', 'view(y abc)'); test_invalid_value('animation-timeline', 'view("string")'); </script>
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-scroll-functional-notation.tentative.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-scroll-functional-notation.tentative.html index 09917b4..0bba4a0 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-scroll-functional-notation.tentative.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-scroll-functional-notation.tentative.html
@@ -143,21 +143,21 @@ let [container, div] = createTargetWithStuff(t, 'block-content'); container.style.writingMode = 'vertical-lr'; div.style.animation = "anim 10s linear"; - div.style.animationTimeline = "scroll(horizontal)"; + div.style.animationTimeline = "scroll(x)"; await scrollLeft(container, 50); assert_equals(getComputedStyle(div).translate, '100px'); -}, 'animation-timeline: scroll(horizontal)'); +}, 'animation-timeline: scroll(x)'); promise_test(async t => { let [container, div] = createTargetWithStuff(t, 'inline-content'); container.style.writingMode = 'vertical-lr'; div.style.animation = "anim 10s linear"; - div.style.animationTimeline = "scroll(vertical)"; + div.style.animationTimeline = "scroll(y)"; await scrollTop(container, 50); assert_equals(getComputedStyle(div).translate, '100px'); -}, 'animation-timeline: scroll(vertical)'); +}, 'animation-timeline: scroll(y)'); // TODO: Add more tests which change the overflow property of the container for // scroll(nearest)
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-view-functional-notation.tentative.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-view-functional-notation.tentative.html index 745d76c..8a62199b 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-view-functional-notation.tentative.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-timeline-view-functional-notation.tentative.html
@@ -202,7 +202,7 @@ let [container, div] = createTargetWithStuff(t, ['target', 'content']); container.style.overflow = 'hidden'; div.style.animation = "fade-out-without-timeline-range 1s linear"; - div.style.animationTimeline = "view(horizontal)"; + div.style.animationTimeline = "view(x)"; // So the range is [-200px, 100px], but it is impossible to scroll to the // negative part. @@ -214,12 +214,12 @@ assert_equals(getComputedStyle(div).opacity, '0.2', 'At 80%'); await scrollLeft(container, 100); assert_equals(getComputedStyle(div).opacity, '0', 'At 100%'); -}, 'animation-timeline: view(horizontal) without timeline range name'); +}, 'animation-timeline: view(x) without timeline range name'); promise_test(async t => { let [container, div] = createTargetWithStuff(t, ['target', 'content']); div.style.animation = "fade-out-without-timeline-range 1s linear"; - div.style.animationTimeline = "view(vertical)"; + div.style.animationTimeline = "view(y)"; // So the range is [-200px, 100px], but it is impossible to scroll to the // negative part. @@ -231,13 +231,13 @@ assert_equals(getComputedStyle(div).opacity, '0.2', 'At 80%'); await scrollTop(container, 100); assert_equals(getComputedStyle(div).opacity, '0', 'At 100%'); -}, 'animation-timeline: view(vertical) without timeline range name'); +}, 'animation-timeline: view(y) without timeline range name'); promise_test(async t => { let [container, div] = createTargetWithStuff(t, ['target', 'content']); container.style.overflow = 'hidden'; div.style.animation = "fade-out-without-timeline-range 1s linear"; - div.style.animationTimeline = "view(horizontal 50px)"; + div.style.animationTimeline = "view(x 50px)"; // So the range is [-150px, 50px], but it is impossible to scroll to the // negative part. @@ -248,7 +248,7 @@ assert_equals(getComputedStyle(div).opacity, '0.2', 'At 80%'); await scrollLeft(container, 50); assert_equals(getComputedStyle(div).opacity, '0', 'At 100%'); -}, 'animation-timeline: view(horizontal 50px) without timeline range name'); +}, 'animation-timeline: view(x 50px) without timeline range name'); promise_test(async t => { let [container, div] = createTargetWithStuff(t, ['target', 'content']); @@ -384,7 +384,7 @@ let [container, div] = createTargetWithStuff(t, ['target', 'content']); container.style.overflow = 'scroll'; div.style.animation = "fade-out 1s linear"; - div.style.animationTimeline = "view(horizontal)"; + div.style.animationTimeline = "view(x)"; await scrollLeft(container, 0); assert_equals(getComputedStyle(div).opacity, '1', 'At exit 0%'); @@ -392,13 +392,13 @@ assert_equals(getComputedStyle(div).opacity, '0.5', 'At exit 50%'); await scrollLeft(container, 100); assert_equals(getComputedStyle(div).opacity, '0', 'At exit 100%'); -}, 'animation-timeline: view(horizontal)'); +}, 'animation-timeline: view(x)'); promise_test(async t => { let [container, div] = createTargetWithStuff(t, ['target', 'content']); container.style.overflow = 'scroll'; div.style.animation = "fade-out 1s linear"; - div.style.animationTimeline = "view(vertical)"; + div.style.animationTimeline = "view(y)"; await scrollTop(container, 0); assert_equals(getComputedStyle(div).opacity, '1', 'At exit 0%'); @@ -406,20 +406,20 @@ assert_equals(getComputedStyle(div).opacity, '0.5', 'At exit 50%'); await scrollTop(container, 100); assert_equals(getComputedStyle(div).opacity, '0', 'At exit 100%'); -}, 'animation-timeline: view(vertical)'); +}, 'animation-timeline: view(y)'); promise_test(async t => { let [container, div] = createTargetWithStuff(t, ['target', 'content']); container.style.overflowY = 'hidden'; container.style.overflowX = 'scroll'; div.style.animation = "fade-out 1s linear"; - div.style.animationTimeline = "view(horizontal 50px)"; + div.style.animationTimeline = "view(x 50px)"; await scrollLeft(container, 0); assert_equals(getComputedStyle(div).opacity, '0.5', 'At exit 50%'); await scrollLeft(container, 50); assert_equals(getComputedStyle(div).opacity, '0', 'At exit 100%'); -}, 'animation-timeline: view(horizontal 50px)'); +}, 'animation-timeline: view(x 50px)'); promise_test(async t => { let [container, div] = createTargetWithStuff(t, ['target', 'content']);
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/get-animations-inactive-timeline.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/get-animations-inactive-timeline.html index 10bf00f..d304891 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/get-animations-inactive-timeline.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/get-animations-inactive-timeline.html
@@ -18,7 +18,7 @@ overflow-x: scroll; height: 200px; width: 200px; - scroll-timeline-name: timeline; + scroll-timeline-name: --timeline; } #spacer { height: 200vh; @@ -28,7 +28,7 @@ height: 100px; width: 100px; animation: slide 1s linear; - animation-timeline: timeline; + animation-timeline: --timeline; } </style> <body>
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/merge-timeline-offset-keyframes.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/merge-timeline-offset-keyframes.html index c6d384fc..e5d5037d 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/merge-timeline-offset-keyframes.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/merge-timeline-offset-keyframes.html
@@ -42,8 +42,8 @@ animation-duration: auto; animation-fill-mode: both; animation-timing-function: linear; - view-timeline: target; - animation-timeline: target; + view-timeline: --target; + animation-timeline: --target; } #target.anim-1 { animation-name: anim-1;
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/printing/animation-timeline-none-with-progress-print.tentative.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/printing/animation-timeline-none-with-progress-print.tentative.html index 3939a1d..c37c1b95 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/printing/animation-timeline-none-with-progress-print.tentative.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/printing/animation-timeline-none-with-progress-print.tentative.html
@@ -12,7 +12,7 @@ } #scroller { - scroll-timeline: timeline; + scroll-timeline: --timeline; overflow: scroll; width: 100px; height: 100px;
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/printing/scroll-timeline-specified-scroller-print.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/printing/scroll-timeline-specified-scroller-print.html index 05fab3e4..dd4add4 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/printing/scroll-timeline-specified-scroller-print.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/printing/scroll-timeline-specified-scroller-print.html
@@ -13,7 +13,7 @@ } #scroller { - scroll-timeline: timeline; + scroll-timeline: --timeline; overflow: scroll; width: 100px; height: 100px; @@ -29,10 +29,10 @@ height: 100px; background-color: green; animation: anim 1s linear; - animation-timeline: timeline; + animation-timeline: --timeline; } - @supports not (animation-timeline:timeline) { + @supports not (animation-timeline:--timeline) { #box { animation-play-state: paused; }
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/progress-based-animation-timeline.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/progress-based-animation-timeline.html index eeb1e54..bbc60e3 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/progress-based-animation-timeline.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/progress-based-animation-timeline.html
@@ -21,18 +21,18 @@ } #scroller1 { - scroll-timeline: top_timeline; + scroll-timeline: --top_timeline; } #element { animation-name: top; animation-duration: 10s; animation-timing-function: linear; - animation-timeline: top_timeline; + animation-timeline: --top_timeline; position: absolute; } /* Ensure stable expectations if feature is not supported */ - @supports not (animation-timeline:foo) { + @supports not (animation-timeline:--foo) { #element { animation-play-state: paused; } } </style>
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-attachment.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-attachment.html index 7996e48..c924302 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-attachment.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-attachment.html
@@ -39,10 +39,10 @@ background-color: coral; width: 0px; animation: anim auto linear; - animation-timeline: t1; + animation-timeline: --t1; } .timeline { - scroll-timeline-name: t1; + scroll-timeline-name: --t1; } .local { scroll-timeline-attachment: local; @@ -161,7 +161,7 @@ <template id=scroll_timeline_defer_axis> <div class="timeline defer" style="scroll-timeline-axis:inline"> <div class=target>Test</div> - <div class="scroller timeline ancestor" style="scroll-timeline-axis:vertical"> + <div class="scroller timeline ancestor" style="scroll-timeline-axis:y"> <div class=content></div> </div> </div> @@ -173,7 +173,7 @@ assert_equals(target.getAnimations().length, 1); let anim = target.getAnimations()[0]; assert_not_equals(anim.timeline, null); - assert_equals(anim.timeline.axis, 'vertical'); + assert_equals(anim.timeline.axis, 'y'); }, 'Axis of deferred timeline is taken from attached timeline'); </script> @@ -181,7 +181,7 @@ <template id=scroll_timeline_defer_axis_multiple> <div class="timeline defer" style="scroll-timeline-axis:inline"> <div class=target>Test</div> - <div class="scroller timeline ancestor" style="scroll-timeline-axis:vertical"> + <div class="scroller timeline ancestor" style="scroll-timeline-axis:y"> <div class=content></div> </div> <!-- Extra attachment -->
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-axis-computed.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-axis-computed.html index b971aba6..c942fb4 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-axis-computed.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-axis-computed.html
@@ -5,7 +5,7 @@ <script src="/css/support/computed-testcommon.js"></script> <style> #outer { scroll-timeline-axis: inline; } - #target { scroll-timeline-axis: vertical; } + #target { scroll-timeline-axis: y; } </style> <div id="outer"> <div id="target"></div> @@ -17,11 +17,11 @@ test_computed_value('scroll-timeline-axis', 'revert', 'block'); test_computed_value('scroll-timeline-axis', 'block'); test_computed_value('scroll-timeline-axis', 'inline'); -test_computed_value('scroll-timeline-axis', 'vertical'); -test_computed_value('scroll-timeline-axis', 'horizontal'); +test_computed_value('scroll-timeline-axis', 'y'); +test_computed_value('scroll-timeline-axis', 'x'); test_computed_value('scroll-timeline-axis', 'block, inline'); test_computed_value('scroll-timeline-axis', 'inline, block'); -test_computed_value('scroll-timeline-axis', 'block, vertical, horizontal, inline'); +test_computed_value('scroll-timeline-axis', 'block, y, x, inline'); test_computed_value('scroll-timeline-axis', 'inline, inline, inline, inline'); test(() => {
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-axis-parsing.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-axis-parsing.html index 25f48f0c..a9a760a5 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-axis-parsing.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-axis-parsing.html
@@ -14,11 +14,11 @@ test_valid_value('scroll-timeline-axis', 'block'); test_valid_value('scroll-timeline-axis', 'inline'); -test_valid_value('scroll-timeline-axis', 'vertical'); -test_valid_value('scroll-timeline-axis', 'horizontal'); +test_valid_value('scroll-timeline-axis', 'y'); +test_valid_value('scroll-timeline-axis', 'x'); test_valid_value('scroll-timeline-axis', 'block, inline'); test_valid_value('scroll-timeline-axis', 'inline, block'); -test_valid_value('scroll-timeline-axis', 'block, vertical, horizontal, inline'); +test_valid_value('scroll-timeline-axis', 'block, y, x, inline'); test_valid_value('scroll-timeline-axis', 'inline, inline, inline, inline'); test_invalid_value('scroll-timeline-axis', 'abc');
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-axis-writing-mode.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-axis-writing-mode.html index 958ce496..872dc1b 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-axis-writing-mode.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-axis-writing-mode.html
@@ -19,26 +19,26 @@ to { width: 200px; } } #timeline_initial_axis { - scroll-timeline: timeline_initial_axis; + scroll-timeline: --timeline_initial_axis; } - #timeline_vertical { - scroll-timeline: timeline_vertical vertical; + #timeline_y { + scroll-timeline: --timeline_y y; } - #timeline_horizontal { - scroll-timeline: timeline_horizontal horizontal; + #timeline_x { + scroll-timeline: --timeline_x x; } #timeline_block_in_horizontal { - scroll-timeline: timeline_block_in_horizontal block; + scroll-timeline: --timeline_block_in_horizontal block; } #timeline_inline_in_horizontal { - scroll-timeline: timeline_inline_in_horizontal inline; + scroll-timeline: --timeline_inline_in_horizontal inline; } #timeline_block_in_vertical { - scroll-timeline: timeline_block_in_vertical block; + scroll-timeline: --timeline_block_in_vertical block; writing-mode: vertical-lr; } #timeline_inline_in_vertical { - scroll-timeline: timeline_inline_in_vertical inline; + scroll-timeline: --timeline_inline_in_vertical inline; writing-mode: vertical-lr; } .target { @@ -49,28 +49,28 @@ position: absolute; } /* Ensure stable expectations if feature is not supported */ - @supports not (animation-timeline:foo) { + @supports not (animation-timeline:--foo) { .target { animation-play-state: paused; } } - #element_initial_axis { animation-timeline: timeline_initial_axis; } - #element_vertical { animation-timeline: timeline_vertical; } - #element_horizontal { animation-timeline: timeline_horizontal; } - #element_block_in_horizontal { animation-timeline: timeline_block_in_horizontal; } - #element_inline_in_horizontal { animation-timeline: timeline_inline_in_horizontal; } - #element_block_in_vertical { animation-timeline: timeline_block_in_vertical; } - #element_inline_in_vertical { animation-timeline: timeline_inline_in_vertical; } + #element_initial_axis { animation-timeline: --timeline_initial_axis; } + #element_y { animation-timeline: --timeline_y; } + #element_x { animation-timeline: --timeline_x; } + #element_block_in_horizontal { animation-timeline: --timeline_block_in_horizontal; } + #element_inline_in_horizontal { animation-timeline: --timeline_inline_in_horizontal; } + #element_block_in_vertical { animation-timeline: --timeline_block_in_vertical; } + #element_inline_in_vertical { animation-timeline: --timeline_inline_in_vertical; } </style> <div class=scroller id=timeline_initial_axis> <div class=contents></div> <div class=target id=element_initial_axis></div> </div> -<div class=scroller id=timeline_vertical> +<div class=scroller id=timeline_y> <div class=contents></div> - <div class=target id=element_vertical></div> + <div class=target id=element_y></div> </div> -<div class=scroller id=timeline_horizontal> +<div class=scroller id=timeline_x> <div class=contents></div> - <div class=target id=element_horizontal></div> + <div class=target id=element_x></div> </div> <div class=scroller id=timeline_block_in_horizontal> <div class=contents></div> @@ -91,11 +91,11 @@ <script> // Animations linked to vertical scroll-timelines are at 75% progress. timeline_initial_axis.scrollTop = 75; - timeline_vertical.scrollTop = 75; + timeline_y.scrollTop = 75; timeline_block_in_horizontal.scrollTop = 75; timeline_inline_in_vertical.scrollTop = 75; // Animations linked to horizontal scroll-timelines are at 25% progress. - timeline_horizontal.scrollLeft = 25; + timeline_x.scrollLeft = 25; timeline_block_in_vertical.scrollLeft = 25; timeline_inline_in_horizontal.scrollLeft = 25; @@ -106,12 +106,12 @@ promise_test(async (t) => { await waitForNextFrame(); - assert_equals(getComputedStyle(element_vertical).width, '175px'); + assert_equals(getComputedStyle(element_y).width, '175px'); }, 'Vertical axis'); promise_test(async (t) => { await waitForNextFrame(); - assert_equals(getComputedStyle(element_horizontal).width, '125px'); + assert_equals(getComputedStyle(element_x).width, '125px'); }, 'Horizontal axis'); promise_test(async (t) => {
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-dynamic.tentative.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-dynamic.tentative.html index 744639f..57c666e 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-dynamic.tentative.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-dynamic.tentative.html
@@ -8,7 +8,7 @@ <style> main { scroll-timeline-attachment: defer; - scroll-timeline-name: timeline; + scroll-timeline-name: --timeline; } .scroller { @@ -110,8 +110,8 @@ await assert_width(element, '100px'); // Switch to scroll timeline. - scroller1.style.scrollTimelineName = 'timeline'; - element.style.animationTimeline = 'timeline'; + scroller1.style.scrollTimelineName = '--timeline'; + element.style.animationTimeline = '--timeline'; await assert_width(element, '120px'); // Switching from ScrollTimeline -> DocumentTimeline should preserve @@ -131,8 +131,8 @@ assert_true(anim.pending, "The animation is in play pending"); // Switch to scroll timeline for a pending animation. - scroller1.style.scrollTimelineName = 'timeline'; - element.style.animationTimeline = 'timeline'; + scroller1.style.scrollTimelineName = '--timeline'; + element.style.animationTimeline = '--timeline'; await anim.ready; assert_false(anim.pending, "The animation is not pending"); @@ -144,19 +144,19 @@ let element = insertElement(); // Note: #scroller1 is at 20%, and #scroller2 is at 40%. - scroller1.style.scrollTimelineName = 'timeline1'; - scroller2.style.scrollTimelineName = 'timeline2'; - main.style.scrollTimelineName = "timeline1, timeline2"; + scroller1.style.scrollTimelineName = '--timeline1'; + scroller2.style.scrollTimelineName = '--timeline2'; + main.style.scrollTimelineName = "--timeline1, --timeline2"; await assert_width(element, '100px'); - element.style.animationTimeline = 'timeline1'; + element.style.animationTimeline = '--timeline1'; await assert_width(element, '120px'); - element.style.animationTimeline = 'timeline2'; + element.style.animationTimeline = '--timeline2'; await assert_width(element, '140px'); - element.style.animationTimeline = 'timeline1'; + element.style.animationTimeline = '--timeline1'; await assert_width(element, '120px'); // Switching from ScrollTimeline -> DocumentTimeline should preserve @@ -169,7 +169,7 @@ dynamic_rule_test(async (t, assert_width) => { let element = insertElement(); - scroller1.style.scrollTimelineName = 'timeline'; + scroller1.style.scrollTimelineName = '--timeline'; // DocumentTimeline applies by default. await assert_width(element, '100px'); @@ -179,7 +179,7 @@ await element.getAnimations()[0].ready; // DocumentTimeline -> none - element.style.animationTimeline = 'none'; + element.style.animationTimeline = '--none'; await assert_width(element, '0px'); // none -> DocumentTimeline @@ -187,15 +187,15 @@ await assert_width(element, '100px'); // DocumentTimeline -> ScrollTimeline - element.style.animationTimeline = 'timeline'; + element.style.animationTimeline = '--timeline'; await assert_width(element, '120px'); // ScrollTimeline -> none - element.style.animationTimeline = 'none'; + element.style.animationTimeline = '--none'; await assert_width(element, '120px'); // none -> ScrollTimeline - element.style.animationTimeline = 'timeline'; + element.style.animationTimeline = '--timeline'; await assert_width(element, '120px'); }, 'Changing to/from animation-timeline:none'); @@ -204,18 +204,18 @@ let element = insertElement(); element.style.animationDirection = 'reverse'; - element.style.animationTimeline = 'timeline'; + element.style.animationTimeline = '--timeline'; // Inactive animation-timeline. Animation is inactive. await assert_width(element, '0px'); // Note: #scroller1 is at 20%. - scroller1.style.scrollTimelineName = 'timeline'; + scroller1.style.scrollTimelineName = '--timeline'; await assert_width(element, '180px'); // Note: #scroller2 is at 40%. scroller1.style.scrollTimelineName = ''; - scroller2.style.scrollTimelineName = 'timeline'; + scroller2.style.scrollTimelineName = '--timeline'; await assert_width(element, '160px'); element.style.animationDirection = ''; @@ -224,13 +224,13 @@ dynamic_rule_test(async (t, assert_width) => { let element = insertElement(); - element.style.animationTimeline = 'timeline'; + element.style.animationTimeline = '--timeline'; // Inactive animation-timeline. Animation effect is inactive. await assert_width(element, '0px'); // Note: #scroller1 is at 20%. - scroller1.style.scrollTimelineName = 'timeline'; + scroller1.style.scrollTimelineName = '--timeline'; await assert_width(element, '120px'); element.style.animationPlayState = 'paused'; @@ -240,7 +240,7 @@ // Note: #scroller2 is at 40%. scroller1.style.scrollTimelineName = ''; - scroller2.style.scrollTimelineName = 'timeline'; + scroller2.style.scrollTimelineName = '--timeline'; // Should be at the same position until we unpause. await assert_width(element, '120px'); @@ -254,11 +254,11 @@ let element = insertElement(); // Note: #scroller1 is at 20%. - scroller1.style.scrollTimelineName = 'timeline'; + scroller1.style.scrollTimelineName = '--timeline'; await assert_width(element, '100px'); - element.style.animationTimeline = 'timeline'; + element.style.animationTimeline = '--timeline'; element.style.animationPlayState = 'paused'; // Pausing should happen before the timeline is modified. (Tentative).
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-in-container-query.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-in-container-query.html index 38b8ffdc..742c35b 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-in-container-query.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-in-container-query.html
@@ -29,7 +29,7 @@ /* This does not apply initially. */ @container (width > 200px) { #scroller { - scroll-timeline: timeline; + scroll-timeline: --timeline; } } @@ -42,7 +42,7 @@ height: 10px; width: 10px; animation: recolor 10s linear; - animation-timeline: timeline; + animation-timeline: --timeline; background-color: rgb(0, 0, 0); } </style>
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-inactive.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-inactive.html index 0953f1b..eedc8e3 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-inactive.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-inactive.html
@@ -27,12 +27,12 @@ <template id=basic> <style> #timeline { - scroll-timeline: timeline; + scroll-timeline: --timeline; } #element { width: 0px; animation: expand 10s linear paused; - animation-timeline: timeline; + animation-timeline: --timeline; } </style> <div id="container"> @@ -57,7 +57,7 @@ #element { width: 0px; animation: expand 10s linear paused; - animation-timeline: timeline; + animation-timeline: --timeline; } </style> <div id="container">
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-multi-pass.tentative.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-multi-pass.tentative.html index 651ba212..7e0c133 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-multi-pass.tentative.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-multi-pass.tentative.html
@@ -18,7 +18,7 @@ main { height: 0px; overflow: hidden; - scroll-timeline: timeline1 defer, timeline2 defer; + scroll-timeline: --timeline1 defer, --timeline2 defer; } .scroller { height: 100px; @@ -30,12 +30,12 @@ #element1 { width: 1px; animation: expand_width 10s; - animation-timeline: timeline1; + animation-timeline: --timeline1; } #element2 { height: 1px; animation: expand_height 10s; - animation-timeline: timeline2; + animation-timeline: --timeline2; } </style> <main id=main> @@ -61,7 +61,7 @@ let events1 = []; let events2 = []; - insertScroller('timeline1'); + insertScroller('--timeline1'); // Even though the scroller was just inserted into the DOM, |timeline1| // remains inactive until the next frame. // @@ -69,7 +69,7 @@ assert_equals(getComputedStyle(element1).width, '1px'); (new ResizeObserver(entries => { events1.push(entries); - insertScroller('timeline2'); + insertScroller('--timeline2'); assert_equals(getComputedStyle(element2).height, '1px'); })).observe(element1);
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-name-computed.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-name-computed.html index bfffafc..b803ee8 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-name-computed.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-name-computed.html
@@ -5,24 +5,24 @@ <script src="/css/support/computed-testcommon.js"></script> </head> <style> - #outer { scroll-timeline-name: foo; } - #target { scroll-timeline-name: bar; } + #outer { scroll-timeline-name: --foo; } + #target { scroll-timeline-name: --bar; } </style> <div id="outer"> <div id="target"></div> </div> <script> test_computed_value('scroll-timeline-name', 'initial', 'none'); -test_computed_value('scroll-timeline-name', 'inherit', 'foo'); +test_computed_value('scroll-timeline-name', 'inherit', '--foo'); test_computed_value('scroll-timeline-name', 'unset', 'none'); test_computed_value('scroll-timeline-name', 'revert', 'none'); test_computed_value('scroll-timeline-name', 'none'); -test_computed_value('scroll-timeline-name', 'test'); -test_computed_value('scroll-timeline-name', 'foo, bar'); -test_computed_value('scroll-timeline-name', 'bar, foo'); -test_computed_value('scroll-timeline-name', 'a, b, c, D, e'); +test_computed_value('scroll-timeline-name', '--foo'); +test_computed_value('scroll-timeline-name', '--foo, --bar'); +test_computed_value('scroll-timeline-name', '--bar, --foo'); +test_computed_value('scroll-timeline-name', '--a, --b, --c, --D, --e'); test_computed_value('scroll-timeline-name', 'none, none'); -test_computed_value('scroll-timeline-name', 'a, b, c, none, d, e'); +test_computed_value('scroll-timeline-name', '--a, --b, --c, none, --d, --e'); test(() => { let style = getComputedStyle(document.getElementById('target'));
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-name-parsing.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-name-parsing.html index 0fb2712..d38b964 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-name-parsing.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-name-parsing.html
@@ -12,15 +12,16 @@ test_valid_value('scroll-timeline-name', 'revert'); test_valid_value('scroll-timeline-name', 'none'); -test_valid_value('scroll-timeline-name', 'abc'); -test_valid_value('scroll-timeline-name', ' abc', 'abc'); -test_valid_value('scroll-timeline-name', 'aBc'); -test_valid_value('scroll-timeline-name', 'foo, bar'); -test_valid_value('scroll-timeline-name', 'bar, foo'); +test_valid_value('scroll-timeline-name', '--abc'); +test_valid_value('scroll-timeline-name', ' --abc', '--abc'); +test_valid_value('scroll-timeline-name', '--aBc'); +test_valid_value('scroll-timeline-name', '--foo, --bar'); +test_valid_value('scroll-timeline-name', '--bar, --foo'); test_valid_value('scroll-timeline-name', 'none, none'); -test_valid_value('scroll-timeline-name', 'a, none, b'); -test_valid_value('scroll-timeline-name', 'auto'); +test_valid_value('scroll-timeline-name', '--a, none, --b'); +test_invalid_value('scroll-timeline-name', 'auto'); +test_invalid_value('scroll-timeline-name', 'abc'); test_invalid_value('scroll-timeline-name', 'default'); test_invalid_value('scroll-timeline-name', '10px'); test_invalid_value('scroll-timeline-name', 'foo bar');
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-name-shadow.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-name-shadow.html index f5cd2ce..f2bea29 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-name-shadow.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-name-shadow.html
@@ -31,10 +31,10 @@ <style> .target { animation: anim 10s linear; - animation-timeline: timeline; + animation-timeline: --timeline; } main > .scroller { - scroll-timeline: timeline horizontal; + scroll-timeline: --timeline x; } </style> <div class=scroller> @@ -42,7 +42,7 @@ <template shadowrootmode=open> <style> :host { - scroll-timeline: timeline vertical; + scroll-timeline: --timeline y; } </style> <slot></slot> @@ -60,7 +60,7 @@ assert_equals(target.getAnimations().length, 1); let anim = target.getAnimations()[0]; assert_not_equals(anim.timeline, null); - assert_equals(anim.timeline.axis, 'vertical'); + assert_equals(anim.timeline.axis, 'y'); }, 'Outer animation can see scroll timeline defined by :host'); </script> @@ -69,17 +69,17 @@ <style> .target { animation: anim 10s linear; - animation-timeline: timeline; + animation-timeline: --timeline; } .host { - scroll-timeline: timeline horizontal; + scroll-timeline: --timeline x; } </style> <div class=host> <template shadowrootmode=open> <style> ::slotted(.scroller) { - scroll-timeline: timeline vertical; + scroll-timeline: --timeline y; } </style> <slot></slot> @@ -98,7 +98,7 @@ assert_equals(target.getAnimations().length, 1); let anim = target.getAnimations()[0]; assert_not_equals(anim.timeline, null); - assert_equals(anim.timeline.axis, 'vertical'); + assert_equals(anim.timeline.axis, 'y'); }, 'Outer animation can see scroll timeline defined by ::slotted'); </script> @@ -106,10 +106,10 @@ <template id=scroll_timeline_part> <style> .host { - scroll-timeline: timeline vertical; + scroll-timeline: --timeline y; } .host::part(foo) { - scroll-timeline: timeline horizontal; + scroll-timeline: --timeline x; } </style> <div class=host> @@ -122,7 +122,7 @@ } .target { animation: anim2 10s linear; - animation-timeline: timeline; + animation-timeline: --timeline; } </style> <div part=foo> @@ -140,7 +140,7 @@ assert_equals(target.getAnimations().length, 1); let anim = target.getAnimations()[0]; assert_not_equals(anim.timeline, null); - assert_equals(anim.timeline.axis, 'horizontal'); + assert_equals(anim.timeline.axis, 'x'); }, 'Inner animation can see scroll timeline defined by ::part'); </script> @@ -149,10 +149,10 @@ <style> .target { animation: anim 10s linear; - animation-timeline: timeline; + animation-timeline: --timeline; } .host { - scroll-timeline: timeline horizontal; + scroll-timeline: --timeline x; } </style> <div class=scroller> @@ -160,7 +160,7 @@ <template shadowrootmode=open> <style> div { - scroll-timeline: timeline vertical; + scroll-timeline: --timeline y; } </style> <div> @@ -180,6 +180,6 @@ assert_equals(target.getAnimations().length, 1); let anim = target.getAnimations()[0]; assert_not_equals(anim.timeline, null); - assert_equals(anim.timeline.axis, 'vertical'); + assert_equals(anim.timeline.axis, 'y'); }, 'Slotted element can see scroll timeline within the shadow'); </script>
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-nearest-with-absolute-positioned-element.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-nearest-with-absolute-positioned-element.html index 7fe2d12..57a1a94 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-nearest-with-absolute-positioned-element.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-nearest-with-absolute-positioned-element.html
@@ -16,7 +16,7 @@ overflow-x: scroll; display: flex; flex-direction: row; - scroll-timeline: timeline inline; + scroll-timeline: --timeline inline; } .progress {
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-sampling.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-sampling.html index 51b60e73..f77c5082 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-sampling.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-sampling.html
@@ -8,7 +8,7 @@ overflow: hidden; width: 100px; height: 100px; - scroll-timeline: timeline; + scroll-timeline: --timeline; } #contents { height: 200px; @@ -20,10 +20,10 @@ #element { width: 0px; animation: expand 10s linear; - animation-timeline: timeline; + animation-timeline: --timeline; } /* Ensure stable expectations if feature is not supported */ - @supports not (animation-timeline:foo) { + @supports not (animation-timeline:--foo) { #element { animation-play-state: paused; } } </style>
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-shorthand.tentative.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-shorthand.tentative.html index 68e1cc9..7a6d9cd 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-shorthand.tentative.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-shorthand.tentative.html
@@ -9,67 +9,67 @@ <script> test_valid_value('scroll-timeline', 'none block', 'none'); test_valid_value('scroll-timeline', 'none inline'); -test_valid_value('scroll-timeline', 'abc horizontal'); -test_valid_value('scroll-timeline', 'abc inline'); -test_valid_value('scroll-timeline', 'aBc inline'); -test_valid_value('scroll-timeline', 'inline inline'); -test_valid_value('scroll-timeline', 'abc'); +test_valid_value('scroll-timeline', '--abc x'); +test_valid_value('scroll-timeline', '--abc inline'); +test_valid_value('scroll-timeline', '--aBc inline'); +test_valid_value('scroll-timeline', '--inline inline'); +test_valid_value('scroll-timeline', '--abc'); -test_valid_value('scroll-timeline', 'inline block', 'inline'); -test_valid_value('scroll-timeline', 'block block', 'block'); -test_valid_value('scroll-timeline', 'vertical block', 'vertical'); -test_valid_value('scroll-timeline', 'horizontal block', 'horizontal'); +test_valid_value('scroll-timeline', '--inline block', '--inline'); +test_valid_value('scroll-timeline', '--block block', '--block'); +test_valid_value('scroll-timeline', '--y block', '--y'); +test_valid_value('scroll-timeline', '--x block', '--x'); -test_valid_value('scroll-timeline', 'a, b, c'); -test_valid_value('scroll-timeline', 'a inline, b block, c vertical', 'a inline, b, c vertical'); -test_valid_value('scroll-timeline', 'auto'); -test_valid_value('scroll-timeline', 'abc defer vertical', 'abc vertical defer'); -test_valid_value('scroll-timeline', 'abc vertical defer'); +test_valid_value('scroll-timeline', '--a, --b, --c'); +test_valid_value('scroll-timeline', '--a inline, --b block, --c y', '--a inline, --b, --c y'); +test_valid_value('scroll-timeline', '--auto'); +test_valid_value('scroll-timeline', '--abc defer y', '--abc y defer'); +test_valid_value('scroll-timeline', '--abc y defer'); test_invalid_value('scroll-timeline', ''); -test_invalid_value('scroll-timeline', 'abc abc'); +test_invalid_value('scroll-timeline', '--abc --abc'); test_invalid_value('scroll-timeline', 'block none'); -test_invalid_value('scroll-timeline', 'inline abc'); +test_invalid_value('scroll-timeline', 'inline --abc'); test_invalid_value('scroll-timeline', 'default'); test_invalid_value('scroll-timeline', ','); test_invalid_value('scroll-timeline', ',,block,,'); test_computed_value('scroll-timeline', 'none block', 'none'); -test_computed_value('scroll-timeline', 'abc inline'); -test_computed_value('scroll-timeline', 'none vertical'); -test_computed_value('scroll-timeline', 'abc horizontal'); -test_computed_value('scroll-timeline', 'vertical vertical'); -test_computed_value('scroll-timeline', 'abc'); -test_computed_value('scroll-timeline', 'inline block', 'inline'); -test_computed_value('scroll-timeline', 'block block', 'block'); -test_computed_value('scroll-timeline', 'vertical block', 'vertical'); -test_computed_value('scroll-timeline', 'horizontal block', 'horizontal'); -test_computed_value('scroll-timeline', 'a, b, c'); -test_computed_value('scroll-timeline', 'a inline, b block, c vertical', 'a inline, b, c vertical'); -test_computed_value('scroll-timeline', 'abc defer vertical', 'abc vertical defer'); -test_computed_value('scroll-timeline', 'abc vertical defer'); +test_computed_value('scroll-timeline', '--abc inline'); +test_computed_value('scroll-timeline', 'none y'); +test_computed_value('scroll-timeline', '--abc x'); +test_computed_value('scroll-timeline', '--y y'); +test_computed_value('scroll-timeline', '--abc'); +test_computed_value('scroll-timeline', '--inline block', '--inline'); +test_computed_value('scroll-timeline', '--block block', '--block'); +test_computed_value('scroll-timeline', '--y block', '--y'); +test_computed_value('scroll-timeline', '--x block', '--x'); +test_computed_value('scroll-timeline', '--a, --b, --c'); +test_computed_value('scroll-timeline', '--a inline, --b block, --c y', '--a inline, --b, --c y'); +test_computed_value('scroll-timeline', '--abc defer y', '--abc y defer'); +test_computed_value('scroll-timeline', '--abc y defer'); -test_shorthand_value('scroll-timeline', 'abc vertical local', +test_shorthand_value('scroll-timeline', '--abc y local', { - 'scroll-timeline-name': 'abc', - 'scroll-timeline-axis': 'vertical', + 'scroll-timeline-name': '--abc', + 'scroll-timeline-axis': 'y', 'scroll-timeline-attachment': 'local', }); -test_shorthand_value('scroll-timeline', 'inline horizontal defer', +test_shorthand_value('scroll-timeline', '--inline x defer', { - 'scroll-timeline-name': 'inline', - 'scroll-timeline-axis': 'horizontal', + 'scroll-timeline-name': '--inline', + 'scroll-timeline-axis': 'x', 'scroll-timeline-attachment': 'defer', }); -test_shorthand_value('scroll-timeline', 'abc vertical ancestor, def', +test_shorthand_value('scroll-timeline', '--abc y ancestor, --def', { - 'scroll-timeline-name': 'abc, def', - 'scroll-timeline-axis': 'vertical, block', + 'scroll-timeline-name': '--abc, --def', + 'scroll-timeline-axis': 'y, block', 'scroll-timeline-attachment': 'ancestor, local', }); -test_shorthand_value('scroll-timeline', 'abc, def', +test_shorthand_value('scroll-timeline', '--abc, --def', { - 'scroll-timeline-name': 'abc, def', + 'scroll-timeline-name': '--abc, --def', 'scroll-timeline-axis': 'block, block', 'scroll-timeline-attachment': 'local, local', }); @@ -89,16 +89,16 @@ } test_shorthand_contraction('scroll-timeline', { - 'scroll-timeline-name': 'abc', + 'scroll-timeline-name': '--abc', 'scroll-timeline-axis': 'inline', 'scroll-timeline-attachment': 'defer', -}, 'abc inline defer'); +}, '--abc inline defer'); test_shorthand_contraction('scroll-timeline', { - 'scroll-timeline-name': 'a, b', + 'scroll-timeline-name': '--a, --b', 'scroll-timeline-axis': 'inline, block', 'scroll-timeline-attachment': 'ancestor, local', -}, 'a inline ancestor, b'); +}, '--a inline ancestor, --b'); test_shorthand_contraction('scroll-timeline', { 'scroll-timeline-name': 'none, none', @@ -109,13 +109,13 @@ // Longhands with different lengths: test_shorthand_contraction('scroll-timeline', { - 'scroll-timeline-name': 'a, b, c', + 'scroll-timeline-name': '--a, --b, --c', 'scroll-timeline-axis': 'inline, inline', 'scroll-timeline-attachment': 'local, local', }, ''); test_shorthand_contraction('scroll-timeline', { - 'scroll-timeline-name': 'a, b', + 'scroll-timeline-name': '--a, --b', 'scroll-timeline-axis': 'inline, inline, inline', 'scroll-timeline-attachment': 'local, local', }, '');
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-update-reversed-animation.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-update-reversed-animation.html index 93ad6916..6bc1854 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-update-reversed-animation.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-update-reversed-animation.html
@@ -18,7 +18,7 @@ overflow: hidden; width: 300px; height: 200px; - scroll-timeline: timeline; + scroll-timeline: --timeline; } #target { margin-bottom: 800px; @@ -33,7 +33,7 @@ } #target.update { animation-play-state: running; - animation-timeline: timeline; + animation-timeline: --timeline; animation-duration: auto; } </style>
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/support/animation-range.css b/third_party/blink/web_tests/external/wpt/scroll-animations/css/support/animation-range.css new file mode 100644 index 0000000..453d076b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/support/animation-range.css
@@ -0,0 +1,82 @@ +.flex { + display: flex; +} + +.flex > div { + position: relative; + height: 160px; + margin: 0 10px; +} + +.scroller { + width: 100px; + height: 100px; + overflow: auto; + border: 1px solid black; +} + +.subject { + view-timeline-name: --view; + width: 20px; + height: 20px; + margin: 0 auto; + background: green; +} + +.meters { + position: absolute; + left: 0; + top: 110px; + height: 50px; +} + +.meters > div { + display: flex; + align-items: center; +} + +@keyframes active-interval { + 0% { opacity: 1; } + 100% { opacity: 1; } +} + +.meter { + width: 50px; + position: relative; + border: 2px solid black; + height: 5px; + overflow: clip; + opacity: 0.4; + animation: active-interval linear; + animation-timeline: --view; +} + +@keyframes slide-in { + 0% { transform: translateX(-100%)} + 100% { transform: translateX(0%)} +} + +.bar { + width: 100%; + height: 100%; + background: blue; + transform: translateX(-100%); + animation: slide-in linear; + animation-timeline: --view; +} + +.spacer { + height: 400px; +} + +.contain .bar, .contain .meter { + animation-range: contain; +} + +.entry .bar, .entry .meter { + animation-range: entry; +} + +.exit .bar, .exit .meter { + animation-range: exit; +}
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/support/testcommon.js b/third_party/blink/web_tests/external/wpt/scroll-animations/css/support/testcommon.js index 66bc27b..9154077 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/support/testcommon.js +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/support/testcommon.js
@@ -14,6 +14,6 @@ } function assert_implements_animation_timeline() { - assert_implements(CSS.supports('animation-timeline:foo'), + assert_implements(CSS.supports('animation-timeline:--foo'), 'animation-timeline not supported'); }
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/timeline-offset-in-keyframe-change-timeline.tentative.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/timeline-offset-in-keyframe-change-timeline.tentative.html index eeb13150..311b2c89 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/timeline-offset-in-keyframe-change-timeline.tentative.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/timeline-offset-in-keyframe-change-timeline.tentative.html
@@ -27,7 +27,7 @@ overflow-x: hidden; width: 300px; height: 200px; - view-timeline: sibling defer; + view-timeline: --sibling defer; } #sibling { margin-top: 800px; @@ -36,7 +36,7 @@ width: 100px; height: 50px; background-color: blue; - view-timeline: sibling block ancestor; + view-timeline: --sibling block ancestor; } #target { margin-bottom: 800px; @@ -50,14 +50,14 @@ /* using document timeline by default */ animation-range-start: contain 0%; animation-range-end: contain 100%; - view-timeline: target block; + view-timeline: --target block; } #target.with-view-timeline { - animation-timeline: target; + animation-timeline: --target; } #target.with-view-timeline.retarget { - animation-timeline: sibling; + animation-timeline: --sibling; } </style> <body> @@ -90,7 +90,7 @@ // Once a view-timeline is added, the kefyrames must update to reflect // the new keyframe offsets. target.classList.add('with-view-timeline'); - assert_equals(getComputedStyle(target).animationTimeline, 'target', + assert_equals(getComputedStyle(target).animationTimeline, '--target', 'Switch to view timeline'); await waitForNextFrame(); @@ -110,7 +110,7 @@ assert_frame_lists_equal(frames, expected); target.classList.add('retarget'); - assert_equals(getComputedStyle(target).animationTimeline, 'sibling', + assert_equals(getComputedStyle(target).animationTimeline, '--sibling', 'Switch to another view timeline'); await waitForNextFrame(); frames = anim.effect.getKeyframes();
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/timeline-offset-keyframes-hidden-subject.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/timeline-offset-keyframes-hidden-subject.html index bea072aa..10934347 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/timeline-offset-keyframes-hidden-subject.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/timeline-offset-keyframes-hidden-subject.html
@@ -29,7 +29,7 @@ overflow-x: hidden; width: 300px; height: 200px; - view-timeline: t1 defer; + view-timeline: --t1 defer; } #block { margin-top: 800px; @@ -38,7 +38,7 @@ width: 100px; height: 50px; background-color: blue; - view-timeline: t1 ancestor; + view-timeline: --t1 ancestor; } #target { margin-bottom: 800px; @@ -51,7 +51,7 @@ animation: anim auto both linear; animation-range-start: contain 0%; animation-range-end: contain 100%; - animation-timeline: t1; + animation-timeline: --t1; } </style> <body>
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/timeline-range-name-offset-in-keyframes.tentative.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/timeline-range-name-offset-in-keyframes.tentative.html index 54467bc..cee90f3 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/timeline-range-name-offset-in-keyframes.tentative.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/timeline-range-name-offset-in-keyframes.tentative.html
@@ -17,9 +17,9 @@ background-color: rgba(0, 0, 255); height: 200px; width: 200px; - view-timeline-name: foo; + view-timeline-name: --foo; animation: linear 1s both fade-in-out-animation; - animation-timeline: foo; + animation-timeline: --foo; } #container {
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/timeline-scope.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/timeline-scope.html new file mode 100644 index 0000000..985e694 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/timeline-scope.html
@@ -0,0 +1,314 @@ +<!DOCTYPE html> +<title>Behavior of the timeline-scope property</title> +<link rel="help" src="https://github.com/w3c/csswg-drafts/issues/7759"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/web-animations/testcommon.js"></script> + +<main id=main></main> +<script> + function inflate(t, template) { + t.add_cleanup(() => main.replaceChildren()); + main.append(template.content.cloneNode(true)); + main.offsetTop; + } + + async function scrollTop(e, value) { + e.scrollTop = value; + await waitForNextFrame(); + } +</script> +<style> + @keyframes anim { + from { width: 0px; } + to { width: 200px; } + } + + .scroller { + overflow-y: hidden; + width: 200px; + height: 200px; + } + .scroller > .content { + margin: 400px 0px; + width: 100px; + height: 100px; + background-color: green; + } + .target { + background-color: coral; + width: 0px; + animation: anim auto linear; + animation-timeline: --t1; + } + .timeline { + scroll-timeline-name: --t1; + } + .scope { + timeline-scope: --t1; + } + +</style> + +<!-- Basic Behavior --> + +<template id=deferred_timeline> + <div class="scope"> + <div class=target>Test</div> + <div class="scroller timeline"> + <div class=content></div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, deferred_timeline); + let scroller = main.querySelector('.scroller'); + let target = main.querySelector('.target'); + await scrollTop(scroller, 350); // 50% + assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50% + }, 'Descendant can attach to deferred timeline'); +</script> + +<template id=deferred_timeline_no_attachments> + <div class="scope"> + <div class=target>Test</div> + <div class="scroller"> + <div class=content></div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, deferred_timeline_no_attachments); + let scroller = main.querySelector('.scroller'); + let target = main.querySelector('.target'); + await scrollTop(scroller, 350); // 50% + assert_equals(getComputedStyle(target).width, '0px'); + }, 'Deferred timeline with no attachments'); +</script> + +<template id=scroll_timeline_inner_interference> + <div class="scroller timeline"> + <div class=content> + <div class=target>Test</div> + <div class="scroller timeline"> + <div class=content></div> + </div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, scroll_timeline_inner_interference); + let scroller = main.querySelector('.scroller'); + let target = main.querySelector('.target'); + await scrollTop(scroller, 350); // 50% + assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50% + }, 'Inner timeline does not interfere with outer timeline'); +</script> + +<template id=deferred_timeline_two_attachments> + <div class="scope"> + <div class=target>Test</div> + <div class="scroller timeline"> + <div class=content></div> + </div> + <!-- Extra attachment --> + <div class="timeline"></div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, deferred_timeline_two_attachments); + let scroller = main.querySelector('.scroller'); + let target = main.querySelector('.target'); + await scrollTop(scroller, 350); // 50% + assert_equals(getComputedStyle(target).width, '0px'); + }, 'Deferred timeline with two attachments'); +</script> + +<!-- Dynamic Reattachment --> + +<template id=deferred_timeline_reattach> + <div class="scope"> + <div class=target>Test</div> + <div class="scroller timeline"> + <div class=content></div> + </div> + <div class="scroller"> + <div class=content></div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, deferred_timeline_reattach); + let scrollers = main.querySelectorAll('.scroller'); + assert_equals(scrollers.length, 2); + let target = main.querySelector('.target'); + await scrollTop(scrollers[0], 350); // 50% + await scrollTop(scrollers[1], 175); // 25% + + // Attached to scrollers[0]. + assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50% + + // Reattach to scrollers[1]. + scrollers[0].classList.remove('timeline'); + scrollers[1].classList.add('timeline'); + + await waitForNextFrame(); + assert_equals(getComputedStyle(target).width, '50px'); // 0px => 200px, 25% + }, 'Dynamically re-attaching'); +</script> + +<template id=deferred_timeline_dynamic_detach> + <div class="scope"> + <div class=target>Test</div> + <div class="scroller timeline"> + <div class=content></div> + </div> + <div class="scroller timeline"> + <div class=content></div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, deferred_timeline_dynamic_detach); + let scrollers = main.querySelectorAll('.scroller'); + assert_equals(scrollers.length, 2); + let target = main.querySelector('.target'); + await scrollTop(scrollers[0], 350); // 50% + await scrollTop(scrollers[1], 175); // 25% + + // Attached to two timelines initially: + assert_equals(getComputedStyle(target).width, '0px'); + + // Detach scrollers[1]. + scrollers[1].classList.remove('timeline'); + + await waitForNextFrame(); + assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50% + + // Also detach scrollers[0]. + scrollers[0].classList.remove('timeline'); + + await waitForNextFrame(); + assert_equals(getComputedStyle(target).width, '0px'); + }, 'Dynamically detaching'); +</script> + +<template id=deferred_timeline_attached_removed> + <div class="scope"> + <div class=target>Test</div> + <div class="scroller timeline"> + <div class=content></div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, deferred_timeline_attached_removed); + let scroller = main.querySelector('.scroller'); + let target = main.querySelector('.target'); + await scrollTop(scroller, 350); // 50% + assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50% + + let scroller_parent = scroller.parentElement; + scroller.remove(); + await waitForNextFrame(); + assert_equals(getComputedStyle(target).width, '0px'); + + scroller_parent.append(scroller); + await scrollTop(scroller, 350); // 50% + assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50% + }, 'Removing/inserting element with attaching timeline'); +</script> + +<template id=deferred_timeline_attached_display_none> + <div class="scope"> + <div class=target>Test</div> + <div class="scroller timeline"> + <div class=content></div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, deferred_timeline_attached_display_none); + let scroller = main.querySelector('.scroller'); + let target = main.querySelector('.target'); + await scrollTop(scroller, 350); // 50% + assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50% + + scroller.style.display = 'none'; + await waitForNextFrame(); + assert_equals(getComputedStyle(target).width, '0px'); + + scroller.style.display = 'block'; + await scrollTop(scroller, 350); // 50% + assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50% + }, 'Ancestor attached element becoming display:none/block'); +</script> + +<template id=deferred_timeline_appearing> + <div class=container> + <div class=target>Test</div> + <div class="scroller timeline"> + <div class=content></div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, deferred_timeline_appearing); + let container = main.querySelector('.container'); + let scroller = main.querySelector('.scroller'); + let target = main.querySelector('.target'); + + await scrollTop(scroller, 350); // 50% + + // Not attached to any timeline initially. + assert_equals(getComputedStyle(target).width, '0px'); + + // Add the deferred timeline. + container.classList.add('scope'); + await waitForNextFrame(); + assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50% + + // Remove the deferred timeline. + container.classList.remove('scope'); + await waitForNextFrame(); + assert_equals(getComputedStyle(target).width, '0px'); + }, 'A deferred timeline appearing dynamically in the ancestor chain'); +</script> + +<template id=deferred_timeline_on_self> + <div class="scroller timeline scope"> + <div class=content> + <div class=target></div> + </div> + <div class=scroller2></div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, deferred_timeline_on_self); + let scroller = main.querySelector('.scroller'); + let target = main.querySelector('.target'); + await scrollTop(scroller, 525); // 75% + + assert_equals(getComputedStyle(target).width, '150px'); // 0px => 200px, 75% + + // A second scroll-timeline now attaches to the same root. + let scroller2 = main.querySelector('.scroller2'); + scroller2.classList.add('timeline'); + await waitForNextFrame(); + + // The deferred timeline produced by timeline-scope is now inactive, + // but it doesn't matter, because we preferred to attach + // to the non-deferred timeline. + assert_equals(getComputedStyle(target).width, '150px'); // 0px => 200px, 75% + }, 'Animations prefer non-deferred timelines'); +</script> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-animation-range-update.tentative.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-animation-range-update.tentative.html index 6c2a792ae..552461c 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-animation-range-update.tentative.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-animation-range-update.tentative.html
@@ -27,8 +27,8 @@ z-index: -1; background-color: green; animation: anim auto both linear; - animation-timeline: t1; - view-timeline: t1 block; + animation-timeline: --t1; + view-timeline: --t1 block; } .restrict-range { animation-range-start: contain 0%;
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-animation.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-animation.html index a367ef9..9f8ffd1 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-animation.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-animation.html
@@ -52,9 +52,9 @@ <template id=default_view_timeline> <style> #target { - view-timeline: t1; + view-timeline: --t1; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=vertical-scroller> @@ -87,9 +87,9 @@ <template id=horizontal_timeline> <style> #target { - view-timeline: t1 horizontal; + view-timeline: --t1 x; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=horizontal-scroller> @@ -122,7 +122,7 @@ <template id=multiple_timelines> <style> #timelines { - view-timeline: tv vertical ancestor, th horizontal ancestor; + view-timeline: --tv y ancestor, --th x ancestor; background-color: red; } #scroller { @@ -132,7 +132,7 @@ display: grid; grid-template-columns: 50px 50px 50px 50px 50px 50px 50px; grid-template-row: 50px 50px 50px 50px 50px 50px 50px; - view-timeline: tv defer, th defer; + view-timeline: --tv defer, --th defer; } #scroller > div { z-index: -1; @@ -141,11 +141,11 @@ } #target_v { animation: anim 1s linear; - animation-timeline: tv; + animation-timeline: --tv; } #target_h { animation: anim 1s linear; - animation-timeline: th; + animation-timeline: --th; } </style> <div id=scroller>
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-attachment.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-attachment.html index ff98ed78..a91ae13 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-attachment.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-attachment.html
@@ -39,10 +39,10 @@ background-color: coral; width: 0px; animation: anim auto linear; - animation-timeline: t1; + animation-timeline: --t1; } .timeline { - view-timeline-name: t1; + view-timeline-name: --t1; } .local { view-timeline-attachment: local; @@ -122,7 +122,7 @@ <div class="timeline defer" style="view-timeline-axis:inline"> <div class=target>Test</div> <div class=scroller> - <div class="content timeline ancestor" style="view-timeline-axis:vertical"></div> + <div class="content timeline ancestor" style="view-timeline-axis:y"></div> </div> </div> </template> @@ -133,7 +133,7 @@ assert_equals(target.getAnimations().length, 1); let anim = target.getAnimations()[0]; assert_not_equals(anim.timeline, null); - assert_equals(anim.timeline.axis, 'vertical'); + assert_equals(anim.timeline.axis, 'y'); }, 'Axis of deferred timeline is taken from attached timeline'); </script> @@ -141,7 +141,7 @@ <div class="timeline defer" style="view-timeline-axis:inline"> <div class=target>Test</div> <div class=scroller> - <div class="content timeline ancestor" style="view-timeline-axis:vertical"></div> + <div class="content timeline ancestor" style="view-timeline-axis:y"></div> <!-- Extra attachment --> <div class="timeline ancestor"></div> </div> @@ -403,11 +403,11 @@ <!-- ViewTimelines and ScrollTimelines --> <template id=view_scroll_timeline_defer> - <div style="scroll-timeline: t1 defer"> + <div style="scroll-timeline: --t1 defer"> <div class=target>Test1</div> <div class="timeline defer"> <div class=target>Test2</div> - <div class=scroller style="scroll-timeline: t1 ancestor;"> + <div class=scroller style="scroll-timeline: --t1 ancestor;"> <div class="content timeline ancestor" style="view-timeline-inset: 0px 50px"></div> </div> </div>
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-axis-computed.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-axis-computed.html index f4649da..30b2a1a 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-axis-computed.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-axis-computed.html
@@ -6,7 +6,7 @@ </head> <style> #outer { view-timeline-axis: block, inline; } - #target { view-timeline-axis: vertical; } + #target { view-timeline-axis: y; } </style> <div id=outer> <div id=target></div> @@ -18,11 +18,11 @@ test_computed_value('view-timeline-axis', 'revert', 'block'); test_computed_value('view-timeline-axis', 'block'); test_computed_value('view-timeline-axis', 'inline'); -test_computed_value('view-timeline-axis', 'vertical'); -test_computed_value('view-timeline-axis', 'horizontal'); +test_computed_value('view-timeline-axis', 'y'); +test_computed_value('view-timeline-axis', 'x'); test_computed_value('view-timeline-axis', 'block, inline'); test_computed_value('view-timeline-axis', 'inline, block'); -test_computed_value('view-timeline-axis', 'block, vertical, horizontal, inline'); +test_computed_value('view-timeline-axis', 'block, y, x, inline'); test_computed_value('view-timeline-axis', 'inline, inline, inline, inline'); test(() => {
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-axis-parsing.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-axis-parsing.html index ffcc36c..1ebe441 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-axis-parsing.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-axis-parsing.html
@@ -13,11 +13,11 @@ test_valid_value('view-timeline-axis', 'block'); test_valid_value('view-timeline-axis', 'inline'); -test_valid_value('view-timeline-axis', 'vertical'); -test_valid_value('view-timeline-axis', 'horizontal'); +test_valid_value('view-timeline-axis', 'y'); +test_valid_value('view-timeline-axis', 'x'); test_valid_value('view-timeline-axis', 'block, inline'); test_valid_value('view-timeline-axis', 'inline, block'); -test_valid_value('view-timeline-axis', 'block, vertical, horizontal, inline'); +test_valid_value('view-timeline-axis', 'block, y, x, inline'); test_valid_value('view-timeline-axis', 'inline, inline, inline, inline'); test_invalid_value('view-timeline-axis', 'abc');
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-dynamic.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-dynamic.html index 207c8c4e..9e042b77 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-dynamic.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-dynamic.html
@@ -14,7 +14,7 @@ overflow: hidden; width: 100px; height: 100px; - view-timeline: t1 defer; + view-timeline: --t1 defer; } .scroller > div { height: 100px; @@ -46,11 +46,11 @@ <template id=dynamic_view_timeline_name> <style> .timeline { - view-timeline: t1 ancestor; + view-timeline: --t1 ancestor; } #target { animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=scroller> @@ -106,11 +106,11 @@ width: 100px; height: 100px; margin: 100px; - view-timeline: t1 ancestor; + view-timeline: --t1 ancestor; } #target { animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=scroller> @@ -126,7 +126,7 @@ await scrollLeft(scroller, 20); // 10% (horizontal) assert_equals(getComputedStyle(target).zIndex, '25', 'vertical'); - timeline.style.viewTimelineAxis = 'horizontal'; + timeline.style.viewTimelineAxis = 'x'; await waitForCSSScrollTimelineStyle(); assert_equals(getComputedStyle(target).zIndex, '10', 'horizontal'); }, 'Dynamically changing view-timeline-axis'); @@ -138,11 +138,11 @@ width: 100px; height: 100px; margin: 100px; - view-timeline: t1 ancestor; + view-timeline: --t1 ancestor; } #target { animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=scroller> @@ -166,11 +166,11 @@ <template id=timeline_display_none> <style> #timeline { - view-timeline: t1 ancestor; + view-timeline: --t1 ancestor; } #target { animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=scroller>
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-inset-animation.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-inset-animation.html index a7e807c..9ba88fde 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-inset-animation.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-inset-animation.html
@@ -91,10 +91,10 @@ <template id=test_one_value> <style> #target { - view-timeline: t1; + view-timeline: --t1; view-timeline-inset: 10px; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=vertical> @@ -115,10 +115,10 @@ <template id=test_two_values> <style> #target { - view-timeline: t1; + view-timeline: --t1; view-timeline-inset: 10px 20px; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=vertical> @@ -140,10 +140,10 @@ <style> #target { font-size: 10px; - view-timeline: t1; + view-timeline: --t1; view-timeline-inset: 10px 2em; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=vertical> @@ -165,10 +165,10 @@ <style> #target { font-size: 10px; - view-timeline: t1; + view-timeline: --t1; view-timeline-inset: calc(5px + max(1%, 5%)) 20%; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=vertical> @@ -189,10 +189,10 @@ <template id=test_outset> <style> #target { - view-timeline: t1; + view-timeline: --t1; view-timeline-inset: -10px -20px; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=vertical> @@ -213,10 +213,10 @@ <template id=test_horizontal> <style> #target { - view-timeline: t1 horizontal; + view-timeline: --t1 x; view-timeline-inset: 10px 20px; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -237,10 +237,10 @@ <template id=test_block> <style> #target { - view-timeline: t1 block; + view-timeline: --t1 block; view-timeline-inset: 10px 20px; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -261,10 +261,10 @@ <template id=test_inline> <style> #target { - view-timeline: t1 inline; + view-timeline: --t1 inline; view-timeline-inset: 10px 20px; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -288,10 +288,10 @@ scroll-padding-block: 10px 20px; } #target { - view-timeline: t1 block; + view-timeline: --t1 block; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -316,10 +316,10 @@ writing-mode: vertical-lr; } #target { - view-timeline: t1 block; + view-timeline: --t1 block; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -344,10 +344,10 @@ writing-mode: vertical-rl; } #target { - view-timeline: t1 block; + view-timeline: --t1 block; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -372,10 +372,10 @@ scroll-padding-inline: 10px 20px; } #target { - view-timeline: t1 inline; + view-timeline: --t1 inline; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -400,10 +400,10 @@ writing-mode: vertical-rl; } #target { - view-timeline: t1 inline; + view-timeline: --t1 inline; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -428,10 +428,10 @@ writing-mode: vertical-lr; } #target { - view-timeline: t1 inline; + view-timeline: --t1 inline; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -456,10 +456,10 @@ direction: rtl; } #target { - view-timeline: t1 inline; + view-timeline: --t1 inline; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -485,10 +485,10 @@ direction: rtl; } #target { - view-timeline: t1 inline; + view-timeline: --t1 inline; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -514,10 +514,10 @@ direction: rtl; } #target { - view-timeline: t1 inline; + view-timeline: --t1 inline; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -541,10 +541,10 @@ scroll-padding-block: 10px 20px; } #target { - view-timeline: t1 vertical; + view-timeline: --t1 y; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -559,7 +559,7 @@ await assertValueAt(scroller, target, { scrollTop:125 + 5, expected:50 }); // 50% await assertValueAt(scroller, target, { scrollTop:200 - 10, expected:100 }); // 100% await assertValueAt(scroller, target, { scrollTop:200, expected:-1 }); - }, 'view-timeline-inset:auto, vertical'); + }, 'view-timeline-inset:auto, y'); </script> <template id=test_auto_vertical_vertical_rl> @@ -569,10 +569,10 @@ writing-mode: vertical-rl; } #target { - view-timeline: t1 vertical; + view-timeline: --t1 y; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -587,7 +587,7 @@ await assertValueAt(scroller, target, { scrollTop:125 + 5, expected:50 }); // 50% await assertValueAt(scroller, target, { scrollTop:200 - 10, expected:100 }); // 100% await assertValueAt(scroller, target, { scrollTop:200, expected:-1 }); - }, 'view-timeline-inset:auto, vertical, vertical-rl'); + }, 'view-timeline-inset:auto, y, vertical-rl'); </script> <template id=test_auto_vertical_vertical_rl_rtl> @@ -598,10 +598,10 @@ direction: rtl; } #target { - view-timeline: t1 vertical; + view-timeline: --t1 y; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -616,7 +616,7 @@ await assertValueAt(scroller, target, { scrollTop:-(125 + 5), expected:50 }); // 50% await assertValueAt(scroller, target, { scrollTop:-(200 - 10), expected:100 }); // 100% await assertValueAt(scroller, target, { scrollTop:-200, expected:-1 }); - }, 'view-timeline-inset:auto, vertical, vertical-rl, rtl'); + }, 'view-timeline-inset:auto, y, vertical-rl, rtl'); </script> <template id=test_auto_horizontal> @@ -625,10 +625,10 @@ scroll-padding-inline: 10px 20px; } #target { - view-timeline: t1 horizontal; + view-timeline: --t1 x; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -643,7 +643,7 @@ await assertValueAt(scroller, target, { scrollLeft:135 + 5, expected:50 }); // 50% await assertValueAt(scroller, target, { scrollLeft:200 - 10, expected:100 }); // 100% await assertValueAt(scroller, target, { scrollLeft:200, expected:-1 }); - }, 'view-timeline-inset:auto, horizontal'); + }, 'view-timeline-inset:auto, x'); </script> <template id=test_auto_horizontal_rtl> @@ -653,10 +653,10 @@ direction: rtl; } #target { - view-timeline: t1 horizontal; + view-timeline: --t1 x; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -671,7 +671,7 @@ await assertValueAt(scroller, target, { scrollLeft:-(135 + 5), expected:50 }); // 50% await assertValueAt(scroller, target, { scrollLeft:-(200 - 10), expected:100 }); // 100% await assertValueAt(scroller, target, { scrollLeft:-200, expected:-1 }); - }, 'view-timeline-inset:auto, horizontal, rtl'); + }, 'view-timeline-inset:auto, x, rtl'); </script> <template id=test_auto_horizontal_vertical_lr> @@ -681,10 +681,10 @@ writing-mode: vertical-lr; } #target { - view-timeline: t1 horizontal; + view-timeline: --t1 x; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -699,7 +699,7 @@ await assertValueAt(scroller, target, { scrollLeft:135 + 5, expected:50 }); // 50% await assertValueAt(scroller, target, { scrollLeft:200 - 10, expected:100 }); // 100% await assertValueAt(scroller, target, { scrollLeft:200, expected:-1 }); - }, 'view-timeline-inset:auto, horizontal, vertical-lr'); + }, 'view-timeline-inset:auto, x, vertical-lr'); </script> <template id=test_auto_horizontal_vertical_rl> @@ -709,10 +709,10 @@ writing-mode: vertical-rl; } #target { - view-timeline: t1 horizontal; + view-timeline: --t1 x; view-timeline-inset: auto auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller> @@ -727,7 +727,7 @@ await assertValueAt(scroller, target, { scrollLeft:-(135 + 5), expected:50 }); // 50% await assertValueAt(scroller, target, { scrollLeft:-(200 - 10), expected:100 }); // 100% await assertValueAt(scroller, target, { scrollLeft:-200, expected:-1 }); - }, 'view-timeline-inset:auto, horizontal, vertical-rl'); + }, 'view-timeline-inset:auto, x, vertical-rl'); </script> <template id=test_auto_mix> @@ -737,10 +737,10 @@ scroll-padding-block: 50px calc(10% + 1em); } #target { - view-timeline: t1; + view-timeline: --t1; view-timeline-inset: 10% auto; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller>
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-keyframe-boundary-interpolation.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-keyframe-boundary-interpolation.html index 04eb648..011f03c 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-keyframe-boundary-interpolation.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-keyframe-boundary-interpolation.html
@@ -38,10 +38,10 @@ z-index: -1; background-color: green; animation: anim auto both linear; - animation-timeline: t1; + animation-timeline: --t1; animation-range-start: contain 0%; animation-range-end: contain 100%; - view-timeline: t1 block; + view-timeline: --t1 block; } </style> <body>
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-lookup.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-lookup.html index 6cead9dc..ea9acd22 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-lookup.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-lookup.html
@@ -33,9 +33,9 @@ <style> #target { height: 0px; - view-timeline: t1; + view-timeline: --t1; animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=scroller> @@ -58,15 +58,15 @@ <template id=timeline_preceding_sibling> <style> #scroller { - view-timeline: t1 defer; + view-timeline: --t1 defer; } #timeline { height: 0px; - view-timeline: t1 ancestor; + view-timeline: --t1 ancestor; } #target { animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=scroller> @@ -91,11 +91,11 @@ <style> #timeline { height: 0px; - view-timeline: t1; + view-timeline: --t1; } #target { animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=scroller> @@ -122,15 +122,15 @@ <template id=timeline_ancestor_sibling> <style> #scroller { - view-timeline: t1 defer; + view-timeline: --t1 defer; } #timeline { height: 0px; - view-timeline: t1 ancestor; + view-timeline: --t1 ancestor; } #target { animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=scroller> @@ -157,15 +157,15 @@ <template id=timeline_ancestor_sibling_conflict> <style> #scroller { - view-timeline: t1 defer; + view-timeline: --t1 defer; } #timeline1, #timeline2 { height: 0px; - view-timeline: t1 ancestor; + view-timeline: --t1 ancestor; } #target { animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=scroller> @@ -193,18 +193,18 @@ <template id=timeline_ancestor_closer_timeline_wins> <style> #scroller { - view-timeline: t1 defer; + view-timeline: --t1 defer; } #timeline { height: 0px; - view-timeline: t1 ancestor; + view-timeline: --t1 ancestor; } #parent { - scroll-timeline: t1 defer; + scroll-timeline: --t1 defer; } #target { animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=scroller> @@ -229,13 +229,13 @@ <template id=timeline_ancestor_scroll_timeline_wins_on_same_element> <style> #scroller { - view-timeline: t1 defer; - scroll-timeline: t1 defer; + view-timeline: --t1 defer; + scroll-timeline: --t1 defer; } #timelines { height: 0px; - view-timeline: t1 ancestor; - scroll-timeline: t1 ancestor; + view-timeline: --t1 ancestor; + scroll-timeline: --t1 ancestor; overflow: auto; } #timelines > div { @@ -243,7 +243,7 @@ } #target { animation: anim 1s linear; - animation-timeline: t1; + animation-timeline: --t1; } </style> <div id=scroller class=scroller>
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-name-computed.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-name-computed.html index 5657dc7..3304723 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-name-computed.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-name-computed.html
@@ -5,24 +5,24 @@ <script src="/css/support/computed-testcommon.js"></script> </head> <style> - #outer { view-timeline-name: foo, bar; } - #target { view-timeline-name: faz; } + #outer { view-timeline-name: --foo, --bar; } + #target { view-timeline-name: --faz; } </style> <div id=outer> <div id=target></div> </div> <script> test_computed_value('view-timeline-name', 'initial', 'none'); -test_computed_value('view-timeline-name', 'inherit', 'foo, bar'); +test_computed_value('view-timeline-name', 'inherit', '--foo, --bar'); test_computed_value('view-timeline-name', 'unset', 'none'); test_computed_value('view-timeline-name', 'revert', 'none'); test_computed_value('view-timeline-name', 'none'); -test_computed_value('view-timeline-name', 'foo'); -test_computed_value('view-timeline-name', 'foo, bar'); -test_computed_value('view-timeline-name', 'bar, foo'); -test_computed_value('view-timeline-name', 'a, b, c, D, e'); +test_computed_value('view-timeline-name', '--foo'); +test_computed_value('view-timeline-name', '--foo, --bar'); +test_computed_value('view-timeline-name', '--bar, --foo'); +test_computed_value('view-timeline-name', '--a, --b, --c, --D, --e'); test_computed_value('view-timeline-name', 'none, none'); -test_computed_value('view-timeline-name', 'a, b, c, none, d, e'); +test_computed_value('view-timeline-name', '--a, --b, --c, none, --d, --e'); test(() => { let style = getComputedStyle(document.getElementById('target'));
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-name-parsing.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-name-parsing.html index 3878d5c5..2b22cbe 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-name-parsing.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-name-parsing.html
@@ -11,16 +11,16 @@ test_valid_value('view-timeline-name', 'revert'); test_valid_value('view-timeline-name', 'none'); -test_valid_value('view-timeline-name', 'abc'); -test_valid_value('view-timeline-name', ' abc', 'abc'); -test_valid_value('view-timeline-name', 'abc ', 'abc'); -test_valid_value('view-timeline-name', 'aBc'); -test_valid_value('view-timeline-name', 'foo, bar'); -test_valid_value('view-timeline-name', 'bar, foo'); +test_valid_value('view-timeline-name', '--abc'); +test_valid_value('view-timeline-name', ' --abc', '--abc'); +test_valid_value('view-timeline-name', '--aBc'); +test_valid_value('view-timeline-name', '--foo, --bar'); +test_valid_value('view-timeline-name', '--bar, --foo'); test_valid_value('view-timeline-name', 'none, none'); -test_valid_value('view-timeline-name', 'a, none, b'); -test_valid_value('view-timeline-name', 'auto'); +test_valid_value('view-timeline-name', '--a, none, --b'); +test_invalid_value('view-timeline-name', 'auto'); +test_invalid_value('view-timeline-name', 'abc'); test_invalid_value('view-timeline-name', 'default'); test_invalid_value('view-timeline-name', '10px'); test_invalid_value('view-timeline-name', 'foo bar');
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-name-shadow.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-name-shadow.html index 55240efc..bb14618 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-name-shadow.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-name-shadow.html
@@ -32,10 +32,10 @@ <style> .target { animation: anim 10s linear; - animation-timeline: timeline; + animation-timeline: --timeline; } .scroller > div { - view-timeline: timeline horizontal; + view-timeline: --timeline x; } </style> <div class=scroller> @@ -44,7 +44,7 @@ <template shadowrootmode=open> <style> :host { - view-timeline: timeline vertical; + view-timeline: --timeline y; } </style> </template> @@ -61,7 +61,7 @@ assert_equals(target.getAnimations().length, 1); let anim = target.getAnimations()[0]; assert_not_equals(anim.timeline, null); - assert_equals(anim.timeline.axis, 'vertical'); + assert_equals(anim.timeline.axis, 'y'); }, 'Outer animation can see view timeline defined by :host'); </script> @@ -70,10 +70,10 @@ <style> .target { animation: anim 10s linear; - animation-timeline: timeline; + animation-timeline: --timeline; } .host { - view-timeline: timeline horizontal; + view-timeline: --timeline x; } </style> <div class=scroller> @@ -81,7 +81,7 @@ <template shadowrootmode=open> <style> ::slotted(.target) { - view-timeline: timeline vertical; + view-timeline: --timeline y; } </style> <slot></slot> @@ -99,7 +99,7 @@ assert_equals(target.getAnimations().length, 1); let anim = target.getAnimations()[0]; assert_not_equals(anim.timeline, null); - assert_equals(anim.timeline.axis, 'vertical'); + assert_equals(anim.timeline.axis, 'y'); }, 'Outer animation can see view timeline defined by ::slotted'); </script> @@ -107,10 +107,10 @@ <template id=view_timeline_part> <style> .host { - view-timeline: timeline vertical; + view-timeline: --timeline y; } .host::part(foo) { - view-timeline: timeline horizontal; + view-timeline: --timeline x; } </style> <div class=host> @@ -123,7 +123,7 @@ } .target { animation: anim2 10s linear; - animation-timeline: timeline; + animation-timeline: --timeline; } </style> <div part=foo> @@ -141,7 +141,7 @@ assert_equals(target.getAnimations().length, 1); let anim = target.getAnimations()[0]; assert_not_equals(anim.timeline, null); - assert_equals(anim.timeline.axis, 'horizontal'); + assert_equals(anim.timeline.axis, 'x'); }, 'Inner animation can see view timeline defined by ::part'); </script> @@ -150,10 +150,10 @@ <style> .target { animation: anim 10s linear; - animation-timeline: timeline; + animation-timeline: --timeline; } .host { - view-timeline: timeline horizontal; + view-timeline: --timeline x; } </style> <div class=scroller> @@ -161,7 +161,7 @@ <template shadowrootmode=open> <style> div { - view-timeline: timeline vertical; + view-timeline: --timeline y; } </style> <div> @@ -181,6 +181,6 @@ assert_equals(target.getAnimations().length, 1); let anim = target.getAnimations()[0]; assert_not_equals(anim.timeline, null); - assert_equals(anim.timeline.axis, 'vertical'); + assert_equals(anim.timeline.axis, 'y'); }, 'Slotted element can see view timeline within the shadow'); </script>
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-range-animation.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-range-animation.html index 3d75938..1c657e4 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-range-animation.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-range-animation.html
@@ -58,13 +58,13 @@ let scroller = main.querySelector('#scroller'); let target = main.querySelector('#target'); - target.style.viewTimeline = 't1 block'; + target.style.viewTimeline = '--t1 block'; // TODO(crbug.com/1375998): Create the timeline in a separate frame to // work around a bug. await waitForNextFrame(); target.style.animation = 'anim auto linear'; - target.style.animationTimeline = 't1'; + target.style.animationTimeline = '--t1'; target.style.animationRangeStart = options.rangeStart; target.style.animationRangeEnd = options.rangeEnd;
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-range-update-reversed-animation.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-range-update-reversed-animation.html index c719916..960a8e6 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-range-update-reversed-animation.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-range-update-reversed-animation.html
@@ -29,8 +29,8 @@ z-index: -1; background-color: green; animation: anim auto linear; - animation-timeline: timeline; - view-timeline: timeline; + animation-timeline: --timeline; + view-timeline: --timeline; } #target.exit-range { animation-range-start: exit 0%;
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-range-update.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-range-update.html index e8e761d..5400d83 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-range-update.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-range-update.html
@@ -29,8 +29,8 @@ z-index: -1; background-color: green; animation: anim auto linear; - animation-timeline: timeline; - view-timeline: timeline; + animation-timeline: --timeline; + view-timeline: --timeline; } #target.exit-range { animation-range-start: exit 0%;
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-shorthand.tentative.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-shorthand.tentative.html index f19b9e6..fd00acc 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-shorthand.tentative.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-shorthand.tentative.html
@@ -9,63 +9,63 @@ <script src="/css/support/shorthand-testcommon.js"></script> <div id="target"></div> <script> -test_valid_value('view-timeline', 'abcd'); +test_valid_value('view-timeline', '--abcd'); test_valid_value('view-timeline', 'none block', 'none'); test_valid_value('view-timeline', 'none inline'); -// view-timeline-name: inline/block/horizontal/vertical. -test_valid_value('view-timeline', 'inline block', 'inline'); -test_valid_value('view-timeline', 'block block', 'block'); -test_valid_value('view-timeline', 'vertical block', 'vertical'); -test_valid_value('view-timeline', 'horizontal block', 'horizontal'); +// view-timeline-name: inline/block/x/y. +test_valid_value('view-timeline', '--inline block', '--inline'); +test_valid_value('view-timeline', '--block block', '--block'); +test_valid_value('view-timeline', '--y block', '--y'); +test_valid_value('view-timeline', '--x block', '--x'); -test_valid_value('view-timeline', 'a, b, c'); -test_valid_value('view-timeline', 'a inline, b block, c vertical', 'a inline, b, c vertical'); -test_valid_value('view-timeline', 'auto'); -test_valid_value('view-timeline', 'abc defer vertical', 'abc vertical defer'); -test_valid_value('view-timeline', 'abc vertical defer'); +test_valid_value('view-timeline', '--a, --b, --c'); +test_valid_value('view-timeline', '--a inline, --b block, --c y', '--a inline, --b, --c y'); +test_valid_value('view-timeline', '--auto'); +test_valid_value('view-timeline', '--abc defer y', '--abc y defer'); +test_valid_value('view-timeline', '--abc y defer'); -test_invalid_value('view-timeline', 'abc abc'); +test_invalid_value('view-timeline', '--abc --abc'); test_invalid_value('view-timeline', 'block none'); test_invalid_value('view-timeline', 'none none'); test_invalid_value('view-timeline', 'default'); test_invalid_value('view-timeline', ','); -test_invalid_value('view-timeline', ',,block,,'); +test_invalid_value('view-timeline', ',,--block,,'); -test_computed_value('view-timeline', 'abcd'); +test_computed_value('view-timeline', '--abcd'); test_computed_value('view-timeline', 'none block', 'none'); test_computed_value('view-timeline', 'none inline'); -test_computed_value('view-timeline', 'inline block', 'inline'); -test_computed_value('view-timeline', 'block block', 'block'); -test_computed_value('view-timeline', 'vertical block', 'vertical'); -test_computed_value('view-timeline', 'horizontal block', 'horizontal'); -test_computed_value('view-timeline', 'a, b, c'); -test_computed_value('view-timeline', 'a inline, b block, c vertical', 'a inline, b, c vertical'); -test_computed_value('view-timeline', 'abc defer vertical', 'abc vertical defer'); -test_computed_value('view-timeline', 'abc vertical defer'); +test_computed_value('view-timeline', '--inline block', '--inline'); +test_computed_value('view-timeline', '--block block', '--block'); +test_computed_value('view-timeline', '--y block', '--y'); +test_computed_value('view-timeline', '--x block', '--x'); +test_computed_value('view-timeline', '--a, --b, --c'); +test_computed_value('view-timeline', '--a inline, --b block, --c y', '--a inline, --b, --c y'); +test_computed_value('view-timeline', '--abc defer y', '--abc y defer'); +test_computed_value('view-timeline', '--abc y defer'); -test_shorthand_value('view-timeline', 'abc vertical', +test_shorthand_value('view-timeline', '--abc y', { - 'view-timeline-name': 'abc', - 'view-timeline-axis': 'vertical', + 'view-timeline-name': '--abc', + 'view-timeline-axis': 'y', 'view-timeline-attachment': 'local', }); -test_shorthand_value('view-timeline', 'abc vertical defer, def', +test_shorthand_value('view-timeline', '--abc y defer, --def', { - 'view-timeline-name': 'abc, def', - 'view-timeline-axis': 'vertical, block', + 'view-timeline-name': '--abc, --def', + 'view-timeline-axis': 'y, block', 'view-timeline-attachment': 'defer, local', }); -test_shorthand_value('view-timeline', 'abc, def', +test_shorthand_value('view-timeline', '--abc, --def', { - 'view-timeline-name': 'abc, def', + 'view-timeline-name': '--abc, --def', 'view-timeline-axis': 'block, block', 'view-timeline-attachment': 'local, local', }); -test_shorthand_value('view-timeline', 'inline horizontal ancestor', +test_shorthand_value('view-timeline', '--inline x ancestor', { - 'view-timeline-name': 'inline', - 'view-timeline-axis': 'horizontal', + 'view-timeline-name': '--inline', + 'view-timeline-axis': 'x', 'view-timeline-attachment': 'ancestor', }); @@ -84,16 +84,16 @@ } test_shorthand_contraction('view-timeline', { - 'view-timeline-name': 'abc', + 'view-timeline-name': '--abc', 'view-timeline-axis': 'inline', 'view-timeline-attachment': 'ancestor', -}, 'abc inline ancestor'); +}, '--abc inline ancestor'); test_shorthand_contraction('view-timeline', { - 'view-timeline-name': 'a, b', + 'view-timeline-name': '--a, --b', 'view-timeline-axis': 'inline, block', 'view-timeline-attachment': 'defer, local', -}, 'a inline defer, b'); +}, '--a inline defer, --b'); test_shorthand_contraction('view-timeline', { 'view-timeline-name': 'none, none', @@ -104,13 +104,13 @@ // Longhands with different lengths: test_shorthand_contraction('view-timeline', { - 'view-timeline-name': 'a, b, c', + 'view-timeline-name': '--a, --b, --c', 'view-timeline-axis': 'inline, inline', 'view-timeline-attachment': 'local, local', }, ''); test_shorthand_contraction('view-timeline', { - 'view-timeline-name': 'a, b', + 'view-timeline-name': '--a, --b', 'view-timeline-axis': 'inline, inline, inline', 'view-timeline-attachment': 'local, local', }, '');
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-subject-bounds-update.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-subject-bounds-update.html index 7001ecee..2961fed 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-subject-bounds-update.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-subject-bounds-update.html
@@ -30,8 +30,8 @@ z-index: -1; background-color: green; animation: anim auto both linear; - animation-timeline: timeline; - view-timeline: timeline; + animation-timeline: --timeline; + view-timeline: --timeline; animation-range: exit; } #target.bounds-update {
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-used-values.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-used-values.html index 6627eeb..1bd6f04 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-used-values.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-used-values.html
@@ -43,10 +43,10 @@ <template id=omitted_axis> <style> #target { - view-timeline-name: t1, t2; /* Two items */ + view-timeline-name: --t1, --t2; /* Two items */ view-timeline-axis: inline; /* One item */ animation: anim 1s linear; - animation-timeline: t2; + animation-timeline: --t2; } </style> <div id=scroller class=scroller> @@ -76,10 +76,10 @@ <template id=omitted_inset> <style> #target { - view-timeline-name: t1, t2; /* Two items */ + view-timeline-name: --t1, --t2; /* Two items */ view-timeline-inset: 100px; /* One item */ animation: anim 1s linear; - animation-timeline: t2; + animation-timeline: --t2; } </style> <div id=scroller class=scroller>
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-with-delay-and-range.tentative.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-with-delay-and-range.tentative.html index e8f537b1..db260f1 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-with-delay-and-range.tentative.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/view-timeline-with-delay-and-range.tentative.html
@@ -27,8 +27,8 @@ z-index: -1; background-color: green; animation: anim auto linear; - animation-timeline: t1; - view-timeline: t1 block; + animation-timeline: --t1; + view-timeline: --t1 block; animation-range-start: entry 0%; animation-range-end: entry 100%; /* Sentinel value when in before or after phase of the animation. */
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/scroll-timelines/constructor.html b/third_party/blink/web_tests/external/wpt/scroll-animations/scroll-timelines/constructor.html index 8e211ef..88c6a45 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/scroll-timelines/constructor.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/scroll-timelines/constructor.html
@@ -67,8 +67,8 @@ const gValidAxisValues = [ 'block', 'inline', - 'horizontal', - 'vertical', + 'x', + 'y', ]; for (let axis of gValidAxisValues) {
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/scroll-timelines/current-time-writing-modes.html b/third_party/blink/web_tests/external/wpt/scroll-animations/scroll-timelines/current-time-writing-modes.html index d18abcd..748cda2f 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/scroll-timelines/current-time-writing-modes.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/scroll-timelines/current-time-writing-modes.html
@@ -23,9 +23,9 @@ const inlineScrollTimeline = new ScrollTimeline( {source: scroller, axis: 'inline'}); const horizontalScrollTimeline = new ScrollTimeline( - {source: scroller, axis: 'horizontal'}); + {source: scroller, axis: 'x'}); const verticalScrollTimeline = new ScrollTimeline( - {source: scroller, axis: 'vertical'}); + {source: scroller, axis: 'y'}); // Unscrolled, all timelines should read a current time of 0 even though the // X-axis will have started at the right hand side for rtl. @@ -67,9 +67,9 @@ const inlineScrollTimeline = new ScrollTimeline( {source: scroller, axis: 'inline'}); const horizontalScrollTimeline = new ScrollTimeline( - {source: scroller, axis: 'horizontal'}); + {source: scroller, axis: 'x'}); const verticalScrollTimeline = new ScrollTimeline( - {source: scroller, axis: 'vertical'}); + {source: scroller, axis: 'y'}); // Unscrolled, all timelines should read a current time of 0 even though the // X-axis will have started at the right hand side for vertical-rl. @@ -113,9 +113,9 @@ const inlineScrollTimeline = new ScrollTimeline( {source: scroller, axis: 'inline'}); const horizontalScrollTimeline = new ScrollTimeline( - {source: scroller, axis: 'horizontal'}); + {source: scroller, axis: 'x'}); const verticalScrollTimeline = new ScrollTimeline( - {source: scroller, axis: 'vertical'}); + {source: scroller, axis: 'y'}); // Unscrolled, all timelines should read a current time of 0. assert_percents_equal(blockScrollTimeline.currentTime, 0,
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/view-timelines/change-animation-range-updates-play-state.html b/third_party/blink/web_tests/external/wpt/scroll-animations/view-timelines/change-animation-range-updates-play-state.html index 53330d32..16b9c30 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/view-timelines/change-animation-range-updates-play-state.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/view-timelines/change-animation-range-updates-play-state.html
@@ -33,8 +33,8 @@ z-index: -1; background-color: green; animation: anim auto both linear; - animation-timeline: t1; - view-timeline: t1; + animation-timeline: --t1; + view-timeline: --t1; } </style> <body>
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/view-timelines/view-timeline-subject-size-changes.html b/third_party/blink/web_tests/external/wpt/scroll-animations/view-timelines/view-timeline-subject-size-changes.html index 9ae4b1d..ee7ce90 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/view-timelines/view-timeline-subject-size-changes.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/view-timelines/view-timeline-subject-size-changes.html
@@ -35,7 +35,7 @@ <script type="text/javascript"> promise_test(async t => { const options = { - timeline: { axis: 'vertical' }, + timeline: { axis: 'y' }, animation: { rangeStart: { rangeName: 'entry', offset: CSS.percent(0) }, rangeEnd: { rangeName: 'entry', offset: CSS.percent(100) },
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/view-timelines/zero-intrinsic-iteration-duration.tentative.html b/third_party/blink/web_tests/external/wpt/scroll-animations/view-timelines/zero-intrinsic-iteration-duration.tentative.html index e77cf46..4eec5d8f 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/view-timelines/zero-intrinsic-iteration-duration.tentative.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/view-timelines/zero-intrinsic-iteration-duration.tentative.html
@@ -33,8 +33,8 @@ z-index: -1; background-color: green; animation: anim auto linear; - animation-timeline: t1; - view-timeline: t1; + animation-timeline: --t1; + view-timeline: --t1; } </style> <body>
diff --git a/third_party/blink/web_tests/external/wpt/webmessaging/event.origin.sub.htm.ini b/third_party/blink/web_tests/external/wpt/webmessaging/event.origin.sub.htm.ini new file mode 100644 index 0000000..ca6b6f5b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webmessaging/event.origin.sub.htm.ini
@@ -0,0 +1,3 @@ +[event.origin.sub.htm] + expected: + if (product == "content_shell") and (os == "mac") and (port == "mac11"): [ERROR, OK]
diff --git a/third_party/blink/web_tests/fast/block/float/rubybase-children-made-inline-crash-expected.txt b/third_party/blink/web_tests/fast/block/float/rubybase-children-made-inline-crash-expected.txt index 05a41b1..30e6390 100644 --- a/third_party/blink/web_tests/fast/block/float/rubybase-children-made-inline-crash-expected.txt +++ b/third_party/blink/web_tests/fast/block/float/rubybase-children-made-inline-crash-expected.txt
@@ -1,3 +1,5 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. CONSOLE ERROR: Uncaught TypeError: oElement.insertAdjacentText is not a function crbug.com/658584: Clear floats when a ruby run's children are made inline. This test passes if it does not crash.
diff --git a/third_party/blink/web_tests/fast/css/button-inner-child-crash-expected.txt b/third_party/blink/web_tests/fast/css/button-inner-child-crash-expected.txt index 0383162..dab0b63 100644 --- a/third_party/blink/web_tests/fast/css/button-inner-child-crash-expected.txt +++ b/third_party/blink/web_tests/fast/css/button-inner-child-crash-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Test passes if it does not crash.
diff --git a/third_party/blink/web_tests/fast/css/first-letter-associated-text-node-crash-expected.txt b/third_party/blink/web_tests/fast/css/first-letter-associated-text-node-crash-expected.txt index 1c8b0a5f..83a7b5a0 100644 --- a/third_party/blink/web_tests/fast/css/first-letter-associated-text-node-crash-expected.txt +++ b/third_party/blink/web_tests/fast/css/first-letter-associated-text-node-crash-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. AText Test passes if it does not CRASH.
diff --git a/third_party/blink/web_tests/fast/css/first-letter-range-insert-expected.txt b/third_party/blink/web_tests/fast/css/first-letter-range-insert-expected.txt index 8b13789..e554d35b 100644 --- a/third_party/blink/web_tests/fast/css/first-letter-range-insert-expected.txt +++ b/third_party/blink/web_tests/fast/css/first-letter-range-insert-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead.
diff --git a/third_party/blink/web_tests/fast/dom/HTMLElement/set-inner-outer-optimization-expected.txt b/third_party/blink/web_tests/fast/dom/HTMLElement/set-inner-outer-optimization-expected.txt index a97db1c..ee5a30b 100644 --- a/third_party/blink/web_tests/fast/dom/HTMLElement/set-inner-outer-optimization-expected.txt +++ b/third_party/blink/web_tests/fast/dom/HTMLElement/set-inner-outer-optimization-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. This tests calls to setInnerHTML, setInnerText, and setOuterHTML to see what kind of DOM modifications they cause. The calls are optimized to not do any work in cases where the DOM would not change at all. PASS: starting with "", setting innerHTML to ""
diff --git a/third_party/blink/web_tests/fast/dom/HTMLImageElement/constructor-mutation-event-dispatch-expected.txt b/third_party/blink/web_tests/fast/dom/HTMLImageElement/constructor-mutation-event-dispatch-expected.txt index b08fb4b..a9f2a1d2 100644 --- a/third_party/blink/web_tests/fast/dom/HTMLImageElement/constructor-mutation-event-dispatch-expected.txt +++ b/third_party/blink/web_tests/fast/dom/HTMLImageElement/constructor-mutation-event-dispatch-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Test for http://bugs.webkit.org/show_bug.cgi?id=12353 REGRESSION: Crash on load (mutation event dispatch under the image element constructor deletes the element). No crash means test PASS.
diff --git a/third_party/blink/web_tests/fast/dom/MutationObserver/added-out-of-order-expected.txt b/third_party/blink/web_tests/fast/dom/MutationObserver/added-out-of-order-expected.txt index 8bb0f37..6deb452 100644 --- a/third_party/blink/web_tests/fast/dom/MutationObserver/added-out-of-order-expected.txt +++ b/third_party/blink/web_tests/fast/dom/MutationObserver/added-out-of-order-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Test MutationEvents interfering with MutationObservers: adding nodes 'out of order' On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/dom/MutationObserver/observe-attributes-expected.txt b/third_party/blink/web_tests/fast/dom/MutationObserver/observe-attributes-expected.txt index 06f783e6..67e2574 100644 --- a/third_party/blink/web_tests/fast/dom/MutationObserver/observe-attributes-expected.txt +++ b/third_party/blink/web_tests/fast/dom/MutationObserver/observe-attributes-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Test WebKitMutationObserver.observe on attributes On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/dom/MutationObserver/observe-characterdata-expected.txt b/third_party/blink/web_tests/fast/dom/MutationObserver/observe-characterdata-expected.txt index 95868a9..4596f352 100644 --- a/third_party/blink/web_tests/fast/dom/MutationObserver/observe-characterdata-expected.txt +++ b/third_party/blink/web_tests/fast/dom/MutationObserver/observe-characterdata-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Test WebKitMutationObserver.observe on CharacterData nodes On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/dom/MutationObserver/removed-out-of-order-expected.txt b/third_party/blink/web_tests/fast/dom/MutationObserver/removed-out-of-order-expected.txt index 0a8654e..c7e1289d 100644 --- a/third_party/blink/web_tests/fast/dom/MutationObserver/removed-out-of-order-expected.txt +++ b/third_party/blink/web_tests/fast/dom/MutationObserver/removed-out-of-order-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Test MutationEvents interfering with MutationObservers: removing nodes 'out of order' On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/dom/Range/range-created-during-remove-children-expected.txt b/third_party/blink/web_tests/fast/dom/Range/range-created-during-remove-children-expected.txt index 37afe76..2e98e142 100644 --- a/third_party/blink/web_tests/fast/dom/Range/range-created-during-remove-children-expected.txt +++ b/third_party/blink/web_tests/fast/dom/Range/range-created-during-remove-children-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASS ranges["blur"].startOffset is 0 PASS ranges["blur"].endOffset is 0 PASS ranges["DOMNodeRemovedFromDocument"].startOffset is 0
diff --git a/third_party/blink/web_tests/fast/dom/Range/range-delete-contents-event-fire-crash-expected.txt b/third_party/blink/web_tests/fast/dom/Range/range-delete-contents-event-fire-crash-expected.txt index 3be5dec..d3821af 100644 --- a/third_party/blink/web_tests/fast/dom/Range/range-delete-contents-event-fire-crash-expected.txt +++ b/third_party/blink/web_tests/fast/dom/Range/range-delete-contents-event-fire-crash-expected.txt
@@ -1,2 +1,3 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASS
diff --git a/third_party/blink/web_tests/fast/dom/Range/range-delete-contents-mutation-event-crash-expected.txt b/third_party/blink/web_tests/fast/dom/Range/range-delete-contents-mutation-event-crash-expected.txt index 66146b5..29bde877 100644 --- a/third_party/blink/web_tests/fast/dom/Range/range-delete-contents-mutation-event-crash-expected.txt +++ b/third_party/blink/web_tests/fast/dom/Range/range-delete-contents-mutation-event-crash-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASS; NOT CRASHED
diff --git a/third_party/blink/web_tests/fast/dom/Range/range-extract-contents-event-fire-crash-expected.txt b/third_party/blink/web_tests/fast/dom/Range/range-extract-contents-event-fire-crash-expected.txt index f528f9c1..814275b 100644 --- a/third_party/blink/web_tests/fast/dom/Range/range-extract-contents-event-fire-crash-expected.txt +++ b/third_party/blink/web_tests/fast/dom/Range/range-extract-contents-event-fire-crash-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASS: does not crash
diff --git a/third_party/blink/web_tests/fast/dom/Range/range-extract-contents-event-fire-crash2-expected.txt b/third_party/blink/web_tests/fast/dom/Range/range-extract-contents-event-fire-crash2-expected.txt index f528f9c1..814275b 100644 --- a/third_party/blink/web_tests/fast/dom/Range/range-extract-contents-event-fire-crash2-expected.txt +++ b/third_party/blink/web_tests/fast/dom/Range/range-extract-contents-event-fire-crash2-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASS: does not crash
diff --git a/third_party/blink/web_tests/fast/dom/Range/range-extractContents-expected.txt b/third_party/blink/web_tests/fast/dom/Range/range-extractContents-expected.txt index 9ceb737..3147704 100644 --- a/third_party/blink/web_tests/fast/dom/Range/range-extractContents-expected.txt +++ b/third_party/blink/web_tests/fast/dom/Range/range-extractContents-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASS: No crash.
diff --git a/third_party/blink/web_tests/fast/dom/Range/range-insertNode-assertion-expected.txt b/third_party/blink/web_tests/fast/dom/Range/range-insertNode-assertion-expected.txt index 55bbf60..7a112c52 100644 --- a/third_party/blink/web_tests/fast/dom/Range/range-insertNode-assertion-expected.txt +++ b/third_party/blink/web_tests/fast/dom/Range/range-insertNode-assertion-expected.txt
@@ -1,3 +1,5 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. No assertion failures even if a DOM mutation event handler updates nodes in a Range during Range::insertNode. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/dom/Range/remove-twice-crash-expected.txt b/third_party/blink/web_tests/fast/dom/Range/remove-twice-crash-expected.txt index 66146b5..29bde877 100644 --- a/third_party/blink/web_tests/fast/dom/Range/remove-twice-crash-expected.txt +++ b/third_party/blink/web_tests/fast/dom/Range/remove-twice-crash-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASS; NOT CRASHED
diff --git a/third_party/blink/web_tests/fast/dom/Range/split-text-in-range-expected.txt b/third_party/blink/web_tests/fast/dom/Range/split-text-in-range-expected.txt index 536aafe..08506c0 100644 --- a/third_party/blink/web_tests/fast/dom/Range/split-text-in-range-expected.txt +++ b/third_party/blink/web_tests/fast/dom/Range/split-text-in-range-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. No assertion failures even if an DOM mutation event handler updates the new node created by Text::splitText. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/dom/Range/surroundContents-crash-expected.txt b/third_party/blink/web_tests/fast/dom/Range/surroundContents-crash-expected.txt index 5c7932d..e63a2e7 100644 --- a/third_party/blink/web_tests/fast/dom/Range/surroundContents-crash-expected.txt +++ b/third_party/blink/web_tests/fast/dom/Range/surroundContents-crash-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. DOM mutation events should not be dispatched during DOM mutations in surroundContents(). On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/dom/append-multiple-document-elements-expected.txt b/third_party/blink/web_tests/fast/dom/append-multiple-document-elements-expected.txt index d1dd0ca1..08f6727 100644 --- a/third_party/blink/web_tests/fast/dom/append-multiple-document-elements-expected.txt +++ b/third_party/blink/web_tests/fast/dom/append-multiple-document-elements-expected.txt
@@ -1,2 +1,3 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. CONSOLE MESSAGE: Failed to execute 'appendChild' on 'Node': Only one element on document allowed. If this does not assert in a debug build, the test passed.
diff --git a/third_party/blink/web_tests/fast/dom/class-attr-change-double-mutation-fire-expected.txt b/third_party/blink/web_tests/fast/dom/class-attr-change-double-mutation-fire-expected.txt index 7ef22e9..15cec15 100644 --- a/third_party/blink/web_tests/fast/dom/class-attr-change-double-mutation-fire-expected.txt +++ b/third_party/blink/web_tests/fast/dom/class-attr-change-double-mutation-fire-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASS
diff --git a/third_party/blink/web_tests/fast/dom/cloneNode-below-body-attribute-merging-expected.txt b/third_party/blink/web_tests/fast/dom/cloneNode-below-body-attribute-merging-expected.txt index d21eee0..04a1620 100644 --- a/third_party/blink/web_tests/fast/dom/cloneNode-below-body-attribute-merging-expected.txt +++ b/third_party/blink/web_tests/fast/dom/cloneNode-below-body-attribute-merging-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Tests that cloning the body node in response to a DOMSubtreeModified event doesn't crash. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/dom/containerNode-expected.txt b/third_party/blink/web_tests/fast/dom/containerNode-expected.txt index 99515d4..8727591 100644 --- a/third_party/blink/web_tests/fast/dom/containerNode-expected.txt +++ b/third_party/blink/web_tests/fast/dom/containerNode-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASS: No infinite loop.
diff --git a/third_party/blink/web_tests/fast/dom/document-set-title-mutation-crash-expected.txt b/third_party/blink/web_tests/fast/dom/document-set-title-mutation-crash-expected.txt index 7ef22e9..0b21594 100644 --- a/third_party/blink/web_tests/fast/dom/document-set-title-mutation-crash-expected.txt +++ b/third_party/blink/web_tests/fast/dom/document-set-title-mutation-crash-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASS
diff --git a/third_party/blink/web_tests/fast/dom/document-set-title-single-DOMSubtreeModified-expected.txt b/third_party/blink/web_tests/fast/dom/document-set-title-single-DOMSubtreeModified-expected.txt index 4472dc4..2ef03ae5 100644 --- a/third_party/blink/web_tests/fast/dom/document-set-title-single-DOMSubtreeModified-expected.txt +++ b/third_party/blink/web_tests/fast/dom/document-set-title-single-DOMSubtreeModified-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. On setting document.title, only one DOMSubtreeModified event is created. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/dom/dom-method-document-change-expected.txt b/third_party/blink/web_tests/fast/dom/dom-method-document-change-expected.txt index ff43ca4..b1937c3 100644 --- a/third_party/blink/web_tests/fast/dom/dom-method-document-change-expected.txt +++ b/third_party/blink/web_tests/fast/dom/dom-method-document-change-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. SUCCESS
diff --git a/third_party/blink/web_tests/fast/dom/getElementById-consistency-expected.txt b/third_party/blink/web_tests/fast/dom/getElementById-consistency-expected.txt index 88f8715..263255d 100644 --- a/third_party/blink/web_tests/fast/dom/getElementById-consistency-expected.txt +++ b/third_party/blink/web_tests/fast/dom/getElementById-consistency-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Test that DOMSubtreeModified listeners cannot cause inDocument to be incorrect On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/dom/getElementById-consistency2-expected.txt b/third_party/blink/web_tests/fast/dom/getElementById-consistency2-expected.txt index dc73f77b..027fe75f 100644 --- a/third_party/blink/web_tests/fast/dom/getElementById-consistency2-expected.txt +++ b/third_party/blink/web_tests/fast/dom/getElementById-consistency2-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Test that DOMSubtreeModified listeners cannot cause TreeOrderedMap to be incorrect On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/dom/getElementById-consistency3-expected.txt b/third_party/blink/web_tests/fast/dom/getElementById-consistency3-expected.txt index dc73f77b..027fe75f 100644 --- a/third_party/blink/web_tests/fast/dom/getElementById-consistency3-expected.txt +++ b/third_party/blink/web_tests/fast/dom/getElementById-consistency3-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Test that DOMSubtreeModified listeners cannot cause TreeOrderedMap to be incorrect On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/dom/getElementById-consistency4-expected.txt b/third_party/blink/web_tests/fast/dom/getElementById-consistency4-expected.txt index dc73f77b..027fe75f 100644 --- a/third_party/blink/web_tests/fast/dom/getElementById-consistency4-expected.txt +++ b/third_party/blink/web_tests/fast/dom/getElementById-consistency4-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Test that DOMSubtreeModified listeners cannot cause TreeOrderedMap to be incorrect On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/dom/getElementById-consistency5-expected.txt b/third_party/blink/web_tests/fast/dom/getElementById-consistency5-expected.txt index dc73f77b..027fe75f 100644 --- a/third_party/blink/web_tests/fast/dom/getElementById-consistency5-expected.txt +++ b/third_party/blink/web_tests/fast/dom/getElementById-consistency5-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Test that DOMSubtreeModified listeners cannot cause TreeOrderedMap to be incorrect On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/dom/hover-node-refcnt-asan-crash-expected.txt b/third_party/blink/web_tests/fast/dom/hover-node-refcnt-asan-crash-expected.txt index 9578d0d..dc7ea67 100644 --- a/third_party/blink/web_tests/fast/dom/hover-node-refcnt-asan-crash-expected.txt +++ b/third_party/blink/web_tests/fast/dom/hover-node-refcnt-asan-crash-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. This test should not crash on ASAN
diff --git a/third_party/blink/web_tests/fast/dom/insertBefore-refChild-crash-expected.txt b/third_party/blink/web_tests/fast/dom/insertBefore-refChild-crash-expected.txt index 0383162..dab0b63 100644 --- a/third_party/blink/web_tests/fast/dom/insertBefore-refChild-crash-expected.txt +++ b/third_party/blink/web_tests/fast/dom/insertBefore-refChild-crash-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Test passes if it does not crash.
diff --git a/third_party/blink/web_tests/fast/dom/margin-height-guarded-crash-expected.txt b/third_party/blink/web_tests/fast/dom/margin-height-guarded-crash-expected.txt index 9d923123..e75885d64 100644 --- a/third_party/blink/web_tests/fast/dom/margin-height-guarded-crash-expected.txt +++ b/third_party/blink/web_tests/fast/dom/margin-height-guarded-crash-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. CONSOLE ERROR: Uncaught TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'. This is a testharness.js-based test. PASS try-trigger-crash
diff --git a/third_party/blink/web_tests/fast/dom/move-nodes-across-documents-expected.txt b/third_party/blink/web_tests/fast/dom/move-nodes-across-documents-expected.txt index bf365598..d0da8b4 100644 --- a/third_party/blink/web_tests/fast/dom/move-nodes-across-documents-expected.txt +++ b/third_party/blink/web_tests/fast/dom/move-nodes-across-documents-expected.txt
@@ -1,3 +1,6 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. 1. PASS 2. PASS 3. PASS
diff --git a/third_party/blink/web_tests/fast/dom/mutation-event-listener-with-dirty-inline-style-crash-expected.txt b/third_party/blink/web_tests/fast/dom/mutation-event-listener-with-dirty-inline-style-crash-expected.txt index d5a3334..e4d64bc 100644 --- a/third_party/blink/web_tests/fast/dom/mutation-event-listener-with-dirty-inline-style-crash-expected.txt +++ b/third_party/blink/web_tests/fast/dom/mutation-event-listener-with-dirty-inline-style-crash-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASS successfullyParsed is true TEST COMPLETE
diff --git a/third_party/blink/web_tests/fast/dom/mutation-event-remove-inserted-node-expected.txt b/third_party/blink/web_tests/fast/dom/mutation-event-remove-inserted-node-expected.txt index c70eee7..d96f05c 100644 --- a/third_party/blink/web_tests/fast/dom/mutation-event-remove-inserted-node-expected.txt +++ b/third_party/blink/web_tests/fast/dom/mutation-event-remove-inserted-node-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. This test verifies that a mutation event that removes inserted nodes from the document doesn't crash upon the insertion of a new node into the document. PASS: You didn't crash.
diff --git a/third_party/blink/web_tests/fast/dom/option-text-mutation-crash-expected.txt b/third_party/blink/web_tests/fast/dom/option-text-mutation-crash-expected.txt index 7ef22e9..0b21594 100644 --- a/third_party/blink/web_tests/fast/dom/option-text-mutation-crash-expected.txt +++ b/third_party/blink/web_tests/fast/dom/option-text-mutation-crash-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASS
diff --git a/third_party/blink/web_tests/fast/dom/shadow/cyclic-append-crash-expected.txt b/third_party/blink/web_tests/fast/dom/shadow/cyclic-append-crash-expected.txt index c79504e..a42bd40a 100644 --- a/third_party/blink/web_tests/fast/dom/shadow/cyclic-append-crash-expected.txt +++ b/third_party/blink/web_tests/fast/dom/shadow/cyclic-append-crash-expected.txt
@@ -1,2 +1,3 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. CONSOLE MESSAGE: Failed to execute 'appendChild' on 'Node': The new child element contains the parent. If this does not crash, the test passed.
diff --git a/third_party/blink/web_tests/fast/dom/shadow/remove-details-in-exec-command-crash-expected.txt b/third_party/blink/web_tests/fast/dom/shadow/remove-details-in-exec-command-crash-expected.txt index 0383162..9113717 100644 --- a/third_party/blink/web_tests/fast/dom/shadow/remove-details-in-exec-command-crash-expected.txt +++ b/third_party/blink/web_tests/fast/dom/shadow/remove-details-in-exec-command-crash-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Test passes if it does not crash.
diff --git a/third_party/blink/web_tests/fast/dom/shadow/shadow-boundary-crossing-expected.txt b/third_party/blink/web_tests/fast/dom/shadow/shadow-boundary-crossing-expected.txt index a3a37de..6da4074 100644 --- a/third_party/blink/web_tests/fast/dom/shadow/shadow-boundary-crossing-expected.txt +++ b/third_party/blink/web_tests/fast/dom/shadow/shadow-boundary-crossing-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Tests to ensure that shadow DOM boundary is not crossed during event propagation. Can only run within DRT. See bug 46015 for details.
diff --git a/third_party/blink/web_tests/fast/dom/shadow/suppress-mutation-events-in-shadow-characterdata-expected.txt b/third_party/blink/web_tests/fast/dom/shadow/suppress-mutation-events-in-shadow-characterdata-expected.txt index 8e515456..e292e3bb 100644 --- a/third_party/blink/web_tests/fast/dom/shadow/suppress-mutation-events-in-shadow-characterdata-expected.txt +++ b/third_party/blink/web_tests/fast/dom/shadow/suppress-mutation-events-in-shadow-characterdata-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Ensures that DOMCharacterDataModified isn't fired inside shadows. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/dom/shadow/suppress-mutation-events-in-shadow-expected.txt b/third_party/blink/web_tests/fast/dom/shadow/suppress-mutation-events-in-shadow-expected.txt index 6141647f..88517d8 100644 --- a/third_party/blink/web_tests/fast/dom/shadow/suppress-mutation-events-in-shadow-expected.txt +++ b/third_party/blink/web_tests/fast/dom/shadow/suppress-mutation-events-in-shadow-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Test that mutation events are not triggered in shadow DOM On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/dom/subtree-modified-attributes-expected.txt b/third_party/blink/web_tests/fast/dom/subtree-modified-attributes-expected.txt index 9b1ed8f..f5c0aa67 100644 --- a/third_party/blink/web_tests/fast/dom/subtree-modified-attributes-expected.txt +++ b/third_party/blink/web_tests/fast/dom/subtree-modified-attributes-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. DOMSubtreeModified should fire when attributes are added or removed, but not modified (see bug 81141) On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/dom/text-node-append-data-remove-crash-expected.txt b/third_party/blink/web_tests/fast/dom/text-node-append-data-remove-crash-expected.txt index a96ffed..fc503ff3 100644 --- a/third_party/blink/web_tests/fast/dom/text-node-append-data-remove-crash-expected.txt +++ b/third_party/blink/web_tests/fast/dom/text-node-append-data-remove-crash-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASS, didn't crash.
diff --git a/third_party/blink/web_tests/fast/dom/xml-parser-error-message-crash-expected.txt b/third_party/blink/web_tests/fast/dom/xml-parser-error-message-crash-expected.txt index 20e3af21..9ae360d 100644 --- a/third_party/blink/web_tests/fast/dom/xml-parser-error-message-crash-expected.txt +++ b/third_party/blink/web_tests/fast/dom/xml-parser-error-message-crash-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. This page contains the following errors: error on line 14 at column 1: Extra content at the end of the document
diff --git a/third_party/blink/web_tests/fast/events/attribute-listener-deletion-crash-expected.txt b/third_party/blink/web_tests/fast/events/attribute-listener-deletion-crash-expected.txt index 489a6e5..24c72ad6 100644 --- a/third_party/blink/web_tests/fast/events/attribute-listener-deletion-crash-expected.txt +++ b/third_party/blink/web_tests/fast/events/attribute-listener-deletion-crash-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. CONSOLE ERROR: Uncaught SyntaxError: Unexpected token '|' CONSOLE ERROR: Uncaught SyntaxError: Unexpected token '|' CONSOLE ERROR: Uncaught SyntaxError: Unexpected token '|'
diff --git a/third_party/blink/web_tests/fast/events/dom-character-data-modified-textarea-crash-expected.txt b/third_party/blink/web_tests/fast/events/dom-character-data-modified-textarea-crash-expected.txt index f8836b0..dda8e70 100644 --- a/third_party/blink/web_tests/fast/events/dom-character-data-modified-textarea-crash-expected.txt +++ b/third_party/blink/web_tests/fast/events/dom-character-data-modified-textarea-crash-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Test passes if a DOMCharacterModified event on the textarea does not crash.
diff --git a/third_party/blink/web_tests/fast/events/domnodeinsertedintodocument-dispatched-post-rendering-expected.txt b/third_party/blink/web_tests/fast/events/domnodeinsertedintodocument-dispatched-post-rendering-expected.txt index 44a23c3..a2be713 100644 --- a/third_party/blink/web_tests/fast/events/domnodeinsertedintodocument-dispatched-post-rendering-expected.txt +++ b/third_party/blink/web_tests/fast/events/domnodeinsertedintodocument-dispatched-post-rendering-expected.txt
@@ -1,3 +1,6 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASS PASS
diff --git a/third_party/blink/web_tests/fast/events/event-fire-disconnected-bubbling-mutation-expected.txt b/third_party/blink/web_tests/fast/events/event-fire-disconnected-bubbling-mutation-expected.txt index 7e682175..95b949a48 100644 --- a/third_party/blink/web_tests/fast/events/event-fire-disconnected-bubbling-mutation-expected.txt +++ b/third_party/blink/web_tests/fast/events/event-fire-disconnected-bubbling-mutation-expected.txt
@@ -1,3 +1,5 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Mutation events should propagate in disconnected DOM trees. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/events/event-fire-disconnected-shadow-dom-crash-expected.txt b/third_party/blink/web_tests/fast/events/event-fire-disconnected-shadow-dom-crash-expected.txt index 8e72aaf..d4b1ef6 100644 --- a/third_party/blink/web_tests/fast/events/event-fire-disconnected-shadow-dom-crash-expected.txt +++ b/third_party/blink/web_tests/fast/events/event-fire-disconnected-shadow-dom-crash-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. ABC ABC
diff --git a/third_party/blink/web_tests/fast/events/event-listener-moving-documents-expected.txt b/third_party/blink/web_tests/fast/events/event-listener-moving-documents-expected.txt index 610a9ad1..de3afe7 100644 --- a/third_party/blink/web_tests/fast/events/event-listener-moving-documents-expected.txt +++ b/third_party/blink/web_tests/fast/events/event-listener-moving-documents-expected.txt
@@ -1,3 +1,5 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Moving an event listener between documents should keep it active On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/events/event-listener-on-link-crash-expected.txt b/third_party/blink/web_tests/fast/events/event-listener-on-link-crash-expected.txt new file mode 100644 index 0000000..f97d238a --- /dev/null +++ b/third_party/blink/web_tests/fast/events/event-listener-on-link-crash-expected.txt
@@ -0,0 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +This tests that you can successfully add a DOMSubtreeModified event listener to a link element, and the page should load without crashing.
diff --git a/third_party/blink/web_tests/fast/events/event-listener-on-link.html b/third_party/blink/web_tests/fast/events/event-listener-on-link-crash.html similarity index 90% rename from third_party/blink/web_tests/fast/events/event-listener-on-link.html rename to third_party/blink/web_tests/fast/events/event-listener-on-link-crash.html index 49428ed..789c970 100644 --- a/third_party/blink/web_tests/fast/events/event-listener-on-link.html +++ b/third_party/blink/web_tests/fast/events/event-listener-on-link-crash.html
@@ -1,6 +1,8 @@ +<!DOCTYPE html> <html> <head> <script> +testRunner.dumpAsText(); function init() { document.getElementById('test').addEventListener('DOMSubtreeModified',function () { alert('Subtree modified!')
diff --git a/third_party/blink/web_tests/fast/events/mutation-during-append-child-expected.txt b/third_party/blink/web_tests/fast/events/mutation-during-append-child-expected.txt index 642cc0a..30466db 100644 --- a/third_party/blink/web_tests/fast/events/mutation-during-append-child-expected.txt +++ b/third_party/blink/web_tests/fast/events/mutation-during-append-child-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Ensures that appendChild() throws an exception if mutation even handler does something wrong On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/events/mutation-during-insert-before-expected.txt b/third_party/blink/web_tests/fast/events/mutation-during-insert-before-expected.txt index d55c8b3..e2038233 100644 --- a/third_party/blink/web_tests/fast/events/mutation-during-insert-before-expected.txt +++ b/third_party/blink/web_tests/fast/events/mutation-during-insert-before-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Ensures that insertBefore() throws an exception if mutation even handler does something wrong On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/events/mutation-during-replace-child-2-expected.txt b/third_party/blink/web_tests/fast/events/mutation-during-replace-child-2-expected.txt index 5b752ac..18745afa 100644 --- a/third_party/blink/web_tests/fast/events/mutation-during-replace-child-2-expected.txt +++ b/third_party/blink/web_tests/fast/events/mutation-during-replace-child-2-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Ensures that replaceChild() throws an exception if mutation even handler does something wrong On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/events/mutation-during-replace-child-expected.txt b/third_party/blink/web_tests/fast/events/mutation-during-replace-child-expected.txt index 99812972..471872c 100644 --- a/third_party/blink/web_tests/fast/events/mutation-during-replace-child-expected.txt +++ b/third_party/blink/web_tests/fast/events/mutation-during-replace-child-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Ensures that replaceChild() throws an exception if mutation even handler does something wrong On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/events/scoped/editing-commands-expected.txt b/third_party/blink/web_tests/fast/events/scoped/editing-commands-expected.txt index 8de3126..c4f3753c 100644 --- a/third_party/blink/web_tests/fast/events/scoped/editing-commands-expected.txt +++ b/third_party/blink/web_tests/fast/events/scoped/editing-commands-expected.txt
@@ -1,3 +1,213 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. This test ensures WebKit does not fire DOM mutation events while execCommand is in progress. PASS: execCommand('BackColor', false, 'blue')
diff --git a/third_party/blink/web_tests/fast/events/window-onerror-isolatedworld-02-expected.txt b/third_party/blink/web_tests/fast/events/window-onerror-isolatedworld-02-expected.txt index 60a4caf63..8758066 100644 --- a/third_party/blink/web_tests/fast/events/window-onerror-isolatedworld-02-expected.txt +++ b/third_party/blink/web_tests/fast/events/window-onerror-isolatedworld-02-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. CONSOLE ERROR: Uncaught Error: Error in main world inline script. CONSOLE ERROR: Uncaught Error: Error in main world load handler. Test that window.onerror and "error" event listeners from isolated world are invoked for uncaught exceptions in scripts running in isolate worlds as well as for exceptions in the main world.Bug 8519.
diff --git a/third_party/blink/web_tests/fast/forms/mutation-event-recalc-expected.txt b/third_party/blink/web_tests/fast/forms/mutation-event-recalc-expected.txt index 5d9e325..e903f53 100644 --- a/third_party/blink/web_tests/fast/forms/mutation-event-recalc-expected.txt +++ b/third_party/blink/web_tests/fast/forms/mutation-event-recalc-expected.txt
@@ -1,3 +1,6 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Test that HTMLSelectElement DOM is in a consistent state when handling mutation events. SUCCESS
diff --git a/third_party/blink/web_tests/fast/forms/select/add-and-remove-option-expected.txt b/third_party/blink/web_tests/fast/forms/select/add-and-remove-option-expected.txt index 2eb5c703..31915584 100644 --- a/third_party/blink/web_tests/fast/forms/select/add-and-remove-option-expected.txt +++ b/third_party/blink/web_tests/fast/forms/select/add-and-remove-option-expected.txt
@@ -1,3 +1,6 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Test for bug 13287: Cannot change SELECT to a dynamically created option. Test that DOM is updated before DOMNodeInserted is dispatched.
diff --git a/third_party/blink/web_tests/fast/forms/select/add-remove-option-modification-event-expected.txt b/third_party/blink/web_tests/fast/forms/select/add-remove-option-modification-event-expected.txt index f8dd8a09..9335f3d 100644 --- a/third_party/blink/web_tests/fast/forms/select/add-remove-option-modification-event-expected.txt +++ b/third_party/blink/web_tests/fast/forms/select/add-remove-option-modification-event-expected.txt
@@ -1,3 +1,6 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Test that SELECT is in correct state when handling a DOM modification event for option removing. 2
diff --git a/third_party/blink/web_tests/fast/forms/select/option-add-crash-expected.txt b/third_party/blink/web_tests/fast/forms/select/option-add-crash-expected.txt index 61754d4..a7714c5 100644 --- a/third_party/blink/web_tests/fast/forms/select/option-add-crash-expected.txt +++ b/third_party/blink/web_tests/fast/forms/select/option-add-crash-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASS successfullyParsed is true TEST COMPLETE
diff --git a/third_party/blink/web_tests/fast/forms/select/select-set-length-with-mutation-expected.txt b/third_party/blink/web_tests/fast/forms/select/select-set-length-with-mutation-expected.txt index 093b562..93ff276 100644 --- a/third_party/blink/web_tests/fast/forms/select/select-set-length-with-mutation-expected.txt +++ b/third_party/blink/web_tests/fast/forms/select/select-set-length-with-mutation-expected.txt
@@ -1,3 +1,5 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Tests setting the .length of an HTMLSelectElement with mutation listeners registered. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/forms/select/select-set-length-with-mutation-remove-expected.txt b/third_party/blink/web_tests/fast/forms/select/select-set-length-with-mutation-remove-expected.txt index 04d8eb3..329300c3 100644 --- a/third_party/blink/web_tests/fast/forms/select/select-set-length-with-mutation-remove-expected.txt +++ b/third_party/blink/web_tests/fast/forms/select/select-set-length-with-mutation-remove-expected.txt
@@ -1,3 +1,55 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Tests that setting .length on an HTMLSelectElement works in the presence of mutation listeners that remove option elements. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/forms/select/select-set-length-with-mutation-reorder-expected.txt b/third_party/blink/web_tests/fast/forms/select/select-set-length-with-mutation-reorder-expected.txt index d80b6aee..89d177c 100644 --- a/third_party/blink/web_tests/fast/forms/select/select-set-length-with-mutation-reorder-expected.txt +++ b/third_party/blink/web_tests/fast/forms/select/select-set-length-with-mutation-reorder-expected.txt
@@ -1,3 +1,6 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Tests that setting the .length on an HTMLSelectElement works in the presence of DOM mutation listeners that reorder option elements On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/forms/select/select-set-length-with-mutation-reparent-expected.txt b/third_party/blink/web_tests/fast/forms/select/select-set-length-with-mutation-reparent-expected.txt index 5b35b38..717aaab 100644 --- a/third_party/blink/web_tests/fast/forms/select/select-set-length-with-mutation-reparent-expected.txt +++ b/third_party/blink/web_tests/fast/forms/select/select-set-length-with-mutation-reparent-expected.txt
@@ -1,3 +1,55 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemoved' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Tests that setting .length on an HTMLSelectElement works in the presence of mutation event listeners that reparent options On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/forms/textarea/textarea-and-mutation-events-appending-text-expected.txt b/third_party/blink/web_tests/fast/forms/textarea/textarea-and-mutation-events-appending-text-expected.txt index bd0f404b..d46f6398 100644 --- a/third_party/blink/web_tests/fast/forms/textarea/textarea-and-mutation-events-appending-text-expected.txt +++ b/third_party/blink/web_tests/fast/forms/textarea/textarea-and-mutation-events-appending-text-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Ensuring that mutation event with text modification on a textarea doesn't crash On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/forms/textarea/textarea-and-mutation-events-expected.txt b/third_party/blink/web_tests/fast/forms/textarea/textarea-and-mutation-events-expected.txt index 61101ef..67547c2 100644 --- a/third_party/blink/web_tests/fast/forms/textarea/textarea-and-mutation-events-expected.txt +++ b/third_party/blink/web_tests/fast/forms/textarea/textarea-and-mutation-events-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. Tests to see if registering an empty DOMNodeInserted event handler and dirtying the tree just right can cause attach re-entrancy with textarea. Passes if doesn't crash.
diff --git a/third_party/blink/web_tests/fast/forms/week-multiple-fields/week-multiple-fields-no-shadow-event-expected.txt b/third_party/blink/web_tests/fast/forms/week-multiple-fields/week-multiple-fields-no-shadow-event-expected.txt index e2cb5669..d3da2217 100644 --- a/third_party/blink/web_tests/fast/forms/week-multiple-fields/week-multiple-fields-no-shadow-event-expected.txt +++ b/third_party/blink/web_tests/fast/forms/week-multiple-fields/week-multiple-fields-no-shadow-event-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASS event did not get triggered. PASS successfullyParsed is true
diff --git a/third_party/blink/web_tests/fast/frames/iframe-onload-and-domnodeinserted-expected.txt b/third_party/blink/web_tests/fast/frames/iframe-onload-and-domnodeinserted-expected.txt index 4083807..2db92c2 100644 --- a/third_party/blink/web_tests/fast/frames/iframe-onload-and-domnodeinserted-expected.txt +++ b/third_party/blink/web_tests/fast/frames/iframe-onload-and-domnodeinserted-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. This test ensures that any tree mutation in the load event handler cannot harm the tree consistency. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/html/details_summary/mutation-details-focus-expected.txt b/third_party/blink/web_tests/html/details_summary/mutation-details-focus-expected.txt index 37b1c6c..8f3be1c0 100644 --- a/third_party/blink/web_tests/html/details_summary/mutation-details-focus-expected.txt +++ b/third_party/blink/web_tests/html/details_summary/mutation-details-focus-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeRemovedFromDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASS unless crash PASS successfullyParsed is true
diff --git a/third_party/blink/web_tests/html/sections/body-inserting-iframe-crash-expected.txt b/third_party/blink/web_tests/html/sections/body-inserting-iframe-crash-expected.txt index fbfeed9..d620a16 100644 --- a/third_party/blink/web_tests/html/sections/body-inserting-iframe-crash-expected.txt +++ b/third_party/blink/web_tests/html/sections/body-inserting-iframe-crash-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASS if not crashed.
diff --git a/third_party/blink/web_tests/html/sections/remove-body-during-body-replacement-expected.txt b/third_party/blink/web_tests/html/sections/remove-body-during-body-replacement-expected.txt index 2afa0bfd..59676e7 100644 --- a/third_party/blink/web_tests/html/sections/remove-body-during-body-replacement-expected.txt +++ b/third_party/blink/web_tests/html/sections/remove-body-during-body-replacement-expected.txt
@@ -1 +1,3 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASS. WebKit didn't crash.
diff --git a/third_party/blink/web_tests/html/sections/remove-body-during-body-replacement2-expected.txt b/third_party/blink/web_tests/html/sections/remove-body-during-body-replacement2-expected.txt index 2afa0bfd..9793157 100644 --- a/third_party/blink/web_tests/html/sections/remove-body-during-body-replacement2-expected.txt +++ b/third_party/blink/web_tests/html/sections/remove-body-during-body-replacement2-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASS. WebKit didn't crash.
diff --git a/third_party/blink/web_tests/html/sections/remove-body-during-title-creation-expected.txt b/third_party/blink/web_tests/html/sections/remove-body-during-title-creation-expected.txt index 2afa0bfd..59676e7 100644 --- a/third_party/blink/web_tests/html/sections/remove-body-during-title-creation-expected.txt +++ b/third_party/blink/web_tests/html/sections/remove-body-during-title-creation-expected.txt
@@ -1 +1,3 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInsertedIntoDocument' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASS. WebKit didn't crash.
diff --git a/third_party/blink/web_tests/http/tests/devtools/tracing/timeline-js/timeline-script-id-expected.txt b/third_party/blink/web_tests/http/tests/devtools/tracing/timeline-js/timeline-script-id-expected.txt deleted file mode 100644 index 87c0eb4..0000000 --- a/third_party/blink/web_tests/http/tests/devtools/tracing/timeline-js/timeline-script-id-expected.txt +++ /dev/null
@@ -1,14 +0,0 @@ -Test that checks location resolving mechanics for TimerInstall TimerRemove and FunctionCall events with scriptId. - It expects two FunctionCall for InjectedScript, two TimerInstall events, two FunctionCall events and one TimerRemove event to be logged with performActions.js script name and some line number. - -detailsTextContent for TimerInstall event: 'performActions.js:33:20' -details.textContent for TimerInstall event: 'performActions.js:33:20' -detailsTextContent for TimerInstall event: 'performActions.js:34:20' -details.textContent for TimerInstall event: 'performActions.js:34:20' -detailsTextContent for FunctionCall event: 'performActions.js:38:31' -details.textContent for FunctionCall event: 'intervalTimerWork @ performActions.js:38:31' -detailsTextContent for FunctionCall event: 'performActions.js:38:31' -details.textContent for FunctionCall event: 'intervalTimerWork @ performActions.js:38:31' -detailsTextContent for TimerRemove event: 'performActions.js:41:7' -details.textContent for TimerRemove event: 'performActions.js:41:7' -
diff --git a/third_party/blink/web_tests/http/tests/devtools/tracing/timeline-js/timeline-script-id.js b/third_party/blink/web_tests/http/tests/devtools/tracing/timeline-js/timeline-script-id.js deleted file mode 100644 index aff409b..0000000 --- a/third_party/blink/web_tests/http/tests/devtools/tracing/timeline-js/timeline-script-id.js +++ /dev/null
@@ -1,56 +0,0 @@ -// Copyright 2017 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -(async function() { - TestRunner.addResult( - `Test that checks location resolving mechanics for TimerInstall TimerRemove and FunctionCall events with scriptId. - It expects two FunctionCall for InjectedScript, two TimerInstall events, two FunctionCall events and one TimerRemove event to be logged with performActions.js script name and some line number.\n`); - await TestRunner.loadLegacyModule('timeline'); await TestRunner.loadTestModule('performance_test_runner'); - await TestRunner.loadLegacyModule('components'); - await TestRunner.showPanel('timeline'); - - function performActions() { - var callback; - var promise = new Promise((fulfill) => callback = fulfill); - var timerOne = setTimeout('1 + 1', 10); - var timerTwo = setInterval(intervalTimerWork, 20); - var iteration = 0; - return promise; - - function intervalTimerWork() { - if (++iteration < 2) - return; - clearInterval(timerTwo); - callback(); - } - } - - const source = performActions.toString() + '\n//# sourceURL=performActions.js'; - await new Promise(resolve => TestRunner.evaluateInPage(source, resolve)); - - const linkifier = new Components.Linkifier(); - const recordTypes = new Set(['TimerInstall', 'TimerRemove', 'FunctionCall']); - - await PerformanceTestRunner.invokeAsyncWithTimeline('performActions'); - await PerformanceTestRunner.walkTimelineEventTree(formatter); - TestRunner.completeTest(); - - async function formatter(event) { - if (!recordTypes.has(event.name)) - return; - - var detailsText = await Timeline.TimelineUIUtils.buildDetailsTextForTraceEvent( - event, PerformanceTestRunner.timelineModel().targetByEvent(event)); - await TestRunner.waitForPendingLiveLocationUpdates(); - TestRunner.addResult('detailsTextContent for ' + event.name + ' event: \'' + detailsText + '\''); - - var details = await Timeline.TimelineUIUtils.buildDetailsNodeForTraceEvent( - event, PerformanceTestRunner.timelineModel().targetByEvent(event), linkifier); - await TestRunner.waitForPendingLiveLocationUpdates(); - if (!details) - return; - TestRunner.addResult( - 'details.textContent for ' + event.name + ' event: \'' + details.textContent.replace(/VM[\d]+/, 'VM') + '\''); - } -})();
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/console/console-dom-mutation-violations-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/console/console-dom-mutation-violations-expected.txt index 8434c51..d6a4f05 100644 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/console/console-dom-mutation-violations-expected.txt +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/console/console-dom-mutation-violations-expected.txt
@@ -17,7 +17,31 @@ } ] } - text : Added synchronous DOM mutation listener to a 'DOMSubtreeModified' event. Consider using MutationObserver to make the page more responsive. + text : Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. + timestamp : <number> + } + } + sessionId : <string> +} +{ + method : Log.entryAdded + params : { + entry : { + level : warning + lineNumber : 0 + source : deprecation + stackTrace : { + callFrames : [ + [0] : { + columnNumber : 14 + functionName : + lineNumber : 0 + scriptId : <string> + url : + } + ] + } + text : Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. timestamp : <number> } }
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/issues/mutation-events-issue-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/issues/mutation-events-issue-expected.txt new file mode 100644 index 0000000..20dd82a --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/issues/mutation-events-issue-expected.txt
@@ -0,0 +1,117 @@ +Verifies that adding Mutation Event listeners triggers a deprecation issue. +Issue for DOMCharacterDataModified: { + issue : { + code : DeprecationIssue + details : { + deprecationIssueDetails : { + affectedFrame : { + frameId : <string> + } + sourceCodeLocation : { + columnNumber : 15 + lineNumber : 6 + scriptId : <string> + url : http://127.0.0.1:8000/inspector-protocol/resources/mutation-events.html?DOMCharacterDataModified + } + type : DOMMutationEvents + } + } + } +} +Issue for DOMNodeInserted: { + issue : { + code : DeprecationIssue + details : { + deprecationIssueDetails : { + affectedFrame : { + frameId : <string> + } + sourceCodeLocation : { + columnNumber : 15 + lineNumber : 6 + scriptId : <string> + url : http://127.0.0.1:8000/inspector-protocol/resources/mutation-events.html?DOMNodeInserted + } + type : DOMMutationEvents + } + } + } +} +Issue for DOMNodeInsertedIntoDocument: { + issue : { + code : DeprecationIssue + details : { + deprecationIssueDetails : { + affectedFrame : { + frameId : <string> + } + sourceCodeLocation : { + columnNumber : 15 + lineNumber : 6 + scriptId : <string> + url : http://127.0.0.1:8000/inspector-protocol/resources/mutation-events.html?DOMNodeInsertedIntoDocument + } + type : DOMMutationEvents + } + } + } +} +Issue for DOMNodeRemoved: { + issue : { + code : DeprecationIssue + details : { + deprecationIssueDetails : { + affectedFrame : { + frameId : <string> + } + sourceCodeLocation : { + columnNumber : 15 + lineNumber : 6 + scriptId : <string> + url : http://127.0.0.1:8000/inspector-protocol/resources/mutation-events.html?DOMNodeRemoved + } + type : DOMMutationEvents + } + } + } +} +Issue for DOMNodeRemovedFromDocument: { + issue : { + code : DeprecationIssue + details : { + deprecationIssueDetails : { + affectedFrame : { + frameId : <string> + } + sourceCodeLocation : { + columnNumber : 15 + lineNumber : 6 + scriptId : <string> + url : http://127.0.0.1:8000/inspector-protocol/resources/mutation-events.html?DOMNodeRemovedFromDocument + } + type : DOMMutationEvents + } + } + } +} +Issue for DOMSubtreeModified: { + issue : { + code : DeprecationIssue + details : { + deprecationIssueDetails : { + affectedFrame : { + frameId : <string> + } + sourceCodeLocation : { + columnNumber : 15 + lineNumber : 6 + scriptId : <string> + url : http://127.0.0.1:8000/inspector-protocol/resources/mutation-events.html?DOMSubtreeModified + } + type : DOMMutationEvents + } + } + } +} +Non-Mutation Event generated issue: PASS +
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/issues/mutation-events-issue.js b/third_party/blink/web_tests/http/tests/inspector-protocol/issues/mutation-events-issue.js new file mode 100644 index 0000000..1ef4c6e --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/issues/mutation-events-issue.js
@@ -0,0 +1,31 @@ +(async function (testRunner) { + const { session, dp } = await testRunner.startBlank( + 'Verifies that adding Mutation Event listeners triggers a deprecation issue.'); + await dp.Audits.enable(); + + const events = [ + 'DOMCharacterDataModified', + 'DOMNodeInserted', + 'DOMNodeInsertedIntoDocument', + 'DOMNodeRemoved', + 'DOMNodeRemovedFromDocument', + 'DOMSubtreeModified', + ]; + + for (const evt of events) { + const promise = dp.Audits.onceIssueAdded(); + await session.navigate(`../resources/mutation-events.html?${evt}`); + const result = await promise; + testRunner.log(result.params, `Issue for ${evt}: `); + } + + // Now make sure a non-mutation event doesn't trigger the warning + const promise = dp.Audits.onceIssueAdded(); + await session.navigate(`../resources/mutation-events.html?load`); + let noIssue = false; + const wait2frames = new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(() => {noIssue=true; resolve();}))); + await Promise.any([wait2frames,promise]); + testRunner.log(`Non-Mutation Event generated issue: ${noIssue ? "PASS" : "FAIL"}`); + + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/resources/mutation-events.html b/third_party/blink/web_tests/http/tests/inspector-protocol/resources/mutation-events.html new file mode 100644 index 0000000..6486d990 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/resources/mutation-events.html
@@ -0,0 +1,8 @@ +<!DOCTYPE html> + +<body> +<script> +// Deprecation warnings should be generated just by adding listeners. +const eventName = location.search.slice(1); +document.body.addEventListener(eventName,() => {}); +</script>
diff --git a/third_party/blink/web_tests/http/tests/xmlhttprequest/reentrant-cancel-abort-expected.txt b/third_party/blink/web_tests/http/tests/xmlhttprequest/reentrant-cancel-abort-expected.txt index 1dc7ec55..7a39e61 100644 --- a/third_party/blink/web_tests/http/tests/xmlhttprequest/reentrant-cancel-abort-expected.txt +++ b/third_party/blink/web_tests/http/tests/xmlhttprequest/reentrant-cancel-abort-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. insertedText Reentrancy, cancellation and explicit abort. Check that we don't crash and report the expected abort event. DOMContentLoaded
diff --git a/third_party/blink/web_tests/http/tests/xmlhttprequest/reentrant-cancel-expected.txt b/third_party/blink/web_tests/http/tests/xmlhttprequest/reentrant-cancel-expected.txt index 32eb9e4..b013ebc 100644 --- a/third_party/blink/web_tests/http/tests/xmlhttprequest/reentrant-cancel-expected.txt +++ b/third_party/blink/web_tests/http/tests/xmlhttprequest/reentrant-cancel-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. insertedText This tests that when we re-entrantly create and cancel XHRs, we don't try to disconnect the same CachedResourceClient multiple times from its CachedResource. We pass if we don't crash. DOMContentLoaded
diff --git a/third_party/blink/web_tests/inspector-protocol/sessions/log-entry-added-expected.txt b/third_party/blink/web_tests/inspector-protocol/sessions/log-entry-added-expected.txt index 49336920..bd31f259 100644 --- a/third_party/blink/web_tests/inspector-protocol/sessions/log-entry-added-expected.txt +++ b/third_party/blink/web_tests/inspector-protocol/sessions/log-entry-added-expected.txt
@@ -20,7 +20,32 @@ } ] } - text : Added synchronous DOM mutation listener to a 'DOMSubtreeModified' event. Consider using MutationObserver to make the page more responsive. + text : Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. + timestamp : <number> + } + } + sessionId : <string> +} +From session1: +{ + method : Log.entryAdded + params : { + entry : { + level : warning + lineNumber : 0 + source : deprecation + stackTrace : { + callFrames : [ + [0] : { + columnNumber : 14 + functionName : + lineNumber : 0 + scriptId : <string> + url : + } + ] + } + text : Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. timestamp : <number> } } @@ -47,7 +72,57 @@ } ] } - text : Added synchronous DOM mutation listener to a 'DOMSubtreeModified' event. Consider using MutationObserver to make the page more responsive. + text : Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. + timestamp : <number> + } + } + sessionId : <string> +} +From session1: +{ + method : Log.entryAdded + params : { + entry : { + level : warning + lineNumber : 0 + source : deprecation + stackTrace : { + callFrames : [ + [0] : { + columnNumber : 14 + functionName : + lineNumber : 0 + scriptId : <string> + url : + } + ] + } + text : Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. + timestamp : <number> + } + } + sessionId : <string> +} +From session2: +{ + method : Log.entryAdded + params : { + entry : { + level : warning + lineNumber : 0 + source : deprecation + stackTrace : { + callFrames : [ + [0] : { + columnNumber : 14 + functionName : + lineNumber : 0 + scriptId : <string> + url : + } + ] + } + text : Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. timestamp : <number> } } @@ -72,7 +147,32 @@ } ] } - text : Added synchronous DOM mutation listener to a 'DOMSubtreeModified' event. Consider using MutationObserver to make the page more responsive. + text : Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. + timestamp : <number> + } + } + sessionId : <string> +} +From session2: +{ + method : Log.entryAdded + params : { + entry : { + level : warning + lineNumber : 0 + source : deprecation + stackTrace : { + callFrames : [ + [0] : { + columnNumber : 14 + functionName : + lineNumber : 0 + scriptId : <string> + url : + } + ] + } + text : Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. timestamp : <number> } } @@ -99,7 +199,32 @@ } ] } - text : Added synchronous DOM mutation listener to a 'DOMSubtreeModified' event. Consider using MutationObserver to make the page more responsive. + text : Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. + timestamp : <number> + } + } + sessionId : <string> +} +From session2: +{ + method : Log.entryAdded + params : { + entry : { + level : warning + lineNumber : 0 + source : deprecation + stackTrace : { + callFrames : [ + [0] : { + columnNumber : 14 + functionName : + lineNumber : 0 + scriptId : <string> + url : + } + ] + } + text : Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. timestamp : <number> } }
diff --git a/third_party/blink/web_tests/media/video-controls-with-mutation-event-handler-expected.txt b/third_party/blink/web_tests/media/video-controls-with-mutation-event-handler-expected.txt index 1f37edf..08225248 100644 --- a/third_party/blink/web_tests/media/video-controls-with-mutation-event-handler-expected.txt +++ b/third_party/blink/web_tests/media/video-controls-with-mutation-event-handler-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMSubtreeModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. This tests that we don't crash while creating a video element while a DOMSubtreeModified even handler is registered. If you can see the movie below, the test passed.
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png index 2dc2ba3..7052754 100644 --- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png +++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png index 44c8e40..7c03bd5 100644 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png index 44c8e40..7c03bd5 100644 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png index 44c8e40..7c03bd5 100644 --- a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png index 8f0d54c..5e3a586 100644 --- a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png +++ b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png index 8ca7917..ebc5eca 100644 --- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png +++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/svg/custom/tref-nested-events-crash-expected.txt b/third_party/blink/web_tests/svg/custom/tref-nested-events-crash-expected.txt index 9b9c9725..fc07cc2 100644 --- a/third_party/blink/web_tests/svg/custom/tref-nested-events-crash-expected.txt +++ b/third_party/blink/web_tests/svg/custom/tref-nested-events-crash-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMCharacterDataModified' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASS: did not crash.
diff --git a/third_party/blink/web_tests/svg/custom/use-mutation-event-crash-expected.txt b/third_party/blink/web_tests/svg/custom/use-mutation-event-crash-expected.txt index 0f98b60..07e2497d 100644 --- a/third_party/blink/web_tests/svg/custom/use-mutation-event-crash-expected.txt +++ b/third_party/blink/web_tests/svg/custom/use-mutation-event-crash-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASS - didn't crash, bug 25092
diff --git a/third_party/blink/web_tests/virtual/text-antialias/split-text-crash-expected.txt b/third_party/blink/web_tests/virtual/text-antialias/split-text-crash-expected.txt index 2afa0bfd..a8135667 100644 --- a/third_party/blink/web_tests/virtual/text-antialias/split-text-crash-expected.txt +++ b/third_party/blink/web_tests/virtual/text-antialias/split-text-crash-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: Listener added for a synchronous 'DOMNodeInserted' DOM Mutation Event. This event type is deprecated (https://w3c.github.io/uievents/#legacy-event-types) and work is underway to remove it from this browser. Usage of this event listener will cause performance issues today, and represents a risk of future incompatibility. Consider using MutationObserver instead. PASS. WebKit didn't crash.
diff --git a/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt b/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt index 0bf131d..de2f0be 100644 --- a/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt +++ b/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt
@@ -550,6 +550,7 @@ property cite property dateTime html element details + property name property open html element dfn html element dialog
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt index dd838d9..8720a07 100644 --- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt +++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -3526,8 +3526,10 @@ method constructor interface HTMLDetailsElement : HTMLElement attribute @@toStringTag + getter name getter open method constructor + setter name setter open interface HTMLDialogElement : HTMLElement attribute @@toStringTag @@ -6920,6 +6922,7 @@ interface PerformanceNavigationTiming : PerformanceResourceTiming attribute @@toStringTag getter activationStart + getter criticalCHRestart getter domComplete getter domContentLoadedEventEnd getter domContentLoadedEventStart
diff --git a/third_party/blink/web_tests/wpt_internal/attribution-reporting/request-format.sub.https.html b/third_party/blink/web_tests/wpt_internal/attribution-reporting/request-format.sub.https.html index 1f26503..0b939f8 100644 --- a/third_party/blink/web_tests/wpt_internal/attribution-reporting/request-format.sub.https.html +++ b/third_party/blink/web_tests/wpt_internal/attribution-reporting/request-format.sub.https.html
@@ -49,7 +49,12 @@ const requests = await waitForRequest(); assert_equals(requests.length, 1); assert_equals(requests[0].method, 'GET'); - assert_equals(requests[0]['attribution-reporting-eligible'], expected_eligible); + // TODO(apaseltiner): Check header value once WPT can parse structured dictionaries. + if (expected_eligible) { + assert_own_property(requests[0], 'attribution-reporting-eligible'); + } else { + assert_not_own_property(requests[0], 'attribution-reporting-eligible'); + } assert_equals(requests[0]['attribution-reporting-support'], expected_support); assert_equals(requests[0].referer, location.toString());
diff --git a/third_party/blink/web_tests/wpt_internal/webmidi/requestmidiaccess-basic.https.html.ini b/third_party/blink/web_tests/wpt_internal/webmidi/requestmidiaccess-basic.https.html.ini index 0bec5fd..72971c3 100644 --- a/third_party/blink/web_tests/wpt_internal/webmidi/requestmidiaccess-basic.https.html.ini +++ b/third_party/blink/web_tests/wpt_internal/webmidi/requestmidiaccess-basic.https.html.ini
@@ -1,4 +1,7 @@ [requestmidiaccess-basic.https.html] expected: - if product == "chrome": ERROR - [ERROR, OK] + if product == "chrome": OK + ERROR + [requestMIDIAccess is defined and callable] + expected: + if product == "chrome": FAIL
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium index 773c9d86..75f3d48 100644 --- a/third_party/freetype/README.chromium +++ b/third_party/freetype/README.chromium
@@ -1,7 +1,7 @@ Name: FreeType URL: http://www.freetype.org/ -Version: VER-2-13-0-139-g99dadd56a -Revision: 99dadd56a40e6d9ae23b395225ecf9997432d22c +Version: VER-2-13-0-140-g115e92754 +Revision: 115e927540dba128980dd734dadeb06aa7b0f4d8 CPEPrefix: cpe:/a:freetype:freetype:2.12.1 License: Custom license "inspired by the BSD, Artistic, and IJG (Independent JPEG Group) licenses"
diff --git a/third_party/libusb/OWNERS b/third_party/libusb/OWNERS index 41d6ce4..268a020d 100644 --- a/third_party/libusb/OWNERS +++ b/third_party/libusb/OWNERS
@@ -1,2 +1,4 @@ +chengweih@chromium.org +mattreynolds@chromium.org meacer@chromium.org reillyg@chromium.org
diff --git a/tools/clang/scripts/package.py b/tools/clang/scripts/package.py index 12c6b7c..4fc4cf9 100755 --- a/tools/clang/scripts/package.py +++ b/tools/clang/scripts/package.py
@@ -33,6 +33,8 @@ EU_STRIP = os.path.join(BUILDTOOLS_DIR, 'third_party', 'eu-strip', 'bin', 'eu-strip') +DEFAULT_GCS_BUCKET = 'chromium-browser-clang-staging' + def Tee(output, logfile): logfile.write(output) @@ -106,10 +108,14 @@ tar_gz.add(os.path.join(directory_path, f), arcname=f) -def MaybeUpload(do_upload, filename, gcs_platform, extra_gsutil_args=[]): +def MaybeUpload(do_upload, + gcs_bucket, + filename, + gcs_platform, + extra_gsutil_args=[]): gsutil_args = ['cp'] + extra_gsutil_args + [ '-n', '-a', 'public-read', filename, - 'gs://chromium-browser-clang-staging/%s/' % (gcs_platform) + 'gs://%s/%s/' % (gcs_bucket, gcs_platform) ] if do_upload: print('Uploading %s to Google Cloud Storage...' % filename) @@ -177,6 +183,10 @@ parser = argparse.ArgumentParser(description='build and package clang') parser.add_argument('--upload', action='store_true', help='Upload the target archive to Google Cloud Storage.') + parser.add_argument( + '--bucket', + default=DEFAULT_GCS_BUCKET, + help='Google Cloud Storage bucket where the target archive is uploaded') parser.add_argument('--build-mac-arm', action='store_true', help='Build arm binaries. Only valid on macOS.') parser.add_argument('--revision', @@ -554,11 +564,12 @@ # Create main archive. PackageInArchive(pdir, pdir) - MaybeUpload(args.upload, pdir + '.t*z', gcs_platform) + MaybeUpload(args.upload, args.bucket, pdir + '.t*z', gcs_platform) # Upload build log next to it. os.rename('buildlog.txt', pdir + '-buildlog.txt') MaybeUpload(args.upload, + args.bucket, pdir + '-buildlog.txt', gcs_platform, extra_gsutil_args=['-z', 'txt']) @@ -572,7 +583,8 @@ shutil.copy(os.path.join(LLVM_RELEASE_DIR, 'bin', filename + exe_ext), os.path.join(code_coverage_dir, 'bin')) PackageInArchive(code_coverage_dir, code_coverage_dir) - MaybeUpload(args.upload, code_coverage_dir + '.t*z', gcs_platform) + MaybeUpload(args.upload, args.bucket, code_coverage_dir + '.t*z', + gcs_platform) # Zip up llvm-objdump and related tools for sanitizer coverage and Supersize. objdumpdir = 'llvmobjdump-' + stamp @@ -592,7 +604,7 @@ if sys.platform != 'win32': os.symlink('llvm-objdump', os.path.join(objdumpdir, 'bin', 'llvm-otool')) PackageInArchive(objdumpdir, objdumpdir) - MaybeUpload(args.upload, objdumpdir + '.t*z', gcs_platform) + MaybeUpload(args.upload, args.bucket, objdumpdir + '.t*z', gcs_platform) # Zip up clang-tidy for users who opt into it, and Tricium. clang_tidy_dir = 'clang-tidy-' + stamp @@ -601,7 +613,7 @@ shutil.copy(os.path.join(LLVM_RELEASE_DIR, 'bin', 'clang-tidy' + exe_ext), os.path.join(clang_tidy_dir, 'bin')) PackageInArchive(clang_tidy_dir, clang_tidy_dir) - MaybeUpload(args.upload, clang_tidy_dir + '.t*z', gcs_platform) + MaybeUpload(args.upload, args.bucket, clang_tidy_dir + '.t*z', gcs_platform) # Zip up clangd for users who opt into it. clangd_dir = 'clangd-' + stamp @@ -610,7 +622,7 @@ shutil.copy(os.path.join(LLVM_RELEASE_DIR, 'bin', 'clangd' + exe_ext), os.path.join(clangd_dir, 'bin')) PackageInArchive(clangd_dir, clangd_dir) - MaybeUpload(args.upload, clangd_dir + '.t*z', gcs_platform) + MaybeUpload(args.upload, args.bucket, clangd_dir + '.t*z', gcs_platform) # Zip up clang-format so we can update it (separately from the clang roll). clang_format_dir = 'clang-format-' + stamp @@ -619,7 +631,7 @@ shutil.copy(os.path.join(LLVM_RELEASE_DIR, 'bin', 'clang-format' + exe_ext), os.path.join(clang_format_dir, 'bin')) PackageInArchive(clang_format_dir, clang_format_dir) - MaybeUpload(args.upload, clang_format_dir + '.t*z', gcs_platform) + MaybeUpload(args.upload, args.bucket, clang_format_dir + '.t*z', gcs_platform) if sys.platform == 'darwin': # dsymutil isn't part of the main zip, and it gets periodically @@ -631,7 +643,7 @@ shutil.copy(os.path.join(LLVM_RELEASE_DIR, 'bin', 'dsymutil'), os.path.join(dsymdir, 'bin')) PackageInArchive(dsymdir, dsymdir) - MaybeUpload(args.upload, dsymdir + '.t*z', gcs_platform) + MaybeUpload(args.upload, args.bucket, dsymdir + '.t*z', gcs_platform) # Zip up the translation_unit tool. translation_unit_dir = 'translation_unit-' + stamp @@ -641,7 +653,8 @@ exe_ext), os.path.join(translation_unit_dir, 'bin')) PackageInArchive(translation_unit_dir, translation_unit_dir) - MaybeUpload(args.upload, translation_unit_dir + '.t*z', gcs_platform) + MaybeUpload(args.upload, args.bucket, translation_unit_dir + '.t*z', + gcs_platform) # Zip up the libclang binaries. libclang_dir = 'libclang-' + stamp @@ -656,7 +669,7 @@ filename), os.path.join(libclang_dir, 'bindings', 'python', 'clang')) PackageInArchive(libclang_dir, libclang_dir) - MaybeUpload(args.upload, libclang_dir + '.t*z', gcs_platform) + MaybeUpload(args.upload, args.bucket, libclang_dir + '.t*z', gcs_platform) if sys.platform == 'win32' and args.upload: binaries = [f for f in want if f.endswith('.exe') or f.endswith('.dll')]
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index b51e0f9..7efbe3f 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -27572,6 +27572,7 @@ <int value="1" label="ExceptedAs1p"/> <int value="2" label="ExceptedAs3p"/> <int value="3" label="Enforced"/> + <int value="4" label="Ignored: Due to empty site."/> </enum> <enum name="DIPSErrorCode"> @@ -42504,6 +42505,8 @@ <int value="4570" label="V8FileSystemHandle_GetUniqueId_Method"/> <int value="4571" label="V8FileSystemHandle_Remove_Method"/> <int value="4572" label="PerformanceNavigateSystemEntropy"/> + <int value="4573" label="V8InvalidatedNumberStringNotRegexpLikeProtector"/> + <int value="4574" label="CriticalCHRestartNavigationTiming"/> </enum> <enum name="FeaturePolicyAllowlistType"> @@ -64907,6 +64910,7 @@ <int value="1215512170" label="DrawEdgeToEdge:disabled"/> <int value="1215531732" label="OmniboxUIExperiments:disabled"/> <int value="1215768255" label="AutofillCreditCardLocalCardMigration:enabled"/> + <int value="1216074694" label="NtpRealboxWidthBehavior:enabled"/> <int value="1216286283" label="tint-composited-content"/> <int value="1216363133" label="LauncherHideContinueSection:disabled"/> <int value="1216452475" label="SyncUSSAutofillProfile:disabled"/> @@ -66330,6 +66334,7 @@ <int value="1952339754" label="SignedExchangePrefetchCacheForNavigations:enabled"/> <int value="1952811009" label="EnableSuggestedDriveFiles:disabled"/> + <int value="1953967314" label="NtpRealboxWidthBehavior:disabled"/> <int value="1954778883" label="COLRV1Fonts:disabled"/> <int value="1955238689" label="OmniboxMaxURLMatches:disabled"/> <int value="1955669770" label="MessagesForAndroidPopupBlocked:enabled"/> @@ -75326,6 +75331,11 @@ <int value="5" label="ELM collection view containing feed header fixed"/> </enum> +<enum name="NTPChromeWebStoreOpen"> + <int value="0" label="Appearance section"/> + <int value="1" label="Theme collections page"/> +</enum> + <enum name="NTPCollectionId"> <summary> Hash values for the IDs of NTP background image collections. Each of these
diff --git a/tools/metrics/histograms/metadata/media/histograms.xml b/tools/metrics/histograms/metadata/media/histograms.xml index aea98c5d..f4ee071f 100644 --- a/tools/metrics/histograms/metadata/media/histograms.xml +++ b/tools/metrics/histograms/metadata/media/histograms.xml
@@ -206,21 +206,6 @@ </summary> </histogram> -<histogram name="Media.Android.MediaCodecInfo.Has{CodecType}Info" - enum="BooleanAvailable" expires_after="M115"> - <owner>dalecurtis@chromium.org</owner> - <owner>media-dev@chromium.org</owner> - <summary> - Indicates if MediaCodecInfo for the given codec type was available and - non-empty. Reported once per GPU process instance if and only if encoder or - decoder info are requested respectively. - </summary> - <token key="CodecType"> - <variant name="Decoder"/> - <variant name="Encoder"/> - </token> -</histogram> - <histogram name="Media.Android.MediaPlayerSuccess" enum="MediaPlayerExitStatus" expires_after="2023-11-12"> <owner>tguilbert@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 0a4d424..5ccc417 100644 --- a/tools/metrics/histograms/metadata/new_tab_page/histograms.xml +++ b/tools/metrics/histograms/metadata/new_tab_page/histograms.xml
@@ -315,6 +315,19 @@ </summary> </histogram> +<histogram name="NewTabPage.ChromeWebStoreOpen" enum="NTPChromeWebStoreOpen" + expires_after="2023-11-18"> + <owner>danpeng@google.com</owner> + <owner>pauladedeji@chromium.org</owner> + <owner>chrome-desktop-ntp@google.com</owner> + <summary> + Logs where a user opened the Chrome Web Store link from in Customize Chrome. + Only logged on the 1P NTP. Note that even if the user has Google as their + default search engine, Incognito and Guest mode NTPs are not considered 1P + and don't log this histogram. + </summary> +</histogram> + <histogram name="NewTabPage.Click" enum="NTPElement" expires_after="2023-11-12"> <owner>tiborg@chromium.org</owner> <owner>yyushkina@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/password/histograms.xml b/tools/metrics/histograms/metadata/password/histograms.xml index 63a453d..ebb4643 100644 --- a/tools/metrics/histograms/metadata/password/histograms.xml +++ b/tools/metrics/histograms/metadata/password/histograms.xml
@@ -3099,7 +3099,7 @@ </histogram> <histogram name="PasswordManager.PrefilledUsernameFillOutcome" - enum="PrefilledUsernameFillOutcome" expires_after="M86"> + enum="PrefilledUsernameFillOutcome" expires_after="M118"> <owner>khamutov@google.com</owner> <owner>kazinova@google.com</owner> <summary> @@ -3108,6 +3108,8 @@ identified as a placeholder. Recorded once per PasswordAutofillAgent instance, when attempting to fill a password form that contains a username value which was prepopulated by the website. + + Warning: this histogram was expired from M86 to M115; data may be missing. </summary> </histogram> @@ -3190,7 +3192,7 @@ </histogram> <histogram name="PasswordManager.RequirementsSpecFetcher.HttpResponseCode" - enum="HttpResponseCode" expires_after="2023-06-04"> + enum="HttpResponseCode" expires_after="2023-09-04"> <owner>kazinova@google.com</owner> <owner>battre@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/storage/histograms.xml b/tools/metrics/histograms/metadata/storage/histograms.xml index 9940720..0cebd259 100644 --- a/tools/metrics/histograms/metadata/storage/histograms.xml +++ b/tools/metrics/histograms/metadata/storage/histograms.xml
@@ -314,12 +314,6 @@ </summary> </histogram> -<histogram name="Sqlite.RecoveryStep" enum="SqliteErrorCode" - expires_after="M77"> - <owner>costan@google.com</owner> - <summary>Error from sqlite3_backup_step() in sql::Recovery.</summary> -</histogram> - <histogram name="Storage.BlacklistedImportantSites.Reason" enum="ClearDataSiteBlacklistCrossedReason" expires_after="2023-08-01"> <owner>ayui@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/uma/histograms.xml b/tools/metrics/histograms/metadata/uma/histograms.xml index 54b78f4c..be90eb4 100644 --- a/tools/metrics/histograms/metadata/uma/histograms.xml +++ b/tools/metrics/histograms/metadata/uma/histograms.xml
@@ -360,56 +360,6 @@ </summary> </histogram> -<histogram name="UMA.JavaCachingRecorder.DroppedHistogramSampleCount" - units="samples" expires_after="2023-09-03"> - <owner>bttk@chromium.org</owner> - <owner>src/base/metrics/OWNERS</owner> - <summary> - Number of histogram samples that were not recorded when flushing due to - cache size limits in the Java in-memory cache. There are separate limits on - the number of cached histograms, and the number of samples in a histogram. - </summary> -</histogram> - -<histogram name="UMA.JavaCachingRecorder.DroppedUserActionCount" - units="samples" expires_after="2023-04-30"> - <owner>bttk@chromium.org</owner> - <owner>src/base/metrics/OWNERS</owner> - <summary> - Number of user actions that were not recorded when flushing due to a cache - size limit in Java the in-memory cache. - </summary> -</histogram> - -<histogram name="UMA.JavaCachingRecorder.FlushedHistogramCount" - units="histograms" expires_after="2022-03-21"> - <owner>bttk@chromium.org</owner> - <owner>src/base/metrics/OWNERS</owner> - <summary> - Number of histograms recorded when flushing the Java in-memory cache. - </summary> -</histogram> - -<histogram name="UMA.JavaCachingRecorder.InputHistogramSampleCount" - units="samples" expires_after="2022-03-21"> - <owner>bttk@chromium.org</owner> - <owner>src/base/metrics/OWNERS</owner> - <summary> - Number of histogram samples seen by the time the Java in-memory cache was - flushed. This includes samples counted in DroppedHistogramSampleCount. - </summary> -</histogram> - -<histogram name="UMA.JavaCachingRecorder.InputUserActionCount" units="samples" - expires_after="2022-03-21"> - <owner>bttk@chromium.org</owner> - <owner>src/base/metrics/OWNERS</owner> - <summary> - Number of user actions seen by the time the in-memory cache was flushed. - This includes actions counted in DroppedUserActionCount. - </summary> -</histogram> - <histogram name="UMA.LocalHistogram" enum="Boolean" expires_after="never"> <!-- expires-never: Used to monitor that local histograms are not reported. -->
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml index 2685692..0db66e1e 100644 --- a/tools/metrics/ukm/ukm.xml +++ b/tools/metrics/ukm/ukm.xml
@@ -15347,6 +15347,44 @@ </metric> </event> +<event name="OpenerHeuristic.PopupInteraction"> + <owner>rtarpine@chromium.org</owner> + <owner>dc-komics@chromium.org</owner> + <summary> + Recorded when the user first interacts in a pop-up with opener access. + </summary> + <metric name="SecondsSinceCommitted"> + <summary> + The number of seconds since the initial pop-up navigation committed, until + the user interacted with the pop-up. Clamped to three minutes at most, and + rounded down to the nearest exponential bucket (out of 50 buckets). + </summary> + </metric> + <metric name="UrlIndex"> + <summary> + The number of URLs visited (including redirects) in the pop-up before the + user interacted with it. For example, the initial URL has index 1. If the + page redirected once before the user interacted, the index would be 2. + </summary> + </metric> +</event> + +<event name="OpenerHeuristic.PopupPastInteraction"> + <owner>rtarpine@chromium.org</owner> + <owner>dc-komics@chromium.org</owner> + <summary> + Recorded when a pop-up with opener access is initially opened, and the user + has previously interacted on the site of the URL passed to window.open(). + </summary> + <metric name="HoursSinceLastInteraction"> + <summary> + The number of hours since the user last interacted with the site, until + the pop-up was opened. Clamped to 720 hours at most, and rounded down to + the nearest exponential bucket (out of 50 buckets). + </summary> + </metric> +</event> + <event name="OptimizationGuide" singular="True"> <owner>sophiechang@chromium.org</owner> <summary>
diff --git a/ui/accessibility/platform/inspect/ax_tree_formatter_auralinux.cc b/ui/accessibility/platform/inspect/ax_tree_formatter_auralinux.cc index 6e5226a..0bc544d 100644 --- a/ui/accessibility/platform/inspect/ax_tree_formatter_auralinux.cc +++ b/ui/accessibility/platform/inspect/ax_tree_formatter_auralinux.cc
@@ -606,6 +606,7 @@ "id", "keyshortcuts", "level", + "link-target", "live", "placeholder", "posinset",
diff --git a/ui/aura/client/aura_constants.cc b/ui/aura/client/aura_constants.cc index f388e932..583c48a 100644 --- a/ui/aura/client/aura_constants.cc +++ b/ui/aura/client/aura_constants.cc
@@ -94,6 +94,7 @@ DEFINE_UI_CLASS_PROPERTY_KEY(int, kWindowWorkspaceKey, kWindowWorkspaceUnassignedWorkspace) +DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(std::string, kDeskUuidKey, nullptr) DEFINE_UI_CLASS_PROPERTY_KEY(ui::ZOrderLevel, kZOrderingKey, ui::ZOrderLevel::kNormal)
diff --git a/ui/aura/client/aura_constants.h b/ui/aura/client/aura_constants.h index c1711542..0f7cbf6b 100644 --- a/ui/aura/client/aura_constants.h +++ b/ui/aura/client/aura_constants.h
@@ -82,6 +82,9 @@ // A property key to store if a window was created by a user gesture. AURA_EXPORT extern const WindowProperty<bool>* const kCreatedByUserGesture; +// A property key to indicate the uuid of the desk this window belongs to. +AURA_EXPORT extern const WindowProperty<std::string*>* const kDeskUuidKey; + // A property key to indicate that a window should show that it deserves // attention. AURA_EXPORT extern const WindowProperty<bool>* const kDrawAttentionKey;
diff --git a/ui/chromeos/translations/ui_chromeos_strings_be.xtb b/ui/chromeos/translations/ui_chromeos_strings_be.xtb index ca2b7e3..b098e76 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_be.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_be.xtb
@@ -919,6 +919,7 @@ <translation id="8264024885325823677">Гэта налада знаходзіцца пад кіраваннем адміністратара.</translation> <translation id="8269755669432358899">Згарнуць панэлі водгукаў для файлаў</translation> <translation id="8280151743281770066">Армянская фанетычная</translation> +<translation id="8285791779547722821">Зашыфраваны <ph name="ORIGINAL_MIME_TYPE" /></translation> <translation id="8294431847097064396">Крыніца</translation> <translation id="8297012244086013755">Карэйскі алфавіт (хангыль), рэжым 3 Set (без клавішы Shift)</translation> <translation id="8299269255470343364">Японская</translation>
diff --git a/ui/color/color_id.h b/ui/color/color_id.h index 3a8fbcc..bec6ee84 100644 --- a/ui/color/color_id.h +++ b/ui/color/color_id.h
@@ -359,6 +359,13 @@ E_CPONLY(kColorScrollbarThumbInactive) \ E_CPONLY(kColorScrollbarThumbPressed) \ E_CPONLY(kColorScrollbarTrack) \ + E_CPONLY(kColorSegmentedButtonBorder) \ + E_CPONLY(kColorSegmentedButtonFocus) \ + E_CPONLY(kColorSegmentedButtonForegroundChecked) \ + E_CPONLY(kColorSegmentedButtonForegroundUnchecked) \ + E_CPONLY(kColorSegmentedButtonHover) \ + E_CPONLY(kColorSegmentedButtonRipple) \ + E_CPONLY(kColorSegmentedButtonChecked) \ E_CPONLY(kColorSeparator) \ E_CPONLY(kColorShadowBase) \ E_CPONLY(kColorShadowValueAmbientShadowElevationSixteen) \
diff --git a/ui/color/material_ui_color_mixer.cc b/ui/color/material_ui_color_mixer.cc index 0c903291..654f0f2 100644 --- a/ui/color/material_ui_color_mixer.cc +++ b/ui/color/material_ui_color_mixer.cc
@@ -69,6 +69,12 @@ mixer[kColorRadioButtonForegroundDisabled] = { kColorSysStateDisabledContainer}; mixer[kColorRadioButtonForegroundUnchecked] = {kColorSysOutline}; + mixer[kColorSegmentedButtonBorder] = {kColorSysTonalOutline}; + mixer[kColorSegmentedButtonForegroundChecked] = {kColorSysOnTonalContainer}; + mixer[kColorSegmentedButtonForegroundUnchecked] = {kColorSysOnSurfaceSubtle}; + mixer[kColorSegmentedButtonHover] = {kColorSysStateHoverOnSubtle}; + mixer[kColorSegmentedButtonRipple] = {kColorSysStateRippleNeutralOnSubtle}; + mixer[kColorSegmentedButtonChecked] = {kColorSysTonalContainer}; mixer[kColorSeparator] = {kColorSysDivider}; mixer[kColorSliderThumb] = {kColorSysPrimary}; mixer[kColorSliderThumbMinimal] = {kColorSysSecondary};
diff --git a/ui/lottie/resource.h b/ui/lottie/resource.h index 7b16c9e..2d546a9 100644 --- a/ui/lottie/resource.h +++ b/ui/lottie/resource.h
@@ -5,6 +5,8 @@ #ifndef UI_LOTTIE_RESOURCE_H_ #define UI_LOTTIE_RESOURCE_H_ +#include <stdint.h> + #include <vector> #include "base/component_export.h"
diff --git a/ui/ozone/platform/wayland/host/wayland_output.cc b/ui/ozone/platform/wayland/host/wayland_output.cc index 1a7be4d1..86e1302 100644 --- a/ui/ozone/platform/wayland/host/wayland_output.cc +++ b/ui/ozone/platform/wayland/host/wayland_output.cc
@@ -26,6 +26,8 @@ constexpr uint32_t kMaxVersion = 4; } // namespace +using Metrics = WaylandOutput::Metrics; + // static constexpr char WaylandOutput::kInterfaceName[]; @@ -56,29 +58,34 @@ connection->output_manager_->AddWaylandOutput(name, output.release()); } -WaylandOutput::Metrics::Metrics() = default; -WaylandOutput::Metrics::Metrics(Id output_id, - int64_t display_id, - gfx::Point origin, - gfx::Size logical_size, - gfx::Size physical_size, - gfx::Insets insets, - float scale_factor, - int32_t panel_transform, - int32_t logical_transform, - const std::string& description) +Metrics::Metrics() = default; +Metrics::Metrics(Id output_id, + int64_t display_id, + gfx::Point origin, + gfx::Size logical_size, + gfx::Size physical_size, + gfx::Insets insets, + gfx::Insets physical_overscan_insets, + float scale_factor, + int32_t panel_transform, + int32_t logical_transform, + const std::string& description) : output_id(output_id), display_id(display_id), origin(origin), logical_size(logical_size), physical_size(physical_size), insets(insets), + physical_overscan_insets(physical_overscan_insets), scale_factor(scale_factor), panel_transform(panel_transform), logical_transform(logical_transform), description(description) {} -WaylandOutput::Metrics::Metrics(const Metrics& copy) = default; -WaylandOutput::Metrics::~Metrics() = default; +Metrics::Metrics(const Metrics&) = default; +Metrics& Metrics::operator=(const Metrics&) = default; +Metrics::Metrics(Metrics&&) = default; +Metrics& Metrics::operator=(Metrics&&) = default; +Metrics::~Metrics() = default; WaylandOutput::WaylandOutput(Id output_id, wl_output* output, @@ -129,7 +136,7 @@ : scale_factor(); } -const WaylandOutput::Metrics& WaylandOutput::GetMetrics() const { +const Metrics& WaylandOutput::GetMetrics() const { return metrics_; }
diff --git a/ui/ozone/platform/wayland/host/wayland_output.h b/ui/ozone/platform/wayland/host/wayland_output.h index d34c25af..d3a09c9 100644 --- a/ui/ozone/platform/wayland/host/wayland_output.h +++ b/ui/ozone/platform/wayland/host/wayland_output.h
@@ -58,11 +58,15 @@ gfx::Size logical_size, gfx::Size physical_size, gfx::Insets insets, + gfx::Insets physical_overscan_insets, float scale_factor, int32_t panel_transform, int32_t logical_transform, const std::string& description); Metrics(const Metrics&); + Metrics& operator=(const Metrics&); + Metrics(Metrics&&); + Metrics& operator=(Metrics&&); ~Metrics(); Id output_id = 0; @@ -70,7 +74,10 @@ gfx::Point origin; gfx::Size logical_size; gfx::Size physical_size; + // Work area insets in DIP. gfx::Insets insets; + // Overscan insets in physical pixels. + gfx::Insets physical_overscan_insets; float scale_factor = 0.0; int32_t panel_transform = 0; int32_t logical_transform = 0;
diff --git a/ui/ozone/platform/wayland/host/wayland_screen.cc b/ui/ozone/platform/wayland/host/wayland_screen.cc index 3db66b1..973d81b 100644 --- a/ui/ozone/platform/wayland/host/wayland_screen.cc +++ b/ui/ozone/platform/wayland/host/wayland_screen.cc
@@ -185,6 +185,8 @@ panel_rotation == display::Display::Rotation::ROTATE_270) { size_in_pixels.Transpose(); } + size_in_pixels.Enlarge(-metrics.physical_overscan_insets.width(), + -metrics.physical_overscan_insets.height()); changed_display.set_size_in_pixels(size_in_pixels); if (!metrics.logical_size.IsEmpty()) {
diff --git a/ui/ozone/platform/wayland/host/wayland_screen_unittest.cc b/ui/ozone/platform/wayland/host/wayland_screen_unittest.cc index ef0f120..faaa0356 100644 --- a/ui/ozone/platform/wayland/host/wayland_screen_unittest.cc +++ b/ui/ozone/platform/wayland/host/wayland_screen_unittest.cc
@@ -144,6 +144,23 @@ EXPECT_EQ(display_for_widget.id(), expected_display_id); } + WaylandOutput::Metrics MakeMetrics(const display::Display& display) const { + return WaylandOutput::Metrics{ + WaylandOutput::Id(display.id()), + display.id(), + display.bounds().origin(), + display.size(), + display.GetSizeInPixel(), + display.GetWorkAreaInsets(), + /*physical_overscan_insets=*/gfx::Insets(), + display.device_scale_factor(), + // Display rotation and output transform go opposite directions. + (4 - display.panel_rotation()) % 4, + (4 - display.rotation()) % 4, + /*description=*/"", + }; + } + raw_ptr<wl::TestOutput> output_ = nullptr; raw_ptr<WaylandOutputManager> output_manager_ = nullptr; @@ -359,13 +376,14 @@ const wl_output_transform panel_transform = WL_OUTPUT_TRANSFORM_90; const wl_output_transform logical_transform = WL_OUTPUT_TRANSFORM_NORMAL; const gfx::Insets insets = gfx::Insets::TLBR(10, 20, 30, 40); + const gfx::Insets overscan_insets = gfx::Insets(); const float scale = 2; // Test with missing logical size. Should fall back to calculating from // physical size. platform_screen_->OnOutputAddedOrUpdated( - {output_id, display_id, origin, gfx::Size(), physical_size, insets, scale, - panel_transform, logical_transform, "display"}); + {output_id, display_id, origin, gfx::Size(), physical_size, insets, + overscan_insets, scale, panel_transform, logical_transform, "display"}); const display::Display new_display(observer.GetDisplay()); EXPECT_EQ(output_id, platform_screen_->GetOutputIdForDisplayId(display_id)); @@ -390,16 +408,8 @@ display::Display display1(1, gfx::Rect(0, 0, 800, 600)); display::Display display2(2, gfx::Rect(800, 0, 700, 500)); - platform_screen_->OnOutputAddedOrUpdated( - {static_cast<uint32_t>(display1.id()), display1.id(), - display1.bounds().origin(), display1.size(), display1.GetSizeInPixel(), - display1.GetWorkAreaInsets(), display1.device_scale_factor(), - WL_OUTPUT_TRANSFORM_NORMAL, WL_OUTPUT_TRANSFORM_NORMAL, std::string()}); - platform_screen_->OnOutputAddedOrUpdated( - {static_cast<uint32_t>(display2.id()), display2.id(), - display2.bounds().origin(), display2.size(), display2.GetSizeInPixel(), - display2.GetWorkAreaInsets(), display2.device_scale_factor(), - WL_OUTPUT_TRANSFORM_NORMAL, WL_OUTPUT_TRANSFORM_NORMAL, std::string()}); + platform_screen_->OnOutputAddedOrUpdated(MakeMetrics(display1)); + platform_screen_->OnOutputAddedOrUpdated(MakeMetrics(display2)); EXPECT_EQ(platform_screen_->GetPrimaryDisplay(), display1); @@ -409,22 +419,64 @@ display2.set_bounds(gfx::Rect(0, 0, 700, 500)); // Purposely send the output metrics out of order. - platform_screen_->OnOutputAddedOrUpdated( - {static_cast<uint32_t>(display2.id()), display2.id(), - display2.bounds().origin(), display2.size(), display2.GetSizeInPixel(), - display2.GetWorkAreaInsets(), display2.device_scale_factor(), - WL_OUTPUT_TRANSFORM_NORMAL, WL_OUTPUT_TRANSFORM_NORMAL, std::string()}); - platform_screen_->OnOutputAddedOrUpdated( - {static_cast<uint32_t>(display1.id()), display1.id(), - display1.bounds().origin(), display1.size(), display1.GetSizeInPixel(), - display1.GetWorkAreaInsets(), display1.device_scale_factor(), - WL_OUTPUT_TRANSFORM_NORMAL, WL_OUTPUT_TRANSFORM_NORMAL, std::string()}); + platform_screen_->OnOutputAddedOrUpdated(MakeMetrics(display2)); + platform_screen_->OnOutputAddedOrUpdated(MakeMetrics(display1)); EXPECT_EQ(platform_screen_->GetPrimaryDisplay(), display2); platform_screen_->RemoveObserver(&observer); } +TEST_P(WaylandScreenTest, OutputPropertyChangesOverscanInsets) { + TestDisplayObserver observer; + platform_screen_->AddObserver(&observer); + + { + display::Display display(123, gfx::Rect(0, 0, 800, 600)); + auto metrics = MakeMetrics(display); + metrics.physical_overscan_insets = gfx::Insets::TLBR(10, 20, 30, 40); + + platform_screen_->OnOutputAddedOrUpdated(metrics); + + display::Display expected_display = display; + expected_display.set_size_in_pixels(gfx::Size(740, 560)); + EXPECT_EQ(platform_screen_->GetPrimaryDisplay(), expected_display); + } + + { + // Display with scaling + display::Display display(123, gfx::Rect(0, 0, 800, 600)); + display.set_device_scale_factor(2.0); + auto metrics = MakeMetrics(display); + metrics.physical_overscan_insets = gfx::Insets::TLBR(10, 20, 30, 40); + + platform_screen_->OnOutputAddedOrUpdated(metrics); + + display::Display expected_display = display; + // Overscan inset is in pixels, so should not scale with scale factor. + expected_display.set_size_in_pixels(gfx::Size(740, 560)); + EXPECT_EQ(platform_screen_->GetPrimaryDisplay(), expected_display); + } + + { + // Display with rotations. + display::Display display(123, gfx::Rect(0, 0, 800, 600)); + display.set_panel_rotation(display::Display::Rotation::ROTATE_90); + display.set_rotation(display::Display::Rotation::ROTATE_180); + auto metrics = MakeMetrics(display); + metrics.physical_overscan_insets = gfx::Insets::TLBR(10, 20, 30, 40); + + platform_screen_->OnOutputAddedOrUpdated(metrics); + + display::Display expected_display = display; + // Overscan inset is applied after accounting for panel rotation. + expected_display.set_size_in_pixels(gfx::Size(540, 760)); + EXPECT_EQ(platform_screen_->GetPrimaryDisplay(), expected_display); + } + + platform_screen_->RemoveObserver(&observer); +} + TEST_P(WaylandScreenTest, GetAcceleratedWidgetAtScreenPoint) { const uint32_t surface_id = window_->root_surface()->get_surface_id(); PostToServerAndWait([surface_id](wl::TestWaylandServerThread* server) {
diff --git a/ui/ozone/platform/wayland/host/wayland_zaura_output_manager.cc b/ui/ozone/platform/wayland/host/wayland_zaura_output_manager.cc index 459d94c..1957e6ce 100644 --- a/ui/ozone/platform/wayland/host/wayland_zaura_output_manager.cc +++ b/ui/ozone/platform/wayland/host/wayland_zaura_output_manager.cc
@@ -196,8 +196,8 @@ wl_output* output, uint32_t scale_as_uint) { auto* self = static_cast<WaylandZAuraOutputManager*>(data); - float scale = base::bit_cast<float>(scale_as_uint); - self->pending_output_metrics_map_[self->GetId(output)].scale_factor = scale; + self->pending_output_metrics_map_[self->GetId(output)].scale_factor = + base::bit_cast<float>(scale_as_uint); } // static @@ -264,7 +264,9 @@ int32_t left, int32_t bottom, int32_t right) { - // TODO(crbug.com/1432295): Handle overscan. + auto* self = static_cast<WaylandZAuraOutputManager*>(data); + self->pending_output_metrics_map_[self->GetId(output)] + .physical_overscan_insets = gfx::Insets::TLBR(top, left, bottom, right); } } // namespace ui
diff --git a/ui/ozone/platform/wayland/test/test_wayland_server_thread.h b/ui/ozone/platform/wayland/test/test_wayland_server_thread.h index a274a03..71799f1e 100644 --- a/ui/ozone/platform/wayland/test/test_wayland_server_thread.h +++ b/ui/ozone/platform/wayland/test/test_wayland_server_thread.h
@@ -241,7 +241,7 @@ MockXdgShell xdg_shell_; TestZAuraOutputManager zaura_output_manager_; TestZAuraShell zaura_shell_; - MockZcrColorManagerV1 zcr_color_manager_v1_; + ::testing::NiceMock<MockZcrColorManagerV1> zcr_color_manager_v1_; TestZcrStylus zcr_stylus_; TestZcrTextInputExtensionV1 zcr_text_input_extension_v1_; TestZwpTextInputManagerV1 zwp_text_input_manager_v1_;
diff --git a/ui/views/cocoa/bridged_native_widget_unittest.mm b/ui/views/cocoa/bridged_native_widget_unittest.mm index 55a63ce..a817054 100644 --- a/ui/views/cocoa/bridged_native_widget_unittest.mm +++ b/ui/views/cocoa/bridged_native_widget_unittest.mm
@@ -296,6 +296,76 @@ } @end +// An NSTextStorage subclass for our DummyTextView, to work around test +// failures with macOS 13. See crbug.com/1446817 . +@interface DummyTextStorage : NSTextStorage { + base::scoped_nsobject<NSMutableAttributedString> _backingStore; +} +@end + +@implementation DummyTextStorage + +- (id)init { + self = [super init]; + if (self) { + _backingStore.reset([[NSMutableAttributedString alloc] init]); + } + return self; +} + +- (NSString*)string { + return [_backingStore string]; +} + +- (NSDictionary*)attributesAtIndex:(NSUInteger)location + effectiveRange:(NSRangePointer)range { + return [_backingStore attributesAtIndex:location effectiveRange:range]; +} + +- (void)replaceCharactersInRange:(NSRange)range withString:(NSString*)str { + [self beginEditing]; + [_backingStore replaceCharactersInRange:range withString:str]; + [self edited:NSTextStorageEditedCharacters + range:range + changeInLength:str.length - range.length]; + [self endEditing]; +} + +- (void)setAttributes:(NSDictionary<NSAttributedStringKey, id>*)attrs + range:(NSRange)range { + [self beginEditing]; + [_backingStore setAttributes:attrs range:range]; + [self edited:NSTextStorageEditedAttributes range:range changeInLength:0]; + [self endEditing]; +} + +@end + +// An NSTextView subclass that uses its own NSTextStorage subclass, to work +// around test failures with macOS 13. See crbug.com/1446817 . +@interface DummyTextView : NSTextView { +} +@end + +@implementation DummyTextView + +- (instancetype)initWithFrame:(NSRect)frameRect + textContainer:(NSTextContainer*)container { + DummyTextStorage* textStorage = [[DummyTextStorage alloc] init]; + NSTextContainer* textContainer = [[NSTextContainer alloc] + initWithSize:NSMakeSize(CGFLOAT_MAX, CGFLOAT_MAX)]; + NSLayoutManager* layoutManager = [[NSLayoutManager alloc] init]; + + [layoutManager addTextContainer:textContainer]; + [textStorage addLayoutManager:layoutManager]; + + self = [super initWithFrame:frameRect textContainer:textContainer]; + + return self; +} + +@end + @implementation NativeWidgetMacNSWindowForTesting // Preserves the value of the hasShadow flag. During testing, -hasShadow will @@ -590,7 +660,7 @@ // Initialize the dummy text view. Initializing this with NSZeroRect causes // weird NSTextView behavior on OSX 10.9. dummy_text_view_.reset( - [[NSTextView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)]); + [[DummyTextView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)]); [dummy_text_view_ setString:SysUTF16ToNSString(text)]; return textfield; }
diff --git a/ui/views/widget/native_widget_aura.cc b/ui/views/widget/native_widget_aura.cc index 648f6f8..b596c4a0d 100644 --- a/ui/views/widget/native_widget_aura.cc +++ b/ui/views/widget/native_widget_aura.cc
@@ -14,6 +14,7 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/task/single_thread_task_runner.h" +#include "base/uuid.h" #include "build/build_config.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/client/capture_client.h" @@ -206,7 +207,14 @@ if (params.visible_on_all_workspaces) { window_->SetProperty(aura::client::kWindowWorkspaceKey, aura::client::kWindowWorkspaceVisibleOnAllWorkspaces); + } else if (const base::Uuid& desk_uuid = + base::Uuid::ParseLowercase(params.workspace); + desk_uuid.is_valid()) { + window_->SetProperty(aura::client::kDeskUuidKey, + desk_uuid.AsLowercaseString()); } else if (base::StringToInt(params.workspace, &desk_index)) { + // `params.workspace` used to be the desk index, it now stores the desk + // Uuid. We still check to see if it is the index for compatibility. window_->SetProperty(aura::client::kWindowWorkspaceKey, desk_index); }
diff --git a/ui/views/widget/native_widget_aura_unittest.cc b/ui/views/widget/native_widget_aura_unittest.cc index 79ee7bd5..72587a88 100644 --- a/ui/views/widget/native_widget_aura_unittest.cc +++ b/ui/views/widget/native_widget_aura_unittest.cc
@@ -11,6 +11,8 @@ #include "base/command_line.h" #include "base/memory/raw_ptr.h" #include "base/run_loop.h" +#include "base/uuid.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/env.h" @@ -875,6 +877,45 @@ EXPECT_EQ(restore_bounds, window->bounds()); } +// Tests that the `kDeskUuidKey` is set if the `workspace` parameter is +// a uuid, and that the `kWindowWorkspaceKey` is set if it's a string +// representation of an integer. +TEST_F(NativeWidgetAuraTest, WorkspaceUuid) { + // If the `workspace` param is a uuid, `kDeskUuidKey` should be set. + Widget::InitParams params(Widget::InitParams::TYPE_WINDOW); + params.parent = nullptr; + params.context = root_window(); + params.show_state = ui::SHOW_STATE_MINIMIZED; + params.bounds.SetRect(0, 0, 1024, 800); + const std::string uuid = "e1b6731b-2a99-48be-bcb7-54e3ba274d05"; + params.workspace = base::Uuid::ParseLowercase(uuid).AsLowercaseString(); + UniqueWidgetPtr widget = std::make_unique<Widget>(); + widget->Init(std::move(params)); + widget->Show(); + + EXPECT_EQ(-1, widget->GetNativeWindow()->GetProperty( + aura::client::kWindowWorkspaceKey)); + EXPECT_THAT( + widget->GetNativeWindow()->GetProperty(aura::client::kDeskUuidKey), + testing::Pointee(uuid)); + + // If the `workspace` param is an int, `kWindowWorkspaceKey` should be set. + Widget::InitParams params2(Widget::InitParams::TYPE_WINDOW); + params2.parent = nullptr; + params2.context = root_window(); + params2.show_state = ui::SHOW_STATE_MINIMIZED; + params2.bounds.SetRect(0, 0, 1024, 800); + params2.workspace = "2"; + UniqueWidgetPtr widget2 = std::make_unique<Widget>(); + widget2->Init(std::move(params2)); + widget2->Show(); + + EXPECT_EQ(2, widget2->GetNativeWindow()->GetProperty( + aura::client::kWindowWorkspaceKey)); + EXPECT_FALSE( + widget2->GetNativeWindow()->GetProperty(aura::client::kDeskUuidKey)); +} + // NativeWidgetAura has a protected destructor. // Use a test object that overrides the destructor for unit tests. class TestNativeWidgetAura : public NativeWidgetAura {
diff --git a/ui/webui/resources/cr_elements/BUILD.gn b/ui/webui/resources/cr_elements/BUILD.gn index 3718f080..bee4d3c 100644 --- a/ui/webui/resources/cr_elements/BUILD.gn +++ b/ui/webui/resources/cr_elements/BUILD.gn
@@ -42,6 +42,8 @@ "cr_radio_button/cr_radio_button.ts", "cr_radio_group/cr_radio_group.ts", "cr_search_field/cr_search_field.ts", + "cr_segmented_button/cr_segmented_button.ts", + "cr_segmented_button/cr_segmented_button_option.ts", "cr_slider/cr_slider.ts", "cr_tabs/cr_tabs.ts", "cr_toast/cr_toast_manager.ts",
diff --git a/ui/webui/resources/cr_elements/cr_segmented_button/cr_segmented_button.html b/ui/webui/resources/cr_elements/cr_segmented_button/cr_segmented_button.html new file mode 100644 index 0000000..fa52a7a --- /dev/null +++ b/ui/webui/resources/cr_elements/cr_segmented_button/cr_segmented_button.html
@@ -0,0 +1,29 @@ +<style> + :host { + --cr-segmented-button-height: 44px; + --cr-segmented-button-width: 100%; + --cr-segmented-button-padding: 2px; + } + + cr-radio-group { + border: 1px var(--color-segmented-button-border) solid; + border-radius: var(--cr-segmented-button-height); + box-sizing: border-box; + display: grid; + grid-auto-columns: 1fr; + grid-auto-flow: column; + height: var(--cr-segmented-button-height); + padding: var(--cr-segmented-button-padding); + width: var(--cr-segmented-button-width); + } + + :host ::slotted(*) { + min-height: 0; + padding: 0; + } +</style> +<cr-radio-group + selected="{{selected}}" + selectable-elements="cr-segmented-button-option"> + <slot></slot> +</cr-radio-group>
diff --git a/ui/webui/resources/cr_elements/cr_segmented_button/cr_segmented_button.ts b/ui/webui/resources/cr_elements/cr_segmented_button/cr_segmented_button.ts new file mode 100644 index 0000000..6e90aff --- /dev/null +++ b/ui/webui/resources/cr_elements/cr_segmented_button/cr_segmented_button.ts
@@ -0,0 +1,44 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import '../cr_radio_group/cr_radio_group.js'; + +import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {getTemplate} from './cr_segmented_button.html.js'; + +export class CrSegmentedButtonElement extends PolymerElement { + static get is() { + return 'cr-segmented-button'; + } + + static get template() { + return getTemplate(); + } + + static get properties() { + return { + selected: { + type: String, + notify: true, + }, + + selectableElements: { + type: String, + value: 'cr-segmented-button-option', + }, + }; + } + + public selected: string; + public selectableElements: string; +} + +declare global { + interface HTMLElementTagNameMap { + 'cr-segmented-button': CrSegmentedButtonElement; + } +} + +customElements.define(CrSegmentedButtonElement.is, CrSegmentedButtonElement);
diff --git a/ui/webui/resources/cr_elements/cr_segmented_button/cr_segmented_button_option.html b/ui/webui/resources/cr_elements/cr_segmented_button/cr_segmented_button_option.html new file mode 100644 index 0000000..1a370e27 --- /dev/null +++ b/ui/webui/resources/cr_elements/cr_segmented_button/cr_segmented_button_option.html
@@ -0,0 +1,105 @@ +<!-- + This element is only intended for use in CR2023 UI since it does not have a + version for non-CR2023 UI. +--> +<style> + #button { + border-radius: var(--cr-segmented-button-height); + box-sizing: border-box; + color: var(--color-segmented-button-foreground-unchecked, + var(--cr-fallback-color-on-surface-subtle)); + cursor: pointer; + height: 100%; + overflow: hidden; + padding: 4px 8px; + position: relative; + } + + #button:focus { + outline: none; + } + + :host([checked]) #button { + background-color: var(--color-segmented-button-checked, + var(--cr-fallback-color-tonal-container)); + color: var(--color-segmented-button-foreground-checked, + var(--cr-fallback-color-on-tonal-container)); + } + + #button #overlay { + border-radius: var(--cr-segmented-button-height); + box-sizing: border-box; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; + } + + #button:hover #overlay { + background-color: var(--color-segmented-button-hover, + var(--cr-fallback-color-state-hover-on-subtle)); + } + + #button:focus-visible #overlay { + border: 2px var(--cr-focus-outline-color) solid; + } + + paper-ripple { + color: var(--color-segmented-button-ripple, + var(--cr-fallback-color-state-ripple-neutral-on-subtle)); + } + + #container { + align-items: center; + display: flex; + flex-direction: row; + height: 100%; + justify-content: center; + } + + #button ::slotted(.cr-icon) { + --cr-icon-color: var(--color-segmented-button-foreground-unchecked, + var(--cr-fallback-color-on-surface-subtle)); + --cr-icon-button-margin-start: 0; + --cr-icon-ripple-margin: 8px; + --cr-icon-ripple-size: 16px; + --cr-icon-size: 16px; + } + + :host([checked]) #prefixIcon, + #checkmark { + display: none; + flex-shrink: 0; + } + + :host([checked]) #checkmark { + display: block; + fill: var(--color-segmented-button-foreground-checked, + var(--cr-fallback-color-on-tonal-container)); + height: 16px; + margin-inline-end: 8px; + width: 16px; + } + + #content { + font-size: 12px; + font-weight: 500; + line-height: 16px; + max-height: 100%; + } +</style> +<div role="radio" + aria-checked$="[[getAriaChecked_(checked)]]" + aria-disabled$="[[getAriaDisabled_(disabled)]]" + id="button" + tabindex$="[[buttonTabIndex_]]" + aria-labelledby="content" + on-keydown="onInputKeydown_"> + <div id="container"> + <iron-icon icon="cr:check" id="checkmark"></iron-icon> + <slot id="prefixIcon" name="prefix-icon"></slot> + <span id="content"><slot></slot></span> + </div> + <div id="overlay"></div> +</div>
diff --git a/ui/webui/resources/cr_elements/cr_segmented_button/cr_segmented_button_option.ts b/ui/webui/resources/cr_elements/cr_segmented_button/cr_segmented_button_option.ts new file mode 100644 index 0000000..99624ca --- /dev/null +++ b/ui/webui/resources/cr_elements/cr_segmented_button/cr_segmented_button_option.ts
@@ -0,0 +1,52 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import '../cr_shared_vars.css.js'; +import '//resources/polymer/v3_0/iron-icon/iron-icon.js'; + +import {PaperRippleBehavior} from '//resources/polymer/v3_0/paper-behaviors/paper-ripple-behavior.js'; +import {mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {CrRadioButtonMixin, CrRadioButtonMixinInterface} from '../cr_radio_button/cr_radio_button_mixin.js'; + +import {getTemplate} from './cr_segmented_button_option.html.js'; + +const CrSegmentedButtonElementBase = + mixinBehaviors([PaperRippleBehavior], CrRadioButtonMixin(PolymerElement)) as + { + new (): PolymerElement & CrRadioButtonMixinInterface & + PaperRippleBehavior, + }; + +export class CrSegmentedButtonOptionElement extends + CrSegmentedButtonElementBase { + static get is() { + return 'cr-segmented-button-option'; + } + + static get template() { + return getTemplate(); + } + + // Overridden from CrRadioButtonMixin + override getPaperRipple() { + return this.getRipple(); + } + + // Overridden from PaperRippleBehavior + /* eslint-disable-next-line @typescript-eslint/naming-convention */ + override _createRipple() { + this._rippleContainer = this.shadowRoot!.querySelector('#button'); + return super._createRipple(); + } +} + +declare global { + interface HTMLElementTagNameMap { + 'cr-segmented-button-option': CrSegmentedButtonOptionElement; + } +} + +customElements.define( + CrSegmentedButtonOptionElement.is, CrSegmentedButtonOptionElement);
diff --git a/ui/webui/resources/cr_elements/cr_shared_vars.css b/ui/webui/resources/cr_elements/cr_shared_vars.css index 7482b826..70ce36bc 100644 --- a/ui/webui/resources/cr_elements/cr_shared_vars.css +++ b/ui/webui/resources/cr_elements/cr_shared_vars.css
@@ -268,8 +268,19 @@ --cr-fallback-color-surface-variant: rgb(225, 227, 225); --cr-fallback-color-on-surface-variant: rgb(68, 71, 70); + --cr-fallback-color-on-surface-subtle: rgb(71, 71, 71); + + --cr-fallback-color-tonal-container: rgb(211, 227, 253); + --cr-fallback-color-on-tonal-container: rgb(4, 30, 73); + --cr-fallback-color-tonal-outline: rgb(168, 199, 250); + --cr-fallback-color-state-on-subtle-rgb: 31, 31, 31; + --cr-fallback-color-state-hover-on-subtle: rgba( + var(--cr-fallback-color-state-on-subtle-rgb), .06); + --cr-fallback-color-state-ripple-neutral-on-subtle: rgba( + var(--cr-fallback-color-state-on-subtle-rgb), .08); + /* States */ --cr-hover-background-color: var(--color-sys-state-hover, rgba(var(--cr-fallback-color-on-surface-rgb), .08)); @@ -306,6 +317,14 @@ --cr-fallback-color-on-surface-rgb: 227, 227, 227; --cr-fallback-color-surface-variant: rgb(68, 71, 70); --cr-fallback-color-on-surface-variant: rgb(196, 199, 197); + --cr-fallback-color-on-surface-subtle: rgb(199, 199, 199); + --cr-fallback-color-tonal-container: rgb(0, 74, 119); + --cr-fallback-color-on-tonal-container: rgb(194, 231, 255); --cr-fallback-color-tonal-outline: rgb(0, 99, 155); + --cr-fallback-color-state-on-subtle-rgb: 253, 252, 251; + --cr-fallback-color-state-hover-on-subtle: rgba( + var(--cr-fallback-color-state-on-subtle-rgb), .10); + --cr-fallback-color-state-ripple-neutral-on-subtle: rgba( + var(--cr-fallback-color-state-on-subtle-rgb), .16); } }
diff --git a/weblayer/BUILD.gn b/weblayer/BUILD.gn index ddba681..5fabf301 100644 --- a/weblayer/BUILD.gn +++ b/weblayer/BUILD.gn
@@ -24,6 +24,7 @@ if (is_android) { import("//build/config/android/config.gni") import("//build/config/android/rules.gni") + import("//build/config/features.gni") import("//components/safe_browsing/buildflags.gni") } else if (is_mac) { import("//build/apple/tweak_info_plist.gni") @@ -57,6 +58,7 @@ "enable_print_preview=$enable_print_preview", "enable_screen_ai_service=$enable_screen_ai_service", "enable_vr=$enable_vr", + "use_blink=$use_blink", ] # components_strings contains strings from all components. WebLayer