diff --git a/DEPS b/DEPS index bf660fe6..4cbd8cb 100644 --- a/DEPS +++ b/DEPS
@@ -294,11 +294,11 @@ # 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': 'f237624765788ebfe3a359d02a051fbaced7682f', + 'skia_revision': '224b97c1401fed1bfd0c157c677da4eedc14f239', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': '5ed365c62baf2a1673d682d1feaf3b25ab4b612d', + 'v8_revision': '1af2eb8ac8af6e547cbfde966ddcc52e80e6d163', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. @@ -373,7 +373,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling devtools-frontend # and whatever else without interference from each other. - 'devtools_frontend_revision': '5445f5cf5f525e2d3ef53a656ef4e127bf51a94a', + 'devtools_frontend_revision': '9726b7159c2fda53b5c310a01472a1ccf9d2a82d', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libprotobuf-mutator # and whatever else without interference from each other. @@ -409,7 +409,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': 'e52cc0419ec12921e4897b102235dddea3bad25b', + 'dawn_revision': 'e0ecd86e73ff9e6def9e1460cb0291f175044046', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -859,7 +859,7 @@ 'packages': [ { 'package': 'chromium/rts/model/linux-amd64', - 'version': 'v26lblo8DLzgn9p0Ew4JSx7FV7oPo9ngXPmFr8CE9cQC', + 'version': 'JUOFo6yUnJfpPR9GTzjQopqKvp_sIOy5BYqN5HR0N_0C', }, ], 'dep_type': 'cipd', @@ -870,7 +870,7 @@ 'packages': [ { 'package': 'chromium/rts/model/mac-amd64', - 'version': 'IuzFXXBtgnmd-AAR6zw5DTZRzH6BOaROPGURtjSi6xUC', + 'version': 'dWN3MIzZd0Ca_6VatXgoyaY3l2Izx4CT_Xk_F0cXlEEC', }, ], 'dep_type': 'cipd', @@ -881,7 +881,7 @@ 'packages': [ { 'package': 'chromium/rts/model/windows-amd64', - 'version': '7cmfSplQnwmja5BGZYeiH69C4fbOkE2ghOoPNOfVwBoC', + 'version': '4os7iufedI8vGvJQDAt6iHLUJmOuJ-EaXxFe1jWRohkC', }, ], 'dep_type': 'cipd', @@ -1581,7 +1581,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'b781e1fdec3e3eb8b7d9f153fbf0c6c6177f57e6', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '16075d13d01a9078bb4ca7de52c489b01dae4677', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1668,7 +1668,7 @@ Var('chromium_git') + '/external/github.com/google/snappy.git' + '@' + '65dc7b383985eb4f63cd3e752136db8d9b4be8c0', 'src/third_party/sqlite/src': - Var('chromium_git') + '/chromium/deps/sqlite.git' + '@' + '98bd61ec66ad759f14743f001fb0a55e82417983', + Var('chromium_git') + '/chromium/deps/sqlite.git' + '@' + '88f6139eadb183a025efeba5fc483bb6f6416eb2', 'src/third_party/sqlite4java': { 'packages': [ @@ -1712,7 +1712,7 @@ 'dep_type': 'cipd', }, - 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@f8ca6e516bbaa728b076f9176a52a968dbf67bef', + 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@7be8321fe0029b7158bb6613af883bd7f19e51fd', 'src/third_party/vulkan_memory_allocator': Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'ebe84bec02c041d28f902da0214bf442743fc907', @@ -1748,7 +1748,7 @@ Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '44e4c8770158c505b03ee7feafa4859d083b0912', 'src/third_party/webgpu-cts/src': - Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '9d30433b74d4b77d5431427f0dc8301150c2ced7', + Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'bbd7445ddefbc94823b6f9129e493fd41f057d07', 'src/third_party/webrtc': Var('webrtc_git') + '/src.git' + '@' + '98c78cdd20215e5fb9b429e4a136f477c7a4b445', @@ -1824,7 +1824,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@ec471bae174378134426f2979f5146f1c1dc8fdd', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@93539e762dc653af59dbbd13e2e48cfbb45e11f9', 'condition': 'checkout_src_internal', },
diff --git a/android_webview/browser/aw_browser_context_unittest.cc b/android_webview/browser/aw_browser_context_unittest.cc index a146091..f753ccf 100644 --- a/android_webview/browser/aw_browser_context_unittest.cc +++ b/android_webview/browser/aw_browser_context_unittest.cc
@@ -84,8 +84,13 @@ network_context_params.initial_ssl_config->sha1_local_anchors_enabled); } -// Tests that TLS 1.0/1.1 is still allowed for WebView by default. +// Tests that TLS 1.0/1.1 is still allowed for WebView if the escape hatch +// feature is enabled. TEST_F(AwBrowserContextTest, LegacyTLSVersionsAllowed) { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeature( + android_webview::features::kWebViewLegacyTlsSupport); + AwBrowserContext context; network::mojom::NetworkContextParams network_context_params; cert_verifier::mojom::CertVerifierCreationParams cert_verifier_params;
diff --git a/android_webview/browser/aw_content_browser_client.cc b/android_webview/browser/aw_content_browser_client.cc index 931a8f2..f0c140ea 100644 --- a/android_webview/browser/aw_content_browser_client.cc +++ b/android_webview/browser/aw_content_browser_client.cc
@@ -688,6 +688,7 @@ ->IsEnterpriseAuthenticationUrl(gurl)) { bool success = client_bridge->SendBrowseIntent(url); if (success) { + *ignore_navigation = true; return true; } }
diff --git a/android_webview/common/aw_features.cc b/android_webview/common/aw_features.cc index 2c2b21c..5957e3f 100644 --- a/android_webview/common/aw_features.cc +++ b/android_webview/common/aw_features.cc
@@ -57,7 +57,7 @@ // When enabled, connections using legacy TLS 1.0/1.1 versions are allowed. const base::Feature kWebViewLegacyTlsSupport{"WebViewLegacyTlsSupport", - base::FEATURE_ENABLED_BY_DEFAULT}; + base::FEATURE_DISABLED_BY_DEFAULT}; // Measure the number of pixels occupied by one or more WebViews as a // proportion of the total screen size. Depending on the number of
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index 217c6b0f..4671d8e 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -2240,10 +2240,10 @@ "//chromeos/ash/components/dbus/services", "//chromeos/ash/components/dbus/system_clock", "//chromeos/ash/components/dbus/usb", + "//chromeos/ash/components/feature_usage", "//chromeos/ash/components/human_presence", "//chromeos/ash/services/assistant/public/cpp", "//chromeos/ash/services/assistant/public/mojom", - "//chromeos/components/feature_usage", "//chromeos/components/quick_answers/public/cpp:prefs", "//chromeos/components/sensors:buildflags", "//chromeos/components/sensors:sensors", @@ -3040,12 +3040,12 @@ "//chromeos/ash/components/dbus/rgbkbd", "//chromeos/ash/components/dbus/services:test_support", "//chromeos/ash/components/dbus/userdataauth", + "//chromeos/ash/components/feature_usage", "//chromeos/ash/components/human_presence:human_presence", "//chromeos/ash/components/network:test_support", "//chromeos/ash/services/assistant:test_support", "//chromeos/ash/services/assistant/public/cpp", "//chromeos/ash/services/assistant/public/mojom", - "//chromeos/components/feature_usage", "//chromeos/components/sensors:sensors", "//chromeos/components/sensors:test_support", "//chromeos/components/sensors/mojom",
diff --git a/ash/DEPS b/ash/DEPS index 80a5424..83bf1908 100644 --- a/ash/DEPS +++ b/ash/DEPS
@@ -59,9 +59,9 @@ # code out of //chromeos into //ash. "-chromeos", # //ash can use chromeos components that sit below it in the dependency tree. + "+chromeos/ash/components/feature_usage", "+chromeos/ash/components/human_presence", "+chromeos/ash/components/local_search_service", - "+chromeos/components/feature_usage", "+chromeos/components/quick_answers", "+chromeos/components/security_token_pin", "+chromeos/components/sensors",
diff --git a/ash/app_list/BUILD.gn b/ash/app_list/BUILD.gn index 9814ef0..58ac60f 100644 --- a/ash/app_list/BUILD.gn +++ b/ash/app_list/BUILD.gn
@@ -188,8 +188,8 @@ "//base/third_party/dynamic_annotations", "//cc/paint", "//chromeos", + "//chromeos/ash/components/feature_usage", "//chromeos/ash/services/assistant/public/cpp", - "//chromeos/components/feature_usage", "//chromeos/ui/vector_icons", "//components/keyed_service/core", "//components/pref_registry", @@ -330,8 +330,8 @@ "//ash/search_box", "//base", "//base/test:test_support", + "//chromeos/ash/components/feature_usage", "//chromeos/ash/services/assistant/public/cpp", - "//chromeos/components/feature_usage", "//mojo/core/embedder", "//mojo/public/cpp/bindings", "//skia",
diff --git a/ash/app_list/app_list_feature_usage_metrics.cc b/ash/app_list/app_list_feature_usage_metrics.cc index f941932..901110aa 100644 --- a/ash/app_list/app_list_feature_usage_metrics.cc +++ b/ash/app_list/app_list_feature_usage_metrics.cc
@@ -11,7 +11,7 @@ #include "ash/session/session_controller_impl.h" #include "ash/shell.h" #include "ash/wm/tablet_mode/tablet_mode_controller.h" -#include "chromeos/components/feature_usage/feature_usage_metrics.h" +#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h" namespace ash { namespace {
diff --git a/ash/app_list/app_list_feature_usage_metrics.h b/ash/app_list/app_list_feature_usage_metrics.h index 76e63a9..1453a1dd 100644 --- a/ash/app_list/app_list_feature_usage_metrics.h +++ b/ash/app_list/app_list_feature_usage_metrics.h
@@ -9,7 +9,7 @@ #include "ash/public/cpp/app_list/app_list_controller_observer.h" #include "ash/public/cpp/tablet_mode_observer.h" -#include "chromeos/components/feature_usage/feature_usage_metrics.h" +#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h" namespace ash {
diff --git a/ash/app_list/app_list_feature_usage_metrics_unittest.cc b/ash/app_list/app_list_feature_usage_metrics_unittest.cc index 2e26f68..fecb5aa 100644 --- a/ash/app_list/app_list_feature_usage_metrics_unittest.cc +++ b/ash/app_list/app_list_feature_usage_metrics_unittest.cc
@@ -12,7 +12,7 @@ #include "base/command_line.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" -#include "chromeos/components/feature_usage/feature_usage_metrics.h" +#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h" #include "components/user_manager/user_type.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/ash/app_list/views/continue_task_view.cc b/ash/app_list/views/continue_task_view.cc index 34786df..c0fc04c 100644 --- a/ash/app_list/views/continue_task_view.cc +++ b/ash/app_list/views/continue_task_view.cc
@@ -200,7 +200,8 @@ if (!result()) { title_->SetText(std::u16string()); subtitle_->SetText(std::u16string()); - GetViewAccessibility().OverrideName(std::u16string()); + GetViewAccessibility().OverrideName( + std::u16string(), ax::mojom::NameFrom::kAttributeExplicitlyEmpty); return; }
diff --git a/ash/clipboard/clipboard_history_controller_impl.cc b/ash/clipboard/clipboard_history_controller_impl.cc index 6c71ac7..2015244 100644 --- a/ash/clipboard/clipboard_history_controller_impl.cc +++ b/ash/clipboard/clipboard_history_controller_impl.cc
@@ -1001,9 +1001,6 @@ void ClipboardHistoryControllerImpl::OnMenuClosed() { accelerator_target_->OnMenuClosed(); - if (on_menu_closed_callback_for_test_) - std::move(on_menu_closed_callback_for_test_).Run(); - // Reset `context_menu_` in the asynchronous way. Because the menu may be // accessed after `OnMenuClosed()` is called. menu_task_timer_.Start(
diff --git a/ash/clipboard/clipboard_history_controller_impl.h b/ash/clipboard/clipboard_history_controller_impl.h index 25e94b6..6865da5 100644 --- a/ash/clipboard/clipboard_history_controller_impl.h +++ b/ash/clipboard/clipboard_history_controller_impl.h
@@ -136,10 +136,6 @@ confirmed_operation_callback_for_test_ = new_callback; } - void set_on_menu_closed_callback_for_test(base::OnceClosure new_closure) { - on_menu_closed_callback_for_test_ = std::move(new_closure); - } - void set_new_bitmap_to_write_while_encoding_for_test(const SkBitmap& bitmap) { new_bitmap_to_write_while_encoding_for_test_ = bitmap; } @@ -262,9 +258,6 @@ // argument. base::RepeatingCallback<void(bool)> confirmed_operation_callback_for_test_; - // Called when the clipboard history menu is closed. - base::OnceClosure on_menu_closed_callback_for_test_; - // A new bitmap to be written to the clipboard while existing images are being // encoded during `GetHistoryValues()`, which will force `GetHistoryValues()` // to re-run in order to encode this new bitmap. This member is marked mutable
diff --git a/ash/components/cryptohome/BUILD.gn b/ash/components/cryptohome/BUILD.gn index e97a6683..b882108b 100644 --- a/ash/components/cryptohome/BUILD.gn +++ b/ash/components/cryptohome/BUILD.gn
@@ -10,7 +10,7 @@ component("cryptohome") { defines = [ "IS_ASH_COMPONENTS_CRYPTOHOME_IMPL" ] deps = [ - "//ash/components/login/auth:challenge_response_key", + "//ash/components/login/auth/public:challenge_response_key", "//base", "//chromeos/ash/components/dbus/userdataauth:userdataauth", "//chromeos/ash/components/dbus/userdataauth:userdataauth_proto", @@ -37,7 +37,7 @@ testonly = true deps = [ ":cryptohome", - "//ash/components/login/auth:challenge_response_key", + "//ash/components/login/auth/public:challenge_response_key", "//base", "//base/test:test_support", "//chromeos/ash/components/dbus/userdataauth:userdataauth",
diff --git a/ash/components/cryptohome/cryptohome_parameters.h b/ash/components/cryptohome/cryptohome_parameters.h index 26570d9..f41f9151 100644 --- a/ash/components/cryptohome/cryptohome_parameters.h +++ b/ash/components/cryptohome/cryptohome_parameters.h
@@ -11,7 +11,7 @@ #include <string> #include <vector> -#include "ash/components/login/auth/challenge_response_key.h" +#include "ash/components/login/auth/public/challenge_response_key.h" #include "base/component_export.h" #include "chromeos/dbus/cryptohome/rpc.pb.h"
diff --git a/ash/components/cryptohome/cryptohome_util_unittest.cc b/ash/components/cryptohome/cryptohome_util_unittest.cc index 44d42b9..2811f1f 100644 --- a/ash/components/cryptohome/cryptohome_util_unittest.cc +++ b/ash/components/cryptohome/cryptohome_util_unittest.cc
@@ -7,7 +7,7 @@ #include <string> #include "ash/components/cryptohome/cryptohome_parameters.h" -#include "ash/components/login/auth/challenge_response_key.h" +#include "ash/components/login/auth/public/challenge_response_key.h" #include "chromeos/dbus/cryptohome/key.pb.h" #include "chromeos/dbus/cryptohome/rpc.pb.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/ash/components/cryptohome/userdataauth_util.cc b/ash/components/cryptohome/userdataauth_util.cc index b5d9fea..57522fd 100644 --- a/ash/components/cryptohome/userdataauth_util.cc +++ b/ash/components/cryptohome/userdataauth_util.cc
@@ -87,6 +87,8 @@ const absl::optional<PrepareVaultForMigrationReply>&); template COMPONENT_EXPORT(ASH_COMPONENTS_CRYPTOHOME) CryptohomeErrorCode ReplyToCryptohomeError(const absl::optional<RemoveAuthFactorReply>&); +template COMPONENT_EXPORT(ASH_COMPONENTS_CRYPTOHOME) CryptohomeErrorCode + ReplyToCryptohomeError(const absl::optional<GetAuthSessionStatusReply>&); std::vector<cryptohome::KeyDefinition> GetKeyDataReplyToKeyDefinitions( const absl::optional<GetKeyDataReply>& reply) {
diff --git a/ash/components/login/auth/BUILD.gn b/ash/components/login/auth/BUILD.gn index 1b9a9b7..bc6c772 100644 --- a/ash/components/login/auth/BUILD.gn +++ b/ash/components/login/auth/BUILD.gn
@@ -10,7 +10,10 @@ component("auth") { defines = [ "IS_ASH_LOGIN_AUTH_IMPL" ] - public_deps = [ ":challenge_response_key" ] + public_deps = [ + "//ash/components/login/auth/public:authpublic", + "//ash/components/login/auth/public:challenge_response_key", + ] deps = [ "//ash/components/cryptohome", "//ash/constants", @@ -42,11 +45,8 @@ sources = [ "auth_attempt_state.cc", "auth_attempt_state.h", - "auth_callbacks.h", "auth_factor_editor.cc", "auth_factor_editor.h", - "auth_factors_data.cc", - "auth_factors_data.h", "auth_performer.cc", "auth_performer.h", "auth_session_authenticator.cc", @@ -63,41 +63,27 @@ "challenge_response/known_user_pref_utils.h", "cryptohome_authenticator.cc", "cryptohome_authenticator.h", - "cryptohome_error.cc", - "cryptohome_error.h", - "cryptohome_key_constants.cc", - "cryptohome_key_constants.h", "cryptohome_parameter_utils.cc", "cryptohome_parameter_utils.h", "extended_authenticator.cc", "extended_authenticator.h", "extended_authenticator_impl.cc", "extended_authenticator_impl.h", - "key.cc", - "key.h", "login_performer.cc", "login_performer.h", "metrics_recorder.cc", "metrics_recorder.h", "mount_performer.cc", "mount_performer.h", - "operation_chain_runner.cc", - "operation_chain_runner.h", "password_visibility_utils.cc", "password_visibility_utils.h", "safe_mode_delegate.h", - "saml_password_attributes.cc", - "saml_password_attributes.h", "stub_authenticator.cc", "stub_authenticator.h", "stub_authenticator_builder.cc", "stub_authenticator_builder.h", - "sync_trusted_vault_keys.cc", - "sync_trusted_vault_keys.h", "test_attempt_state.cc", "test_attempt_state.h", - "user_context.cc", - "user_context.h", ] } @@ -125,17 +111,6 @@ ] } -# This is a separate targat to avoid a circular dependency with -# ash/components/cryptohome. -source_set("challenge_response_key") { - defines = [ "IS_ASH_LOGIN_AUTH_IMPL" ] - deps = [ "//base" ] - sources = [ - "challenge_response_key.cc", - "challenge_response_key.h", - ] -} - source_set("unit_tests") { configs += [ "//build/config/linux/dbus" ] testonly = true @@ -165,9 +140,9 @@ sources = [ "auth_performer_unittest.cc", "challenge_response/cert_utils_unittest.cc", - "key_unittest.cc", - "operation_chain_runner_unittest.cc", - "saml_password_attributes_unittest.cc", - "sync_trusted_vault_keys_unittest.cc", + "public/key_unittest.cc", + "public/operation_chain_runner_unittest.cc", + "public/saml_password_attributes_unittest.cc", + "public/sync_trusted_vault_keys_unittest.cc", ] }
diff --git a/ash/components/login/auth/auth_attempt_state.h b/ash/components/login/auth/auth_attempt_state.h index 533caaec..57eb79ee 100644 --- a/ash/components/login/auth/auth_attempt_state.h +++ b/ash/components/login/auth/auth_attempt_state.h
@@ -9,7 +9,7 @@ #include <string> #include "ash/components/login/auth/auth_status_consumer.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/component_export.h" #include "base/memory/weak_ptr.h" #include "google_apis/gaia/gaia_auth_consumer.h"
diff --git a/ash/components/login/auth/auth_factor_editor.cc b/ash/components/login/auth/auth_factor_editor.cc index d1899f0..56b79fd 100644 --- a/ash/components/login/auth/auth_factor_editor.cc +++ b/ash/components/login/auth/auth_factor_editor.cc
@@ -7,9 +7,9 @@ #include "ash/components/cryptohome/cryptohome_util.h" #include "ash/components/cryptohome/system_salt_getter.h" #include "ash/components/cryptohome/userdataauth_util.h" -#include "ash/components/login/auth/cryptohome_key_constants.h" #include "ash/components/login/auth/cryptohome_parameter_utils.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/cryptohome_key_constants.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/constants/ash_features.h" #include "base/bind.h" #include "base/callback.h"
diff --git a/ash/components/login/auth/auth_factor_editor.h b/ash/components/login/auth/auth_factor_editor.h index 273cad68..7d91967 100644 --- a/ash/components/login/auth/auth_factor_editor.h +++ b/ash/components/login/auth/auth_factor_editor.h
@@ -5,9 +5,9 @@ #ifndef ASH_COMPONENTS_LOGIN_AUTH_AUTH_FACTOR_EDITOR_H_ #define ASH_COMPONENTS_LOGIN_AUTH_AUTH_FACTOR_EDITOR_H_ -#include "ash/components/login/auth/auth_callbacks.h" -#include "ash/components/login/auth/cryptohome_error.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/auth_callbacks.h" +#include "ash/components/login/auth/public/cryptohome_error.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/callback.h" #include "base/component_export.h" #include "base/memory/weak_ptr.h"
diff --git a/ash/components/login/auth/auth_performer.cc b/ash/components/login/auth/auth_performer.cc index 036b456..77bb672d 100644 --- a/ash/components/login/auth/auth_performer.cc +++ b/ash/components/login/auth/auth_performer.cc
@@ -7,12 +7,15 @@ #include "ash/components/cryptohome/cryptohome_util.h" #include "ash/components/cryptohome/system_salt_getter.h" #include "ash/components/cryptohome/userdataauth_util.h" -#include "ash/components/login/auth/cryptohome_key_constants.h" #include "ash/components/login/auth/cryptohome_parameter_utils.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/auth_session_status.h" +#include "ash/components/login/auth/public/cryptohome_key_constants.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/bind.h" #include "base/callback.h" +#include "base/time/time.h" #include "chromeos/ash/components/dbus/userdataauth/userdataauth_client.h" +#include "chromeos/dbus/cryptohome/UserDataAuth.pb.h" #include "chromeos/dbus/cryptohome/key.pb.h" #include "components/device_event_log/device_event_log.h" #include "components/user_manager/user_type.h" @@ -240,6 +243,21 @@ std::move(callback))); } +void AuthPerformer::GetAuthSessionStatus(std::unique_ptr<UserContext> context, + AuthSessionStatusCallback callback) { + DCHECK(!context->GetAuthSessionId().empty()); + + LOGIN_LOG(EVENT) << "Requesting authsession status"; + user_data_auth::GetAuthSessionStatusRequest request; + + request.set_auth_session_id(context->GetAuthSessionId()); + + client_->GetAuthSessionStatus( + request, base::BindOnce(&AuthPerformer::OnGetAuthSessionStatus, + weak_factory_.GetWeakPtr(), std::move(context), + std::move(callback))); +} + /// ---- private callbacks ---- void AuthPerformer::OnStartAuthSession( @@ -302,4 +320,49 @@ std::move(callback).Run(std::move(context), absl::nullopt); } +void AuthPerformer::OnGetAuthSessionStatus( + std::unique_ptr<UserContext> context, + AuthSessionStatusCallback callback, + absl::optional<user_data_auth::GetAuthSessionStatusReply> reply) { + auto error = user_data_auth::ReplyToCryptohomeError(reply); + + if (error == user_data_auth::CRYPTOHOME_INVALID_AUTH_SESSION_TOKEN) { + // Do not trigger error handling + std::move(callback).Run(AuthSessionStatus(), base::TimeDelta(), + std::move(context), + /*cryptohome_error=*/absl::nullopt); + return; + } + + if (error != user_data_auth::CRYPTOHOME_ERROR_NOT_SET) { + LOGIN_LOG(EVENT) << "Failed to get authsession status " << error; + std::move(callback).Run(AuthSessionStatus(), base::TimeDelta(), + std::move(context), CryptohomeError{error}); + return; + } + CHECK(reply.has_value()); + base::TimeDelta lifetime; + AuthSessionStatus status; + switch (reply->status()) { + case ::user_data_auth::AUTH_SESSION_STATUS_NOT_SET: + case ::user_data_auth::AUTH_SESSION_STATUS_INVALID_AUTH_SESSION: + break; + case ::user_data_auth::AUTH_SESSION_STATUS_FURTHER_FACTOR_REQUIRED: + status.Put(AuthSessionLevel::kSessionIsValid); + // Once we support multi-factor authentication (and have partially + // authenticated sessions) we might need to use value from reply. + lifetime = base::TimeDelta::Max(); + break; + case ::user_data_auth::AUTH_SESSION_STATUS_AUTHENTICATED: + status.Put(AuthSessionLevel::kSessionIsValid); + status.Put(AuthSessionLevel::kCryptohomeStrong); + lifetime = base::Seconds(reply->time_left()); + break; + default: + NOTREACHED(); + } + std::move(callback).Run(status, lifetime, std::move(context), + /*cryptohome_error=*/absl::nullopt); +} + } // namespace ash
diff --git a/ash/components/login/auth/auth_performer.h b/ash/components/login/auth/auth_performer.h index 0e91818..d848655 100644 --- a/ash/components/login/auth/auth_performer.h +++ b/ash/components/login/auth/auth_performer.h
@@ -7,8 +7,9 @@ #include <memory> -#include "ash/components/login/auth/auth_callbacks.h" -#include "ash/components/login/auth/cryptohome_error.h" +#include "ash/components/login/auth/public/auth_callbacks.h" +#include "ash/components/login/auth/public/auth_session_status.h" +#include "ash/components/login/auth/public/cryptohome_error.h" #include "base/callback.h" #include "base/component_export.h" #include "base/memory/raw_ptr.h" @@ -39,6 +40,12 @@ std::unique_ptr<UserContext>, absl::optional<CryptohomeError>)>; + using AuthSessionStatusCallback = + base::OnceCallback<void(AuthSessionStatus status, + base::TimeDelta lifetime, + std::unique_ptr<UserContext>, + absl::optional<CryptohomeError>)>; + // Invalidates any ongoing mount attempts by invalidating Weak pointers on // internal callbacks. Callbacks for ongoing operations will not be called // afterwards, but there is no guarantees about state of the session. @@ -95,6 +102,9 @@ void AuthenticateAsKiosk(std::unique_ptr<UserContext> context, AuthOperationCallback callback); + void GetAuthSessionStatus(std::unique_ptr<UserContext> context, + AuthSessionStatusCallback callback); + private: void OnServiceRunning(std::unique_ptr<UserContext> context, bool ephemeral, @@ -120,6 +130,11 @@ AuthOperationCallback callback, absl::optional<user_data_auth::AuthenticateAuthSessionReply> reply); + void OnGetAuthSessionStatus( + std::unique_ptr<UserContext> context, + AuthSessionStatusCallback callback, + absl::optional<user_data_auth::GetAuthSessionStatusReply> reply); + const base::raw_ptr<UserDataAuthClient> client_; base::WeakPtrFactory<AuthPerformer> weak_factory_{this}; };
diff --git a/ash/components/login/auth/auth_performer_unittest.cc b/ash/components/login/auth/auth_performer_unittest.cc index 54a2a43..b240ef2 100644 --- a/ash/components/login/auth/auth_performer_unittest.cc +++ b/ash/components/login/auth/auth_performer_unittest.cc
@@ -8,8 +8,9 @@ #include "ash/components/cryptohome/cryptohome_parameters.h" #include "ash/components/cryptohome/system_salt_getter.h" -#include "ash/components/login/auth/auth_factors_data.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/auth_factors_data.h" +#include "ash/components/login/auth/public/auth_session_status.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/bind.h" #include "base/callback_helpers.h" #include "base/memory/raw_ptr.h" @@ -252,5 +253,156 @@ user_data_auth::CRYPTOHOME_ERROR_KEY_NOT_FOUND); } +// Checks how AuthSessionStatus works when cryptohome returns an error. +TEST_F(AuthPerformerTest, AuthSessionStatusOnError) { + AuthPerformer performer(&mock_client_); + context_->SetAuthSessionId("123"); + + EXPECT_CALL(mock_client_, GetAuthSessionStatus(_, _)) + .WillOnce([](const ::user_data_auth::GetAuthSessionStatusRequest& request, + UserDataAuthClient::GetAuthSessionStatusCallback callback) { + ::user_data_auth::GetAuthSessionStatusReply reply; + reply.set_error(::user_data_auth::CRYPTOHOME_ERROR_TPM_NEEDS_REBOOT); + reply.set_status(::user_data_auth::AUTH_SESSION_STATUS_NOT_SET); + std::move(callback).Run(reply); + }); + base::test::TestFuture<AuthSessionStatus, base::TimeDelta, + std::unique_ptr<UserContext>, + absl::optional<CryptohomeError>> + result; + performer.GetAuthSessionStatus(std::move(context_), result.GetCallback()); + // Session does not have a status + ASSERT_EQ(result.Get<0>(), AuthSessionStatus()); + // Session does not have a lifetime: + ASSERT_TRUE(result.Get<1>().is_zero()); + // Context exists + ASSERT_TRUE(result.Get<2>()); + // Error is passed + ASSERT_TRUE(result.Get<3>().has_value()); + ASSERT_EQ(result.Get<3>().value().error_code, + user_data_auth::CRYPTOHOME_ERROR_TPM_NEEDS_REBOOT); +} + +// Checks how AuthSessionStatus works when session is not valid. +TEST_F(AuthPerformerTest, AuthSessionStatusOnInvalidSession) { + AuthPerformer performer(&mock_client_); + context_->SetAuthSessionId("123"); + + EXPECT_CALL(mock_client_, GetAuthSessionStatus(_, _)) + .WillOnce([](const ::user_data_auth::GetAuthSessionStatusRequest& request, + UserDataAuthClient::GetAuthSessionStatusCallback callback) { + ::user_data_auth::GetAuthSessionStatusReply reply; + reply.set_error( + ::user_data_auth::CRYPTOHOME_INVALID_AUTH_SESSION_TOKEN); + reply.set_status(::user_data_auth::AUTH_SESSION_STATUS_NOT_SET); + std::move(callback).Run(reply); + }); + base::test::TestFuture<AuthSessionStatus, base::TimeDelta, + std::unique_ptr<UserContext>, + absl::optional<CryptohomeError>> + result; + performer.GetAuthSessionStatus(std::move(context_), result.GetCallback()); + // Session does not have a status + ASSERT_EQ(result.Get<0>(), AuthSessionStatus()); + // Session does not have a lifetime: + ASSERT_TRUE(result.Get<1>().is_zero()); + // Context exists + ASSERT_TRUE(result.Get<2>()); + // No error is passed - this is a special case. + ASSERT_FALSE(result.Get<3>().has_value()); +} + +// Checks how AuthSessionStatus works when session was just invalidated +// (cryptohome still finds authsession, but it is already marked as invalid). +TEST_F(AuthPerformerTest, AuthSessionStatusOnInvalidSessionAnotherFlow) { + AuthPerformer performer(&mock_client_); + context_->SetAuthSessionId("123"); + + EXPECT_CALL(mock_client_, GetAuthSessionStatus(_, _)) + .WillOnce([](const ::user_data_auth::GetAuthSessionStatusRequest& request, + UserDataAuthClient::GetAuthSessionStatusCallback callback) { + ::user_data_auth::GetAuthSessionStatusReply reply; + reply.set_error(::user_data_auth::CRYPTOHOME_ERROR_NOT_SET); + reply.set_status( + ::user_data_auth::AUTH_SESSION_STATUS_INVALID_AUTH_SESSION); + std::move(callback).Run(reply); + }); + base::test::TestFuture<AuthSessionStatus, base::TimeDelta, + std::unique_ptr<UserContext>, + absl::optional<CryptohomeError>> + result; + performer.GetAuthSessionStatus(std::move(context_), result.GetCallback()); + // Session does not have a status + ASSERT_EQ(result.Get<0>(), AuthSessionStatus()); + // Session does not have a lifetime: + ASSERT_TRUE(result.Get<1>().is_zero()); + // Context exists + ASSERT_TRUE(result.Get<2>()); + // No error is passed - this is a special case. + ASSERT_FALSE(result.Get<3>().has_value()); +} + +// Checks how AuthSessionStatus works when session is not authenticated. +TEST_F(AuthPerformerTest, AuthSessionStatusWhenNotAuthenticated) { + AuthPerformer performer(&mock_client_); + context_->SetAuthSessionId("123"); + + EXPECT_CALL(mock_client_, GetAuthSessionStatus(_, _)) + .WillOnce([](const ::user_data_auth::GetAuthSessionStatusRequest& request, + UserDataAuthClient::GetAuthSessionStatusCallback callback) { + ::user_data_auth::GetAuthSessionStatusReply reply; + reply.set_error(::user_data_auth::CRYPTOHOME_ERROR_NOT_SET); + reply.set_status( + ::user_data_auth::AUTH_SESSION_STATUS_FURTHER_FACTOR_REQUIRED); + std::move(callback).Run(reply); + }); + base::test::TestFuture<AuthSessionStatus, base::TimeDelta, + std::unique_ptr<UserContext>, + absl::optional<CryptohomeError>> + result; + performer.GetAuthSessionStatus(std::move(context_), result.GetCallback()); + // Session is valid but not authenticated + ASSERT_EQ(result.Get<0>(), + AuthSessionStatus(AuthSessionLevel::kSessionIsValid)); + // Session have infinite lifetime + ASSERT_TRUE(result.Get<1>().is_max()); + // Context exists + ASSERT_TRUE(result.Get<2>()); + // No error is passed + ASSERT_FALSE(result.Get<3>().has_value()); +} + +// Checks how AuthSessionStatus works when session is authenticated. +TEST_F(AuthPerformerTest, AuthSessionStatusWhenAuthenticated) { + AuthPerformer performer(&mock_client_); + context_->SetAuthSessionId("123"); + + EXPECT_CALL(mock_client_, GetAuthSessionStatus(_, _)) + .WillOnce([](const ::user_data_auth::GetAuthSessionStatusRequest& request, + UserDataAuthClient::GetAuthSessionStatusCallback callback) { + ::user_data_auth::GetAuthSessionStatusReply reply; + reply.set_error(::user_data_auth::CRYPTOHOME_ERROR_NOT_SET); + reply.set_status(::user_data_auth::AUTH_SESSION_STATUS_AUTHENTICATED); + reply.set_time_left(10 * 60); + std::move(callback).Run(reply); + }); + + base::test::TestFuture<AuthSessionStatus, base::TimeDelta, + std::unique_ptr<UserContext>, + absl::optional<CryptohomeError>> + result; + performer.GetAuthSessionStatus(std::move(context_), result.GetCallback()); + // Session is authenticated + ASSERT_EQ(result.Get<0>(), + AuthSessionStatus(AuthSessionLevel::kSessionIsValid, + AuthSessionLevel::kCryptohomeStrong)); + // Session have some finite lifetime + ASSERT_EQ(result.Get<1>(), base::Minutes(10)); + // Context exists + ASSERT_TRUE(result.Get<2>()); + // No error is passed + ASSERT_FALSE(result.Get<3>().has_value()); +} + } // namespace } // namespace ash
diff --git a/ash/components/login/auth/auth_session_authenticator.cc b/ash/components/login/auth/auth_session_authenticator.cc index 95d5fec9..526ff81 100644 --- a/ash/components/login/auth/auth_session_authenticator.cc +++ b/ash/components/login/auth/auth_session_authenticator.cc
@@ -8,10 +8,11 @@ #include "ash/components/cryptohome/cryptohome_util.h" #include "ash/components/cryptohome/system_salt_getter.h" #include "ash/components/cryptohome/userdataauth_util.h" -#include "ash/components/login/auth/cryptohome_key_constants.h" #include "ash/components/login/auth/cryptohome_parameter_utils.h" -#include "ash/components/login/auth/operation_chain_runner.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/auth_failure.h" +#include "ash/components/login/auth/public/cryptohome_key_constants.h" +#include "ash/components/login/auth/public/operation_chain_runner.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/bind.h" #include "base/callback.h" #include "base/callback_helpers.h"
diff --git a/ash/components/login/auth/auth_status_consumer.h b/ash/components/login/auth/auth_status_consumer.h index 4b4c495..12198675 100644 --- a/ash/components/login/auth/auth_status_consumer.h +++ b/ash/components/login/auth/auth_status_consumer.h
@@ -5,133 +5,14 @@ #ifndef ASH_COMPONENTS_LOGIN_AUTH_AUTH_STATUS_CONSUMER_H_ #define ASH_COMPONENTS_LOGIN_AUTH_AUTH_STATUS_CONSUMER_H_ -#include <string> - #include "base/component_export.h" -#include "base/logging.h" -#include "base/notreached.h" #include "base/observer_list_types.h" -#include "google_apis/gaia/gaia_auth_consumer.h" -#include "google_apis/gaia/google_service_auth_error.h" -#include "net/base/net_errors.h" namespace ash { +class AuthFailure; class UserContext; -class COMPONENT_EXPORT(ASH_LOGIN_AUTH) AuthFailure { - public: - // Enum used for UMA. Do NOT reorder or remove entry. Don't forget to - // update LoginFailureReason enum in enums.xml when adding new entries. - enum FailureReason { - NONE = 0, - COULD_NOT_MOUNT_CRYPTOHOME = 1, - COULD_NOT_MOUNT_TMPFS = 2, - COULD_NOT_UNMOUNT_CRYPTOHOME = 3, - DATA_REMOVAL_FAILED = 4, // Could not destroy your old data - LOGIN_TIMED_OUT = 5, - UNLOCK_FAILED = 6, - NETWORK_AUTH_FAILED = 7, // Could not authenticate against Google - OWNER_REQUIRED = 8, // Only the device owner can log-in. - ALLOWLIST_CHECK_FAILED = 9, // Login attempt blocked by allowlist. This - // value is synthesized by the ExistingUserController and passed to the - // login_status_consumer_ in tests only. It is never generated or seen by - // any of the other authenticator classes. - TPM_ERROR = 10, // Critical TPM error encountered. - USERNAME_HASH_FAILED = 11, // Could not get username hash. - FAILED_TO_INITIALIZE_TOKEN = 12, // Could not get OAuth2 Token, - MISSING_CRYPTOHOME = 13, // cryptohome missing from disk. - AUTH_DISABLED = 14, // Authentication disabled for user. - TPM_UPDATE_REQUIRED = 15, // TPM firmware update is required. - UNRECOVERABLE_CRYPTOHOME = 16, // cryptohome is corrupted. - NUM_FAILURE_REASONS, // This has to be the last item. - }; - - explicit AuthFailure(FailureReason reason) - : reason_(reason), error_(GoogleServiceAuthError::NONE) { - DCHECK(reason != NETWORK_AUTH_FAILED); - } - - inline bool operator==(const AuthFailure& b) const { - if (reason_ != b.reason_) { - return false; - } - if (reason_ == NETWORK_AUTH_FAILED) { - return error_ == b.error_; - } - return true; - } - - static AuthFailure FromNetworkAuthFailure( - const GoogleServiceAuthError& error) { - return AuthFailure(NETWORK_AUTH_FAILED, error); - } - - static AuthFailure AuthFailureNone() { return AuthFailure(NONE); } - - const std::string GetErrorString() const { - switch (reason_) { - case DATA_REMOVAL_FAILED: - return "Could not destroy your old data."; - case COULD_NOT_MOUNT_CRYPTOHOME: - return "Could not mount cryptohome."; - case COULD_NOT_UNMOUNT_CRYPTOHOME: - return "Could not unmount cryptohome."; - case COULD_NOT_MOUNT_TMPFS: - return "Could not mount tmpfs."; - case LOGIN_TIMED_OUT: - return "Login timed out. Please try again."; - case UNLOCK_FAILED: - return "Unlock failed."; - case NETWORK_AUTH_FAILED: - if (error_.state() == GoogleServiceAuthError::CONNECTION_FAILED) { - return net::ErrorToString(error_.network_error()); - } - return "Google authentication failed."; - case OWNER_REQUIRED: - return "Login is restricted to the owner's account only."; - case ALLOWLIST_CHECK_FAILED: - return "Login attempt blocked by allowlist."; - case FAILED_TO_INITIALIZE_TOKEN: - return "OAuth2 token fetch failed."; - case MISSING_CRYPTOHOME: - return "Cryptohome missing from disk."; - case AUTH_DISABLED: - return "Auth disabled for user."; - case TPM_ERROR: - return "Critical TPM error encountered."; - case TPM_UPDATE_REQUIRED: - return "TPM firmware update required."; - case UNRECOVERABLE_CRYPTOHOME: - return "Cryptohome is corrupted."; - case USERNAME_HASH_FAILED: - return "Failed to get hashed username"; - case NONE: - case NUM_FAILURE_REASONS: - NOTREACHED(); - return std::string(); - } - } - - const GoogleServiceAuthError& error() const { return error_; } - const FailureReason& reason() const { return reason_; } - - private: - AuthFailure(FailureReason reason, GoogleServiceAuthError error) - : reason_(reason), error_(error) {} - - FailureReason reason_; - GoogleServiceAuthError error_; -}; - -// Enum used for UMA. Do NOT reorder or remove entry. Don't forget to -// update histograms.xml when adding new entries. -enum SuccessReason { - OFFLINE_AND_ONLINE = 0, - OFFLINE_ONLY = 1, - NUM_SUCCESS_REASONS, // This has to be the last item. -}; - // An interface that defines the callbacks for objects that the // Authenticator class will call to report the success/failure of // authentication for Chromium OS.
diff --git a/ash/components/login/auth/authenticator.h b/ash/components/login/auth/authenticator.h index 700336df..d4a54bb 100644 --- a/ash/components/login/auth/authenticator.h +++ b/ash/components/login/auth/authenticator.h
@@ -16,6 +16,7 @@ namespace ash { +class AuthFailure; class UserContext; // An interface for objects that will authenticate a Chromium OS user.
diff --git a/ash/components/login/auth/challenge_response/cert_utils.h b/ash/components/login/auth/challenge_response/cert_utils.h index 040f6db..8c7ff74 100644 --- a/ash/components/login/auth/challenge_response/cert_utils.h +++ b/ash/components/login/auth/challenge_response/cert_utils.h
@@ -8,7 +8,7 @@ #include <cstdint> #include <vector> -#include "ash/components/login/auth/challenge_response_key.h" +#include "ash/components/login/auth/public/challenge_response_key.h" #include "base/component_export.h" #include "third_party/abseil-cpp/absl/types/optional.h"
diff --git a/ash/components/login/auth/challenge_response/cert_utils_unittest.cc b/ash/components/login/auth/challenge_response/cert_utils_unittest.cc index 6ee0ed342..34561db 100644 --- a/ash/components/login/auth/challenge_response/cert_utils_unittest.cc +++ b/ash/components/login/auth/challenge_response/cert_utils_unittest.cc
@@ -7,7 +7,7 @@ #include <string> #include <vector> -#include "ash/components/login/auth/challenge_response_key.h" +#include "ash/components/login/auth/public/challenge_response_key.h" #include "base/hash/sha1.h" #include "base/memory/ref_counted.h" #include "net/cert/x509_certificate.h"
diff --git a/ash/components/login/auth/challenge_response/key_label_utils.h b/ash/components/login/auth/challenge_response/key_label_utils.h index fd526a5c..5ce0ccb 100644 --- a/ash/components/login/auth/challenge_response/key_label_utils.h +++ b/ash/components/login/auth/challenge_response/key_label_utils.h
@@ -8,7 +8,7 @@ #include <string> #include <vector> -#include "ash/components/login/auth/challenge_response_key.h" +#include "ash/components/login/auth/public/challenge_response_key.h" namespace ash {
diff --git a/ash/components/login/auth/challenge_response/known_user_pref_utils.h b/ash/components/login/auth/challenge_response/known_user_pref_utils.h index af323c3..b1ace0a 100644 --- a/ash/components/login/auth/challenge_response/known_user_pref_utils.h +++ b/ash/components/login/auth/challenge_response/known_user_pref_utils.h
@@ -8,7 +8,7 @@ #include <string> #include <vector> -#include "ash/components/login/auth/challenge_response_key.h" +#include "ash/components/login/auth/public/challenge_response_key.h" #include "base/component_export.h" namespace base {
diff --git a/ash/components/login/auth/cryptohome_authenticator.cc b/ash/components/login/auth/cryptohome_authenticator.cc index 68caaeef..8524820 100644 --- a/ash/components/login/auth/cryptohome_authenticator.cc +++ b/ash/components/login/auth/cryptohome_authenticator.cc
@@ -14,10 +14,11 @@ #include "ash/components/cryptohome/system_salt_getter.h" #include "ash/components/cryptohome/userdataauth_util.h" #include "ash/components/login/auth/auth_status_consumer.h" -#include "ash/components/login/auth/cryptohome_key_constants.h" #include "ash/components/login/auth/cryptohome_parameter_utils.h" -#include "ash/components/login/auth/key.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/auth_failure.h" +#include "ash/components/login/auth/public/cryptohome_key_constants.h" +#include "ash/components/login/auth/public/key.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/constants/ash_switches.h" #include "base/bind.h" #include "base/command_line.h"
diff --git a/ash/components/login/auth/cryptohome_authenticator.h b/ash/components/login/auth/cryptohome_authenticator.h index cb47fc2..a10e340 100644 --- a/ash/components/login/auth/cryptohome_authenticator.h +++ b/ash/components/login/auth/cryptohome_authenticator.h
@@ -10,6 +10,7 @@ #include "ash/components/login/auth/auth_attempt_state.h" #include "ash/components/login/auth/authenticator.h" +#include "ash/components/login/auth/public/auth_failure.h" #include "ash/components/login/auth/safe_mode_delegate.h" #include "ash/components/login/auth/test_attempt_state.h" #include "base/compiler_specific.h"
diff --git a/ash/components/login/auth/cryptohome_parameter_utils.cc b/ash/components/login/auth/cryptohome_parameter_utils.cc index 059f1ab8..8564a5f 100644 --- a/ash/components/login/auth/cryptohome_parameter_utils.cc +++ b/ash/components/login/auth/cryptohome_parameter_utils.cc
@@ -6,8 +6,8 @@ #include "ash/components/cryptohome/cryptohome_parameters.h" #include "ash/components/login/auth/challenge_response/key_label_utils.h" -#include "ash/components/login/auth/key.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/key.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/check_op.h" using cryptohome::KeyDefinition;
diff --git a/ash/components/login/auth/extended_authenticator_impl.cc b/ash/components/login/auth/extended_authenticator_impl.cc index f10f840..e95bd72d 100644 --- a/ash/components/login/auth/extended_authenticator_impl.cc +++ b/ash/components/login/auth/extended_authenticator_impl.cc
@@ -12,8 +12,9 @@ #include "ash/components/cryptohome/userdataauth_util.h" #include "ash/components/login/auth/auth_status_consumer.h" #include "ash/components/login/auth/cryptohome_parameter_utils.h" -#include "ash/components/login/auth/key.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/auth_failure.h" +#include "ash/components/login/auth/public/key.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/bind.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h"
diff --git a/ash/components/login/auth/fake_extended_authenticator.cc b/ash/components/login/auth/fake_extended_authenticator.cc index 40e5778..82ae956 100644 --- a/ash/components/login/auth/fake_extended_authenticator.cc +++ b/ash/components/login/auth/fake_extended_authenticator.cc
@@ -5,6 +5,7 @@ #include "ash/components/login/auth/fake_extended_authenticator.h" #include "ash/components/login/auth/auth_status_consumer.h" +#include "ash/components/login/auth/public/auth_failure.h" #include "base/notreached.h" #include "components/account_id/account_id.h"
diff --git a/ash/components/login/auth/fake_extended_authenticator.h b/ash/components/login/auth/fake_extended_authenticator.h index 7f46ea28..7eb4fd77 100644 --- a/ash/components/login/auth/fake_extended_authenticator.h +++ b/ash/components/login/auth/fake_extended_authenticator.h
@@ -6,7 +6,7 @@ #define ASH_COMPONENTS_LOGIN_AUTH_FAKE_EXTENDED_AUTHENTICATOR_H_ #include "ash/components/login/auth/extended_authenticator.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/component_export.h" namespace ash {
diff --git a/ash/components/login/auth/login_performer.cc b/ash/components/login/auth/login_performer.cc index 36d8fad..44bcc765 100644 --- a/ash/components/login/auth/login_performer.cc +++ b/ash/components/login/auth/login_performer.cc
@@ -5,6 +5,7 @@ #include "ash/components/login/auth/login_performer.h" #include "ash/components/login/auth/metrics_recorder.h" +#include "ash/components/login/auth/public/auth_failure.h" #include "base/bind.h" #include "base/location.h" #include "base/logging.h" @@ -25,7 +26,7 @@ MetricsRecorder* metrics_recorder) : delegate_(delegate), metrics_recorder_(metrics_recorder), - last_login_failure_(AuthFailure::AuthFailureNone()) { + last_login_failure_(AuthFailure(AuthFailure::NONE)) { DCHECK(metrics_recorder_); }
diff --git a/ash/components/login/auth/login_performer.h b/ash/components/login/auth/login_performer.h index 5677303e..dd24868 100644 --- a/ash/components/login/auth/login_performer.h +++ b/ash/components/login/auth/login_performer.h
@@ -12,7 +12,8 @@ #include "ash/components/login/auth/authenticator.h" #include "ash/components/login/auth/extended_authenticator.h" #include "ash/components/login/auth/metrics_recorder.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/auth_failure.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/callback.h" #include "base/component_export.h" #include "base/memory/raw_ptr.h"
diff --git a/ash/components/login/auth/metrics_recorder.cc b/ash/components/login/auth/metrics_recorder.cc index 48ef1e49..ea55656 100644 --- a/ash/components/login/auth/metrics_recorder.cc +++ b/ash/components/login/auth/metrics_recorder.cc
@@ -4,8 +4,8 @@ #include "ash/components/login/auth/metrics_recorder.h" -#include "ash/components/login/auth/auth_status_consumer.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/auth_failure.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/metrics/user_metrics.h"
diff --git a/ash/components/login/auth/metrics_recorder.h b/ash/components/login/auth/metrics_recorder.h index 4a87843..5ff2a850 100644 --- a/ash/components/login/auth/metrics_recorder.h +++ b/ash/components/login/auth/metrics_recorder.h
@@ -5,8 +5,8 @@ #ifndef ASH_COMPONENTS_LOGIN_AUTH_METRICS_RECORDER_H_ #define ASH_COMPONENTS_LOGIN_AUTH_METRICS_RECORDER_H_ -#include "ash/components/login/auth/auth_status_consumer.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/auth_failure.h" +#include "ash/components/login/auth/public/user_context.h" namespace ash {
diff --git a/ash/components/login/auth/mock_auth_performer.h b/ash/components/login/auth/mock_auth_performer.h index 04afc15..7457e4ca 100644 --- a/ash/components/login/auth/mock_auth_performer.h +++ b/ash/components/login/auth/mock_auth_performer.h
@@ -6,7 +6,7 @@ #define ASH_COMPONENTS_LOGIN_AUTH_MOCK_AUTH_PERFORMER_H_ #include "ash/components/login/auth/auth_performer.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "chromeos/ash/components/dbus/userdataauth/userdataauth_client.h" #include "testing/gmock/include/gmock/gmock.h"
diff --git a/ash/components/login/auth/mock_auth_status_consumer.h b/ash/components/login/auth/mock_auth_status_consumer.h index 680252f2..5318782 100644 --- a/ash/components/login/auth/mock_auth_status_consumer.h +++ b/ash/components/login/auth/mock_auth_status_consumer.h
@@ -6,7 +6,8 @@ #define ASH_COMPONENTS_LOGIN_AUTH_MOCK_AUTH_STATUS_CONSUMER_H_ #include "ash/components/login/auth/auth_status_consumer.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/auth_failure.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/callback.h" #include "base/component_export.h" #include "testing/gmock/include/gmock/gmock.h"
diff --git a/ash/components/login/auth/mount_performer.cc b/ash/components/login/auth/mount_performer.cc index 6c16b522..3d69e69 100644 --- a/ash/components/login/auth/mount_performer.cc +++ b/ash/components/login/auth/mount_performer.cc
@@ -5,7 +5,7 @@ #include "ash/components/login/auth/mount_performer.h" #include "ash/components/cryptohome/userdataauth_util.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/constants/ash_switches.h" #include "base/bind.h" #include "base/callback.h"
diff --git a/ash/components/login/auth/mount_performer.h b/ash/components/login/auth/mount_performer.h index da608fc..a205f54 100644 --- a/ash/components/login/auth/mount_performer.h +++ b/ash/components/login/auth/mount_performer.h
@@ -7,8 +7,8 @@ #include <memory> -#include "ash/components/login/auth/auth_callbacks.h" -#include "ash/components/login/auth/cryptohome_error.h" +#include "ash/components/login/auth/public/auth_callbacks.h" +#include "ash/components/login/auth/public/cryptohome_error.h" #include "base/callback.h" #include "base/component_export.h" #include "base/memory/weak_ptr.h"
diff --git a/ash/components/login/auth/public/BUILD.gn b/ash/components/login/auth/public/BUILD.gn new file mode 100644 index 0000000..b477415d --- /dev/null +++ b/ash/components/login/auth/public/BUILD.gn
@@ -0,0 +1,58 @@ +# Copyright 2022 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/chromeos/ui_mode.gni") + +assert(is_chromeos_ash, "Non-Chrome-OS builds must not depend on //ash") + +component("authpublic") { + defines = [ "IS_ASH_LOGIN_AUTH_IMPL" ] + public_deps = [ ":challenge_response_key" ] + deps = [ + "//ash/components/cryptohome", + "//ash/constants", + "//base", + "//chromeos/ash/components/dbus/userdataauth:userdataauth_proto", + "//components/account_id", + "//components/password_manager/core/browser:password_hash_data", + "//components/prefs", + "//components/user_manager", + "//crypto", + "//google_apis", + "//net", + "//third_party/abseil-cpp:absl", + ] + sources = [ + "auth_callbacks.h", + "auth_factors_data.cc", + "auth_factors_data.h", + "auth_failure.cc", + "auth_failure.h", + "auth_session_status.h", + "cryptohome_error.cc", + "cryptohome_error.h", + "cryptohome_key_constants.cc", + "cryptohome_key_constants.h", + "key.cc", + "key.h", + "operation_chain_runner.cc", + "operation_chain_runner.h", + "saml_password_attributes.cc", + "saml_password_attributes.h", + "sync_trusted_vault_keys.cc", + "sync_trusted_vault_keys.h", + "user_context.cc", + "user_context.h", + ] +} + +# Separate target to break cyclic dependency with //ash/components/cryptohome +component("challenge_response_key") { + defines = [ "IS_ASH_LOGIN_AUTH_IMPL" ] + deps = [ "//base" ] + sources = [ + "challenge_response_key.cc", + "challenge_response_key.h", + ] +}
diff --git a/ash/components/login/auth/auth_callbacks.h b/ash/components/login/auth/public/auth_callbacks.h similarity index 78% rename from ash/components/login/auth/auth_callbacks.h rename to ash/components/login/auth/public/auth_callbacks.h index 3a96d36..f60eef7 100644 --- a/ash/components/login/auth/auth_callbacks.h +++ b/ash/components/login/auth/public/auth_callbacks.h
@@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef ASH_COMPONENTS_LOGIN_AUTH_AUTH_CALLBACKS_H_ -#define ASH_COMPONENTS_LOGIN_AUTH_AUTH_CALLBACKS_H_ +#ifndef ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_AUTH_CALLBACKS_H_ +#define ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_AUTH_CALLBACKS_H_ #include <memory> -#include "ash/components/login/auth/cryptohome_error.h" +#include "ash/components/login/auth/public/cryptohome_error.h" #include "base/callback.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -29,4 +29,4 @@ } // namespace ash -#endif // ASH_COMPONENTS_LOGIN_AUTH_AUTH_CALLBACKS_H_ +#endif // ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_AUTH_CALLBACKS_H_
diff --git a/ash/components/login/auth/auth_factors_data.cc b/ash/components/login/auth/public/auth_factors_data.cc similarity index 93% rename from ash/components/login/auth/auth_factors_data.cc rename to ash/components/login/auth/public/auth_factors_data.cc index 0596bf8..a41997b10 100644 --- a/ash/components/login/auth/auth_factors_data.cc +++ b/ash/components/login/auth/public/auth_factors_data.cc
@@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/components/login/auth/auth_factors_data.h" +#include "ash/components/login/auth/public/auth_factors_data.h" #include "ash/components/cryptohome/cryptohome_parameters.h" -#include "ash/components/login/auth/cryptohome_key_constants.h" +#include "ash/components/login/auth/public/cryptohome_key_constants.h" #include "base/check_op.h" namespace ash {
diff --git a/ash/components/login/auth/auth_factors_data.h b/ash/components/login/auth/public/auth_factors_data.h similarity index 89% rename from ash/components/login/auth/auth_factors_data.h rename to ash/components/login/auth/public/auth_factors_data.h index 660ecbb..a5103e9 100644 --- a/ash/components/login/auth/auth_factors_data.h +++ b/ash/components/login/auth/public/auth_factors_data.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef ASH_COMPONENTS_LOGIN_AUTH_AUTH_FACTORS_DATA_H_ -#define ASH_COMPONENTS_LOGIN_AUTH_AUTH_FACTORS_DATA_H_ +#ifndef ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_AUTH_FACTORS_DATA_H_ +#define ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_AUTH_FACTORS_DATA_H_ #include <string> @@ -50,4 +50,4 @@ } // namespace ash -#endif // ASH_COMPONENTS_LOGIN_AUTH_AUTH_FACTORS_DATA_H_ +#endif // ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_AUTH_FACTORS_DATA_H_
diff --git a/ash/components/login/auth/public/auth_failure.cc b/ash/components/login/auth/public/auth_failure.cc new file mode 100644 index 0000000..203789f --- /dev/null +++ b/ash/components/login/auth/public/auth_failure.cc
@@ -0,0 +1,68 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/components/login/auth/public/auth_failure.h" + +namespace ash { + +AuthFailure::AuthFailure(FailureReason reason) + : reason_(reason), error_(GoogleServiceAuthError::NONE) { + DCHECK(reason != NETWORK_AUTH_FAILED); +} + +// private +AuthFailure::AuthFailure(FailureReason reason, GoogleServiceAuthError error) + : reason_(reason), error_(error) {} + +// static +AuthFailure AuthFailure::FromNetworkAuthFailure( + const GoogleServiceAuthError& error) { + return AuthFailure(NETWORK_AUTH_FAILED, error); +} + +const std::string AuthFailure::GetErrorString() const { + switch (reason_) { + case DATA_REMOVAL_FAILED: + return "Could not destroy your old data."; + case COULD_NOT_MOUNT_CRYPTOHOME: + return "Could not mount cryptohome."; + case COULD_NOT_UNMOUNT_CRYPTOHOME: + return "Could not unmount cryptohome."; + case COULD_NOT_MOUNT_TMPFS: + return "Could not mount tmpfs."; + case LOGIN_TIMED_OUT: + return "Login timed out. Please try again."; + case UNLOCK_FAILED: + return "Unlock failed."; + case NETWORK_AUTH_FAILED: + if (error_.state() == GoogleServiceAuthError::CONNECTION_FAILED) { + return net::ErrorToString(error_.network_error()); + } + return "Google authentication failed."; + case OWNER_REQUIRED: + return "Login is restricted to the owner's account only."; + case ALLOWLIST_CHECK_FAILED: + return "Login attempt blocked by allowlist."; + case FAILED_TO_INITIALIZE_TOKEN: + return "OAuth2 token fetch failed."; + case MISSING_CRYPTOHOME: + return "Cryptohome missing from disk."; + case AUTH_DISABLED: + return "Auth disabled for user."; + case TPM_ERROR: + return "Critical TPM error encountered."; + case TPM_UPDATE_REQUIRED: + return "TPM firmware update required."; + case UNRECOVERABLE_CRYPTOHOME: + return "Cryptohome is corrupted."; + case USERNAME_HASH_FAILED: + return "Failed to get hashed username"; + case NONE: + case NUM_FAILURE_REASONS: + NOTREACHED(); + return std::string(); + } +} + +} // namespace ash
diff --git a/ash/components/login/auth/public/auth_failure.h b/ash/components/login/auth/public/auth_failure.h new file mode 100644 index 0000000..1e0d25c1 --- /dev/null +++ b/ash/components/login/auth/public/auth_failure.h
@@ -0,0 +1,84 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_AUTH_FAILURE_H_ +#define ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_AUTH_FAILURE_H_ + +#include <string> + +#include "base/check.h" +#include "base/component_export.h" +#include "base/notreached.h" +#include "google_apis/gaia/gaia_auth_consumer.h" +#include "google_apis/gaia/google_service_auth_error.h" +#include "net/base/net_errors.h" + +namespace ash { + +class COMPONENT_EXPORT(ASH_LOGIN_AUTH) AuthFailure { + public: + // Enum used for UMA. Do NOT reorder or remove entry. Don't forget to + // update LoginFailureReason enum in enums.xml when adding new entries. + enum FailureReason { + NONE = 0, + COULD_NOT_MOUNT_CRYPTOHOME = 1, + COULD_NOT_MOUNT_TMPFS = 2, + COULD_NOT_UNMOUNT_CRYPTOHOME = 3, + DATA_REMOVAL_FAILED = 4, // Could not destroy your old data + LOGIN_TIMED_OUT = 5, + UNLOCK_FAILED = 6, + NETWORK_AUTH_FAILED = 7, // Could not authenticate against Google + OWNER_REQUIRED = 8, // Only the device owner can log-in. + ALLOWLIST_CHECK_FAILED = 9, // Login attempt blocked by allowlist. This + // value is synthesized by the ExistingUserController and passed to the + // login_status_consumer_ in tests only. It is never generated or seen by + // any of the other authenticator classes. + TPM_ERROR = 10, // Critical TPM error encountered. + USERNAME_HASH_FAILED = 11, // Could not get username hash. + FAILED_TO_INITIALIZE_TOKEN = 12, // Could not get OAuth2 Token, + MISSING_CRYPTOHOME = 13, // cryptohome missing from disk. + AUTH_DISABLED = 14, // Authentication disabled for user. + TPM_UPDATE_REQUIRED = 15, // TPM firmware update is required. + UNRECOVERABLE_CRYPTOHOME = 16, // cryptohome is corrupted. + NUM_FAILURE_REASONS, // This has to be the last item. + }; + + explicit AuthFailure(FailureReason reason); + + static AuthFailure FromNetworkAuthFailure( + const GoogleServiceAuthError& error); + + inline bool operator==(const AuthFailure& b) const { + if (reason_ != b.reason_) { + return false; + } + if (reason_ == NETWORK_AUTH_FAILED) { + return error_ == b.error_; + } + return true; + } + + const std::string GetErrorString() const; + + const GoogleServiceAuthError& error() const { return error_; } + const FailureReason& reason() const { return reason_; } + + private: + AuthFailure(FailureReason reason, GoogleServiceAuthError error); + + FailureReason reason_; + GoogleServiceAuthError error_; +}; + +// Enum used for UMA. Do NOT reorder or remove entry. Don't forget to +// update histograms.xml when adding new entries. +enum SuccessReason { + OFFLINE_AND_ONLINE = 0, + OFFLINE_ONLY = 1, + NUM_SUCCESS_REASONS, // This has to be the last item. +}; + +} // namespace ash + +#endif // ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_AUTH_FAILURE_H_
diff --git a/ash/components/login/auth/public/auth_session_status.h b/ash/components/login/auth/public/auth_session_status.h new file mode 100644 index 0000000..1c3bed3 --- /dev/null +++ b/ash/components/login/auth/public/auth_session_status.h
@@ -0,0 +1,37 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_AUTH_SESSION_STATUS_H_ +#define ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_AUTH_SESSION_STATUS_H_ + +#include "base/containers/enum_set.h" + +namespace ash { + +// This enum represents possible authentication level of auth session. +// Note that this is not specific to cryptohome AuthSessions, and can be used +// with other services providing some level of authentication (e.g. +// SmartUnlock). +enum class AuthSessionLevel { + // Indication that session is still valid (but might be non-authenticated). + kSessionIsValid, + // Session is authenticated by some service other than cryptohome, no + // cryptohome operations can be performed. + kAuthenticatedOther, + // Lightweight authentication in cryptohome. Authentication step is faster + // when lightweight authentication is used, but not all operations might be + // authorized by such authsession. + kCryptohomeLightweight, + // Strong authsentication in cryptohome. Authentication step is longer, but + // all cryptohome operations are available with this type of authentication. + kCryptohomeStrong +}; + +using AuthSessionStatus = base::EnumSet<AuthSessionLevel, + AuthSessionLevel::kSessionIsValid, + AuthSessionLevel::kCryptohomeStrong>; + +} // namespace ash + +#endif // ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_AUTH_RESULTS_H_
diff --git a/ash/components/login/auth/challenge_response_key.cc b/ash/components/login/auth/public/challenge_response_key.cc similarity index 91% rename from ash/components/login/auth/challenge_response_key.cc rename to ash/components/login/auth/public/challenge_response_key.cc index a95d063..026af98 100644 --- a/ash/components/login/auth/challenge_response_key.cc +++ b/ash/components/login/auth/public/challenge_response_key.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/components/login/auth/challenge_response_key.h" +#include "ash/components/login/auth/public/challenge_response_key.h" namespace ash {
diff --git a/ash/components/login/auth/challenge_response_key.h b/ash/components/login/auth/public/challenge_response_key.h similarity index 92% rename from ash/components/login/auth/challenge_response_key.h rename to ash/components/login/auth/public/challenge_response_key.h index 39467fdc..6870d3d 100644 --- a/ash/components/login/auth/challenge_response_key.h +++ b/ash/components/login/auth/public/challenge_response_key.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef ASH_COMPONENTS_LOGIN_AUTH_CHALLENGE_RESPONSE_KEY_H_ -#define ASH_COMPONENTS_LOGIN_AUTH_CHALLENGE_RESPONSE_KEY_H_ +#ifndef ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_CHALLENGE_RESPONSE_KEY_H_ +#define ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_CHALLENGE_RESPONSE_KEY_H_ #include <string> #include <vector> @@ -79,4 +79,4 @@ using ::ash::ChallengeResponseKey; } // namespace chromeos -#endif // ASH_COMPONENTS_LOGIN_AUTH_CHALLENGE_RESPONSE_KEY_H_ +#endif // ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_CHALLENGE_RESPONSE_KEY_H_
diff --git a/ash/components/login/auth/cryptohome_error.cc b/ash/components/login/auth/public/cryptohome_error.cc similarity index 85% rename from ash/components/login/auth/cryptohome_error.cc rename to ash/components/login/auth/public/cryptohome_error.cc index 6a62ee37..072ab25 100644 --- a/ash/components/login/auth/cryptohome_error.cc +++ b/ash/components/login/auth/public/cryptohome_error.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/components/login/auth/cryptohome_error.h" +#include "ash/components/login/auth/public/cryptohome_error.h" namespace ash {
diff --git a/ash/components/login/auth/cryptohome_error.h b/ash/components/login/auth/public/cryptohome_error.h similarity index 75% rename from ash/components/login/auth/cryptohome_error.h rename to ash/components/login/auth/public/cryptohome_error.h index e349d1f9..dc370bb 100644 --- a/ash/components/login/auth/cryptohome_error.h +++ b/ash/components/login/auth/public/cryptohome_error.h
@@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef ASH_COMPONENTS_LOGIN_AUTH_CRYPTOHOME_ERROR_H_ -#define ASH_COMPONENTS_LOGIN_AUTH_CRYPTOHOME_ERROR_H_ +#ifndef ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_CRYPTOHOME_ERROR_H_ +#define ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_CRYPTOHOME_ERROR_H_ -#include "ash/components/login/auth/auth_status_consumer.h" +#include "ash/components/login/auth/public/auth_failure.h" #include "base/component_export.h" #include "chromeos/dbus/cryptohome/UserDataAuth.pb.h" @@ -25,4 +25,4 @@ } // namespace ash -#endif // ASH_COMPONENTS_LOGIN_AUTH_CRYPTOHOME_ERROR_H_ +#endif // ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_CRYPTOHOME_ERROR_H_
diff --git a/ash/components/login/auth/cryptohome_key_constants.cc b/ash/components/login/auth/public/cryptohome_key_constants.cc similarity index 92% rename from ash/components/login/auth/cryptohome_key_constants.cc rename to ash/components/login/auth/public/cryptohome_key_constants.cc index 7e04d8e0..bbc77c4 100644 --- a/ash/components/login/auth/cryptohome_key_constants.cc +++ b/ash/components/login/auth/public/cryptohome_key_constants.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/components/login/auth/cryptohome_key_constants.h" +#include "ash/components/login/auth/public/cryptohome_key_constants.h" namespace ash {
diff --git a/ash/components/login/auth/cryptohome_key_constants.h b/ash/components/login/auth/public/cryptohome_key_constants.h similarity index 80% rename from ash/components/login/auth/cryptohome_key_constants.h rename to ash/components/login/auth/public/cryptohome_key_constants.h index 50fadd7..4150edc 100644 --- a/ash/components/login/auth/cryptohome_key_constants.h +++ b/ash/components/login/auth/public/cryptohome_key_constants.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef ASH_COMPONENTS_LOGIN_AUTH_CRYPTOHOME_KEY_CONSTANTS_H_ -#define ASH_COMPONENTS_LOGIN_AUTH_CRYPTOHOME_KEY_CONSTANTS_H_ +#ifndef ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_CRYPTOHOME_KEY_CONSTANTS_H_ +#define ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_CRYPTOHOME_KEY_CONSTANTS_H_ #include "base/component_export.h" @@ -34,4 +34,4 @@ using ::ash::kCryptohomeGaiaKeyLabel; } // namespace chromeos -#endif // ASH_COMPONENTS_LOGIN_AUTH_CRYPTOHOME_KEY_CONSTANTS_H_ +#endif // ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_CRYPTOHOME_KEY_CONSTANTS_H_
diff --git a/ash/components/login/auth/key.cc b/ash/components/login/auth/public/key.cc similarity index 94% rename from ash/components/login/auth/key.cc rename to ash/components/login/auth/public/key.cc index 636d6841..bbbf632a 100644 --- a/ash/components/login/auth/key.cc +++ b/ash/components/login/auth/public/key.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/components/login/auth/key.h" +#include "ash/components/login/auth/public/key.h" #include <memory> @@ -24,18 +24,15 @@ } // namespace -Key::Key() : key_type_(KEY_TYPE_PASSWORD_PLAIN) { -} +Key::Key() : key_type_(KEY_TYPE_PASSWORD_PLAIN) {} Key::Key(const Key& other) = default; Key::Key(const std::string& plain_text_password) - : key_type_(KEY_TYPE_PASSWORD_PLAIN), secret_(plain_text_password) { -} + : key_type_(KEY_TYPE_PASSWORD_PLAIN), secret_(plain_text_password) {} Key::Key(KeyType key_type, const std::string& salt, const std::string& secret) - : key_type_(key_type), salt_(salt), secret_(secret) { -} + : key_type_(key_type), salt_(salt), secret_(secret) {} Key::~Key() = default;
diff --git a/ash/components/login/auth/key.h b/ash/components/login/auth/public/key.h similarity index 92% rename from ash/components/login/auth/key.h rename to ash/components/login/auth/public/key.h index 3ad817c..6809b25 100644 --- a/ash/components/login/auth/key.h +++ b/ash/components/login/auth/public/key.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef ASH_COMPONENTS_LOGIN_AUTH_KEY_H_ -#define ASH_COMPONENTS_LOGIN_AUTH_KEY_H_ +#ifndef ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_KEY_H_ +#define ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_KEY_H_ #include <string> @@ -68,4 +68,4 @@ using ::ash::Key; } // namespace chromeos -#endif // ASH_COMPONENTS_LOGIN_AUTH_KEY_H_ +#endif // ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_KEY_H_
diff --git a/ash/components/login/auth/key_unittest.cc b/ash/components/login/auth/public/key_unittest.cc similarity index 97% rename from ash/components/login/auth/key_unittest.cc rename to ash/components/login/auth/public/key_unittest.cc index 0d3f6a9..719f259b 100644 --- a/ash/components/login/auth/key_unittest.cc +++ b/ash/components/login/auth/public/key_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/components/login/auth/key.h" +#include "ash/components/login/auth/public/key.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/ash/components/login/auth/operation_chain_runner.cc b/ash/components/login/auth/public/operation_chain_runner.cc similarity index 90% rename from ash/components/login/auth/operation_chain_runner.cc rename to ash/components/login/auth/public/operation_chain_runner.cc index af916c9..a758154 100644 --- a/ash/components/login/auth/operation_chain_runner.cc +++ b/ash/components/login/auth/public/operation_chain_runner.cc
@@ -2,12 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/components/login/auth/operation_chain_runner.h" +#include "ash/components/login/auth/public/operation_chain_runner.h" #include <memory> #include <vector> -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/auth_callbacks.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/bind.h" #include "base/containers/stack.h"
diff --git a/ash/components/login/auth/operation_chain_runner.h b/ash/components/login/auth/public/operation_chain_runner.h similarity index 72% rename from ash/components/login/auth/operation_chain_runner.h rename to ash/components/login/auth/public/operation_chain_runner.h index 1f776133..57d2aca 100644 --- a/ash/components/login/auth/operation_chain_runner.h +++ b/ash/components/login/auth/public/operation_chain_runner.h
@@ -2,13 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef ASH_COMPONENTS_LOGIN_AUTH_OPERATION_CHAIN_RUNNER_H_ -#define ASH_COMPONENTS_LOGIN_AUTH_OPERATION_CHAIN_RUNNER_H_ +#ifndef ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_OPERATION_CHAIN_RUNNER_H_ +#define ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_OPERATION_CHAIN_RUNNER_H_ #include <memory> #include <vector> -#include "ash/components/login/auth/auth_callbacks.h" +#include "ash/components/login/auth/public/auth_callbacks.h" #include "base/callback.h" #include "base/component_export.h" @@ -26,4 +26,4 @@ } // namespace ash -#endif // ASH_COMPONENTS_LOGIN_AUTH_OPERATION_CHAIN_RUNNER_H_ +#endif // ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_OPERATION_CHAIN_RUNNER_H_
diff --git a/ash/components/login/auth/operation_chain_runner_unittest.cc b/ash/components/login/auth/public/operation_chain_runner_unittest.cc similarity index 96% rename from ash/components/login/auth/operation_chain_runner_unittest.cc rename to ash/components/login/auth/public/operation_chain_runner_unittest.cc index de6ee7e..e774bc97 100644 --- a/ash/components/login/auth/operation_chain_runner_unittest.cc +++ b/ash/components/login/auth/public/operation_chain_runner_unittest.cc
@@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/components/login/auth/operation_chain_runner.h" +#include "ash/components/login/auth/public/operation_chain_runner.h" #include <memory> -#include "ash/components/login/auth/auth_callbacks.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/auth_callbacks.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/test/bind.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/ash/components/login/auth/saml_password_attributes.cc b/ash/components/login/auth/public/saml_password_attributes.cc similarity index 97% rename from ash/components/login/auth/saml_password_attributes.cc rename to ash/components/login/auth/public/saml_password_attributes.cc index 08fde06..def6b16 100644 --- a/ash/components/login/auth/saml_password_attributes.cc +++ b/ash/components/login/auth/public/saml_password_attributes.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/components/login/auth/saml_password_attributes.h" +#include "ash/components/login/auth/public/saml_password_attributes.h" #include "ash/constants/ash_pref_names.h" #include "base/strings/string_number_conversions.h"
diff --git a/ash/components/login/auth/saml_password_attributes.h b/ash/components/login/auth/public/saml_password_attributes.h similarity index 92% rename from ash/components/login/auth/saml_password_attributes.h rename to ash/components/login/auth/public/saml_password_attributes.h index 0fb19544..3311c454 100644 --- a/ash/components/login/auth/saml_password_attributes.h +++ b/ash/components/login/auth/public/saml_password_attributes.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef ASH_COMPONENTS_LOGIN_AUTH_SAML_PASSWORD_ATTRIBUTES_H_ -#define ASH_COMPONENTS_LOGIN_AUTH_SAML_PASSWORD_ATTRIBUTES_H_ +#ifndef ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_SAML_PASSWORD_ATTRIBUTES_H_ +#define ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_SAML_PASSWORD_ATTRIBUTES_H_ #include <string> @@ -75,4 +75,4 @@ using ::ash::SamlPasswordAttributes; } // namespace chromeos -#endif // ASH_COMPONENTS_LOGIN_AUTH_SAML_PASSWORD_ATTRIBUTES_H_ +#endif // ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_SAML_PASSWORD_ATTRIBUTES_H_
diff --git a/ash/components/login/auth/saml_password_attributes_unittest.cc b/ash/components/login/auth/public/saml_password_attributes_unittest.cc similarity index 97% rename from ash/components/login/auth/saml_password_attributes_unittest.cc rename to ash/components/login/auth/public/saml_password_attributes_unittest.cc index ed1009d..124d7e49 100644 --- a/ash/components/login/auth/saml_password_attributes_unittest.cc +++ b/ash/components/login/auth/public/saml_password_attributes_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/components/login/auth/saml_password_attributes.h" +#include "ash/components/login/auth/public/saml_password_attributes.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/testing_pref_service.h"
diff --git a/ash/components/login/auth/sync_trusted_vault_keys.cc b/ash/components/login/auth/public/sync_trusted_vault_keys.cc similarity index 98% rename from ash/components/login/auth/sync_trusted_vault_keys.cc rename to ash/components/login/auth/public/sync_trusted_vault_keys.cc index f2e96c8..3e6bed1 100644 --- a/ash/components/login/auth/sync_trusted_vault_keys.cc +++ b/ash/components/login/auth/public/sync_trusted_vault_keys.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/components/login/auth/sync_trusted_vault_keys.h" +#include "ash/components/login/auth/public/sync_trusted_vault_keys.h" #include "base/bind.h" #include "base/callback.h"
diff --git a/ash/components/login/auth/sync_trusted_vault_keys.h b/ash/components/login/auth/public/sync_trusted_vault_keys.h similarity index 89% rename from ash/components/login/auth/sync_trusted_vault_keys.h rename to ash/components/login/auth/public/sync_trusted_vault_keys.h index c81234f..f871339a 100644 --- a/ash/components/login/auth/sync_trusted_vault_keys.h +++ b/ash/components/login/auth/public/sync_trusted_vault_keys.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef ASH_COMPONENTS_LOGIN_AUTH_SYNC_TRUSTED_VAULT_KEYS_H_ -#define ASH_COMPONENTS_LOGIN_AUTH_SYNC_TRUSTED_VAULT_KEYS_H_ +#ifndef ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_SYNC_TRUSTED_VAULT_KEYS_H_ +#define ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_SYNC_TRUSTED_VAULT_KEYS_H_ #include <string> #include <vector> @@ -58,4 +58,4 @@ using ::ash::SyncTrustedVaultKeys; } // namespace chromeos -#endif // ASH_COMPONENTS_LOGIN_AUTH_SYNC_TRUSTED_VAULT_KEYS_H_ +#endif // ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_SYNC_TRUSTED_VAULT_KEYS_H_
diff --git a/ash/components/login/auth/sync_trusted_vault_keys_unittest.cc b/ash/components/login/auth/public/sync_trusted_vault_keys_unittest.cc similarity index 98% rename from ash/components/login/auth/sync_trusted_vault_keys_unittest.cc rename to ash/components/login/auth/public/sync_trusted_vault_keys_unittest.cc index f1fea918..9272dfef 100644 --- a/ash/components/login/auth/sync_trusted_vault_keys_unittest.cc +++ b/ash/components/login/auth/public/sync_trusted_vault_keys_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/components/login/auth/sync_trusted_vault_keys.h" +#include "ash/components/login/auth/public/sync_trusted_vault_keys.h" #include "base/values.h" #include "testing/gmock/include/gmock/gmock.h"
diff --git a/ash/components/login/auth/user_context.cc b/ash/components/login/auth/public/user_context.cc similarity index 98% rename from ash/components/login/auth/user_context.cc rename to ash/components/login/auth/public/user_context.cc index 5140ff6..8cdc25e 100644 --- a/ash/components/login/auth/user_context.cc +++ b/ash/components/login/auth/public/user_context.cc
@@ -2,9 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" -#include "ash/components/login/auth/auth_factors_data.h" +#include "ash/components/login/auth/public/auth_factors_data.h" #include "components/user_manager/user.h" #include "components/user_manager/user_manager.h" #include "components/user_manager/user_names.h"
diff --git a/ash/components/login/auth/user_context.h b/ash/components/login/auth/public/user_context.h similarity index 94% rename from ash/components/login/auth/user_context.h rename to ash/components/login/auth/public/user_context.h index acfa630..3b0b6c4 100644 --- a/ash/components/login/auth/user_context.h +++ b/ash/components/login/auth/public/user_context.h
@@ -2,16 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef ASH_COMPONENTS_LOGIN_AUTH_USER_CONTEXT_H_ -#define ASH_COMPONENTS_LOGIN_AUTH_USER_CONTEXT_H_ +#ifndef ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_USER_CONTEXT_H_ +#define ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_USER_CONTEXT_H_ #include <string> -#include "ash/components/login/auth/auth_factors_data.h" -#include "ash/components/login/auth/challenge_response_key.h" -#include "ash/components/login/auth/key.h" -#include "ash/components/login/auth/saml_password_attributes.h" -#include "ash/components/login/auth/sync_trusted_vault_keys.h" +#include "ash/components/login/auth/public/auth_factors_data.h" +#include "ash/components/login/auth/public/challenge_response_key.h" +#include "ash/components/login/auth/public/key.h" +#include "ash/components/login/auth/public/saml_password_attributes.h" +#include "ash/components/login/auth/public/sync_trusted_vault_keys.h" #include "base/component_export.h" #include "components/account_id/account_id.h" #include "components/password_manager/core/browser/password_hash_data.h" @@ -215,4 +215,4 @@ using ::ash::UserContext; } // namespace chromeos -#endif // ASH_COMPONENTS_LOGIN_AUTH_USER_CONTEXT_H_ +#endif // ASH_COMPONENTS_LOGIN_AUTH_PUBLIC_USER_CONTEXT_H_
diff --git a/ash/components/login/auth/stub_authenticator.cc b/ash/components/login/auth/stub_authenticator.cc index 0f93275..a8638ca 100644 --- a/ash/components/login/auth/stub_authenticator.cc +++ b/ash/components/login/auth/stub_authenticator.cc
@@ -4,6 +4,7 @@ #include "ash/components/login/auth/stub_authenticator.h" +#include "ash/components/login/auth/public/auth_failure.h" #include "base/bind.h" #include "base/location.h" #include "base/notreached.h"
diff --git a/ash/components/login/auth/stub_authenticator.h b/ash/components/login/auth/stub_authenticator.h index a2a4aa2f..3e6cc13 100644 --- a/ash/components/login/auth/stub_authenticator.h +++ b/ash/components/login/auth/stub_authenticator.h
@@ -9,7 +9,8 @@ #include "ash/components/login/auth/auth_status_consumer.h" #include "ash/components/login/auth/authenticator.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/auth_failure.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/callback.h" #include "base/component_export.h" #include "base/task/single_thread_task_runner.h"
diff --git a/ash/components/login/auth/stub_authenticator_builder.h b/ash/components/login/auth/stub_authenticator_builder.h index 036dd68..21466f27 100644 --- a/ash/components/login/auth/stub_authenticator_builder.h +++ b/ash/components/login/auth/stub_authenticator_builder.h
@@ -8,8 +8,9 @@ #include <string> #include "ash/components/login/auth/auth_status_consumer.h" +#include "ash/components/login/auth/public/auth_failure.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/components/login/auth/stub_authenticator.h" -#include "ash/components/login/auth/user_context.h" #include "base/component_export.h" #include "base/memory/ref_counted.h"
diff --git a/ash/in_session_auth/authentication_dialog.cc b/ash/in_session_auth/authentication_dialog.cc index c2d25e35..8e00126 100644 --- a/ash/in_session_auth/authentication_dialog.cc +++ b/ash/in_session_auth/authentication_dialog.cc
@@ -7,9 +7,9 @@ #include <memory> #include "ash/components/login/auth/auth_performer.h" -#include "ash/components/login/auth/cryptohome_error.h" -#include "ash/components/login/auth/cryptohome_key_constants.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/cryptohome_error.h" +#include "ash/components/login/auth/public/cryptohome_key_constants.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/public/cpp/in_session_auth_dialog_controller.h" #include "ash/public/cpp/in_session_auth_token_provider.h" #include "ash/public/cpp/shelf_config.h"
diff --git a/ash/in_session_auth/authentication_dialog.h b/ash/in_session_auth/authentication_dialog.h index 41189750..ae84bfc 100644 --- a/ash/in_session_auth/authentication_dialog.h +++ b/ash/in_session_auth/authentication_dialog.h
@@ -8,7 +8,7 @@ #include <memory> #include "ash/components/login/auth/auth_performer.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/public/cpp/in_session_auth_dialog_controller.h" #include "ash/public/cpp/in_session_auth_token_provider.h" #include "base/memory/raw_ptr.h"
diff --git a/ash/in_session_auth/authentication_dialog_unittest.cc b/ash/in_session_auth/authentication_dialog_unittest.cc index 5825f73..f6137522 100644 --- a/ash/in_session_auth/authentication_dialog_unittest.cc +++ b/ash/in_session_auth/authentication_dialog_unittest.cc
@@ -7,10 +7,10 @@ #include <cctype> #include "ash/components/cryptohome/cryptohome_parameters.h" -#include "ash/components/login/auth/auth_factors_data.h" #include "ash/components/login/auth/auth_performer.h" -#include "ash/components/login/auth/cryptohome_key_constants.h" #include "ash/components/login/auth/mock_auth_performer.h" +#include "ash/components/login/auth/public/auth_factors_data.h" +#include "ash/components/login/auth/public/cryptohome_key_constants.h" #include "ash/public/cpp/in_session_auth_token_provider.h" #include "ash/public/cpp/test/mock_in_session_auth_token_provider.h" #include "ash/test/ash_test_base.h"
diff --git a/ash/login/login_screen_controller.cc b/ash/login/login_screen_controller.cc index 149df804..5015e30 100644 --- a/ash/login/login_screen_controller.cc +++ b/ash/login/login_screen_controller.cc
@@ -116,6 +116,7 @@ case ForceFailAuth::kDelayed: // Set a dummy authentication stage so that |IsAuthenticating| returns // true. + LOG(WARNING) << "crbug.com/1339004 : Dummy auth state"; authentication_stage_ = AuthenticationStage::kDoAuthenticate; base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( FROM_HERE, @@ -126,6 +127,7 @@ return; } + LOG(WARNING) << "crbug.com/1339004 : started authentication"; authentication_stage_ = AuthenticationStage::kDoAuthenticate; // Checking if the password is only formed of numbers with base::StringToInt @@ -466,8 +468,10 @@ void LoginScreenController::OnAuthenticateComplete( OnAuthenticateCallback callback, bool success) { + LOG(WARNING) << "crbug.com/1339004 : authentication complete"; authentication_stage_ = AuthenticationStage::kUserCallback; std::move(callback).Run(absl::make_optional<bool>(success)); + LOG(WARNING) << "crbug.com/1339004 : triggered callback"; authentication_stage_ = AuthenticationStage::kIdle; // During smart card login flow, multiple security token requests can be made.
diff --git a/ash/login/ui/access_code_input.cc b/ash/login/ui/access_code_input.cc index f63927f..f8ad780 100644 --- a/ash/login/ui/access_code_input.cc +++ b/ash/login/ui/access_code_input.cc
@@ -121,6 +121,11 @@ NOTIMPLEMENTED(); } +bool FlexCodeInput::IsReadOnly() const { + NOTIMPLEMENTED(); + return false; +} + void FlexCodeInput::ClearInput() { code_field_->SetText(std::u16string()); on_input_change_.Run(false); @@ -455,6 +460,17 @@ } } +bool FixedLengthCodeInput::IsReadOnly() const { + if (!input_fields_.empty()) { + // As SetReadOnly above propagates flag to all fields, just + // check the first field here instead of implementing complex + // combining logic. + return static_cast<views::SelectionControllerDelegate*>(input_fields_[0]) + ->IsReadOnly(); + } + return false; +} + void FixedLengthCodeInput::ClearInput() { for (auto* field : input_fields_) { field->SetText(std::u16string());
diff --git a/ash/login/ui/access_code_input.h b/ash/login/ui/access_code_input.h index f1674f1..1f95057 100644 --- a/ash/login/ui/access_code_input.h +++ b/ash/login/ui/access_code_input.h
@@ -44,6 +44,7 @@ // Makes the internal fields read only. In contrast to 'SetInputEnabled', // the focus remain on the element. virtual void SetReadOnly(bool read_only) = 0; + virtual bool IsReadOnly() const = 0; // Clears the input field(s). virtual void ClearInput() = 0; @@ -88,6 +89,7 @@ void SetInputEnabled(bool input_enabled) override; void SetReadOnly(bool read_only) override; + bool IsReadOnly() const override; // Clears text in input text field. void ClearInput() override; @@ -221,6 +223,7 @@ void SetInputEnabled(bool input_enabled) override; void SetReadOnly(bool read_only) override; + bool IsReadOnly() const override; // Clears the PIN fields. void ClearInput() override;
diff --git a/ash/login/ui/login_auth_user_view.cc b/ash/login/ui/login_auth_user_view.cc index f11f910d..a75e7de 100644 --- a/ash/login/ui/login_auth_user_view.cc +++ b/ash/login/ui/login_auth_user_view.cc
@@ -45,6 +45,7 @@ #include "base/time/time.h" #include "base/timer/timer.h" #include "components/user_manager/user.h" +#include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/accessibility/ax_enums.mojom.h" #include "ui/accessibility/ax_node_data.h" #include "ui/base/l10n/l10n_util.h" @@ -1719,6 +1720,11 @@ } 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()) { @@ -1738,11 +1744,14 @@ } void LoginAuthUserView::OnAuthComplete(absl::optional<bool> auth_success) { + bool failed = !auth_success.value_or(false); + LOG(WARNING) << "crbug.com/1339004 : OnAuthComplete " << failed; + // Clear the password only if auth fails. Make sure to keep the password // view disabled even if auth succeededs, as if the user submits a password // while animating the next lock screen will not work as expected. See // https://crbug.com/808486. - if (!auth_success.has_value() || !auth_success.value()) { + if (failed) { password_view_->Reset(); password_view_->SetReadOnly(false); pin_input_view_->Reset();
diff --git a/ash/login/ui/login_password_view.cc b/ash/login/ui/login_password_view.cc index 4050b3b..fd3c17f 100644 --- a/ash/login/ui/login_password_view.cc +++ b/ash/login/ui/login_password_view.cc
@@ -795,6 +795,10 @@ UpdateUiState(); } +bool LoginPasswordView::IsReadOnly() const { + return textfield_->GetReadOnly(); +} + const char* LoginPasswordView::GetClassName() const { return kLoginPasswordViewName; }
diff --git a/ash/login/ui/login_password_view.h b/ash/login/ui/login_password_view.h index 32193947..ccdd1b2c 100644 --- a/ash/login/ui/login_password_view.h +++ b/ash/login/ui/login_password_view.h
@@ -134,6 +134,7 @@ // Makes the textfield read-only and enables/disables submitting. void SetReadOnly(bool read_only); + bool IsReadOnly() const; // views::View: const char* GetClassName() const override;
diff --git a/ash/login/ui/login_pin_input_view.cc b/ash/login/ui/login_pin_input_view.cc index e26ab94..80dda44 100644 --- a/ash/login/ui/login_pin_input_view.cc +++ b/ash/login/ui/login_pin_input_view.cc
@@ -90,6 +90,7 @@ if (last_field_active && complete) { absl::optional<std::string> user_input = GetCode(); DCHECK(on_submit_); + LOG(WARNING) << "crbug.com/1339004 : Submitting PIN " << IsReadOnly(); SetReadOnly(true); on_submit_.Run(base::UTF8ToUTF16(user_input.value_or(std::string()))); } @@ -246,6 +247,10 @@ code_input_->SetReadOnly(read_only); } +bool LoginPinInputView::IsReadOnly() const { + return is_read_only_; +} + gfx::Size LoginPinInputView::CalculatePreferredSize() const { const int ideal_size = kFieldWidth * length_ + kFieldSpace * (length_ - 1);
diff --git a/ash/login/ui/login_pin_input_view.h b/ash/login/ui/login_pin_input_view.h index 5b585a22..0aff557b 100644 --- a/ash/login/ui/login_pin_input_view.h +++ b/ash/login/ui/login_pin_input_view.h
@@ -83,6 +83,7 @@ // Sets the field as read only. The field is made read only during an // authentication request. void SetReadOnly(bool read_only); + bool IsReadOnly() const; // views::View gfx::Size CalculatePreferredSize() const override; void RequestFocus() override;
diff --git a/ash/login/ui/login_remove_account_dialog.cc b/ash/login/ui/login_remove_account_dialog.cc index 8664ceb..605432c 100644 --- a/ash/login/ui/login_remove_account_dialog.cc +++ b/ash/login/ui/login_remove_account_dialog.cc
@@ -238,7 +238,8 @@ remove_user_button_->SetBackgroundAndFont(/*alert_mode=*/false); // Reset button's description to none. remove_user_button_->GetViewAccessibility().OverrideDescription( - std::u16string()); + std::u16string(), + ax::mojom::DescriptionFrom::kAttributeExplicitlyEmpty); } }
diff --git a/ash/login/ui/public_account_menu_view.cc b/ash/login/ui/public_account_menu_view.cc index cce2a743..6246c8e 100644 --- a/ash/login/ui/public_account_menu_view.cc +++ b/ash/login/ui/public_account_menu_view.cc
@@ -21,7 +21,7 @@ public: PublicAccountComboboxModel( const std::vector<PublicAccountMenuView::Item>& items, - const size_t default_index) + size_t default_index) : items_(items), default_index_(default_index) {} PublicAccountComboboxModel(const PublicAccountComboboxModel&) = delete; @@ -31,10 +31,10 @@ ~PublicAccountComboboxModel() override = default; // ui::ComboboxModel: - int GetItemCount() const override { return items_.size(); } + size_t GetItemCount() const override { return items_.size(); } // ui::ComboboxModel: - std::u16string GetItemAt(int index) const override { + std::u16string GetItemAt(size_t index) const override { return base::UTF8ToUTF16(items_[index].title); } @@ -43,7 +43,7 @@ // group items are considered as some sort of separators. We choose to // represent them as disabled items because they were presented in a similar // fashion before (i.e. the group name was visible but unclickable). - bool IsItemEnabledAt(int index) const override { + bool IsItemEnabledAt(size_t index) const override { return !items_[index].is_group; } @@ -54,7 +54,7 @@ private: const std::vector<PublicAccountMenuView::Item>& items_; - const int default_index_; + const size_t default_index_; }; } // namespace @@ -62,7 +62,7 @@ PublicAccountMenuView::Item::Item() = default; PublicAccountMenuView::PublicAccountMenuView(const std::vector<Item>& items, - const size_t selected_index, + size_t selected_index, const OnSelect& on_select) : views::Combobox( std::make_unique<PublicAccountComboboxModel>(items, selected_index)),
diff --git a/ash/login/ui/public_account_menu_view.h b/ash/login/ui/public_account_menu_view.h index adf94ad..a4ea2a3 100644 --- a/ash/login/ui/public_account_menu_view.h +++ b/ash/login/ui/public_account_menu_view.h
@@ -26,7 +26,7 @@ using OnSelect = base::RepeatingCallback<void(const std::string& value)>; PublicAccountMenuView(const std::vector<Item>& items, - const size_t selected_index, + size_t selected_index, const OnSelect& on_select); PublicAccountMenuView(const PublicAccountMenuView&) = delete; PublicAccountMenuView& operator=(const PublicAccountMenuView&) = delete;
diff --git a/ash/metrics/stylus_metrics_recorder.h b/ash/metrics/stylus_metrics_recorder.h index 8d42475..07445fb 100644 --- a/ash/metrics/stylus_metrics_recorder.h +++ b/ash/metrics/stylus_metrics_recorder.h
@@ -7,7 +7,7 @@ #include "ash/ash_export.h" #include "ash/system/power/peripheral_battery_listener.h" -#include "chromeos/components/feature_usage/feature_usage_metrics.h" +#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h" #include "third_party/abseil-cpp/absl/types/optional.h" namespace ash {
diff --git a/ash/public/cpp/in_session_auth_token_provider.h b/ash/public/cpp/in_session_auth_token_provider.h index e1372002..0deccd33 100644 --- a/ash/public/cpp/in_session_auth_token_provider.h +++ b/ash/public/cpp/in_session_auth_token_provider.h
@@ -5,7 +5,7 @@ #ifndef ASH_PUBLIC_CPP_IN_SESSION_AUTH_TOKEN_PROVIDER_H_ #define ASH_PUBLIC_CPP_IN_SESSION_AUTH_TOKEN_PROVIDER_H_ -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/public/cpp/ash_public_export.h" #include "base/callback_forward.h" #include "base/time/time.h"
diff --git a/ash/quick_pair/common/BUILD.gn b/ash/quick_pair/common/BUILD.gn index e0828a2c..5b1c7ba 100644 --- a/ash/quick_pair/common/BUILD.gn +++ b/ash/quick_pair/common/BUILD.gn
@@ -45,7 +45,7 @@ "//ash/constants:constants", "//ash/services/quick_pair/public/mojom", "//base", - "//chromeos/components/feature_usage", + "//chromeos/ash/components/feature_usage", "//components/prefs", "//device/bluetooth", "//device/bluetooth/public/cpp", @@ -91,7 +91,7 @@ ":test_support", "//ash/constants:constants", "//base/test:test_support", - "//chromeos/components/feature_usage", + "//chromeos/ash/components/feature_usage", "//components/prefs:test_support", "//device/bluetooth", "//device/bluetooth:mocks",
diff --git a/ash/quick_pair/common/fast_pair/fast_pair_feature_usage_metrics_logger.h b/ash/quick_pair/common/fast_pair/fast_pair_feature_usage_metrics_logger.h index ff32576..a938fa45 100644 --- a/ash/quick_pair/common/fast_pair/fast_pair_feature_usage_metrics_logger.h +++ b/ash/quick_pair/common/fast_pair/fast_pair_feature_usage_metrics_logger.h
@@ -9,7 +9,7 @@ #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/scoped_observation.h" -#include "chromeos/components/feature_usage/feature_usage_metrics.h" +#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h" #include "device/bluetooth/bluetooth_adapter.h" #include "third_party/abseil-cpp/absl/types/optional.h"
diff --git a/ash/quick_pair/common/fast_pair/fast_pair_feature_usage_metrics_logger_unittest.cc b/ash/quick_pair/common/fast_pair/fast_pair_feature_usage_metrics_logger_unittest.cc index 4412381..cd4e5d3a 100644 --- a/ash/quick_pair/common/fast_pair/fast_pair_feature_usage_metrics_logger_unittest.cc +++ b/ash/quick_pair/common/fast_pair/fast_pair_feature_usage_metrics_logger_unittest.cc
@@ -11,7 +11,7 @@ #include "base/memory/scoped_refptr.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/task_environment.h" -#include "chromeos/components/feature_usage/feature_usage_metrics.h" +#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h" #include "components/prefs/pref_registry.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/testing_pref_service.h"
diff --git a/ash/system/holding_space/holding_space_item_view.cc b/ash/system/holding_space/holding_space_item_view.cc index 008e993..14f1861 100644 --- a/ash/system/holding_space/holding_space_item_view.cc +++ b/ash/system/holding_space/holding_space_item_view.cc
@@ -134,7 +134,15 @@ // Accessibility. GetViewAccessibility().OverrideName(item->GetAccessibleName()); - GetViewAccessibility().OverrideDescription(base::EmptyString16()); + + // When the description is not specified, tooltip text will be used. + // That text is redundant to the name, but different enough that it is + // still exposed to assistive technologies which may then present both. + // To avoid that redundant presentation, set the description explicitly + // to the empty string. See crrev.com/c/3218112. + GetViewAccessibility().OverrideDescription( + std::u16string(), ax::mojom::DescriptionFrom::kAttributeExplicitlyEmpty); + GetViewAccessibility().OverrideRole(ax::mojom::Role::kListItem); // Layer.
diff --git a/ash/system/power/power_event_observer.cc b/ash/system/power/power_event_observer.cc index 8254a30..0c34d9fe 100644 --- a/ash/system/power/power_event_observer.cc +++ b/ash/system/power/power_event_observer.cc
@@ -21,7 +21,7 @@ #include "base/location.h" #include "base/scoped_multi_source_observation.h" #include "base/threading/thread_task_runner_handle.h" -#include "chromeos/components/feature_usage/feature_usage_metrics.h" +#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h" #include "ui/aura/window.h" #include "ui/aura/window_tree_host.h" #include "ui/base/user_activity/user_activity_detector.h"
diff --git a/ash/system/power/power_event_observer_unittest.cc b/ash/system/power/power_event_observer_unittest.cc index 33f848f..d713e2c1 100644 --- a/ash/system/power/power_event_observer_unittest.cc +++ b/ash/system/power/power_event_observer_unittest.cc
@@ -17,7 +17,7 @@ #include "ash/wm/test_session_state_animator.h" #include "base/test/metrics/histogram_tester.h" #include "base/time/time.h" -#include "chromeos/components/feature_usage/feature_usage_metrics.h" +#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h" #include "chromeos/dbus/power/fake_power_manager_client.h" #include "chromeos/dbus/power_manager/suspend.pb.h" #include "testing/gmock/include/gmock/gmock.h"
diff --git a/ash/webui/diagnostics_ui/BUILD.gn b/ash/webui/diagnostics_ui/BUILD.gn index 3a34332c5..7629de72 100644 --- a/ash/webui/diagnostics_ui/BUILD.gn +++ b/ash/webui/diagnostics_ui/BUILD.gn
@@ -26,7 +26,7 @@ "//ash/webui/diagnostics_ui/backend", "//ash/webui/diagnostics_ui/mojom", "//ash/webui/resources:diagnostics_app_resources", - "//chromeos/components/feature_usage:feature_usage", + "//chromeos/ash/components/feature_usage", "//chromeos/login/login_state", "//chromeos/strings/", "//content/public/browser",
diff --git a/ash/webui/diagnostics_ui/DEPS b/ash/webui/diagnostics_ui/DEPS index 78afd32..2775d94 100644 --- a/ash/webui/diagnostics_ui/DEPS +++ b/ash/webui/diagnostics_ui/DEPS
@@ -10,7 +10,4 @@ "+ui/resources", "+ui/shell_dialogs", "+ui/web_dialogs", - - # SFUL Metrics DEPS - "+chromeos/components/feature_usage", ]
diff --git a/ash/webui/diagnostics_ui/diagnostics_metrics.cc b/ash/webui/diagnostics_ui/diagnostics_metrics.cc index ec5bc459..632380e 100644 --- a/ash/webui/diagnostics_ui/diagnostics_metrics.cc +++ b/ash/webui/diagnostics_ui/diagnostics_metrics.cc
@@ -5,7 +5,7 @@ #include "ash/webui/diagnostics_ui/diagnostics_metrics.h" #include "ash/constants/ash_features.h" -#include "chromeos/components/feature_usage/feature_usage_metrics.h" +#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h" namespace ash { namespace diagnostics {
diff --git a/ash/webui/diagnostics_ui/diagnostics_metrics.h b/ash/webui/diagnostics_ui/diagnostics_metrics.h index 9e0e0d4..53eb853f 100644 --- a/ash/webui/diagnostics_ui/diagnostics_metrics.h +++ b/ash/webui/diagnostics_ui/diagnostics_metrics.h
@@ -5,7 +5,7 @@ #ifndef ASH_WEBUI_DIAGNOSTICS_UI_DIAGNOSTICS_METRICS_H_ #define ASH_WEBUI_DIAGNOSTICS_UI_DIAGNOSTICS_METRICS_H_ -#include "chromeos/components/feature_usage/feature_usage_metrics.h" +#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h" namespace ash { namespace diagnostics {
diff --git a/ash/webui/media_app_ui/BUILD.gn b/ash/webui/media_app_ui/BUILD.gn index 28c5570..267c5c2 100644 --- a/ash/webui/media_app_ui/BUILD.gn +++ b/ash/webui/media_app_ui/BUILD.gn
@@ -77,9 +77,9 @@ ] data = [ + "//ash/webui/system_apps/public/js/dom_testing_helpers.js", "test/driver.js", "test/driver_api.js", - "test/dom_testing_helpers.js", "test/guest_query_receiver.js", "test/media_app_ui_browsertest.js", "test/media_app_guest_ui_browsertest.js", @@ -149,18 +149,13 @@ sources = [ "test/driver_api.js" ] } -js_library("test_dom_testing_helpers_js") { - testonly = true - sources = [ "test/dom_testing_helpers.js" ] -} - js_library("test_guest_query_receiver_js") { testonly = true sources = [ "test/guest_query_receiver.js" ] deps = [ - ":test_dom_testing_helpers_js", ":test_driver_api_js", "//ash/webui/media_app_ui/resources/js:receiver", + "//ash/webui/system_apps/public/js:dom_testing_helpers", "//ash/webui/system_apps/public/js:message_pipe", ] }
diff --git a/ash/webui/media_app_ui/test/media_app_ui_browsertest.cc b/ash/webui/media_app_ui/test/media_app_ui_browsertest.cc index c497805..026c79e 100644 --- a/ash/webui/media_app_ui/test/media_app_ui_browsertest.cc +++ b/ash/webui/media_app_ui/test/media_app_ui_browsertest.cc
@@ -14,7 +14,7 @@ // File containing the test utility library, shared with integration tests. constexpr base::FilePath::CharType kTestLibraryPath[] = - FILE_PATH_LITERAL("ash/webui/media_app_ui/test/dom_testing_helpers.js"); + FILE_PATH_LITERAL("ash/webui/system_apps/public/js/dom_testing_helpers.js"); // Test cases that run in the guest context. constexpr char kGuestTestCases[] = "media_app_guest_ui_browsertest.js";
diff --git a/ash/webui/system_apps/public/js/BUILD.gn b/ash/webui/system_apps/public/js/BUILD.gn index 2653f2f..6ff11df 100644 --- a/ash/webui/system_apps/public/js/BUILD.gn +++ b/ash/webui/system_apps/public/js/BUILD.gn
@@ -16,6 +16,10 @@ js_library("sandboxed_load_time_data") { } +js_library("dom_testing_helpers") { + testonly = true +} + js_library("message_pipe.m") { sources = [ "$root_gen_dir/ash/webui/system_apps/public/js/message_pipe.m.js" ]
diff --git a/ash/webui/media_app_ui/test/dom_testing_helpers.js b/ash/webui/system_apps/public/js/dom_testing_helpers.js similarity index 100% rename from ash/webui/media_app_ui/test/dom_testing_helpers.js rename to ash/webui/system_apps/public/js/dom_testing_helpers.js
diff --git a/ash/wm/desks/templates/saved_desk_icon_view.cc b/ash/wm/desks/templates/saved_desk_icon_view.cc index e08d2f1..b789c8ed 100644 --- a/ash/wm/desks/templates/saved_desk_icon_view.cc +++ b/ash/wm/desks/templates/saved_desk_icon_view.cc
@@ -124,7 +124,8 @@ ->incognito_window_color_provider()); icon_view_->GetViewAccessibility().OverrideRole(ax::mojom::Role::kImage); - icon_view_->GetViewAccessibility().OverrideName(app_title); + if (!app_title.empty()) + icon_view_->GetViewAccessibility().OverrideName(app_title); // PWAs (e.g. Messages) should use icon identifier as they share the same app // id as Chrome and would return short name for app id as "Chromium" (see
diff --git a/ash/wm/desks/templates/saved_desk_presenter.cc b/ash/wm/desks/templates/saved_desk_presenter.cc index b288f3c..48521359 100644 --- a/ash/wm/desks/templates/saved_desk_presenter.cc +++ b/ash/wm/desks/templates/saved_desk_presenter.cc
@@ -345,6 +345,27 @@ Shell::Get()->desks_templates_delegate()->LaunchAppsFromTemplate( std::move(desk_template), time_launch_started, delay); + auto* overview_controller = Shell::Get()->overview_controller(); + if (!overview_controller->InOverviewSession()) { + // Note: it is the intention that we don't leave overview mode when + // launching a saved desk. However, if something goes wrong when launching a + // window and the correct properties aren't applied, then we may find that + // we have left overview mode. + // + // The `SavedDeskPresenter` is indirectly owned by the overview session, so + // if we get here, `this` is gone and we must not access any member + // functions or variables. + + // Bare minimum code to remove save & recall desks. + if (saved_desk_type == DeskTemplateType::kSaveAndRecall) { + auto* desk_model = + Shell::Get()->desks_templates_delegate()->GetDeskModel(); + desk_model->DeleteEntry(uuid, base::DoNothing()); + } + + return; + } + DesksBarView* desks_bar_view = const_cast<DesksBarView*>( overview_session_->GetGridWithRootWindow(root_window)->desks_bar_view()); desks_bar_view->NudgeDeskName(desk_index);
diff --git a/base/BUILD.gn b/base/BUILD.gn index ca7a96e..3688f635 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn
@@ -1683,7 +1683,6 @@ "android/reached_addresses_bitset.h", "android/reached_code_profiler.cc", "android/reached_code_profiler.h", - "android/record_histogram.cc", "android/remove_stale_data.cc", "android/remove_stale_data.h", "android/scoped_hardware_buffer_fence_sync.cc", @@ -4004,7 +4003,6 @@ "android/java/src/org/chromium/base/library_loader/LibraryPrefetcher.java", "android/java/src/org/chromium/base/memory/JavaHeapDumpGenerator.java", "android/java/src/org/chromium/base/metrics/NativeUmaRecorder.java", - "android/java/src/org/chromium/base/metrics/RecordHistogram.java", "android/java/src/org/chromium/base/metrics/StatisticsRecorderAndroid.java", "android/java/src/org/chromium/base/process_launcher/ChildProcessService.java", "android/java/src/org/chromium/base/task/PostTask.java",
diff --git a/base/android/java/src/org/chromium/base/metrics/NativeUmaRecorder.java b/base/android/java/src/org/chromium/base/metrics/NativeUmaRecorder.java index d2157c38..e3e5509 100644 --- a/base/android/java/src/org/chromium/base/metrics/NativeUmaRecorder.java +++ b/base/android/java/src/org/chromium/base/metrics/NativeUmaRecorder.java
@@ -145,6 +145,9 @@ int getHistogramValueCountForTesting(String name, int sample, long snapshotPtr); int getHistogramTotalCountForTesting(String name, long snapshotPtr); + long createHistogramSnapshotForTesting(); + void destroyHistogramSnapshotForTesting(long snapshotPtr); + long addActionCallbackForTesting(Callback<String> callback); void removeActionCallbackForTesting(long callbackId); }
diff --git a/base/android/java/src/org/chromium/base/metrics/RecordHistogram.java b/base/android/java/src/org/chromium/base/metrics/RecordHistogram.java index 4c34c7f..af3b0aa 100644 --- a/base/android/java/src/org/chromium/base/metrics/RecordHistogram.java +++ b/base/android/java/src/org/chromium/base/metrics/RecordHistogram.java
@@ -8,14 +8,11 @@ import androidx.annotation.VisibleForTesting; -import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.MainDex; -import org.chromium.base.annotations.NativeMethods; /** * Java API for recording UMA histograms. * */ -@JNINamespace("base::android") @MainDex public class RecordHistogram { /** @@ -289,13 +286,4 @@ public static int getHistogramTotalCountForTesting(String name) { return UmaRecorderHolder.get().getHistogramTotalCountForTesting(name); } - - /** - * Natives API to read metrics reported when testing. - */ - @NativeMethods - public interface Natives { - long createHistogramSnapshotForTesting(); - void destroyHistogramSnapshotForTesting(long snapshotPtr); - } }
diff --git a/base/android/native_uma_recorder.cc b/base/android/native_uma_recorder.cc index d5d70d8f..561d1de 100644 --- a/base/android/native_uma_recorder.cc +++ b/base/android/native_uma_recorder.cc
@@ -281,6 +281,20 @@ return actual_count; } +jlong JNI_NativeUmaRecorder_CreateHistogramSnapshotForTesting(JNIEnv* env) { + HistogramsSnapshot* snapshot = new HistogramsSnapshot(); + for (const auto* const histogram : StatisticsRecorder::GetHistograms()) { + (*snapshot)[histogram->histogram_name()] = histogram->SnapshotSamples(); + } + return reinterpret_cast<intptr_t>(snapshot); +} + +void JNI_NativeUmaRecorder_DestroyHistogramSnapshotForTesting( + JNIEnv* env, + jlong snapshot_ptr) { + delete reinterpret_cast<HistogramsSnapshot*>(snapshot_ptr); +} + static jlong JNI_NativeUmaRecorder_AddActionCallbackForTesting( JNIEnv* env, const JavaParamRef<jobject>& callback) {
diff --git a/base/android/record_histogram.cc b/base/android/record_histogram.cc deleted file mode 100644 index cdcb470..0000000 --- a/base/android/record_histogram.cc +++ /dev/null
@@ -1,37 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <stdint.h> - -#include <map> -#include <string> - -#include "base/android/jni_android.h" -#include "base/android/jni_string.h" -#include "base/base_jni_headers/RecordHistogram_jni.h" -#include "base/metrics/histogram.h" -#include "base/metrics/statistics_recorder.h" - -namespace base { -namespace android { - -using HistogramsSnapshot = - std::map<std::string, std::unique_ptr<HistogramSamples>>; - -jlong JNI_RecordHistogram_CreateHistogramSnapshotForTesting(JNIEnv* env) { - HistogramsSnapshot* snapshot = new HistogramsSnapshot(); - for (const auto* const histogram : StatisticsRecorder::GetHistograms()) { - (*snapshot)[histogram->histogram_name()] = histogram->SnapshotSamples(); - } - return reinterpret_cast<intptr_t>(snapshot); -} - -void JNI_RecordHistogram_DestroyHistogramSnapshotForTesting( - JNIEnv* env, - jlong snapshot_ptr) { - delete reinterpret_cast<HistogramsSnapshot*>(snapshot_ptr); -} - -} // namespace android -} // namespace base
diff --git a/base/test/android/javatests/src/org/chromium/base/test/metrics/HistogramTestRule.java b/base/test/android/javatests/src/org/chromium/base/test/metrics/HistogramTestRule.java index dd4e1c4..833698e 100644 --- a/base/test/android/javatests/src/org/chromium/base/test/metrics/HistogramTestRule.java +++ b/base/test/android/javatests/src/org/chromium/base/test/metrics/HistogramTestRule.java
@@ -9,7 +9,6 @@ import org.junit.runners.model.Statement; import org.chromium.base.metrics.NativeUmaRecorderJni; -import org.chromium.base.metrics.RecordHistogramJni; /** * A {@link TestRule} to test histograms. Returns the amount of recorded samples during a test run. @@ -38,11 +37,11 @@ @Override public void evaluate() throws Throwable { assert mSnapShotPtr == 0; - mSnapShotPtr = RecordHistogramJni.get().createHistogramSnapshotForTesting(); + mSnapShotPtr = NativeUmaRecorderJni.get().createHistogramSnapshotForTesting(); try { base.evaluate(); } finally { - RecordHistogramJni.get().destroyHistogramSnapshotForTesting(mSnapShotPtr); + NativeUmaRecorderJni.get().destroyHistogramSnapshotForTesting(mSnapShotPtr); mSnapShotPtr = 0; } }
diff --git a/base/trace_event/trace_logging_minimal_win.cc b/base/trace_event/trace_logging_minimal_win.cc index 5a63183..0a3e17a6 100644 --- a/base/trace_event/trace_logging_minimal_win.cc +++ b/base/trace_event/trace_logging_minimal_win.cc
@@ -7,6 +7,7 @@ #include <evntrace.h> #include "base/check_op.h" +#include "base/logging.h" #include "base/numerics/checked_math.h" /* @@ -74,7 +75,7 @@ void* enable_callback_context) noexcept { ULONG status = Register(provider_name, provider_guid, enable_callback, enable_callback_context); - DCHECK_EQ(status, ULONG{ERROR_SUCCESS}); + LOG_IF(ERROR, status != ERROR_SUCCESS) << "Provider resistration failure"; } // Appends a nul-terminated string to a metadata block. @@ -100,7 +101,7 @@ return; ULONG status = EventUnregister(reg_handle_); - DCHECK_EQ(status, ULONG{ERROR_SUCCESS}); + LOG_IF(ERROR, status != ERROR_SUCCESS) << "Provider unregistration failure"; reg_handle_ = 0; level_plus1_ = 0; }
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn index b975153..b6aaae9 100644 --- a/build/config/compiler/BUILD.gn +++ b/build/config/compiler/BUILD.gn
@@ -317,7 +317,7 @@ cflags += [ "-fno-strict-aliasing" ] # See http://crbug.com/32204 # Stack protection. - if (is_mac) { + if (is_apple) { # The strong variant of the stack protector significantly increases # binary size, so only enable it in debug mode. if (is_debug) { @@ -369,7 +369,7 @@ ] } - # Non-Mac Posix and Fuchsia compiler flags setup. + # Non-Apple Posix and Fuchsia compiler flags setup. # ----------------------------------- if ((is_posix && !is_apple) || is_fuchsia) { if (enable_profiling) { @@ -608,10 +608,11 @@ cflags_c += [ "/std:c11" ] cflags_cc += [ "/std:c++17" ] } else if (!is_nacl) { - # TODO(mcgrathr) - the NaCl GCC toolchain doesn't support either gnu11/gnu++11 - # or c11/c++11; we technically don't need this toolchain any more, but there - # are still a few buildbots using it, so until those are turned off - # we need the !is_nacl clause and the (is_nacl && is_clang) clause, above. + # TODO(mcgrathr) - the NaCl GCC toolchain doesn't support either + # gnu11/gnu++11 or c11/c++11; we technically don't need this toolchain any + # more, but there are still a few buildbots using it, so until those are + # turned off we need the !is_nacl clause and the (is_nacl && is_clang) + # clause, above. cflags_c += [ "-std=c11" ] cflags_cc += [ "-std=c++17" ] }
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1 index 34d797b..60b498d6 100644 --- a/build/fuchsia/linux_internal.sdk.sha1 +++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@ -8.20220714.3.1 +8.20220715.2.1
diff --git a/chrome/VERSION b/chrome/VERSION index 8709312..67d1e0c3 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=105 MINOR=0 -BUILD=5182 +BUILD=5183 PATCH=0
diff --git a/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryControllerTest.java b/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryControllerTest.java index 5af6f86..bab8dda 100644 --- a/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryControllerTest.java +++ b/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryControllerTest.java
@@ -28,7 +28,6 @@ import com.google.android.material.tabs.TabLayout; import org.junit.Before; -import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -38,11 +37,9 @@ import org.chromium.base.Callback; import org.chromium.base.FeatureList; import org.chromium.base.metrics.RecordHistogram; -import org.chromium.base.metrics.RecordHistogramJni; import org.chromium.base.metrics.UmaRecorderHolder; import org.chromium.base.task.test.CustomShadowAsyncTask; import org.chromium.base.test.BaseRobolectricTestRunner; -import org.chromium.base.test.util.JniMocker; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.keyboard_accessory.AccessoryAction; import org.chromium.chrome.browser.keyboard_accessory.AccessoryBarContents; @@ -71,9 +68,6 @@ @RunWith(BaseRobolectricTestRunner.class) @Config(manifest = Config.NONE, shadows = {CustomShadowAsyncTask.class}) public class KeyboardAccessoryControllerTest { - @Rule - public JniMocker mocker = new JniMocker(); - @Mock private PropertyObserver<PropertyKey> mMockPropertyObserver; @Mock @@ -88,8 +82,6 @@ private KeyboardAccessoryCoordinator.TabSwitchingDelegate mMockTabSwitchingDelegate; @Mock private AutofillDelegate mMockAutofillDelegate; - @Mock - private RecordHistogram.Natives mMockRecordHistogram; private final KeyboardAccessoryData.Tab mTestTab = new KeyboardAccessoryData.Tab("Passwords", null, null, 0, 0, null); @@ -103,7 +95,6 @@ UmaRecorderHolder.resetForTesting(); MockitoAnnotations.initMocks(this); setAutofillFeature(false); - mocker.mock(RecordHistogramJni.TEST_HOOKS, mMockRecordHistogram); when(mMockView.getTabLayout()).thenReturn(mock(TabLayout.class)); when(mMockTabLayout.getTabSwitchingDelegate()).thenReturn(mMockTabSwitchingDelegate); mCoordinator = new KeyboardAccessoryCoordinator(
diff --git a/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetControllerTest.java b/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetControllerTest.java index 8e6319b3..4ff6ac9 100644 --- a/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetControllerTest.java +++ b/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetControllerTest.java
@@ -23,7 +23,6 @@ import androidx.recyclerview.widget.RecyclerView; import org.junit.Before; -import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -31,11 +30,9 @@ import org.robolectric.annotation.Config; import org.chromium.base.metrics.RecordHistogram; -import org.chromium.base.metrics.RecordHistogramJni; import org.chromium.base.metrics.UmaRecorderHolder; import org.chromium.base.task.test.CustomShadowAsyncTask; import org.chromium.base.test.BaseRobolectricTestRunner; -import org.chromium.base.test.util.JniMocker; import org.chromium.chrome.browser.keyboard_accessory.AccessorySheetTrigger; import org.chromium.chrome.browser.keyboard_accessory.ManualFillingMetricsRecorder; import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.Tab; @@ -51,8 +48,6 @@ @RunWith(BaseRobolectricTestRunner.class) @Config(manifest = Config.NONE, shadows = {CustomShadowAsyncTask.class}) public class AccessorySheetControllerTest { - @Rule - public JniMocker mocker = new JniMocker(); @Mock private PropertyObservable.PropertyObserver<PropertyKey> mMockPropertyObserver; @Mock @@ -61,8 +56,6 @@ private AccessorySheetView mMockView; @Mock private RecyclerView mMockRecyclerView; - @Mock - private RecordHistogram.Natives mMockRecordHistogramNatives; private final Tab[] mTabs = new Tab[] {new Tab("Passwords", null, null, 0, 0, null), new Tab("Passwords", null, null, 0, 0, null), @@ -77,7 +70,6 @@ public void setUp() { UmaRecorderHolder.resetForTesting(); MockitoAnnotations.initMocks(this); - mocker.mock(RecordHistogramJni.TEST_HOOKS, mMockRecordHistogramNatives); when(mMockView.getLayoutParams()).thenReturn(new ViewGroup.LayoutParams(0, 0)); mCoordinator = new AccessorySheetCoordinator(new FakeViewProvider<>(mMockView)); mMediator = mCoordinator.getMediatorForTesting();
diff --git a/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AddressAccessorySheetControllerTest.java b/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AddressAccessorySheetControllerTest.java index 5bc99ba..6ead9e7 100644 --- a/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AddressAccessorySheetControllerTest.java +++ b/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AddressAccessorySheetControllerTest.java
@@ -35,11 +35,9 @@ import org.robolectric.annotation.Config; import org.chromium.base.metrics.RecordHistogram; -import org.chromium.base.metrics.RecordHistogramJni; import org.chromium.base.metrics.UmaRecorderHolder; import org.chromium.base.task.test.CustomShadowAsyncTask; import org.chromium.base.test.BaseRobolectricTestRunner; -import org.chromium.base.test.util.JniMocker; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType; import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData; @@ -58,16 +56,12 @@ @Features.EnableFeatures({ChromeFeatureList.AUTOFILL_KEYBOARD_ACCESSORY}) public class AddressAccessorySheetControllerTest { @Rule - public JniMocker mocker = new JniMocker(); - @Rule public TestRule mFeaturesProcessorRule = new Features.JUnitProcessor(); @Mock private RecyclerView mMockView; @Mock private ListObservable.ListObserver<Void> mMockItemListObserver; - @Mock - private RecordHistogram.Natives mMockRecordHistogramNatives; private AddressAccessorySheetCoordinator mCoordinator; private AccessorySheetTabModel mSheetDataPieces; @@ -76,7 +70,6 @@ public void setUp() { UmaRecorderHolder.resetForTesting(); MockitoAnnotations.initMocks(this); - mocker.mock(RecordHistogramJni.TEST_HOOKS, mMockRecordHistogramNatives); AccessorySheetTabCoordinator.IconProvider.setIconForTesting(mock(Drawable.class)); mCoordinator = new AddressAccessorySheetCoordinator(RuntimeEnvironment.application, null); assertNotNull(mCoordinator);
diff --git a/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/CreditCardAccessorySheetControllerTest.java b/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/CreditCardAccessorySheetControllerTest.java index 51816cf..a64848c 100644 --- a/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/CreditCardAccessorySheetControllerTest.java +++ b/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/CreditCardAccessorySheetControllerTest.java
@@ -36,11 +36,9 @@ import org.robolectric.annotation.Config; import org.chromium.base.metrics.RecordHistogram; -import org.chromium.base.metrics.RecordHistogramJni; import org.chromium.base.metrics.UmaRecorderHolder; import org.chromium.base.task.test.CustomShadowAsyncTask; import org.chromium.base.test.BaseRobolectricTestRunner; -import org.chromium.base.test.util.JniMocker; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType; import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData; @@ -60,15 +58,11 @@ @Features.EnableFeatures(ChromeFeatureList.AUTOFILL_KEYBOARD_ACCESSORY) public class CreditCardAccessorySheetControllerTest { @Rule - public JniMocker mocker = new JniMocker(); - @Rule public TestRule mFeaturesProcessorRule = new Features.JUnitProcessor(); @Mock private RecyclerView mMockView; @Mock private ListObservable.ListObserver<Void> mMockItemListObserver; - @Mock - private RecordHistogram.Natives mMockRecordHistogramNatives; private CreditCardAccessorySheetCoordinator mCoordinator; private AccessorySheetTabModel mSheetDataPieces; @@ -77,7 +71,6 @@ public void setUp() { UmaRecorderHolder.resetForTesting(); MockitoAnnotations.initMocks(this); - mocker.mock(RecordHistogramJni.TEST_HOOKS, mMockRecordHistogramNatives); AccessorySheetTabCoordinator.IconProvider.setIconForTesting(mock(Drawable.class)); mCoordinator = new CreditCardAccessorySheetCoordinator(RuntimeEnvironment.application, null);
diff --git a/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetControllerTest.java b/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetControllerTest.java index 0422ca1..dcd0546 100644 --- a/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetControllerTest.java +++ b/chrome/android/features/keyboard_accessory/junit/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetControllerTest.java
@@ -42,11 +42,9 @@ import org.robolectric.annotation.Config; import org.chromium.base.metrics.RecordHistogram; -import org.chromium.base.metrics.RecordHistogramJni; import org.chromium.base.metrics.UmaRecorderHolder; import org.chromium.base.task.test.CustomShadowAsyncTask; import org.chromium.base.test.BaseRobolectricTestRunner; -import org.chromium.base.test.util.JniMocker; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.keyboard_accessory.AccessoryAction; import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType; @@ -72,15 +70,11 @@ @Features.EnableFeatures(ChromeFeatureList.AUTOFILL_KEYBOARD_ACCESSORY) public class PasswordAccessorySheetControllerTest { @Rule - public JniMocker mocker = new JniMocker(); - @Rule public TestRule mFeaturesProcessorRule = new Features.JUnitProcessor(); @Mock private RecyclerView mMockView; @Mock private ListObservable.ListObserver<Void> mMockItemListObserver; - @Mock - private RecordHistogram.Natives mMockRecordHistogramNatives; private PasswordAccessorySheetCoordinator mCoordinator; private AccessorySheetTabModel mSheetDataPieces; @@ -89,7 +83,6 @@ public void setUp() { UmaRecorderHolder.resetForTesting(); MockitoAnnotations.initMocks(this); - mocker.mock(RecordHistogramJni.TEST_HOOKS, mMockRecordHistogramNatives); AccessorySheetTabCoordinator.IconProvider.setIconForTesting(mock(Drawable.class)); mCoordinator = new PasswordAccessorySheetCoordinator(RuntimeEnvironment.application, null); assertNotNull(mCoordinator);
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/ConditionalTabStripUtilsUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/ConditionalTabStripUtilsUnitTest.java index e683156..8db5bfb 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/ConditionalTabStripUtilsUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/ConditionalTabStripUtilsUnitTest.java
@@ -14,15 +14,12 @@ import org.junit.Test; import org.junit.rules.TestRule; import org.junit.runner.RunWith; -import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.annotation.Config; import org.chromium.base.ContextUtils; import org.chromium.base.metrics.RecordHistogram; -import org.chromium.base.metrics.RecordHistogramJni; import org.chromium.base.test.BaseRobolectricTestRunner; -import org.chromium.base.test.util.JniMocker; import org.chromium.chrome.browser.tasks.ConditionalTabStripUtils; import org.chromium.chrome.browser.tasks.ConditionalTabStripUtils.FeatureStatus; import org.chromium.chrome.browser.tasks.ConditionalTabStripUtils.UserStatus; @@ -36,20 +33,14 @@ public class ConditionalTabStripUtilsUnitTest { @Rule public TestRule mProcessor = new Features.JUnitProcessor(); - @Rule - public JniMocker mJniMocker = new JniMocker(); private SharedPreferences mSharedPreference; - @Mock - private RecordHistogram.Natives mMockRecordHistogramNatives; - @Before public void setUp() { MockitoAnnotations.initMocks(this); mSharedPreference = ContextUtils.getAppSharedPreferences(); - mJniMocker.mock(RecordHistogramJni.TEST_HOOKS, mMockRecordHistogramNatives); // Initialize the feature status. ConditionalTabStripUtils.setFeatureStatus(FeatureStatus.DEFAULT);
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 9563b7a..e464b297 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -2258,6 +2258,12 @@ public boolean handleBackPressed() { if (!mUIWithNativeInitialized) return false; + // TODO(1091411): Find a better mechanism for back-press handling for features. + if (mRootUiCoordinator.getBottomSheetController().handleBackPress()) { + BackPressManager.record(BackPressHandler.Type.BOTTOM_SHEET); + return true; + } + if (mTabModalHandler.onBackPressed()) { BackPressManager.record(BackPressHandler.Type.TAB_MODAL_HANDLER); return true; @@ -2349,6 +2355,13 @@ } private void initializeBackPressHandlers() { + BackPressHandler mBottomSheetBackPressHandler = + mRootUiCoordinator.getBottomSheetController().getBottomSheetBackPressHandler(); + if (mBottomSheetBackPressHandler != null) { + mBackPressManager.addHandler( + mBottomSheetBackPressHandler, BackPressHandler.Type.BOTTOM_SHEET); + } + if (mReturnToChromeBackPressHandler == null) { mReturnToChromeBackPressHandler = new ReturnToChromeBackPressHandler(mLayoutStateProviderSupplier,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java index a7a5778..74353ec 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
@@ -2249,12 +2249,6 @@ return; } - if (mRootUiCoordinator.getBottomSheetController() != null - && mRootUiCoordinator.getBottomSheetController().handleBackPress()) { - BackPressManager.record(BackPressHandler.Type.BOTTOM_SHEET); - return; - } - handleBackPressed(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java index 9e4ab80..70e0d51 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java
@@ -408,6 +408,7 @@ @Override protected boolean handleBackPressed() { + // TODO(1091411): Find a better mechanism for back-press handling for features. if (mRootUiCoordinator.getBottomSheetController().handleBackPress()) { return true; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java index 62990d3..11a61b5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java
@@ -165,6 +165,9 @@ private static final String ON_RESIZED_CALLBACK = "onResized"; private static final String ON_RESIZED_SIZE_EXTRA = "size"; + private static final String ON_VERTICAL_SCROLL_EVENT_CALLBACK = "onVerticalScrollEvent"; + private static final String ON_VERTICAL_SCROLL_EVENT_IS_DIRECTION_UP_EXTRA = "isDirectionUp"; + @IntDef({ParallelRequestStatus.NO_REQUEST, ParallelRequestStatus.SUCCESS, ParallelRequestStatus.FAILURE_NOT_INITIALIZED, ParallelRequestStatus.FAILURE_NOT_AUTHORIZED, ParallelRequestStatus.FAILURE_INVALID_URL, @@ -1140,6 +1143,22 @@ } /** + * Notifies the application of a vertical scroll event, i.e. when a scroll started or changed + * direction. + * + * @param session The Binder object identifying the session. + * @param isDirectionUp Whether the scroll direction is up. + */ + public void notifyVerticalScrollEvent(CustomTabsSessionToken session, boolean isDirectionUp) { + Bundle args = new Bundle(); + args.putBoolean(ON_VERTICAL_SCROLL_EVENT_IS_DIRECTION_UP_EXTRA, isDirectionUp); + + if (safeExtraCallback(session, ON_VERTICAL_SCROLL_EVENT_CALLBACK, args)) { + logCallback("extraCallback(" + ON_VERTICAL_SCROLL_EVENT_CALLBACK + ")", args); + } + } + + /** * Notifies the application of a navigation event. * * Delivers the {@link CustomTabsCallback#onNavigationEvent} callback to the application.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityTabController.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityTabController.java index 5887ede..f2fbc84 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityTabController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityTabController.java
@@ -40,6 +40,7 @@ import org.chromium.chrome.browser.customtabs.PageLoadMetricsObserver; import org.chromium.chrome.browser.customtabs.ReparentingTaskProvider; import org.chromium.chrome.browser.dependency_injection.ActivityScope; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; import org.chromium.chrome.browser.lifecycle.InflationObserver; import org.chromium.chrome.browser.profiles.Profile; @@ -57,6 +58,8 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelectorBase; import org.chromium.chrome.browser.tabmodel.TabReparentingParams; import org.chromium.chrome.browser.translate.TranslateBridge; +import org.chromium.content_public.browser.GestureListenerManager; +import org.chromium.content_public.browser.GestureStateListener; import org.chromium.content_public.browser.WebContents; import org.chromium.ui.base.ActivityWindowAndroid; @@ -111,6 +114,9 @@ private final CustomTabsSessionToken mSession; private final Intent mIntent; + private GestureStateListener mGestureStateListener; + private ScrollState mScrollState; + @Inject public CustomTabActivityTabController(AppCompatActivity activity, Lazy<CustomTabDelegateFactory> customTabDelegateFactory, @@ -411,6 +417,24 @@ public void onContentChanged(Tab tab) { if (tab.getWebContents() != null) { mConnection.setClientDataHeaderForNewTab(mSession, tab.getWebContents()); + + if (ChromeFeatureList.isEnabled( + ChromeFeatureList.CCT_REAL_TIME_ENGAGEMENT_SIGNALS)) { + maybeStartSendingRealTimeEngagementSignals(tab); + } + } + } + + @Override + public void webContentsWillSwap(Tab tab) { + if (ChromeFeatureList.isEnabled( + ChromeFeatureList.CCT_REAL_TIME_ENGAGEMENT_SIGNALS)) { + if (tab.getWebContents() != null) { + if (mGestureStateListener != null) { + GestureListenerManager.fromWebContents(tab.getWebContents()) + .removeListener(mGestureStateListener); + } + } } } }; @@ -464,4 +488,63 @@ tab.addObserver(mediaObserver); } + + /** + * Create |mScrollState| and |mGestureStateListener| and start sending real-time engagement + * signals through {@link androidx.browser.customtabs.CustomTabsCallback}. + */ + private void maybeStartSendingRealTimeEngagementSignals(Tab tab) { + assert tab.getWebContents() != null; + + if (mScrollState == null) mScrollState = new ScrollState(); + if (mGestureStateListener == null) { + mGestureStateListener = new GestureStateListener() { + @Override + public void onScrollStarted( + int scrollOffsetY, int scrollExtentY, boolean isDirectionUp) { + mScrollState.onScrollStarted(isDirectionUp); + } + + @Override + public void onVerticalScrollDirectionChanged( + boolean directionUp, float currentScrollRatio) { + mScrollState.onScrollDirectionChanged(directionUp); + } + + @Override + public void onScrollEnded(int scrollOffsetY, int scrollExtentY) { + mScrollState.onScrollEnded(); + } + }; + } + + GestureListenerManager gestureListenerManager = + GestureListenerManager.fromWebContents(tab.getWebContents()); + if (!gestureListenerManager.hasListener(mGestureStateListener)) { + gestureListenerManager.addListener(mGestureStateListener); + } + } + + private class ScrollState { + boolean mIsScrollActive; + boolean mIsDirectionUp; + + void onScrollStarted(boolean isDirectionUp) { + assert !mIsScrollActive; + mIsScrollActive = true; + mIsDirectionUp = isDirectionUp; + mConnection.notifyVerticalScrollEvent(mSession, mIsDirectionUp); + } + + void onScrollDirectionChanged(boolean isDirectionUp) { + if (mIsScrollActive && isDirectionUp != mIsDirectionUp) { + mIsDirectionUp = isDirectionUp; + mConnection.notifyVerticalScrollEvent(mSession, mIsDirectionUp); + } + } + + void onScrollEnded() { + mIsScrollActive = false; + } + } }
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 1193166b..eff2261 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
@@ -138,7 +138,6 @@ import org.chromium.components.browser_ui.bottomsheet.ManagedBottomSheetController; import org.chromium.components.browser_ui.widget.CoordinatorLayoutForPointer; import org.chromium.components.browser_ui.widget.MenuOrKeyboardActionController; -import org.chromium.components.browser_ui.widget.gesture.BackPressHandler; import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator; import org.chromium.components.feature_engagement.EventConstants; import org.chromium.components.feature_engagement.Tracker; @@ -1325,18 +1324,6 @@ mBrowserControlsManager, mModalDialogManagerSupplier, this::getBottomSheetSnackbarManager, mTabObscuringHandlerSupplier.get(), mOmniboxFocusStateSupplier, panelManagerSupplier, mStartSurfaceSupplier); - - // TODO(crbug.com/1279941): Consider moving handler registration to feature code. - if (BackPressManager.isEnabled()) { - assert mBackPressManager != null - && !mBackPressManager.has(BackPressHandler.Type.BOTTOM_SHEET); - BackPressHandler mBottomSheetBackPressHandler = - mBottomSheetController.getBottomSheetBackPressHandler(); - if (mBottomSheetBackPressHandler != null) { - mBackPressManager.addHandler( - mBottomSheetBackPressHandler, BackPressHandler.Type.BOTTOM_SHEET); - } - } } /**
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityTabControllerUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityTabControllerUnitTest.java index c5f15e6..1526fb7 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityTabControllerUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityTabControllerUnitTest.java
@@ -13,29 +13,38 @@ import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Intent; import android.os.Bundle; +import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.annotation.Config; import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tab.TabObserver; import org.chromium.chrome.test.util.browser.Features; +import org.chromium.chrome.test.util.browser.Features.DisableFeatures; import org.chromium.components.embedder_support.util.ShadowUrlUtilities; +import org.chromium.content.browser.GestureListenerManagerImpl; +import org.chromium.content_public.browser.GestureStateListener; import org.chromium.content_public.browser.WebContents; /** @@ -43,6 +52,7 @@ */ @RunWith(BaseRobolectricTestRunner.class) @Config(manifest = Config.NONE, shadows = {ShadowUrlUtilities.class}) +@DisableFeatures({ChromeFeatureList.CCT_REAL_TIME_ENGAGEMENT_SIGNALS}) public class CustomTabActivityTabControllerUnitTest { @Rule public final CustomTabActivityContentTestEnvironment env = @@ -55,12 +65,20 @@ @Mock private Profile mProfile; + @Mock + private GestureListenerManagerImpl mGestureListenerManagerImpl; @Before public void setUp() { MockitoAnnotations.initMocks(this); Profile.setLastUsedProfileForTesting(mProfile); mTabController = env.createTabController(); + GestureListenerManagerImpl.setInstanceForTesting(mGestureListenerManagerImpl); + } + + @After + public void tearDown() { + GestureListenerManagerImpl.setInstanceForTesting(null); } @Test @@ -197,4 +215,85 @@ Tab tab = env.prepareTab(); assertTrue(tab.isIncognito()); } + + @Test + public void doesNotAddListenersForSignalsIfFeatureIsDisabled() { + env.reachNativeInit(mTabController); + + verify(mGestureListenerManagerImpl, never()).addListener(any(GestureStateListener.class)); + } + + @Test + @Features.EnableFeatures({ChromeFeatureList.CCT_REAL_TIME_ENGAGEMENT_SIGNALS}) + public void addsListenersForSignalsIfFeatureIsEnabled() { + env.reachNativeInit(mTabController); + + verify(mGestureListenerManagerImpl).addListener(any(GestureStateListener.class)); + } + + @Test + @Features.EnableFeatures({ChromeFeatureList.CCT_REAL_TIME_ENGAGEMENT_SIGNALS}) + public void removesGestureStateListenerWhenWebContentsWillSwap() { + env.reachNativeInit(mTabController); + + ArgumentCaptor<GestureStateListener> gestureStateListenerArgumentCaptor = + ArgumentCaptor.forClass(GestureStateListener.class); + verify(mGestureListenerManagerImpl) + .addListener(gestureStateListenerArgumentCaptor.capture()); + + ArgumentCaptor<TabObserver> tabObserverArgumentCaptor = + ArgumentCaptor.forClass(TabObserver.class); + verify(env.tabProvider.getTab(), atLeastOnce()) + .addObserver(tabObserverArgumentCaptor.capture()); + + for (TabObserver observer : tabObserverArgumentCaptor.getAllValues()) { + observer.webContentsWillSwap(env.tabProvider.getTab()); + } + verify(mGestureListenerManagerImpl) + .removeListener(gestureStateListenerArgumentCaptor.getValue()); + } + + @Test + @Features.EnableFeatures({ChromeFeatureList.CCT_REAL_TIME_ENGAGEMENT_SIGNALS}) + public void sendsSignalsForScrollStartThenEnd() { + env.reachNativeInit(mTabController); + + ArgumentCaptor<GestureStateListener> gestureStateListenerArgumentCaptor = + ArgumentCaptor.forClass(GestureStateListener.class); + verify(mGestureListenerManagerImpl) + .addListener(gestureStateListenerArgumentCaptor.capture()); + + // Start scrolling down. + gestureStateListenerArgumentCaptor.getValue().onScrollStarted(0, 100, false); + verify(env.connection).notifyVerticalScrollEvent(eq(env.session), eq(false)); + // End scrolling at 50%. + gestureStateListenerArgumentCaptor.getValue().onScrollEnded(50, 100); + // We shouldn't make any more calls. + verify(env.connection, times(1)).notifyVerticalScrollEvent(eq(env.session), anyBoolean()); + } + + @Test + @Features.EnableFeatures({ChromeFeatureList.CCT_REAL_TIME_ENGAGEMENT_SIGNALS}) + public void sendsSignalsForScrollStartDirectionChangeThenEnd() { + env.reachNativeInit(mTabController); + + ArgumentCaptor<GestureStateListener> gestureStateListenerArgumentCaptor = + ArgumentCaptor.forClass(GestureStateListener.class); + verify(mGestureListenerManagerImpl) + .addListener(gestureStateListenerArgumentCaptor.capture()); + + // Start by scrolling down. + gestureStateListenerArgumentCaptor.getValue().onScrollStarted(0, 100, false); + verify(env.connection).notifyVerticalScrollEvent(eq(env.session), eq(false)); + // Change direction to up at 10%. + gestureStateListenerArgumentCaptor.getValue().onVerticalScrollDirectionChanged(true, .1f); + verify(env.connection).notifyVerticalScrollEvent(eq(env.session), eq(true)); + // Change direction to down at 5%. + gestureStateListenerArgumentCaptor.getValue().onVerticalScrollDirectionChanged(false, .05f); + verify(env.connection, times(2)).notifyVerticalScrollEvent(eq(env.session), eq(false)); + // End scrolling at 50%. + gestureStateListenerArgumentCaptor.getValue().onScrollEnded(50, 100); + // We shouldn't make any more calls. + verify(env.connection, times(3)).notifyVerticalScrollEvent(eq(env.session), anyBoolean()); + } }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityUrlLoadingTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityUrlLoadingTest.java index 3744f9a..44cebe8 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityUrlLoadingTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityUrlLoadingTest.java
@@ -34,11 +34,13 @@ import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.util.JniMocker; import org.chromium.chrome.browser.customtabs.CustomTabIntentDataProvider; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.password_manager.PasswordChangeSuccessTrackerBridge; import org.chromium.chrome.browser.password_manager.PasswordChangeSuccessTrackerBridgeJni; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.test.util.browser.Features; +import org.chromium.chrome.test.util.browser.Features.DisableFeatures; import org.chromium.components.embedder_support.util.UrlUtilities; import org.chromium.components.embedder_support.util.UrlUtilitiesJni; import org.chromium.content_public.browser.LoadUrlParams; @@ -49,6 +51,7 @@ */ @RunWith(BaseRobolectricTestRunner.class) @Config(manifest = Config.NONE) +@DisableFeatures({ChromeFeatureList.CCT_REAL_TIME_ENGAGEMENT_SIGNALS}) public class CustomTabActivityUrlLoadingTest { public static final String PASSWORD_CHANGE_USERNAME = "Peter";
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/DEPS b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/DEPS new file mode 100644 index 0000000..ba9f81a --- /dev/null +++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/DEPS
@@ -0,0 +1,3 @@ +include_rules = [ + "+content/public/android/java/src/org/chromium/content/browser/GestureListenerManagerImpl.java", +]
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt index 5447b59..3de83b8 100644 --- a/chrome/android/profiles/newest.txt +++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-105.0.5176.0_rc-r2-merged.afdo.bz2 +chromeos-chrome-amd64-105.0.5180.0_rc-r1-merged.afdo.bz2
diff --git a/chrome/app/vector_icons/BUILD.gn b/chrome/app/vector_icons/BUILD.gn index 1b0ebc2e..ec6fde4 100644 --- a/chrome/app/vector_icons/BUILD.gn +++ b/chrome/app/vector_icons/BUILD.gn
@@ -265,6 +265,7 @@ "google_chrome/google_keep_note.icon", "google_chrome/google_lens_full_logo.icon", "google_chrome/google_lens_full_logo_dark.icon", + "google_chrome/google_lens_logo.icon", "google_chrome/google_password_manager.icon", "google_chrome/google_pay_logo.icon", "google_chrome/google_sites.icon",
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 1c3e4a5..80500e14 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -790,6 +790,8 @@ "metrics/bluetooth_metrics_provider.h", "metrics/chrome_browser_main_extra_parts_metrics.cc", "metrics/chrome_browser_main_extra_parts_metrics.h", + "metrics/chrome_browser_sampling_trials.cc", + "metrics/chrome_browser_sampling_trials.h", "metrics/chrome_feature_list_creator.cc", "metrics/chrome_feature_list_creator.h", "metrics/chrome_metrics_extensions_helper.cc", @@ -5161,6 +5163,7 @@ "//chromeos/ash/components/dbus/update_engine", "//chromeos/ash/components/dbus/userdataauth:userdataauth", "//chromeos/ash/components/dbus/userdataauth:userdataauth_proto", + "//chromeos/ash/components/feature_usage", "//chromeos/ash/components/local_search_service", "//chromeos/ash/components/local_search_service/public/cpp", "//chromeos/ash/components/local_search_service/public/mojom", @@ -5168,7 +5171,6 @@ "//chromeos/ash/services/assistant/public/cpp", "//chromeos/ash/services/cros_healthd/public/cpp", "//chromeos/ash/services/cros_healthd/public/mojom", - "//chromeos/components/feature_usage", "//chromeos/components/onc", "//chromeos/components/quick_answers", "//chromeos/components/sync_wifi", @@ -7635,6 +7637,13 @@ ] } + if (chrome_root_store_supported) { + sources += [ + "feedback/system_logs/log_sources/chrome_root_store_log_source.cc", + "feedback/system_logs/log_sources/chrome_root_store_log_source.h", + ] + } + if (use_udev) { deps += [ "//device/udev_linux" ] }
diff --git a/chrome/browser/android/examples/custom_tabs_client/src/java/org/chromium/customtabsclient/MainActivity.java b/chrome/browser/android/examples/custom_tabs_client/src/java/org/chromium/customtabsclient/MainActivity.java index 3238393..a316b9f 100644 --- a/chrome/browser/android/examples/custom_tabs_client/src/java/org/chromium/customtabsclient/MainActivity.java +++ b/chrome/browser/android/examples/custom_tabs_client/src/java/org/chromium/customtabsclient/MainActivity.java
@@ -34,6 +34,8 @@ import android.widget.Spinner; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.browser.customtabs.CustomTabsCallback; import androidx.browser.customtabs.CustomTabsClient; @@ -106,6 +108,15 @@ public void onNavigationEvent(int navigationEvent, Bundle extras) { Log.w(TAG, "onNavigationEvent: Code = " + navigationEvent); } + + @Override + public void extraCallback(@NonNull String callbackName, @Nullable Bundle args) { + if (callbackName.equals("onVerticalScrollEvent") && args != null) { + Log.w(TAG, + "onVerticalScrollEvent: isDirectionUp = " + + args.getBoolean("isDirectionUp")); + } + } } @Override
diff --git a/chrome/browser/app_controller_mac.h b/chrome/browser/app_controller_mac.h index af992620..1a6a11c 100644 --- a/chrome/browser/app_controller_mac.h +++ b/chrome/browser/app_controller_mac.h
@@ -6,6 +6,11 @@ #define CHROME_BROWSER_APP_CONTROLLER_MAC_H_ #include "base/memory/raw_ptr.h" +#include "base/scoped_observation.h" +#include "chrome/browser/profiles/profile.h" +#include "components/sessions/core/session_id.h" +#include "components/sessions/core/tab_restore_service.h" +#include "components/sessions/core/tab_restore_service_observer.h" #if defined(__OBJC__) @@ -19,6 +24,7 @@ #include "base/mac/scoped_nsobject.h" #include "base/time/time.h" #include "chrome/browser/profiles/keep_alive/scoped_profile_keep_alive.h" +#include "chrome/browser/profiles/profile.h" #include "components/prefs/pref_change_registrar.h" class AppControllerProfileObserver; @@ -257,6 +263,67 @@ // applicationDidFinished notification. void EnterpriseStartupDialogClosed(); +// Tells RunInSafeProfile() or RunInSpecificSafeProfile() what to do if the +// profile cannot be loaded from disk. +enum ProfileLoadFailureBehavior { + // Silently fail, and run |callback| with nullptr. + kIgnoreOnFailure, + // Show the profile picker, and run |callback| with nullptr. + kShowProfilePickerOnFailure, +}; + +// Tries to load the profile returned by |-safeProfileForNewWindows:|. If it +// succeeds, calls |callback| with it. +// +// |callback| must be valid. +void RunInLastProfileSafely(base::OnceCallback<void(Profile*)> callback, + ProfileLoadFailureBehavior on_failure); + +// Tries to load the profile in |profile_dir|. If it succeeds, calls +// |callback| with it. If the profile was already loaded, |callback| runs +// immediately. +// +// |callback| must be valid. +void RunInProfileSafely(const base::FilePath& profile_dir, + base::OnceCallback<void(Profile*)> callback, + ProfileLoadFailureBehavior on_failure); + +// Waits for the TabRestoreService to have loaded its entries, then calls +// OpenWindowWithRestoredTabs(). +// +// Owned by itself. +class TabRestorer : public sessions::TabRestoreServiceObserver { + public: + // Restore the most recent tab in |profile|, e.g. for Cmd+Shift+T. + static void RestoreMostRecent(Profile* profile); + + // Restore a specific tab in |profile|, e.g. for a History menu item. + // |session_id| can be a |TabRestoreService::Entry::id|, or a + // |TabRestoreEntryService::Entry::original_id|. + static void RestoreByID(Profile* profile, SessionID session_id); + + ~TabRestorer() override; + + // sessions::TabRestoreServiceObserver: + void TabRestoreServiceDestroyed( + sessions::TabRestoreService* service) override; + void TabRestoreServiceLoaded(sessions::TabRestoreService* service) override; + + private: + TabRestorer(Profile* profile, SessionID session_id); + + // Performs the tab restore. Called either in TabRestoreServiceLoaded(), or + // directly from RestoreMostRecent()/RestoreByID() if the service was already + // loaded. + static void DoRestoreTab(Profile* profile, SessionID session_id); + + base::ScopedObservation<sessions::TabRestoreService, + sessions::TabRestoreServiceObserver> + observation_{this}; + raw_ptr<Profile> profile_; + SessionID session_id_; +}; + } // namespace app_controller_mac #endif // CHROME_BROWSER_APP_CONTROLLER_MAC_H_
diff --git a/chrome/browser/app_controller_mac.mm b/chrome/browser/app_controller_mac.mm index 4e06ce9..5ba1fb3 100644 --- a/chrome/browser/app_controller_mac.mm +++ b/chrome/browser/app_controller_mac.mm
@@ -65,6 +65,7 @@ #include "chrome/browser/ui/browser_dialogs.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_list.h" +#include "chrome/browser/ui/browser_live_tab_context.h" #include "chrome/browser/ui/browser_mac.h" #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/chrome_pages.h" @@ -105,7 +106,6 @@ #include "components/keep_alive_registry/scoped_keep_alive.h" #include "components/prefs/pref_service.h" #include "components/sessions/core/tab_restore_service.h" -#include "components/sessions/core/tab_restore_service_observer.h" #include "content/public/browser/download_manager.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_system.h" @@ -120,67 +120,6 @@ namespace { -// Helper class which asynchronously loads the profile that can be used for new -// windows. If it succeeds, calls |callback| with the profile returned by -// |-safeProfileForNewWindows:|. If it fails, opens the profile picker and calls -// |callback| with nullptr. -class RunInSafeProfileHelper { - public: - // |callback| must be valid. - static void Run(base::OnceCallback<void(Profile*)> callback); - - private: - // Called when the profile has been loaded. This profile may not be safe to - // use for new windows (due to policies). - static void OnProfileLoaded(base::OnceCallback<void(Profile*)>& callback, - Profile* loaded_profile, - Profile::CreateStatus status); - // Returns the profile to be used for new windows (or nullptr if it fails). - static Profile* GetSafeProfile(Profile* loaded_profile, - Profile::CreateStatus status); -}; - -// Waits for the TabRestoreService to have loaded its entries, then calls -// OpenWindowWithRestoredTabs(). -// -// Owned by itself. -class TabRestorer : public sessions::TabRestoreServiceObserver { - public: - explicit TabRestorer(Profile* profile) : profile_(profile) {} - ~TabRestorer() override = default; - - void TabRestoreServiceDestroyed( - sessions::TabRestoreService* service) override { - service->RemoveObserver(this); - delete this; - } - - void TabRestoreServiceLoaded(sessions::TabRestoreService* service) override { - chrome::OpenWindowWithRestoredTabs(profile_); - service->RemoveObserver(this); - delete this; - } - - private: - raw_ptr<Profile> profile_; -}; - -// TODO(crbug.com/1334721): Single-tab windows get restored as tabs instead of -// windows, which is confusing. -void RestoreTab(Profile* profile) { - auto* service = TabRestoreServiceFactory::GetForProfile(profile); - if (!service) - return; - if (service->IsLoaded()) { - chrome::OpenWindowWithRestoredTabs(profile); - } else { - // TabRestoreService isn't loaded. Tell it to load entries, and call - // OpenWindowWithRestoredTabs() when it's done. - service->AddObserver(new TabRestorer(profile)); - service->LoadTabsFromLastSession(); - } -} - // How long we allow a workspace change notification to wait to be // associated with a dock activation. The animation lasts 250ms. See // applicationShouldHandleReopen:hasVisibleWindows:. @@ -390,13 +329,14 @@ // Open the urls in the last used browser. Loads the profile asynchronously if // needed. void OpenUrlsInBrowser(const std::vector<GURL>& urls) { - RunInSafeProfileHelper::Run( - base::BindOnce(&OpenUrlsInBrowserWithProfile, urls)); + app_controller_mac::RunInLastProfileSafely( + base::BindOnce(&OpenUrlsInBrowserWithProfile, urls), + app_controller_mac::kShowProfilePickerOnFailure); } } // namespace -// Returns the last profile. This is extracted as a standalone function in order +// This is extracted as a standalone function in order // to be friend with base::ScopedAllowBlocking. Profile* GetLastProfileMac() { ProfileManager* profile_manager = g_browser_process->profile_manager(); @@ -1293,10 +1233,11 @@ } // Asynchronously load profile first if needed. - RunInSafeProfileHelper::Run( + app_controller_mac::RunInLastProfileSafely( base::BindOnce(base::RetainBlock(^(Profile* profile) { [self executeCommand:sender withProfile:profile]; - }))); + })), + app_controller_mac::kShowProfilePickerOnFailure); } - (void)executeCommand:(id)sender withProfile:(Profile*)profile { @@ -1332,7 +1273,7 @@ CreateBrowser(profile->GetPrimaryOTRProfile(/*create_if_needed=*/true)); break; case IDC_RESTORE_TAB: - RestoreTab(profile); + app_controller_mac::TabRestorer::RestoreMostRecent(profile); break; case IDC_OPEN_FILE: chrome::ExecuteCommand(CreateBrowser(profile), IDC_OPEN_FILE); @@ -1641,10 +1582,11 @@ // visible. - (IBAction)showPreferences:(id)sender { // Asynchronously load profile first if needed. - RunInSafeProfileHelper::Run( + app_controller_mac::RunInLastProfileSafely( base::BindOnce(base::RetainBlock(^(Profile* profile) { [self showPreferencesForProfile:profile]; - }))); + })), + app_controller_mac::kShowProfilePickerOnFailure); } - (IBAction)showPreferencesForProfile:(Profile*)profile { @@ -1661,10 +1603,11 @@ - (IBAction)orderFrontStandardAboutPanel:(id)sender { // Asynchronously load profile first if needed. - RunInSafeProfileHelper::Run( + app_controller_mac::RunInLastProfileSafely( base::BindOnce(base::RetainBlock(^(Profile* profile) { [self orderFrontStandardAboutPanelForProfile:profile]; - }))); + })), + app_controller_mac::kShowProfilePickerOnFailure); } - (IBAction)orderFrontStandardAboutPanelForProfile:(Profile*)profile { @@ -1974,10 +1917,11 @@ DCHECK(![GetPendingWebAuthRequests() objectForKey:key]) << "Duplicate ASWebAuthenticationSessionRequest"; [GetPendingWebAuthRequests() setObject:request forKey:key]; - RunInSafeProfileHelper::Run( + app_controller_mac::RunInLastProfileSafely( base::BindOnce(&BeginHandlingWebAuthenticationSessionRequestWithProfile, base::scoped_nsobject<ASWebAuthenticationSessionRequest>( - request, base::scoped_policy::RETAIN))); + request, base::scoped_policy::RETAIN)), + app_controller_mac::kShowProfilePickerOnFailure); }); } @@ -2011,62 +1955,6 @@ namespace { -// static -void RunInSafeProfileHelper::Run(base::OnceCallback<void(Profile*)> callback) { - DCHECK(callback); - AppController* controller = - base::mac::ObjCCastStrict<AppController>([NSApp delegate]); - if (!controller) { - OnProfileLoaded(callback, nullptr, Profile::CREATE_STATUS_LOCAL_FAIL); - return; - } - if (Profile* profile = [controller lastProfileIfLoaded]) { - OnProfileLoaded(callback, profile, Profile::CREATE_STATUS_INITIALIZED); - return; - } - // Pass the OnceCallback by reference because CreateProfileAsync() needs a - // repeating callback. It will be called at most once. - g_browser_process->profile_manager()->CreateProfileAsync( - GetStartupProfilePathMac(), - base::BindRepeating(&OnProfileLoaded, - base::OwnedRef(std::move(callback)))); -} - -// static -void RunInSafeProfileHelper::OnProfileLoaded( - base::OnceCallback<void(Profile*)>& callback, - Profile* loaded_profile, - Profile::CreateStatus status) { - if (status == Profile::CREATE_STATUS_CREATED) - return; // Profile loading is not complete, wait to be called again. - Profile* safe_profile = GetSafeProfile(loaded_profile, status); - if (!safe_profile) { - ProfilePicker::Show(ProfilePicker::Params::FromEntryPoint( - ProfilePicker::EntryPoint::kUnableToCreateBrowser)); - } - std::move(callback).Run(safe_profile); -} - -// static -Profile* RunInSafeProfileHelper::GetSafeProfile(Profile* loaded_profile, - Profile::CreateStatus status) { - switch (status) { - case Profile::CREATE_STATUS_INITIALIZED: - break; - case Profile::CREATE_STATUS_CREATED: - NOTREACHED() << "Should only be called when profile loading is complete"; - [[fallthrough]]; - case Profile::CREATE_STATUS_LOCAL_FAIL: - return nullptr; - } - AppController* controller = - base::mac::ObjCCastStrict<AppController>([NSApp delegate]); - if (!controller) - return nullptr; - DCHECK(loaded_profile); - return [controller safeProfileForNewWindows:loaded_profile]; -} - void UpdateProfileInUse(Profile* profile, Profile::CreateStatus status) { if (status == Profile::CREATE_STATUS_INITIALIZED) { AppController* controller = @@ -2115,6 +2003,48 @@ } } +// Returns the profile to be used for new windows (or nullptr if it fails). +Profile* GetSafeProfile(Profile* loaded_profile, Profile::CreateStatus status) { + switch (status) { + case Profile::CREATE_STATUS_INITIALIZED: + break; + case Profile::CREATE_STATUS_CREATED: + NOTREACHED() << "Should only be called when profile loading is complete"; + [[fallthrough]]; + case Profile::CREATE_STATUS_LOCAL_FAIL: + return nullptr; + } + AppController* controller = + base::mac::ObjCCastStrict<AppController>([NSApp delegate]); + if (!controller) + return nullptr; + DCHECK(loaded_profile); + return [controller safeProfileForNewWindows:loaded_profile]; +} + +// Called when the profile has been loaded for RunIn*ProfileSafely(). This +// profile may not be safe to use for new windows (due to policies). +void OnProfileLoaded(base::OnceCallback<void(Profile*)>& callback, + app_controller_mac::ProfileLoadFailureBehavior on_failure, + Profile* loaded_profile, + Profile::CreateStatus status) { + if (status == Profile::CREATE_STATUS_CREATED) + return; // Profile loading is not complete, wait to be called again. + Profile* safe_profile = GetSafeProfile(loaded_profile, status); + if (!safe_profile) { + switch (on_failure) { + case app_controller_mac::kShowProfilePickerOnFailure: + ProfilePicker::Show(ProfilePicker::Params::FromEntryPoint( + ProfilePicker::EntryPoint::kUnableToCreateBrowser)); + break; + + case app_controller_mac::kIgnoreOnFailure: + break; + } + } + std::move(callback).Run(safe_profile); +} + } // namespace namespace app_controller_mac { @@ -2140,4 +2070,110 @@ } } +void RunInLastProfileSafely(base::OnceCallback<void(Profile*)> callback, + ProfileLoadFailureBehavior on_failure) { + DCHECK(callback); + AppController* controller = + base::mac::ObjCCastStrict<AppController>([NSApp delegate]); + if (!controller) { + OnProfileLoaded(callback, on_failure, nullptr, + Profile::CREATE_STATUS_LOCAL_FAIL); + return; + } + if (Profile* profile = [controller lastProfileIfLoaded]) { + OnProfileLoaded(callback, on_failure, profile, + Profile::CREATE_STATUS_INITIALIZED); + return; + } + // Pass the OnceCallback by reference because CreateProfileAsync() needs a + // repeating callback. It will be called at most once. + g_browser_process->profile_manager()->CreateProfileAsync( + GetStartupProfilePathMac(), + base::BindRepeating(&OnProfileLoaded, base::OwnedRef(std::move(callback)), + on_failure)); +} + +void RunInProfileSafely(const base::FilePath& profile_dir, + base::OnceCallback<void(Profile*)> callback, + ProfileLoadFailureBehavior on_failure) { + DCHECK(callback); + ProfileManager* profile_manager = g_browser_process->profile_manager(); + // `profile_manager` can be null in tests. + if (!profile_manager) { + OnProfileLoaded(callback, on_failure, nullptr, + Profile::CREATE_STATUS_LOCAL_FAIL); + return; + } + if (Profile* profile = profile_manager->GetProfileByPath(profile_dir)) { + OnProfileLoaded(callback, on_failure, profile, + Profile::CREATE_STATUS_INITIALIZED); + return; + } + // Pass the OnceCallback by reference because CreateProfileAsync() needs a + // repeating callback. It will be called at most once. + g_browser_process->profile_manager()->CreateProfileAsync( + profile_dir, + base::BindRepeating(&OnProfileLoaded, base::OwnedRef(std::move(callback)), + on_failure)); +} + +// static +void TabRestorer::RestoreMostRecent(Profile* profile) { + RestoreByID(profile, SessionID::InvalidValue()); +} + +// static +void TabRestorer::RestoreByID(Profile* profile, SessionID session_id) { + DCHECK(profile); + auto* service = TabRestoreServiceFactory::GetForProfile(profile); + if (!service) + return; + if (service->IsLoaded()) { + DoRestoreTab(profile, session_id); + } else { + // TabRestoreService isn't loaded. Tell it to load entries, and call + // OpenWindowWithRestoredTabs() when it's done. + std::ignore = new TabRestorer(profile, session_id); + service->LoadTabsFromLastSession(); + } +} + +// static +void TabRestorer::DoRestoreTab(Profile* profile, SessionID session_id) { + DCHECK(profile); + auto* service = TabRestoreServiceFactory::GetForProfile(profile); + if (!service) + return; + Browser* browser = chrome::FindTabbedBrowser(profile, false); + BrowserLiveTabContext* context = + browser ? browser->live_tab_context() : nullptr; + if (session_id.is_valid()) { + service->RestoreEntryById(context, session_id, + WindowOpenDisposition::UNKNOWN); + } else { + service->RestoreMostRecentEntry(context); + } +} + +TabRestorer::TabRestorer(Profile* profile, SessionID session_id) + : profile_(profile), session_id_(session_id) { + auto* service = TabRestoreServiceFactory::GetForProfile(profile); + DCHECK(service); + observation_.Observe(service); +} + +TabRestorer::~TabRestorer() = default; + +void TabRestorer::TabRestoreServiceDestroyed( + sessions::TabRestoreService* service) { + delete this; +} + +void TabRestorer::TabRestoreServiceLoaded( + sessions::TabRestoreService* service) { + observation_.Reset(); + DoRestoreTab(profile_, session_id_); + delete this; +} + } // namespace app_controller_mac
diff --git a/chrome/browser/app_controller_mac_unittest.mm b/chrome/browser/app_controller_mac_unittest.mm index 6a20e79a..9bf40e58 100644 --- a/chrome/browser/app_controller_mac_unittest.mm +++ b/chrome/browser/app_controller_mac_unittest.mm
@@ -12,6 +12,7 @@ #include "base/mac/scoped_objc_class_swizzler.h" #include "base/run_loop.h" #include "base/strings/utf_string_conversions.h" +#include "base/test/bind.h" #include "chrome/app/chrome_command_ids.h" #import "chrome/browser/app_controller_mac.h" #include "chrome/browser/browser_process.h" @@ -291,3 +292,107 @@ CheckMenuItemsMatchNonBrowserWindow(); } + +class AppControllerSafeProfileTest : public AppControllerTest { + protected: + AppControllerSafeProfileTest() = default; + ~AppControllerSafeProfileTest() override = default; + + void TearDown() override { [NSApp setDelegate:nil]; } +}; + +// Tests that RunInLastProfileSafely() works with an already-loaded +// profile. +TEST_F(AppControllerSafeProfileTest, LastProfileLoaded) { + PrefService* local_state = g_browser_process->local_state(); + local_state->SetString(prefs::kProfileLastUsed, + profile_->GetPath().BaseName().MaybeAsASCII()); + + base::scoped_nsobject<AppController> ac([[AppController alloc] init]); + [NSApp setDelegate:ac]; + ASSERT_EQ(profile_, [ac lastProfileIfLoaded]); + + base::RunLoop run_loop; + app_controller_mac::RunInLastProfileSafely( + base::BindLambdaForTesting([&](Profile* profile) { + EXPECT_EQ(profile, profile_.get()); + run_loop.Quit(); + }), + app_controller_mac::kIgnoreOnFailure); + run_loop.Run(); +} + +// Tests that RunInLastProfileSafely() re-loads the profile from disk if +// it's not currently in memory. +TEST_F(AppControllerSafeProfileTest, LastProfileNotLoaded) { + PrefService* local_state = g_browser_process->local_state(); + local_state->SetString(prefs::kProfileLastUsed, "New Profile 2"); + + base::scoped_nsobject<AppController> ac([[AppController alloc] init]); + [NSApp setDelegate:ac]; + ASSERT_EQ(nil, [ac lastProfileIfLoaded]); + + base::RunLoop run_loop; + app_controller_mac::RunInLastProfileSafely( + base::BindLambdaForTesting([&](Profile* profile) { + EXPECT_NE(profile, nullptr); + EXPECT_NE(profile, profile_.get()); + EXPECT_EQ(profile->GetBaseName().MaybeAsASCII(), "New Profile 2"); + run_loop.Quit(); + }), + app_controller_mac::kIgnoreOnFailure); + run_loop.Run(); +} + +// Tests that RunInProfileInSafeProfileHelper::RunInProfile() works with an +// already-loaded profile. +TEST_F(AppControllerSafeProfileTest, SpecificProfileLoaded) { + PrefService* local_state = g_browser_process->local_state(); + local_state->SetString(prefs::kProfileLastUsed, + profile_->GetPath().BaseName().MaybeAsASCII()); + + base::scoped_nsobject<AppController> ac([[AppController alloc] init]); + [NSApp setDelegate:ac]; + ASSERT_EQ(profile_, [ac lastProfileIfLoaded]); + + TestingProfile* profile2 = + profile_manager_.CreateTestingProfile("New Profile 2"); + + base::RunLoop run_loop; + app_controller_mac::RunInProfileSafely( + profile_manager_.profiles_dir().AppendASCII("New Profile 2"), + base::BindLambdaForTesting([&](Profile* profile) { + // This should run with the specific profile we asked for, rather than + // the last-used profile. + EXPECT_EQ(profile, profile2); + run_loop.Quit(); + }), + app_controller_mac::kIgnoreOnFailure); + run_loop.Run(); +} + +// Tests that RunInProfileSafely() re-loads the profile from +// disk if it's not currently in memory. +TEST_F(AppControllerSafeProfileTest, SpecificProfileNotLoaded) { + PrefService* local_state = g_browser_process->local_state(); + local_state->SetString(prefs::kProfileLastUsed, + profile_->GetPath().BaseName().MaybeAsASCII()); + + base::scoped_nsobject<AppController> ac([[AppController alloc] init]); + [NSApp setDelegate:ac]; + ASSERT_EQ(profile_, [ac lastProfileIfLoaded]); + + base::RunLoop run_loop; + app_controller_mac::RunInProfileSafely( + profile_manager_.profiles_dir().AppendASCII("New Profile 2"), + base::BindLambdaForTesting([&](Profile* profile) { + // This should run with the specific profile we asked for, rather than + // the last-used profile. + EXPECT_NE(profile, nullptr); + EXPECT_NE(profile, profile_.get()); + EXPECT_EQ(profile->GetBaseName().MaybeAsASCII(), "New Profile 2"); + run_loop.Quit(); + }), + app_controller_mac::kIgnoreOnFailure); + run_loop.Run(); +}
diff --git a/chrome/browser/ash/BUILD.gn b/chrome/browser/ash/BUILD.gn index c9c8d93..b88c5e2 100644 --- a/chrome/browser/ash/BUILD.gn +++ b/chrome/browser/ash/BUILD.gn
@@ -1517,7 +1517,6 @@ "//ash/components/enhanced_network_tts/mojom", "//ash/components/geolocation", "//ash/components/login/auth", - "//ash/components/login/auth:challenge_response_key", "//ash/components/multidevice", "//ash/components/proximity_auth", "//ash/components/settings", @@ -1591,11 +1590,11 @@ "//chromeos/ash/components/dbus/update_engine", "//chromeos/ash/components/dbus/userdataauth", "//chromeos/ash/components/dbus/userdataauth:userdataauth_proto", + "//chromeos/ash/components/feature_usage", "//chromeos/ash/components/memory", "//chromeos/ash/components/network/portal_detector", "//chromeos/ash/services/cros_healthd/public/cpp", "//chromeos/ash/services/cros_healthd/public/mojom", - "//chromeos/components/feature_usage", "//chromeos/components/onc", "//chromeos/components/sharesheet:constants", "//chromeos/crosapi/mojom",
diff --git a/chrome/browser/ash/app_mode/kiosk_app_launch_error.cc b/chrome/browser/ash/app_mode/kiosk_app_launch_error.cc index 96efb27..2549d2e 100644 --- a/chrome/browser/ash/app_mode/kiosk_app_launch_error.cc +++ b/chrome/browser/ash/app_mode/kiosk_app_launch_error.cc
@@ -4,7 +4,7 @@ #include "chrome/browser/ash/app_mode/kiosk_app_launch_error.h" -#include "ash/components/login/auth/auth_status_consumer.h" +#include "ash/components/login/auth/public/auth_failure.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "chrome/browser/ash/app_mode/kiosk_app_manager.h"
diff --git a/chrome/browser/ash/app_mode/kiosk_app_launch_error_unittest.cc b/chrome/browser/ash/app_mode/kiosk_app_launch_error_unittest.cc index de076de..8cfc09ea 100644 --- a/chrome/browser/ash/app_mode/kiosk_app_launch_error_unittest.cc +++ b/chrome/browser/ash/app_mode/kiosk_app_launch_error_unittest.cc
@@ -6,7 +6,7 @@ #include <string> -#include "ash/components/login/auth/auth_status_consumer.h" +#include "ash/components/login/auth/public/auth_failure.h" #include "chrome/browser/ash/app_mode/kiosk_app_manager.h" #include "chrome/grit/generated_resources.h" #include "chrome/test/base/scoped_testing_local_state.h"
diff --git a/chrome/browser/ash/app_mode/kiosk_app_manager.cc b/chrome/browser/ash/app_mode/kiosk_app_manager.cc index d6ab296..c3d915d 100644 --- a/chrome/browser/ash/app_mode/kiosk_app_manager.cc +++ b/chrome/browser/ash/app_mode/kiosk_app_manager.cc
@@ -200,9 +200,15 @@ } // static -void KioskAppManager::RegisterPrefs(PrefRegistrySimple* registry) { +void KioskAppManager::RegisterLocalStatePrefs(PrefRegistrySimple* registry) { registry->RegisterDictionaryPref(kKioskDictionaryName); - chromeos::AppSession::RegisterPrefs(registry); + chromeos::AppSession::RegisterLocalStatePrefs(registry); +} + +// static +void KioskAppManager::RegisterProfilePrefs( + user_prefs::PrefRegistrySyncable* registry) { + chromeos::AppSession::RegisterProfilePrefs(registry); } // static
diff --git a/chrome/browser/ash/app_mode/kiosk_app_manager.h b/chrome/browser/ash/app_mode/kiosk_app_manager.h index b4f2dd5d..c0368cc 100644 --- a/chrome/browser/ash/app_mode/kiosk_app_manager.h +++ b/chrome/browser/ash/app_mode/kiosk_app_manager.h
@@ -22,6 +22,7 @@ #include "chrome/browser/chromeos/extensions/external_cache_delegate.h" #include "chromeos/crosapi/mojom/chrome_app_kiosk_service.mojom.h" #include "components/account_id/account_id.h" +#include "components/pref_registry/pref_registry_syncable.h" #include "extensions/common/extension_id.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -107,7 +108,11 @@ static void ResetForTesting(); // Registers kiosk app entries in local state. - static void RegisterPrefs(PrefRegistrySimple* registry); + static void RegisterLocalStatePrefs(PrefRegistrySimple* registry); + + // Registers kiosk app prefs that will be attached to a user profile. It would + // be applied to Kiosk, because a Kiosk session has a special user profile. + static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); static bool IsConsumerKioskEnabled();
diff --git a/chrome/browser/ash/app_mode/kiosk_profile_loader.cc b/chrome/browser/ash/app_mode/kiosk_profile_loader.cc index 17fa178..36f0b9c 100644 --- a/chrome/browser/ash/app_mode/kiosk_profile_loader.cc +++ b/chrome/browser/ash/app_mode/kiosk_profile_loader.cc
@@ -7,8 +7,8 @@ #include <memory> #include <tuple> -#include "ash/components/login/auth/auth_status_consumer.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/auth_failure.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/bind.h" #include "base/location.h" #include "base/logging.h"
diff --git a/chrome/browser/ash/app_mode/kiosk_profile_loader.h b/chrome/browser/ash/app_mode/kiosk_profile_loader.h index 38c7f8153..acb2b31 100644 --- a/chrome/browser/ash/app_mode/kiosk_profile_loader.h +++ b/chrome/browser/ash/app_mode/kiosk_profile_loader.h
@@ -19,6 +19,7 @@ namespace ash { +class AuthFailure; enum class KioskAppType; class UserContext;
diff --git a/chrome/browser/ash/arc/fileapi/file_stream_forwarder_unittest.cc b/chrome/browser/ash/arc/fileapi/file_stream_forwarder_unittest.cc index 4e060ee..6342f937 100644 --- a/chrome/browser/ash/arc/fileapi/file_stream_forwarder_unittest.cc +++ b/chrome/browser/ash/arc/fileapi/file_stream_forwarder_unittest.cc
@@ -17,6 +17,9 @@ #include "storage/browser/file_system/file_system_url.h" #include "storage/browser/quota/quota_manager_proxy.h" #include "storage/browser/test/async_file_test_helper.h" +#include "storage/browser/test/mock_quota_manager.h" +#include "storage/browser/test/mock_quota_manager_proxy.h" +#include "storage/browser/test/mock_special_storage_policy.h" #include "storage/browser/test/test_file_system_context.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -40,8 +43,14 @@ ASSERT_TRUE(dest_file.IsValid()); dest_fd_ = base::ScopedFD(dest_file.TakePlatformFile()); + base::FilePath temp_path = temp_dir_.GetPath(); + quota_manager_ = base::MakeRefCounted<storage::MockQuotaManager>( + /*is_incognito=*/false, temp_path, base::ThreadTaskRunnerHandle::Get(), + base::MakeRefCounted<storage::MockSpecialStoragePolicy>()); + quota_manager_proxy_ = base::MakeRefCounted<storage::MockQuotaManagerProxy>( + quota_manager_.get(), base::ThreadTaskRunnerHandle::Get()); context_ = storage::CreateFileSystemContextForTesting( - /*quota_manager_proxy=*/nullptr, temp_dir_.GetPath()); + quota_manager_proxy_.get(), temp_path); // Prepare a file system. constexpr char kURLOrigin[] = "http://origin/"; @@ -75,6 +84,8 @@ base::ScopedTempDir temp_dir_; base::FilePath dest_file_path_; base::ScopedFD dest_fd_; + scoped_refptr<storage::MockQuotaManager> quota_manager_; + scoped_refptr<storage::MockQuotaManagerProxy> quota_manager_proxy_; scoped_refptr<storage::FileSystemContext> context_; storage::FileSystemURL url_; std::string test_data_;
diff --git a/chrome/browser/ash/arc/nearby_share/share_info_file_stream_adapter_unittest.cc b/chrome/browser/ash/arc/nearby_share/share_info_file_stream_adapter_unittest.cc index 7979e6c..f5260a7 100644 --- a/chrome/browser/ash/arc/nearby_share/share_info_file_stream_adapter_unittest.cc +++ b/chrome/browser/ash/arc/nearby_share/share_info_file_stream_adapter_unittest.cc
@@ -22,6 +22,9 @@ #include "storage/browser/file_system/file_system_url.h" #include "storage/browser/quota/quota_manager_proxy.h" #include "storage/browser/test/async_file_test_helper.h" +#include "storage/browser/test/mock_quota_manager.h" +#include "storage/browser/test/mock_quota_manager_proxy.h" +#include "storage/browser/test/mock_special_storage_policy.h" #include "storage/browser/test/test_file_system_context.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/storage_key/storage_key.h" @@ -57,8 +60,14 @@ ASSERT_TRUE(test_file.IsValid() && base::PathExists(test_file_path_)); test_fd_ = base::ScopedFD(test_file.TakePlatformFile()); + base::FilePath temp_path = temp_dir_.GetPath(); + quota_manager_ = base::MakeRefCounted<storage::MockQuotaManager>( + /*is_incognito=*/false, temp_path, base::ThreadTaskRunnerHandle::Get(), + base::MakeRefCounted<storage::MockSpecialStoragePolicy>()); + quota_manager_proxy_ = base::MakeRefCounted<storage::MockQuotaManagerProxy>( + quota_manager_.get(), base::ThreadTaskRunnerHandle::Get()); file_system_context_ = storage::CreateFileSystemContextForTesting( - nullptr /*quota_manager_proxy=*/, temp_dir_.GetPath()); + quota_manager_proxy_.get(), temp_path); file_system_context_->OpenFileSystem( blink::StorageKey::CreateFromStringForTesting(kURLOrigin), @@ -114,6 +123,8 @@ base::ScopedFD test_fd_; content::BrowserTaskEnvironment task_environment_; scoped_refptr<ShareInfoFileStreamAdapter> stream_adapter_; + scoped_refptr<storage::MockQuotaManager> quota_manager_; + scoped_refptr<storage::MockQuotaManagerProxy> quota_manager_proxy_; scoped_refptr<storage::FileSystemContext> file_system_context_; storage::FileSystemURL url_; std::string test_data_;
diff --git a/chrome/browser/ash/crosapi/browser_data_migrator_browsertest.cc b/chrome/browser/ash/crosapi/browser_data_migrator_browsertest.cc index cef4673..21984d27 100644 --- a/chrome/browser/ash/crosapi/browser_data_migrator_browsertest.cc +++ b/chrome/browser/ash/crosapi/browser_data_migrator_browsertest.cc
@@ -6,7 +6,7 @@ #include <string> -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/constants/ash_features.h" #include "ash/constants/ash_switches.h" #include "base/run_loop.h"
diff --git a/chrome/browser/ash/crosapi/login_ash.cc b/chrome/browser/ash/crosapi/login_ash.cc index 9797e68d..690ad785 100644 --- a/chrome/browser/ash/crosapi/login_ash.cc +++ b/chrome/browser/ash/crosapi/login_ash.cc
@@ -4,9 +4,9 @@ #include "chrome/browser/ash/crosapi/login_ash.h" -#include "ash/components/login/auth/cryptohome_key_constants.h" -#include "ash/components/login/auth/key.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/cryptohome_key_constants.h" +#include "ash/components/login/auth/public/key.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/notreached.h" #include "chrome/browser/ash/login/existing_user_controller.h" #include "chrome/browser/ash/login/ui/login_display_host.h"
diff --git a/chrome/browser/ash/login/OWNERS b/chrome/browser/ash/login/OWNERS index 0cb8af2..71f7370 100644 --- a/chrome/browser/ash/login/OWNERS +++ b/chrome/browser/ash/login/OWNERS
@@ -8,4 +8,6 @@ per-file *wizard_controller.*=file://ash/login/LOGIN_LOCK_OWNERS per-file *challenge_response*=emaxx@chromium.org +per-file *challenge_response*=fabiansommer@chromium.org per-file *security_token*=emaxx@chromium.org +per-file *security_token*=fabiansommer@chromium.org
diff --git a/chrome/browser/ash/login/auth/chrome_login_performer.h b/chrome/browser/ash/login/auth/chrome_login_performer.h index f8216ee..f5439a1 100644 --- a/chrome/browser/ash/login/auth/chrome_login_performer.h +++ b/chrome/browser/ash/login/auth/chrome_login_performer.h
@@ -13,7 +13,7 @@ #include "ash/components/login/auth/extended_authenticator.h" #include "ash/components/login/auth/login_performer.h" #include "ash/components/login/auth/metrics_recorder.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/memory/weak_ptr.h" #include "chrome/browser/ash/policy/login/wildcard_login_checker.h" #include "components/user_manager/user_type.h"
diff --git a/chrome/browser/ash/login/auth/cryptohome_authenticator_unittest.cc b/chrome/browser/ash/login/auth/cryptohome_authenticator_unittest.cc index 583d97c7..192d7690 100644 --- a/chrome/browser/ash/login/auth/cryptohome_authenticator_unittest.cc +++ b/chrome/browser/ash/login/auth/cryptohome_authenticator_unittest.cc
@@ -12,11 +12,12 @@ #include "ash/components/cryptohome/cryptohome_parameters.h" #include "ash/components/cryptohome/cryptohome_util.h" #include "ash/components/cryptohome/system_salt_getter.h" -#include "ash/components/login/auth/cryptohome_key_constants.h" -#include "ash/components/login/auth/key.h" #include "ash/components/login/auth/mock_auth_status_consumer.h" +#include "ash/components/login/auth/public/auth_failure.h" +#include "ash/components/login/auth/public/cryptohome_key_constants.h" +#include "ash/components/login/auth/public/key.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/components/login/auth/test_attempt_state.h" -#include "ash/components/login/auth/user_context.h" #include "ash/constants/ash_switches.h" #include "base/bind.h" #include "base/command_line.h"
diff --git a/chrome/browser/ash/login/challenge_response_auth_keys_loader.h b/chrome/browser/ash/login/challenge_response_auth_keys_loader.h index 59bc1d0..0ac8c759 100644 --- a/chrome/browser/ash/login/challenge_response_auth_keys_loader.h +++ b/chrome/browser/ash/login/challenge_response_auth_keys_loader.h
@@ -8,7 +8,7 @@ #include <string> #include <vector> -#include "ash/components/login/auth/challenge_response_key.h" +#include "ash/components/login/auth/public/challenge_response_key.h" #include "base/memory/weak_ptr.h" #include "base/scoped_observation.h" #include "base/time/time.h"
diff --git a/chrome/browser/ash/login/challenge_response_auth_keys_loader_browsertest.cc b/chrome/browser/ash/login/challenge_response_auth_keys_loader_browsertest.cc index bf0d7a1..18b2f8d 100644 --- a/chrome/browser/ash/login/challenge_response_auth_keys_loader_browsertest.cc +++ b/chrome/browser/ash/login/challenge_response_auth_keys_loader_browsertest.cc
@@ -7,7 +7,7 @@ #include <vector> #include "ash/components/login/auth/challenge_response/known_user_pref_utils.h" -#include "ash/components/login/auth/challenge_response_key.h" +#include "ash/components/login/auth/public/challenge_response_key.h" #include "base/callback_helpers.h" #include "base/run_loop.h" #include "base/scoped_observation.h"
diff --git a/chrome/browser/ash/login/crash_restore_browsertest.cc b/chrome/browser/ash/login/crash_restore_browsertest.cc index 14c460ec..3f10517 100644 --- a/chrome/browser/ash/login/crash_restore_browsertest.cc +++ b/chrome/browser/ash/login/crash_restore_browsertest.cc
@@ -7,7 +7,7 @@ #include <vector> #include "ash/components/cryptohome/cryptohome_parameters.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/constants/ash_switches.h" #include "base/command_line.h" #include "base/files/file_path.h"
diff --git a/chrome/browser/ash/login/device_family_link_allowed_policy_browsertest.cc b/chrome/browser/ash/login/device_family_link_allowed_policy_browsertest.cc index 262ae90a..a2fa67d 100644 --- a/chrome/browser/ash/login/device_family_link_allowed_policy_browsertest.cc +++ b/chrome/browser/ash/login/device_family_link_allowed_policy_browsertest.cc
@@ -4,8 +4,8 @@ #include <memory> +#include "ash/components/login/auth/public/user_context.h" #include "ash/components/login/auth/stub_authenticator_builder.h" -#include "ash/components/login/auth/user_context.h" #include "ash/components/settings/cros_settings_names.h" #include "ash/constants/ash_features.h" #include "ash/public/cpp/login_screen_test_api.h"
diff --git a/chrome/browser/ash/login/easy_unlock/easy_unlock_create_keys_operation.cc b/chrome/browser/ash/login/easy_unlock/easy_unlock_create_keys_operation.cc index 8a4bfbae..82986b4 100644 --- a/chrome/browser/ash/login/easy_unlock/easy_unlock_create_keys_operation.cc +++ b/chrome/browser/ash/login/easy_unlock/easy_unlock_create_keys_operation.cc
@@ -12,7 +12,7 @@ #include "ash/components/cryptohome/cryptohome_util.h" #include "ash/components/cryptohome/system_salt_getter.h" #include "ash/components/cryptohome/userdataauth_util.h" -#include "ash/components/login/auth/key.h" +#include "ash/components/login/auth/public/key.h" #include "ash/components/multidevice/logging/logging.h" #include "base/base64url.h" #include "base/bind.h"
diff --git a/chrome/browser/ash/login/easy_unlock/easy_unlock_create_keys_operation.h b/chrome/browser/ash/login/easy_unlock/easy_unlock_create_keys_operation.h index bbcc3a0..d4903d4 100644 --- a/chrome/browser/ash/login/easy_unlock/easy_unlock_create_keys_operation.h +++ b/chrome/browser/ash/login/easy_unlock/easy_unlock_create_keys_operation.h
@@ -10,7 +10,7 @@ #include <memory> #include <string> -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/callback.h" #include "base/memory/weak_ptr.h" #include "chrome/browser/ash/login/easy_unlock/easy_unlock_types.h"
diff --git a/chrome/browser/ash/login/easy_unlock/easy_unlock_get_keys_operation.h b/chrome/browser/ash/login/easy_unlock/easy_unlock_get_keys_operation.h index 9e996f98..67987f22 100644 --- a/chrome/browser/ash/login/easy_unlock/easy_unlock_get_keys_operation.h +++ b/chrome/browser/ash/login/easy_unlock/easy_unlock_get_keys_operation.h
@@ -7,7 +7,7 @@ #include <stddef.h> -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/callback.h" #include "base/memory/weak_ptr.h" #include "chrome/browser/ash/login/easy_unlock/easy_unlock_types.h"
diff --git a/chrome/browser/ash/login/easy_unlock/easy_unlock_refresh_keys_operation.h b/chrome/browser/ash/login/easy_unlock/easy_unlock_refresh_keys_operation.h index 7b612d6..1e707be 100644 --- a/chrome/browser/ash/login/easy_unlock/easy_unlock_refresh_keys_operation.h +++ b/chrome/browser/ash/login/easy_unlock/easy_unlock_refresh_keys_operation.h
@@ -7,7 +7,7 @@ #include <string> -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/callback.h" #include "base/memory/weak_ptr.h" #include "chrome/browser/ash/login/easy_unlock/easy_unlock_types.h"
diff --git a/chrome/browser/ash/login/easy_unlock/easy_unlock_remove_keys_operation.h b/chrome/browser/ash/login/easy_unlock/easy_unlock_remove_keys_operation.h index df5df42..79d0688 100644 --- a/chrome/browser/ash/login/easy_unlock/easy_unlock_remove_keys_operation.h +++ b/chrome/browser/ash/login/easy_unlock/easy_unlock_remove_keys_operation.h
@@ -7,7 +7,7 @@ #include <stddef.h> -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/callback.h" #include "base/memory/weak_ptr.h" #include "chromeos/dbus/cryptohome/UserDataAuth.pb.h"
diff --git a/chrome/browser/ash/login/easy_unlock/easy_unlock_service.cc b/chrome/browser/ash/login/easy_unlock/easy_unlock_service.cc index 290da7b2..250291a 100644 --- a/chrome/browser/ash/login/easy_unlock/easy_unlock_service.cc +++ b/chrome/browser/ash/login/easy_unlock/easy_unlock_service.cc
@@ -7,7 +7,7 @@ #include <memory> #include <utility> -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/components/multidevice/logging/logging.h" #include "ash/components/proximity_auth/proximity_auth_local_state_pref_manager.h" #include "ash/components/proximity_auth/proximity_auth_profile_pref_manager.h"
diff --git a/chrome/browser/ash/login/easy_unlock/easy_unlock_service_signin.cc b/chrome/browser/ash/login/easy_unlock/easy_unlock_service_signin.cc index 098cabb..7c894be 100644 --- a/chrome/browser/ash/login/easy_unlock/easy_unlock_service_signin.cc +++ b/chrome/browser/ash/login/easy_unlock/easy_unlock_service_signin.cc
@@ -8,7 +8,7 @@ #include <memory> -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/components/multidevice/logging/logging.h" #include "ash/components/multidevice/remote_device.h" #include "ash/components/multidevice/remote_device_cache.h"
diff --git a/chrome/browser/ash/login/easy_unlock/easy_unlock_user_login_flow.cc b/chrome/browser/ash/login/easy_unlock/easy_unlock_user_login_flow.cc index bea009a..1d90bf8 100644 --- a/chrome/browser/ash/login/easy_unlock/easy_unlock_user_login_flow.cc +++ b/chrome/browser/ash/login/easy_unlock/easy_unlock_user_login_flow.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/ash/login/easy_unlock/easy_unlock_user_login_flow.h" +#include "ash/components/login/auth/public/auth_failure.h" #include "base/metrics/histogram_macros.h" #include "chrome/browser/ash/login/easy_unlock/easy_unlock_service.h" #include "chrome/browser/ash/profiles/profile_helper.h"
diff --git a/chrome/browser/ash/login/easy_unlock/smartlock_feature_usage_metrics.cc b/chrome/browser/ash/login/easy_unlock/smartlock_feature_usage_metrics.cc index 600c1f1..ef63eb6 100644 --- a/chrome/browser/ash/login/easy_unlock/smartlock_feature_usage_metrics.cc +++ b/chrome/browser/ash/login/easy_unlock/smartlock_feature_usage_metrics.cc
@@ -5,7 +5,7 @@ #include "chrome/browser/ash/login/easy_unlock/smartlock_feature_usage_metrics.h" #include "ash/services/multidevice_setup/public/cpp/multidevice_setup_client.h" -#include "chromeos/components/feature_usage/feature_usage_metrics.h" +#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h" namespace ash {
diff --git a/chrome/browser/ash/login/easy_unlock/smartlock_feature_usage_metrics.h b/chrome/browser/ash/login/easy_unlock/smartlock_feature_usage_metrics.h index eff711b..72c1f991 100644 --- a/chrome/browser/ash/login/easy_unlock/smartlock_feature_usage_metrics.h +++ b/chrome/browser/ash/login/easy_unlock/smartlock_feature_usage_metrics.h
@@ -6,7 +6,7 @@ #define CHROME_BROWSER_ASH_LOGIN_EASY_UNLOCK_SMARTLOCK_FEATURE_USAGE_METRICS_H_ #include "ash/components/proximity_auth/smart_lock_metrics_recorder.h" -#include "chromeos/components/feature_usage/feature_usage_metrics.h" +#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h" namespace ash {
diff --git a/chrome/browser/ash/login/easy_unlock/smartlock_feature_usage_metrics_unittest.cc b/chrome/browser/ash/login/easy_unlock/smartlock_feature_usage_metrics_unittest.cc index 2f75171..573954ef3 100644 --- a/chrome/browser/ash/login/easy_unlock/smartlock_feature_usage_metrics_unittest.cc +++ b/chrome/browser/ash/login/easy_unlock/smartlock_feature_usage_metrics_unittest.cc
@@ -9,7 +9,7 @@ #include "base/test/metrics/histogram_tester.h" #include "base/test/task_environment.h" #include "chrome/browser/ash/login/easy_unlock/smartlock_feature_usage_metrics.h" -#include "chromeos/components/feature_usage/feature_usage_metrics.h" +#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h" #include "testing/gtest/include/gtest/gtest.h" namespace ash {
diff --git a/chrome/browser/ash/login/encryption_migration_browsertest.cc b/chrome/browser/ash/login/encryption_migration_browsertest.cc index 10270ca..4a15597 100644 --- a/chrome/browser/ash/login/encryption_migration_browsertest.cc +++ b/chrome/browser/ash/login/encryption_migration_browsertest.cc
@@ -4,8 +4,8 @@ #include <string> +#include "ash/components/login/auth/public/user_context.h" #include "ash/components/login/auth/stub_authenticator_builder.h" -#include "ash/components/login/auth/user_context.h" #include "ash/constants/ash_switches.h" #include "ash/public/cpp/login_screen_test_api.h" #include "base/command_line.h"
diff --git a/chrome/browser/ash/login/enterprise_user_session_metrics.cc b/chrome/browser/ash/login/enterprise_user_session_metrics.cc index 4a7df02d..cf979028 100644 --- a/chrome/browser/ash/login/enterprise_user_session_metrics.cc +++ b/chrome/browser/ash/login/enterprise_user_session_metrics.cc
@@ -6,7 +6,7 @@ #include <algorithm> -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/check.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h"
diff --git a/chrome/browser/ash/login/enterprise_user_session_metrics_unittest.cc b/chrome/browser/ash/login/enterprise_user_session_metrics_unittest.cc index 71fd2e6..91481685 100644 --- a/chrome/browser/ash/login/enterprise_user_session_metrics_unittest.cc +++ b/chrome/browser/ash/login/enterprise_user_session_metrics_unittest.cc
@@ -6,7 +6,7 @@ #include <memory> -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/components/tpm/stub_install_attributes.h" #include "base/test/metrics/histogram_tester.h" #include "base/time/time.h"
diff --git a/chrome/browser/ash/login/existing_user_controller.cc b/chrome/browser/ash/login/existing_user_controller.cc index 3dad9dd..69fe1ddf 100644 --- a/chrome/browser/ash/login/existing_user_controller.cc +++ b/chrome/browser/ash/login/existing_user_controller.cc
@@ -13,7 +13,8 @@ #include "ash/components/arc/enterprise/arc_data_snapshotd_manager.h" #include "ash/components/cryptohome/cryptohome_parameters.h" #include "ash/components/cryptohome/cryptohome_util.h" -#include "ash/components/login/auth/key.h" +#include "ash/components/login/auth/public/auth_failure.h" +#include "ash/components/login/auth/public/key.h" #include "ash/components/login/session/session_termination_manager.h" #include "ash/components/settings/cros_settings_names.h" #include "ash/constants/ash_features.h"
diff --git a/chrome/browser/ash/login/existing_user_controller.h b/chrome/browser/ash/login/existing_user_controller.h index 582a98b..997fb39 100644 --- a/chrome/browser/ash/login/existing_user_controller.h +++ b/chrome/browser/ash/login/existing_user_controller.h
@@ -11,7 +11,8 @@ #include <string> #include "ash/components/login/auth/login_performer.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/auth_failure.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/callback_forward.h" #include "base/gtest_prod_util.h" #include "base/memory/weak_ptr.h"
diff --git a/chrome/browser/ash/login/existing_user_controller_browsertest.cc b/chrome/browser/ash/login/existing_user_controller_browsertest.cc index f32f075..ad761e9 100644 --- a/chrome/browser/ash/login/existing_user_controller_browsertest.cc +++ b/chrome/browser/ash/login/existing_user_controller_browsertest.cc
@@ -8,9 +8,9 @@ #include "ash/components/arc/enterprise/arc_data_snapshotd_manager.h" #include "ash/components/arc/test/arc_util_test_support.h" #include "ash/components/cryptohome/cryptohome_parameters.h" -#include "ash/components/login/auth/key.h" +#include "ash/components/login/auth/public/key.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/components/login/auth/stub_authenticator_builder.h" -#include "ash/components/login/auth/user_context.h" #include "ash/components/settings/cros_settings_names.h" #include "ash/components/settings/cros_settings_provider.h" #include "ash/constants/ash_features.h"
diff --git a/chrome/browser/ash/login/helper.cc b/chrome/browser/ash/login/helper.cc index 65be425d..f298bc8 100644 --- a/chrome/browser/ash/login/helper.cc +++ b/chrome/browser/ash/login/helper.cc
@@ -6,7 +6,7 @@ #include <memory> -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/bind.h" #include "base/command_line.h" #include "base/json/json_reader.h"
diff --git a/chrome/browser/ash/login/lock/screen_locker.cc b/chrome/browser/ash/login/lock/screen_locker.cc index a6c2257..9f063b0 100644 --- a/chrome/browser/ash/login/lock/screen_locker.cc +++ b/chrome/browser/ash/login/lock/screen_locker.cc
@@ -9,6 +9,7 @@ #include "ash/components/audio/sounds.h" #include "ash/components/login/auth/authenticator.h" #include "ash/components/login/auth/extended_authenticator.h" +#include "ash/components/login/auth/public/auth_failure.h" #include "ash/components/login/session/session_termination_manager.h" #include "ash/constants/ash_pref_names.h" #include "ash/public/cpp/login_screen.h"
diff --git a/chrome/browser/ash/login/lock/screen_locker.h b/chrome/browser/ash/login/lock/screen_locker.h index f4706a2..cf3bf6b 100644 --- a/chrome/browser/ash/login/lock/screen_locker.h +++ b/chrome/browser/ash/login/lock/screen_locker.h
@@ -11,8 +11,8 @@ #include <vector> #include "ash/components/login/auth/auth_status_consumer.h" -#include "ash/components/login/auth/challenge_response_key.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/challenge_response_key.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/public/cpp/login_types.h" #include "base/callback_forward.h" #include "base/memory/ref_counted.h"
diff --git a/chrome/browser/ash/login/lock/screen_locker_tester.cc b/chrome/browser/ash/login/lock/screen_locker_tester.cc index ae6abb6..0ad4cc9 100644 --- a/chrome/browser/ash/login/lock/screen_locker_tester.cc +++ b/chrome/browser/ash/login/lock/screen_locker_tester.cc
@@ -9,9 +9,9 @@ #include "ash/components/login/auth/auth_status_consumer.h" #include "ash/components/login/auth/fake_extended_authenticator.h" -#include "ash/components/login/auth/key.h" +#include "ash/components/login/auth/public/key.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/components/login/auth/stub_authenticator.h" -#include "ash/components/login/auth/user_context.h" #include "ash/public/cpp/login_screen_test_api.h" #include "base/run_loop.h" #include "base/scoped_observation.h"
diff --git a/chrome/browser/ash/login/login_client_cert_usage_observer.h b/chrome/browser/ash/login/login_client_cert_usage_observer.h index cfa51a85..86ade19 100644 --- a/chrome/browser/ash/login/login_client_cert_usage_observer.h +++ b/chrome/browser/ash/login/login_client_cert_usage_observer.h
@@ -8,7 +8,7 @@ #include <string> #include <vector> -#include "ash/components/login/auth/challenge_response_key.h" +#include "ash/components/login/auth/public/challenge_response_key.h" #include "base/memory/ref_counted.h" #include "chrome/browser/certificate_provider/certificate_provider_service.h" #include "net/cert/x509_certificate.h"
diff --git a/chrome/browser/ash/login/login_manager_test.cc b/chrome/browser/ash/login/login_manager_test.cc index ac3c915..d71a3c3 100644 --- a/chrome/browser/ash/login/login_manager_test.cc +++ b/chrome/browser/ash/login/login_manager_test.cc
@@ -6,8 +6,8 @@ #include <string> -#include "ash/components/login/auth/key.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/key.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/constants/ash_switches.h" #include "ash/metrics/login_unlock_throughput_recorder.h" #include "ash/shell.h"
diff --git a/chrome/browser/ash/login/login_ui_keyboard_browsertest.cc b/chrome/browser/ash/login/login_ui_keyboard_browsertest.cc index d27efcd..c7d9c83 100644 --- a/chrome/browser/ash/login/login_ui_keyboard_browsertest.cc +++ b/chrome/browser/ash/login/login_ui_keyboard_browsertest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/constants/ash_features.h" #include "ash/constants/ash_switches.h" #include "ash/public/cpp/login_screen_test_api.h"
diff --git a/chrome/browser/ash/login/oobe_browsertest.cc b/chrome/browser/ash/login/oobe_browsertest.cc index 4c49ebf..d87a559 100644 --- a/chrome/browser/ash/login/oobe_browsertest.cc +++ b/chrome/browser/ash/login/oobe_browsertest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/components/login/auth/cryptohome_key_constants.h" +#include "ash/components/login/auth/public/cryptohome_key_constants.h" #include "ash/constants/ash_features.h" #include "ash/constants/ash_switches.h" #include "ash/display/window_tree_host_manager.h"
diff --git a/chrome/browser/ash/login/password_change_browsertest.cc b/chrome/browser/ash/login/password_change_browsertest.cc index 3e29885f..40c87bc0 100644 --- a/chrome/browser/ash/login/password_change_browsertest.cc +++ b/chrome/browser/ash/login/password_change_browsertest.cc
@@ -6,9 +6,9 @@ #include <string> #include <utility> +#include "ash/components/login/auth/public/user_context.h" #include "ash/components/login/auth/stub_authenticator.h" #include "ash/components/login/auth/stub_authenticator_builder.h" -#include "ash/components/login/auth/user_context.h" #include "ash/public/cpp/login_screen_test_api.h" #include "base/auto_reset.h" #include "base/bind.h"
diff --git a/chrome/browser/ash/login/quick_unlock/DEPS b/chrome/browser/ash/login/quick_unlock/DEPS deleted file mode 100644 index 3e3d784..0000000 --- a/chrome/browser/ash/login/quick_unlock/DEPS +++ /dev/null
@@ -1,3 +0,0 @@ -include_rules = [ - "+chromeos/components/feature_usage", -] \ No newline at end of file
diff --git a/chrome/browser/ash/login/quick_unlock/auth_token.cc b/chrome/browser/ash/login/quick_unlock/auth_token.cc index 185f074..fbe6b33 100644 --- a/chrome/browser/ash/login/quick_unlock/auth_token.cc +++ b/chrome/browser/ash/login/quick_unlock/auth_token.cc
@@ -4,7 +4,7 @@ #include "chrome/browser/ash/login/quick_unlock/auth_token.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/bind.h" #include "base/task/single_thread_task_runner.h" #include "base/threading/thread_task_runner_handle.h"
diff --git a/chrome/browser/ash/login/quick_unlock/fingerprint_storage.cc b/chrome/browser/ash/login/quick_unlock/fingerprint_storage.cc index 38a4fef..93aa06c 100644 --- a/chrome/browser/ash/login/quick_unlock/fingerprint_storage.cc +++ b/chrome/browser/ash/login/quick_unlock/fingerprint_storage.cc
@@ -11,7 +11,7 @@ #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/profiles/profile.h" #include "chromeos/ash/components/dbus/biod/biod_client.h" -#include "chromeos/components/feature_usage/feature_usage_metrics.h" +#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h" #include "chromeos/dbus/power/power_manager_client.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/ash/login/quick_unlock/fingerprint_storage.h b/chrome/browser/ash/login/quick_unlock/fingerprint_storage.h index db83c66..17fc893 100644 --- a/chrome/browser/ash/login/quick_unlock/fingerprint_storage.h +++ b/chrome/browser/ash/login/quick_unlock/fingerprint_storage.h
@@ -8,7 +8,7 @@ #include "base/time/time.h" #include "chrome/browser/ash/login/quick_unlock/fingerprint_power_button_race_detector.h" #include "chrome/browser/ash/login/quick_unlock/quick_unlock_utils.h" -#include "chromeos/components/feature_usage/feature_usage_metrics.h" +#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h" #include "chromeos/dbus/power/power_manager_client.h" #include "mojo/public/cpp/bindings/remote.h" #include "services/device/public/mojom/fingerprint.mojom.h"
diff --git a/chrome/browser/ash/login/quick_unlock/pin_backend.h b/chrome/browser/ash/login/quick_unlock/pin_backend.h index dcc024f..db978c8 100644 --- a/chrome/browser/ash/login/quick_unlock/pin_backend.h +++ b/chrome/browser/ash/login/quick_unlock/pin_backend.h
@@ -7,7 +7,7 @@ #include <string> -#include "ash/components/login/auth/key.h" +#include "ash/components/login/auth/public/key.h" #include "base/callback.h" #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/ash/login/quick_unlock/pin_storage_cryptohome.cc b/chrome/browser/ash/login/quick_unlock/pin_storage_cryptohome.cc index 089a854..ffe610f 100644 --- a/chrome/browser/ash/login/quick_unlock/pin_storage_cryptohome.cc +++ b/chrome/browser/ash/login/quick_unlock/pin_storage_cryptohome.cc
@@ -8,8 +8,8 @@ #include "ash/components/cryptohome/cryptohome_util.h" #include "ash/components/cryptohome/system_salt_getter.h" #include "ash/components/cryptohome/userdataauth_util.h" -#include "ash/components/login/auth/cryptohome_key_constants.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/cryptohome_key_constants.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/constants/ash_pref_names.h" #include "base/bind.h" #include "base/logging.h"
diff --git a/chrome/browser/ash/login/quick_unlock/pin_storage_cryptohome_unittest.cc b/chrome/browser/ash/login/quick_unlock/pin_storage_cryptohome_unittest.cc index c606cb3..ffe29ee 100644 --- a/chrome/browser/ash/login/quick_unlock/pin_storage_cryptohome_unittest.cc +++ b/chrome/browser/ash/login/quick_unlock/pin_storage_cryptohome_unittest.cc
@@ -9,8 +9,8 @@ #include "ash/components/cryptohome/cryptohome_parameters.h" #include "ash/components/cryptohome/cryptohome_util.h" #include "ash/components/cryptohome/system_salt_getter.h" -#include "ash/components/login/auth/cryptohome_key_constants.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/cryptohome_key_constants.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/bind.h" #include "base/logging.h" #include "base/run_loop.h"
diff --git a/chrome/browser/ash/login/quick_unlock/pin_storage_prefs.h b/chrome/browser/ash/login/quick_unlock/pin_storage_prefs.h index c02d9de..5a211404 100644 --- a/chrome/browser/ash/login/quick_unlock/pin_storage_prefs.h +++ b/chrome/browser/ash/login/quick_unlock/pin_storage_prefs.h
@@ -7,7 +7,7 @@ #include <string> -#include "ash/components/login/auth/key.h" +#include "ash/components/login/auth/public/key.h" #include "base/gtest_prod_util.h" class PrefRegistrySimple;
diff --git a/chrome/browser/ash/login/quick_unlock/quick_unlock_storage.h b/chrome/browser/ash/login/quick_unlock/quick_unlock_storage.h index f3ef0e31..c5ddbe4 100644 --- a/chrome/browser/ash/login/quick_unlock/quick_unlock_storage.h +++ b/chrome/browser/ash/login/quick_unlock/quick_unlock_storage.h
@@ -5,7 +5,7 @@ #ifndef CHROME_BROWSER_ASH_LOGIN_QUICK_UNLOCK_QUICK_UNLOCK_STORAGE_H_ #define CHROME_BROWSER_ASH_LOGIN_QUICK_UNLOCK_QUICK_UNLOCK_STORAGE_H_ -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/time/default_clock.h" #include "base/time/time.h" #include "components/keyed_service/core/keyed_service.h"
diff --git a/chrome/browser/ash/login/quick_unlock/quick_unlock_storage_unittest.cc b/chrome/browser/ash/login/quick_unlock/quick_unlock_storage_unittest.cc index 4788669..e5ea2e8 100644 --- a/chrome/browser/ash/login/quick_unlock/quick_unlock_storage_unittest.cc +++ b/chrome/browser/ash/login/quick_unlock/quick_unlock_storage_unittest.cc
@@ -6,7 +6,7 @@ #include <memory> -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/constants/ash_pref_names.h" #include "base/time/time.h" #include "chrome/browser/ash/login/quick_unlock/auth_token.h"
diff --git a/chrome/browser/ash/login/reporting/login_logout_reporter.cc b/chrome/browser/ash/login/reporting/login_logout_reporter.cc index ba16eff..1d03265 100644 --- a/chrome/browser/ash/login/reporting/login_logout_reporter.cc +++ b/chrome/browser/ash/login/reporting/login_logout_reporter.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/ash/login/reporting/login_logout_reporter.h" +#include "ash/components/login/auth/public/auth_failure.h" #include "base/logging.h" #include "base/task/bind_post_task.h" #include "chrome/browser/ash/login/existing_user_controller.h"
diff --git a/chrome/browser/ash/login/reporting/login_logout_reporter.h b/chrome/browser/ash/login/reporting/login_logout_reporter.h index a21ff34b..c87e92ec7 100644 --- a/chrome/browser/ash/login/reporting/login_logout_reporter.h +++ b/chrome/browser/ash/login/reporting/login_logout_reporter.h
@@ -25,6 +25,9 @@ } // namespace reporting namespace ash { + +class AuthFailure; + namespace reporting { class LoginLogoutReporter : public policy::ManagedSessionService::Observer {
diff --git a/chrome/browser/ash/login/reporting/login_logout_reporter_browsertest.cc b/chrome/browser/ash/login/reporting/login_logout_reporter_browsertest.cc index f8c83ea..6f93eedf 100644 --- a/chrome/browser/ash/login/reporting/login_logout_reporter_browsertest.cc +++ b/chrome/browser/ash/login/reporting/login_logout_reporter_browsertest.cc
@@ -6,10 +6,10 @@ #include <tuple> #include <vector> -#include "ash/components/login/auth/auth_status_consumer.h" -#include "ash/components/login/auth/key.h" +#include "ash/components/login/auth/public/auth_failure.h" +#include "ash/components/login/auth/public/key.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/components/login/auth/stub_authenticator_builder.h" -#include "ash/components/login/auth/user_context.h" #include "ash/components/settings/cros_settings_names.h" #include "ash/public/cpp/login_screen_test_api.h" #include "base/run_loop.h"
diff --git a/chrome/browser/ash/login/reporting/login_logout_reporter_unittest.cc b/chrome/browser/ash/login/reporting/login_logout_reporter_unittest.cc index ef79898..efa2e47 100644 --- a/chrome/browser/ash/login/reporting/login_logout_reporter_unittest.cc +++ b/chrome/browser/ash/login/reporting/login_logout_reporter_unittest.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/ash/login/reporting/login_logout_reporter_test_delegate.h" +#include "ash/components/login/auth/public/auth_failure.h" #include "ash/components/login/session/session_termination_manager.h" #include "base/test/scoped_feature_list.h" #include "base/test/simple_test_clock.h"
diff --git a/chrome/browser/ash/login/saml/in_session_password_change_manager.cc b/chrome/browser/ash/login/saml/in_session_password_change_manager.cc index ff1bf73..98c7deb 100644 --- a/chrome/browser/ash/login/saml/in_session_password_change_manager.cc +++ b/chrome/browser/ash/login/saml/in_session_password_change_manager.cc
@@ -4,7 +4,7 @@ #include "chrome/browser/ash/login/saml/in_session_password_change_manager.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/constants/ash_features.h" #include "ash/public/cpp/session/session_activation_observer.h" #include "ash/public/cpp/session/session_controller.h"
diff --git a/chrome/browser/ash/login/saml/in_session_password_change_manager_unittest.cc b/chrome/browser/ash/login/saml/in_session_password_change_manager_unittest.cc index 014eaa6..e3e2ef48 100644 --- a/chrome/browser/ash/login/saml/in_session_password_change_manager_unittest.cc +++ b/chrome/browser/ash/login/saml/in_session_password_change_manager_unittest.cc
@@ -4,7 +4,7 @@ #include "chrome/browser/ash/login/saml/in_session_password_change_manager.h" -#include "ash/components/login/auth/saml_password_attributes.h" +#include "ash/components/login/auth/public/saml_password_attributes.h" #include "ash/public/cpp/session/session_activation_observer.h" #include "ash/public/cpp/session/session_controller.h" #include "base/strings/utf_string_conversions.h"
diff --git a/chrome/browser/ash/login/saml/in_session_password_sync_manager.cc b/chrome/browser/ash/login/saml/in_session_password_sync_manager.cc index a517dac..1f9f85d59 100644 --- a/chrome/browser/ash/login/saml/in_session_password_sync_manager.cc +++ b/chrome/browser/ash/login/saml/in_session_password_sync_manager.cc
@@ -7,7 +7,7 @@ #include <utility> #include "ash/components/login/auth/extended_authenticator.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/components/proximity_auth/screenlock_bridge.h" #include "ash/constants/ash_switches.h" #include "base/callback.h"
diff --git a/chrome/browser/ash/login/saml/in_session_password_sync_manager.h b/chrome/browser/ash/login/saml/in_session_password_sync_manager.h index 3561aff..ab57b0c8 100644 --- a/chrome/browser/ash/login/saml/in_session_password_sync_manager.h +++ b/chrome/browser/ash/login/saml/in_session_password_sync_manager.h
@@ -9,7 +9,7 @@ #include <string> #include "ash/components/login/auth/auth_status_consumer.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/components/proximity_auth/screenlock_bridge.h" #include "base/callback_forward.h" #include "base/time/clock.h"
diff --git a/chrome/browser/ash/login/saml/in_session_password_sync_manager_unittest.cc b/chrome/browser/ash/login/saml/in_session_password_sync_manager_unittest.cc index 8381288..954a3a3 100644 --- a/chrome/browser/ash/login/saml/in_session_password_sync_manager_unittest.cc +++ b/chrome/browser/ash/login/saml/in_session_password_sync_manager_unittest.cc
@@ -5,7 +5,7 @@ #include "chrome/browser/ash/login/saml/in_session_password_sync_manager.h" #include <memory> -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/constants/ash_features.h" #include "base/test/scoped_feature_list.h" #include "base/time/default_clock.h"
diff --git a/chrome/browser/ash/login/saml/password_expiry_notification.cc b/chrome/browser/ash/login/saml/password_expiry_notification.cc index c373fd2..915fde5 100644 --- a/chrome/browser/ash/login/saml/password_expiry_notification.cc +++ b/chrome/browser/ash/login/saml/password_expiry_notification.cc
@@ -8,7 +8,7 @@ #include <string> #include <vector> -#include "ash/components/login/auth/saml_password_attributes.h" +#include "ash/components/login/auth/public/saml_password_attributes.h" #include "ash/constants/notifier_catalogs.h" #include "ash/public/cpp/notification_utils.h" #include "ash/public/cpp/session/session_activation_observer.h"
diff --git a/chrome/browser/ash/login/saml/password_expiry_notification_unittest.cc b/chrome/browser/ash/login/saml/password_expiry_notification_unittest.cc index 3f20e75..224f1183 100644 --- a/chrome/browser/ash/login/saml/password_expiry_notification_unittest.cc +++ b/chrome/browser/ash/login/saml/password_expiry_notification_unittest.cc
@@ -4,7 +4,7 @@ #include "chrome/browser/ash/login/saml/password_expiry_notification.h" -#include "ash/components/login/auth/saml_password_attributes.h" +#include "ash/components/login/auth/public/saml_password_attributes.h" #include "ash/public/cpp/session/session_activation_observer.h" #include "ash/public/cpp/session/session_controller.h" #include "base/strings/utf_string_conversions.h"
diff --git a/chrome/browser/ash/login/saml/password_sync_token_verifier_unittest.cc b/chrome/browser/ash/login/saml/password_sync_token_verifier_unittest.cc index a829033..81d392c 100644 --- a/chrome/browser/ash/login/saml/password_sync_token_verifier_unittest.cc +++ b/chrome/browser/ash/login/saml/password_sync_token_verifier_unittest.cc
@@ -4,7 +4,7 @@ #include "chrome/browser/ash/login/saml/password_sync_token_verifier.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/test/metrics/histogram_tester.h" #include "base/time/default_clock.h" #include "chrome/browser/ash/login/login_pref_names.h"
diff --git a/chrome/browser/ash/login/saml/saml_browsertest.cc b/chrome/browser/ash/login/saml/saml_browsertest.cc index f981240..e4edd58 100644 --- a/chrome/browser/ash/login/saml/saml_browsertest.cc +++ b/chrome/browser/ash/login/saml/saml_browsertest.cc
@@ -9,8 +9,8 @@ #include "ash/components/attestation/mock_attestation_flow.h" #include "ash/components/cryptohome/system_salt_getter.h" -#include "ash/components/login/auth/key.h" -#include "ash/components/login/auth/saml_password_attributes.h" +#include "ash/components/login/auth/public/key.h" +#include "ash/components/login/auth/public/saml_password_attributes.h" #include "ash/components/settings/cros_settings_names.h" #include "ash/components/tpm/stub_install_attributes.h" #include "ash/constants/ash_features.h" @@ -1636,9 +1636,7 @@ // Tests that clicking back on the SAML page successfully closes the oobe // dialog. Reopens a dialog and checks that SAML IdP authentication page is // loaded and authenticating there is successful. -// TODO(https://crbug.com/1102738) flaky test - partially fixed but keeping the -// test disabled since there is still some instabillity observed under load. -IN_PROC_BROWSER_TEST_P(SAMLPolicyTest, DISABLED_SAMLInterstitialNext) { +IN_PROC_BROWSER_TEST_P(SAMLPolicyTest, SAMLInterstitialNext) { fake_saml_idp()->SetLoginHTMLTemplate("saml_login.html"); fake_gaia_.fake_gaia()->SetFakeMergeSessionParams( saml_test_users::kFirstUserCorpExampleComEmail, kTestAuthSIDCookie1,
diff --git a/chrome/browser/ash/login/saml/saml_profile_prefs.cc b/chrome/browser/ash/login/saml/saml_profile_prefs.cc index 796aceb4..83f0719 100644 --- a/chrome/browser/ash/login/saml/saml_profile_prefs.cc +++ b/chrome/browser/ash/login/saml/saml_profile_prefs.cc
@@ -4,7 +4,7 @@ #include "chrome/browser/ash/login/saml/saml_profile_prefs.h" -#include "ash/components/login/auth/saml_password_attributes.h" +#include "ash/components/login/auth/public/saml_password_attributes.h" #include "chrome/browser/ash/login/login_constants.h" #include "chrome/browser/ash/login/login_pref_names.h" #include "components/prefs/pref_registry_simple.h"
diff --git a/chrome/browser/ash/login/screens/active_directory_login_screen.cc b/chrome/browser/ash/login/screens/active_directory_login_screen.cc index 922e504..b1cc8b1 100644 --- a/chrome/browser/ash/login/screens/active_directory_login_screen.cc +++ b/chrome/browser/ash/login/screens/active_directory_login_screen.cc
@@ -4,8 +4,8 @@ #include "chrome/browser/ash/login/screens/active_directory_login_screen.h" -#include "ash/components/login/auth/cryptohome_key_constants.h" -#include "ash/components/login/auth/key.h" +#include "ash/components/login/auth/public/cryptohome_key_constants.h" +#include "ash/components/login/auth/public/key.h" #include "base/memory/weak_ptr.h" #include "base/values.h" #include "chrome/browser/ash/login/screens/signin_fatal_error_screen.h"
diff --git a/chrome/browser/ash/login/screens/active_directory_password_change_screen.cc b/chrome/browser/ash/login/screens/active_directory_password_change_screen.cc index 78b6046..e3a75c43 100644 --- a/chrome/browser/ash/login/screens/active_directory_password_change_screen.cc +++ b/chrome/browser/ash/login/screens/active_directory_password_change_screen.cc
@@ -6,8 +6,8 @@ #include <memory> -#include "ash/components/login/auth/cryptohome_key_constants.h" -#include "ash/components/login/auth/key.h" +#include "ash/components/login/auth/public/cryptohome_key_constants.h" +#include "ash/components/login/auth/public/key.h" #include "base/bind.h" #include "base/memory/weak_ptr.h" #include "chrome/browser/ash/login/ui/login_display_host.h"
diff --git a/chrome/browser/ash/login/screens/encryption_migration_screen.h b/chrome/browser/ash/login/screens/encryption_migration_screen.h index 0de5aaa..f0875f4 100644 --- a/chrome/browser/ash/login/screens/encryption_migration_screen.h +++ b/chrome/browser/ash/login/screens/encryption_migration_screen.h
@@ -8,7 +8,7 @@ #include <memory> #include <string> -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/callback_forward.h" #include "base/scoped_observation.h" #include "chrome/browser/ash/login/screens/base_screen.h"
diff --git a/chrome/browser/ash/login/screens/encryption_migration_screen_unittest.cc b/chrome/browser/ash/login/screens/encryption_migration_screen_unittest.cc index f137024c..750fb0cd 100644 --- a/chrome/browser/ash/login/screens/encryption_migration_screen_unittest.cc +++ b/chrome/browser/ash/login/screens/encryption_migration_screen_unittest.cc
@@ -5,8 +5,8 @@ #include <memory> #include <utility> -#include "ash/components/login/auth/key.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/key.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/bind.h" #include "base/memory/ptr_util.h" #include "base/test/task_environment.h"
diff --git a/chrome/browser/ash/login/screens/offline_login_screen.cc b/chrome/browser/ash/login/screens/offline_login_screen.cc index c51f3ba..4fb91859 100644 --- a/chrome/browser/ash/login/screens/offline_login_screen.cc +++ b/chrome/browser/ash/login/screens/offline_login_screen.cc
@@ -4,8 +4,8 @@ #include "chrome/browser/ash/login/screens/offline_login_screen.h" -#include "ash/components/login/auth/key.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/key.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/bind.h" #include "base/metrics/histogram_functions.h" #include "base/time/default_clock.h"
diff --git a/chrome/browser/ash/login/screens/pin_setup_screen.cc b/chrome/browser/ash/login/screens/pin_setup_screen.cc index a0a4ba0..8fc2175 100644 --- a/chrome/browser/ash/login/screens/pin_setup_screen.cc +++ b/chrome/browser/ash/login/screens/pin_setup_screen.cc
@@ -6,8 +6,8 @@ #include <memory> -#include "ash/components/login/auth/cryptohome_key_constants.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/cryptohome_key_constants.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/constants/ash_features.h" #include "ash/constants/ash_switches.h" #include "ash/public/cpp/tablet_mode.h"
diff --git a/chrome/browser/ash/login/screens/saml_confirm_password_screen.cc b/chrome/browser/ash/login/screens/saml_confirm_password_screen.cc index d795625..533f53b2 100644 --- a/chrome/browser/ash/login/screens/saml_confirm_password_screen.cc +++ b/chrome/browser/ash/login/screens/saml_confirm_password_screen.cc
@@ -3,7 +3,7 @@ // found in the LICENSE file. #include "chrome/browser/ash/login/screens/saml_confirm_password_screen.h" -#include "ash/components/login/auth/cryptohome_key_constants.h" +#include "ash/components/login/auth/public/cryptohome_key_constants.h" #include "ash/constants/ash_features.h" #include "base/containers/contains.h" #include "base/values.h"
diff --git a/chrome/browser/ash/login/screens/saml_confirm_password_screen.h b/chrome/browser/ash/login/screens/saml_confirm_password_screen.h index 93e4758..3acba3e4 100644 --- a/chrome/browser/ash/login/screens/saml_confirm_password_screen.h +++ b/chrome/browser/ash/login/screens/saml_confirm_password_screen.h
@@ -8,7 +8,7 @@ #include <memory> #include <string> -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/memory/weak_ptr.h" #include "base/values.h" #include "chrome/browser/ash/login/screens/base_screen.h"
diff --git a/chrome/browser/ash/login/screens/theme_selection_screen.cc b/chrome/browser/ash/login/screens/theme_selection_screen.cc index 38f43189e..0ef9cca 100644 --- a/chrome/browser/ash/login/screens/theme_selection_screen.cc +++ b/chrome/browser/ash/login/screens/theme_selection_screen.cc
@@ -19,6 +19,19 @@ namespace { constexpr const char kUserActionNext[] = "next"; constexpr const char kUserActionSelect[] = "select"; + +std::string GetSelectedTheme(Profile* profile) { + if (profile->GetPrefs()->GetInteger(prefs::kDarkModeScheduleType) == + static_cast<int>(ScheduleType::kSunsetToSunrise)) { + return ThemeSelectionScreenView::kAutoMode; + } + + if (profile->GetPrefs()->GetBoolean(prefs::kDarkModeEnabled)) { + return ThemeSelectionScreenView::kDarkMode; + } + return ThemeSelectionScreenView::kLightMode; +} + } // namespace // static @@ -61,8 +74,10 @@ } void ThemeSelectionScreen::ShowImpl() { - if (view_) - view_->Show(); + if (!view_) + return; + Profile* profile = ProfileManager::GetActiveUserProfile(); + view_->Show(GetSelectedTheme(profile)); } void ThemeSelectionScreen::HideImpl() {}
diff --git a/chrome/browser/ash/login/screens/theme_selection_screen_browsertest.cc b/chrome/browser/ash/login/screens/theme_selection_screen_browsertest.cc index 60d71fe..32a7c5d 100644 --- a/chrome/browser/ash/login/screens/theme_selection_screen_browsertest.cc +++ b/chrome/browser/ash/login/screens/theme_selection_screen_browsertest.cc
@@ -11,7 +11,9 @@ #include "ash/wm/tablet_mode/tablet_mode_controller.h" #include "chrome/browser/ash/login/screens/guest_tos_screen.h" #include "chrome/browser/ash/login/screens/welcome_screen.h" +#include "chrome/browser/ash/login/test/device_state_mixin.h" #include "chrome/browser/ash/login/test/fake_eula_mixin.h" +#include "chrome/browser/ash/login/test/fake_gaia_mixin.h" #include "chrome/browser/ash/login/test/login_manager_mixin.h" #include "chrome/browser/ash/login/test/oobe_base_test.h" #include "chrome/browser/ash/login/test/oobe_screen_exit_waiter.h" @@ -152,4 +154,61 @@ kLightThemeButtonPath, kAutoThemeButtonPath)); +class ThemeSelectionScreenResumeTest + : public OobeBaseTest, + public ::testing::WithParamInterface<test::UIPath> { + protected: + DeviceStateMixin device_state_{ + &mixin_host_, DeviceStateMixin::State::OOBE_COMPLETED_UNOWNED}; + FakeGaiaMixin gaia_mixin_{&mixin_host_}; + LoginManagerMixin login_mixin_{&mixin_host_, LoginManagerMixin::UserList(), + &gaia_mixin_}; + AccountId user_{ + AccountId::FromUserEmailGaiaId(test::kTestEmail, test::kTestGaiaId)}; +}; + +IN_PROC_BROWSER_TEST_P(ThemeSelectionScreenResumeTest, PRE_ResumedScreen) { + OobeScreenWaiter(UserCreationView::kScreenId).Wait(); + LoginManagerMixin::TestUserInfo test_user(user_); + login_mixin_.LoginWithDefaultContext(test_user); + OobeScreenExitWaiter(UserCreationView::kScreenId).Wait(); + WizardController::default_controller()->AdvanceToScreen( + ThemeSelectionScreenView::kScreenId); + + Profile* profile = ProfileManager::GetActiveUserProfile(); + EXPECT_EQ(profile->GetPrefs()->GetInteger(prefs::kDarkModeScheduleType), 1); + + test::OobeJS().ExpectVisiblePath(GetParam()); + test::OobeJS().ClickOnPath(GetParam()); + + auto selectedOption = GetParam().begin()[GetParam().size() - 1]; + if (selectedOption == kDarkThemeButton) { + EXPECT_EQ(profile->GetPrefs()->GetBoolean(prefs::kDarkModeEnabled), true); + EXPECT_EQ(profile->GetPrefs()->GetInteger(prefs::kDarkModeScheduleType), 0); + EXPECT_TRUE(ash::DarkLightModeControllerImpl::Get()->IsDarkModeEnabled()); + + } else if (selectedOption == kLightThemeButton) { + EXPECT_EQ(profile->GetPrefs()->GetBoolean(prefs::kDarkModeEnabled), false); + EXPECT_EQ(profile->GetPrefs()->GetInteger(prefs::kDarkModeScheduleType), 0); + EXPECT_FALSE(ash::DarkLightModeControllerImpl::Get()->IsDarkModeEnabled()); + + } else if (selectedOption == kAutoThemeButton) { + EXPECT_EQ(profile->GetPrefs()->GetInteger(prefs::kDarkModeScheduleType), 1); + } + + OobeScreenWaiter(ThemeSelectionScreenView::kScreenId).Wait(); +} + +IN_PROC_BROWSER_TEST_P(ThemeSelectionScreenResumeTest, ResumedScreen) { + login_mixin_.LoginAsNewRegularUser(); + OobeScreenWaiter(ThemeSelectionScreenView::kScreenId).Wait(); + test::OobeJS().ExpectHasAttribute("checked", GetParam()); +} + +INSTANTIATE_TEST_SUITE_P(All, + ThemeSelectionScreenResumeTest, + ::testing::Values(kDarkThemeButtonPath, + kLightThemeButtonPath, + kAutoThemeButtonPath)); + } // namespace ash
diff --git a/chrome/browser/ash/login/security_token_login_browsertest.cc b/chrome/browser/ash/login/security_token_login_browsertest.cc index ae8bc64f..525ac5d 100644 --- a/chrome/browser/ash/login/security_token_login_browsertest.cc +++ b/chrome/browser/ash/login/security_token_login_browsertest.cc
@@ -10,6 +10,7 @@ #include "ash/components/login/auth/auth_status_consumer.h" #include "ash/components/login/auth/challenge_response/known_user_pref_utils.h" +#include "ash/components/login/auth/public/auth_failure.h" #include "ash/constants/ash_features.h" #include "ash/constants/ash_switches.h" #include "ash/public/cpp/login_screen_test_api.h"
diff --git a/chrome/browser/ash/login/security_token_session_controller.cc b/chrome/browser/ash/login/security_token_session_controller.cc index 142b23d..7065d215 100644 --- a/chrome/browser/ash/login/security_token_session_controller.cc +++ b/chrome/browser/ash/login/security_token_session_controller.cc
@@ -8,7 +8,7 @@ #include <vector> #include "ash/components/login/auth/challenge_response/known_user_pref_utils.h" -#include "ash/components/login/auth/challenge_response_key.h" +#include "ash/components/login/auth/public/challenge_response_key.h" #include "ash/constants/notifier_catalogs.h" #include "ash/public/cpp/notification_utils.h" #include "base/bind.h"
diff --git a/chrome/browser/ash/login/session/user_session_manager.h b/chrome/browser/ash/login/session/user_session_manager.h index f6f4794..1e703ff6 100644 --- a/chrome/browser/ash/login/session/user_session_manager.h +++ b/chrome/browser/ash/login/session/user_session_manager.h
@@ -14,7 +14,7 @@ #include "ash/components/arc/net/always_on_vpn_manager.h" #include "ash/components/login/auth/authenticator.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/callback.h" #include "base/containers/flat_map.h" #include "base/containers/flat_set.h"
diff --git a/chrome/browser/ash/login/session/user_session_manager_test.cc b/chrome/browser/ash/login/session/user_session_manager_test.cc index 1451d8a74..155c438 100644 --- a/chrome/browser/ash/login/session/user_session_manager_test.cc +++ b/chrome/browser/ash/login/session/user_session_manager_test.cc
@@ -4,8 +4,8 @@ #include "chrome/browser/ash/login/session/user_session_manager.h" -#include "ash/components/login/auth/key.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/key.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/callback_helpers.h" #include "base/strings/utf_string_conversions.h" #include "chrome/browser/ash/login/demo_mode/demo_session.h"
diff --git a/chrome/browser/ash/login/shill_profile_loading_browsertest.cc b/chrome/browser/ash/login/shill_profile_loading_browsertest.cc index ef2ebb93..a542ae33 100644 --- a/chrome/browser/ash/login/shill_profile_loading_browsertest.cc +++ b/chrome/browser/ash/login/shill_profile_loading_browsertest.cc
@@ -15,7 +15,7 @@ // unmanaged user case and the managed user with/without network policy cases. #include "ash/components/cryptohome/cryptohome_parameters.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/public/cpp/login_screen_test_api.h" #include "base/bind.h" #include "base/bind_internal.h"
diff --git a/chrome/browser/ash/login/signin/oauth2_browsertest.cc b/chrome/browser/ash/login/signin/oauth2_browsertest.cc index 18de010..7bd6917 100644 --- a/chrome/browser/ash/login/signin/oauth2_browsertest.cc +++ b/chrome/browser/ash/login/signin/oauth2_browsertest.cc
@@ -7,8 +7,8 @@ #include <string> #include <utility> -#include "ash/components/login/auth/key.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/key.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/constants/ash_switches.h" #include "ash/public/cpp/login_screen_test_api.h" #include "base/bind.h"
diff --git a/chrome/browser/ash/login/signin/oauth2_token_initializer.h b/chrome/browser/ash/login/signin/oauth2_token_initializer.h index 1671947..7f4fb62 100644 --- a/chrome/browser/ash/login/signin/oauth2_token_initializer.h +++ b/chrome/browser/ash/login/signin/oauth2_token_initializer.h
@@ -7,7 +7,7 @@ #include <memory> -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/callback.h" #include "chrome/browser/ash/login/signin/oauth2_token_fetcher.h"
diff --git a/chrome/browser/ash/login/signin/offline_signin_limiter.h b/chrome/browser/ash/login/signin/offline_signin_limiter.h index 09dce0c..93d2a98 100644 --- a/chrome/browser/ash/login/signin/offline_signin_limiter.h +++ b/chrome/browser/ash/login/signin/offline_signin_limiter.h
@@ -7,7 +7,7 @@ #include <memory> -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/power_monitor/power_observer.h" #include "base/time/time.h" #include "base/timer/wall_clock_timer.h"
diff --git a/chrome/browser/ash/login/test/logged_in_user_mixin.cc b/chrome/browser/ash/login/test/logged_in_user_mixin.cc index 50f8908..f5fdeee 100644 --- a/chrome/browser/ash/login/test/logged_in_user_mixin.cc +++ b/chrome/browser/ash/login/test/logged_in_user_mixin.cc
@@ -6,8 +6,8 @@ #include <vector> +#include "ash/components/login/auth/public/user_context.h" #include "ash/components/login/auth/stub_authenticator_builder.h" -#include "ash/components/login/auth/user_context.h" #include "chrome/browser/ash/login/wizard_controller.h" #include "components/account_id/account_id.h" #include "net/dns/mock_host_resolver.h"
diff --git a/chrome/browser/ash/login/test/login_manager_mixin.cc b/chrome/browser/ash/login/test/login_manager_mixin.cc index 1512fd0..eb4db36 100644 --- a/chrome/browser/ash/login/test/login_manager_mixin.cc +++ b/chrome/browser/ash/login/test/login_manager_mixin.cc
@@ -9,9 +9,9 @@ #include <utility> #include "ash/components/login/auth/auth_status_consumer.h" -#include "ash/components/login/auth/key.h" +#include "ash/components/login/auth/public/key.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/components/login/auth/stub_authenticator_builder.h" -#include "ash/components/login/auth/user_context.h" #include "base/command_line.h" #include "base/containers/contains.h" #include "base/strings/string_util.h"
diff --git a/chrome/browser/ash/login/test/login_manager_mixin.h b/chrome/browser/ash/login/test/login_manager_mixin.h index 2fbf275f..30e87f6 100644 --- a/chrome/browser/ash/login/test/login_manager_mixin.h +++ b/chrome/browser/ash/login/test/login_manager_mixin.h
@@ -8,7 +8,7 @@ #include <memory> #include <vector> -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "chrome/browser/ash/login/test/fake_gaia_mixin.h" #include "chrome/browser/ash/login/test/local_state_mixin.h" #include "chrome/browser/ash/login/test/session_flags_manager.h"
diff --git a/chrome/browser/ash/login/test/offline_login_test_mixin.cc b/chrome/browser/ash/login/test/offline_login_test_mixin.cc index 5c49601..cdf9ad6 100644 --- a/chrome/browser/ash/login/test/offline_login_test_mixin.cc +++ b/chrome/browser/ash/login/test/offline_login_test_mixin.cc
@@ -4,7 +4,7 @@ #include "chrome/browser/ash/login/test/offline_login_test_mixin.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/components/settings/cros_settings_names.h" #include "ash/components/settings/cros_settings_provider.h" #include "chrome/browser/ash/login/session/user_session_manager_test_api.h"
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 286aee5..bf7e4694 100644 --- a/chrome/browser/ash/login/ui/login_display_host_common.cc +++ b/chrome/browser/ash/login/ui/login_display_host_common.cc
@@ -3,6 +3,7 @@ // found in the LICENSE file. #include "chrome/browser/ash/login/ui/login_display_host_common.h" +#include <memory> #include "ash/constants/ash_features.h" #include "ash/public/cpp/login_accelerators.h" @@ -45,6 +46,7 @@ #include "chrome/browser/ui/webui/chromeos/login/user_creation_screen_handler.h" #include "chrome/common/pref_names.h" #include "chrome/grit/generated_resources.h" +#include "chromeos/ash/components/oobe_quick_start/target_device_bootstrap_controller.h" #include "components/keep_alive_registry/keep_alive_types.h" #include "components/strings/grit/components_strings.h" #include "extensions/common/features/feature_session_type.h" @@ -656,6 +658,11 @@ base::WeakPtr<quick_start::TargetDeviceBootstrapController> LoginDisplayHostCommon::GetQuickStartBootstrapController() { + DCHECK(features::IsOobeQuickStartEnabled()); + if (!bootstrap_controller_) { + bootstrap_controller_ = + std::make_unique<ash::quick_start::TargetDeviceBootstrapController>(); + } return bootstrap_controller_->GetAsWeakPtrForClient(); }
diff --git a/chrome/browser/ash/login/ui/login_display_host_mojo.cc b/chrome/browser/ash/login/ui/login_display_host_mojo.cc index 7b8a38f8..cbb0a97f4 100644 --- a/chrome/browser/ash/login/ui/login_display_host_mojo.cc +++ b/chrome/browser/ash/login/ui/login_display_host_mojo.cc
@@ -6,7 +6,7 @@ #include <utility> -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/constants/ash_features.h" #include "ash/constants/ash_pref_names.h" #include "ash/constants/ash_switches.h"
diff --git a/chrome/browser/ash/login/ui/login_display_host_mojo.h b/chrome/browser/ash/login/ui/login_display_host_mojo.h index a6c276e2..acd643e 100644 --- a/chrome/browser/ash/login/ui/login_display_host_mojo.h +++ b/chrome/browser/ash/login/ui/login_display_host_mojo.h
@@ -10,7 +10,7 @@ #include <vector> #include "ash/components/login/auth/auth_status_consumer.h" -#include "ash/components/login/auth/challenge_response_key.h" +#include "ash/components/login/auth/public/challenge_response_key.h" #include "base/callback_forward.h" #include "base/memory/weak_ptr.h" #include "base/observer_list.h"
diff --git a/chrome/browser/ash/login/ui/mock_signin_ui.h b/chrome/browser/ash/login/ui/mock_signin_ui.h index 2b3efee..22260a3 100644 --- a/chrome/browser/ash/login/ui/mock_signin_ui.h +++ b/chrome/browser/ash/login/ui/mock_signin_ui.h
@@ -6,7 +6,7 @@ #define CHROME_BROWSER_ASH_LOGIN_UI_MOCK_SIGNIN_UI_H_ #include <memory> -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "chrome/browser/ash/login/ui/signin_ui.h" #include "components/login/base_screen_handler_utils.h" #include "testing/gmock/include/gmock/gmock.h"
diff --git a/chrome/browser/ash/login/ui/signin_ui.h b/chrome/browser/ash/login/ui/signin_ui.h index 26c8c37..1c620a31 100644 --- a/chrome/browser/ash/login/ui/signin_ui.h +++ b/chrome/browser/ash/login/ui/signin_ui.h
@@ -6,7 +6,7 @@ #include <memory> -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/callback.h" #include "chrome/browser/ash/login/oobe_screen.h" #include "chrome/browser/ash/login/screens/encryption_migration_mode.h"
diff --git a/chrome/browser/ash/login/user_allowlist_policy_browsertest.cc b/chrome/browser/ash/login/user_allowlist_policy_browsertest.cc index 98e254c..ae57bd07 100644 --- a/chrome/browser/ash/login/user_allowlist_policy_browsertest.cc +++ b/chrome/browser/ash/login/user_allowlist_policy_browsertest.cc
@@ -4,7 +4,7 @@ #include <memory> -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/components/settings/cros_settings_names.h" #include "chrome/browser/ash/login/login_manager_test.h" #include "chrome/browser/ash/login/test/device_state_mixin.h"
diff --git a/chrome/browser/ash/login/user_flags_login_browsertest.cc b/chrome/browser/ash/login/user_flags_login_browsertest.cc index cd847bfd..c6f4cf7b 100644 --- a/chrome/browser/ash/login/user_flags_login_browsertest.cc +++ b/chrome/browser/ash/login/user_flags_login_browsertest.cc
@@ -3,7 +3,7 @@ // found in the LICENSE file. #include "ash/components/cryptohome/cryptohome_parameters.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/command_line.h" #include "base/test/bind.h" #include "chrome/browser/about_flags.h"
diff --git a/chrome/browser/ash/login/webview_login_browsertest.cc b/chrome/browser/ash/login/webview_login_browsertest.cc index 3849b70d..c35adc2 100644 --- a/chrome/browser/ash/login/webview_login_browsertest.cc +++ b/chrome/browser/ash/login/webview_login_browsertest.cc
@@ -6,7 +6,7 @@ #include <iterator> #include <string> -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/components/tpm/tpm_token_loader.h" #include "ash/constants/ash_features.h" #include "ash/constants/ash_switches.h"
diff --git a/chrome/browser/ash/login/wizard_context.cc b/chrome/browser/ash/login/wizard_context.cc index e4cb09eb..21a22267 100644 --- a/chrome/browser/ash/login/wizard_context.cc +++ b/chrome/browser/ash/login/wizard_context.cc
@@ -4,7 +4,7 @@ #include "chrome/browser/ash/login/wizard_context.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "build/branding_buildflags.h" #include "chrome/browser/ui/webui/chromeos/login/family_link_notice_screen_handler.h"
diff --git a/chrome/browser/ash/platform_keys/key_permissions/key_permissions_manager_browsertest.cc b/chrome/browser/ash/platform_keys/key_permissions/key_permissions_manager_browsertest.cc index 12bdc4f..78cf9a6 100644 --- a/chrome/browser/ash/platform_keys/key_permissions/key_permissions_manager_browsertest.cc +++ b/chrome/browser/ash/platform_keys/key_permissions/key_permissions_manager_browsertest.cc
@@ -10,7 +10,7 @@ #include <utility> #include <vector> -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/values.h" #include "chrome/browser/ash/login/test/device_state_mixin.h" #include "chrome/browser/ash/login/test/login_manager_mixin.h"
diff --git a/chrome/browser/ash/platform_keys/platform_keys_service_browsertest.cc b/chrome/browser/ash/platform_keys/platform_keys_service_browsertest.cc index 9cf7be38..4cfc5a4 100644 --- a/chrome/browser/ash/platform_keys/platform_keys_service_browsertest.cc +++ b/chrome/browser/ash/platform_keys/platform_keys_service_browsertest.cc
@@ -10,7 +10,7 @@ #include <utility> #include <vector> -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/bind.h" #include "base/callback.h" #include "base/command_line.h"
diff --git a/chrome/browser/ash/policy/affiliation/affiliation_test_helper.cc b/chrome/browser/ash/policy/affiliation/affiliation_test_helper.cc index 2678e87..ad50a1e 100644 --- a/chrome/browser/ash/policy/affiliation/affiliation_test_helper.cc +++ b/chrome/browser/ash/policy/affiliation/affiliation_test_helper.cc
@@ -10,8 +10,8 @@ #include <string> #include "ash/components/cryptohome/cryptohome_parameters.h" -#include "ash/components/login/auth/key.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/key.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/constants/ash_switches.h" #include "base/command_line.h" #include "base/containers/contains.h"
diff --git a/chrome/browser/ash/policy/core/device_local_account_browsertest.cc b/chrome/browser/ash/policy/core/device_local_account_browsertest.cc index 1f87214..74cc090 100644 --- a/chrome/browser/ash/policy/core/device_local_account_browsertest.cc +++ b/chrome/browser/ash/policy/core/device_local_account_browsertest.cc
@@ -13,7 +13,7 @@ #include <utility> #include <vector> -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/components/settings/timezone_settings.h" #include "ash/constants/ash_paths.h" #include "ash/constants/ash_switches.h"
diff --git a/chrome/browser/ash/policy/core/device_policy_decoder.cc b/chrome/browser/ash/policy/core/device_policy_decoder.cc index f533d41..9ac0639a 100644 --- a/chrome/browser/ash/policy/core/device_policy_decoder.cc +++ b/chrome/browser/ash/policy/core/device_policy_decoder.cc
@@ -747,13 +747,13 @@ policies->Set(key::kReportDeviceNetworkConfiguration, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, - base::Value(container.has_report_network_configuration()), + base::Value(container.report_network_configuration()), nullptr); } if (container.has_report_network_status()) { policies->Set(key::kReportDeviceNetworkStatus, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, - base::Value(container.has_report_network_status()), + base::Value(container.report_network_status()), nullptr); } if (container.has_report_users()) {
diff --git a/chrome/browser/ash/policy/enrollment/enrollment_config.cc b/chrome/browser/ash/policy/enrollment/enrollment_config.cc index a92a5fd3..a90ec64 100644 --- a/chrome/browser/ash/policy/enrollment/enrollment_config.cc +++ b/chrome/browser/ash/policy/enrollment/enrollment_config.cc
@@ -32,9 +32,8 @@ return value; } -std::string GetString(const base::Value& dict, base::StringPiece key) { - DCHECK(dict.is_dict()); - const std::string* value = dict.FindStringKey(key); +std::string GetString(const base::Value::Dict& dict, base::StringPiece key) { + const std::string* value = dict.FindString(key); return value ? *value : std::string(); } @@ -116,21 +115,19 @@ // signal present that indicates the device should enroll. // Gather enrollment signals from various sources. - const base::Value* device_state = - local_state.GetDictionary(prefs::kServerBackedDeviceState); + const base::Value::Dict& device_state = + local_state.GetValueDict(prefs::kServerBackedDeviceState); std::string device_state_mode; std::string device_state_management_domain; bool is_license_packaged_with_device = false; std::string license_type; - if (device_state) { - device_state_mode = GetString(*device_state, kDeviceStateMode); - device_state_management_domain = - GetString(*device_state, kDeviceStateManagementDomain); - is_license_packaged_with_device = - device_state->FindBoolPath(kDeviceStatePackagedLicense).value_or(false); - license_type = GetString(*device_state, kDeviceStateLicenseType); - } + device_state_mode = GetString(device_state, kDeviceStateMode); + device_state_management_domain = + GetString(device_state, kDeviceStateManagementDomain); + is_license_packaged_with_device = + device_state.FindBool(kDeviceStatePackagedLicense).value_or(false); + license_type = GetString(device_state, kDeviceStateLicenseType); config.is_license_packaged_with_device = is_license_packaged_with_device;
diff --git a/chrome/browser/ash/policy/login/login_policy_test_base.cc b/chrome/browser/ash/policy/login/login_policy_test_base.cc index 60cb6a1..05d32f37b 100644 --- a/chrome/browser/ash/policy/login/login_policy_test_base.cc +++ b/chrome/browser/ash/policy/login/login_policy_test_base.cc
@@ -6,7 +6,7 @@ #include <memory> -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/constants/ash_switches.h" #include "base/values.h" #include "chrome/browser/ash/login/test/login_manager_mixin.h"
diff --git a/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc b/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc index 3f86981..2b78d51 100644 --- a/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc +++ b/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc
@@ -899,7 +899,7 @@ // Set up a fake local state for KioskAppManager and KioskCryptohomeRemover. TestingBrowserProcess::GetGlobal()->SetLocalState(&local_state_); - ash::KioskAppManager::RegisterPrefs(local_state_.registry()); + ash::KioskAppManager::RegisterLocalStatePrefs(local_state_.registry()); ash::KioskCryptohomeRemover::RegisterPrefs(local_state_.registry()); // Use FakeUpdateEngineClient.
diff --git a/chrome/browser/ash/policy/status_collector/legacy_device_status_collector_browsertest.cc b/chrome/browser/ash/policy/status_collector/legacy_device_status_collector_browsertest.cc index cb8de1b4..5f5f572 100644 --- a/chrome/browser/ash/policy/status_collector/legacy_device_status_collector_browsertest.cc +++ b/chrome/browser/ash/policy/status_collector/legacy_device_status_collector_browsertest.cc
@@ -888,7 +888,7 @@ // Set up a fake local state for KioskAppManager and KioskCryptohomeRemover. TestingBrowserProcess::GetGlobal()->SetLocalState(&local_state_); - ash::KioskAppManager::RegisterPrefs(local_state_.registry()); + ash::KioskAppManager::RegisterLocalStatePrefs(local_state_.registry()); chromeos::KioskCryptohomeRemover::RegisterPrefs(local_state_.registry()); // Use FakeUpdateEngineClient.
diff --git a/chrome/browser/ash/policy/status_collector/managed_session_service_unittest.cc b/chrome/browser/ash/policy/status_collector/managed_session_service_unittest.cc index d802a51..7d4696cf 100644 --- a/chrome/browser/ash/policy/status_collector/managed_session_service_unittest.cc +++ b/chrome/browser/ash/policy/status_collector/managed_session_service_unittest.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/ash/policy/status_collector/managed_session_service.h" +#include "ash/components/login/auth/public/auth_failure.h" #include "base/test/simple_test_clock.h" #include "base/time/time.h" #include "chrome/browser/ash/login/users/chrome_user_manager.h" @@ -118,7 +119,7 @@ } void OnKioskLoginFailure() override { ++observed_kiosk_login_failure_count_; } - ash::AuthFailure auth_failure_ = ash::AuthFailure::AuthFailureNone(); + ash::AuthFailure auth_failure_ = ash::AuthFailure(ash::AuthFailure::NONE); Profile* logged_in_ = nullptr; Profile* logged_out_ = nullptr; bool locked_ = false;
diff --git a/chrome/browser/ash/remote_apps/remote_apps_manager_browsertest.cc b/chrome/browser/ash/remote_apps/remote_apps_manager_browsertest.cc index 1da1036f..8ac9e2b 100644 --- a/chrome/browser/ash/remote_apps/remote_apps_manager_browsertest.cc +++ b/chrome/browser/ash/remote_apps/remote_apps_manager_browsertest.cc
@@ -7,7 +7,7 @@ #include "ash/app_list/app_list_model_provider.h" #include "ash/app_list/model/app_list_item.h" #include "ash/app_list/model/app_list_model.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/constants/ash_switches.h" #include "ash/public/cpp/accelerators.h" #include "ash/public/cpp/app_list/app_list_types.h"
diff --git a/chrome/browser/certificate_provider/OWNERS b/chrome/browser/certificate_provider/OWNERS index 325f7c3..5f652fe 100644 --- a/chrome/browser/certificate_provider/OWNERS +++ b/chrome/browser/certificate_provider/OWNERS
@@ -1 +1,2 @@ emaxx@chromium.org +fabiansommer@chromium.org
diff --git a/chrome/browser/chrome_browser_field_trials.cc b/chrome/browser/chrome_browser_field_trials.cc index f1a3a2a..b06b472 100644 --- a/chrome/browser/chrome_browser_field_trials.cc +++ b/chrome/browser/chrome_browser_field_trials.cc
@@ -15,15 +15,13 @@ #include "base/time/time.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" +#include "chrome/browser/metrics/chrome_browser_sampling_trials.h" #include "chrome/browser/metrics/chrome_metrics_service_accessor.h" #include "chrome/browser/metrics/chrome_metrics_service_client.h" -#include "chrome/browser/metrics/chrome_metrics_services_manager_client.h" -#include "chrome/common/channel_info.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_switches.h" #include "components/metrics/metrics_pref_names.h" #include "components/metrics/persistent_histograms.h" -#include "components/ukm/ukm_recorder_impl.h" #include "components/version_info/version_info.h" #if BUILDFLAG(IS_ANDROID) @@ -42,26 +40,6 @@ #include "chrome/browser/ash/login/consolidated_consent_field_trial.h" #endif -namespace { - -// Create a field trial to control metrics/crash sampling for Stable on -// Windows/Android if no variations seed was applied. -void CreateFallbackSamplingTrialIfNeeded(base::FeatureList* feature_list) { -#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID) - ChromeMetricsServicesManagerClient::CreateFallbackSamplingTrial( - chrome::GetChannel(), feature_list); -#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID) -} - -// Create a field trial to control UKM sampling for Stable if no variations -// seed was applied. -void CreateFallbackUkmSamplingTrialIfNeeded(base::FeatureList* feature_list) { - ukm::UkmRecorderImpl::CreateFallbackSamplingTrial( - chrome::GetChannel() == version_info::Channel::STABLE, feature_list); -} - -} // namespace - ChromeBrowserFieldTrials::ChromeBrowserFieldTrials(PrefService* local_state) : local_state_(local_state) { DCHECK(local_state_); @@ -90,11 +68,14 @@ // Only create the fallback trials if there isn't already a variations seed // being applied. This should occur during first run when first-run variations // isn't supported. It's assumed that, if there is a seed, then it either - // contains the relavent studies, or is intentionally omitted, so no fallback - // is needed. + // contains the relevant studies, or is intentionally omitted, so no fallback + // is needed. The exception is for sampling trials. Fallback trials are + // created even if no variations seed was applied. This allows testing the + // fallback code by intentionally omitting the sampling trial from a + // variations seed. + metrics::CreateFallbackSamplingTrialsIfNeeded(feature_list); + metrics::CreateFallbackUkmSamplingTrialIfNeeded(feature_list); if (!has_seed) { - CreateFallbackSamplingTrialIfNeeded(feature_list); - CreateFallbackUkmSamplingTrialIfNeeded(feature_list); #if BUILDFLAG(IS_CHROMEOS_ASH) ash::multidevice_setup::CreateFirstRunFieldTrial(feature_list); #endif
diff --git a/chrome/browser/chrome_browser_field_trials_unittest.cc b/chrome/browser/chrome_browser_field_trials_unittest.cc new file mode 100644 index 0000000..9c5b1be --- /dev/null +++ b/chrome/browser/chrome_browser_field_trials_unittest.cc
@@ -0,0 +1,52 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/chrome_browser_field_trials.h" + +#include <memory> + +#include "base/feature_list.h" +#include "components/prefs/testing_pref_service.h" +#include "components/ukm/ukm_recorder_impl.h" +#include "testing/gtest/include/gtest/gtest.h" + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID) +TEST(ChromeBrowserFieldTrialsTest, SamplingTrials) { + TestingPrefServiceSimple local_state; + ChromeBrowserFieldTrials chrome_browser_field_trials(&local_state); + + const char kSamplingTrialName[] = "MetricsAndCrashSampling"; +#if BUILDFLAG(IS_ANDROID) + const char kPostFREFixSamplingTrialName[] = + "PostFREFixMetricsAndCrashSampling"; +#endif // BUILDFLAG(IS_ANDROID) + const char kUkmSamplingTrialName[] = "UkmSamplingRate"; + + // Verify that initially, sampling trials do not exist. + EXPECT_FALSE(base::FieldTrialList::TrialExists(kSamplingTrialName)); +#if BUILDFLAG(IS_ANDROID) + EXPECT_FALSE(base::FieldTrialList::TrialExists(kPostFREFixSamplingTrialName)); +#endif // BUILDFLAG(IS_ANDROID) + EXPECT_FALSE(base::FieldTrialList::TrialExists(kUkmSamplingTrialName)); + + // Call SetUpFeatureControllingFieldTrials(), which should create fallback + // sampling trials since they do not exist yet. + auto feature_list = std::make_unique<base::FeatureList>(); + chrome_browser_field_trials.SetUpFeatureControllingFieldTrials( + /*has_seed=*/false, /*low_entropy_provider=*/nullptr, feature_list.get()); + + // Verify that the sampling trials were created. + EXPECT_TRUE(base::FieldTrialList::TrialExists(kSamplingTrialName)); +#if BUILDFLAG(IS_ANDROID) + EXPECT_TRUE(base::FieldTrialList::TrialExists(kPostFREFixSamplingTrialName)); +#endif // BUILDFLAG(IS_ANDROID) + EXPECT_TRUE(base::FieldTrialList::TrialExists(kUkmSamplingTrialName)); + + // Call SetUpFeatureControllingFieldTrials() again. This should be a no-op, + // since the sampling trials already exist. If the trials are created again, + // a CHECK will be triggered and this will crash. + chrome_browser_field_trials.SetUpFeatureControllingFieldTrials( + /*has_seed=*/false, /*low_entropy_provider=*/nullptr, feature_list.get()); +} +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID)
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index 15bda91..1d8f21c5 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -4215,8 +4215,8 @@ // Allow loading Chrome's DLLs. for (const auto* dll : {chrome::kBrowserResourcesDll, chrome::kElfDll}) { - result = policy->AddRule(sandbox::TargetPolicy::SUBSYS_SIGNED_BINARY, - sandbox::TargetPolicy::SIGNED_ALLOW_LOAD, + result = policy->AddRule(sandbox::SubSystem::kSignedBinary, + sandbox::Semantics::kSignedAllowLoad, GetModulePath(dll).value().c_str()); if (result != sandbox::SBOX_ALL_OK) return false;
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index f1e9e9ee..6bb30648 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -303,6 +303,7 @@ "//chromeos/ash/components/dbus/virtual_file_provider", "//chromeos/ash/components/dbus/vm_plugin_dispatcher", "//chromeos/ash/components/dbus/vm_plugin_dispatcher:proto", + "//chromeos/ash/components/feature_usage", "//chromeos/ash/components/hibernate:buildflags", "//chromeos/ash/components/local_search_service/public/cpp", "//chromeos/ash/components/memory", @@ -316,7 +317,6 @@ "//chromeos/ash/services/cros_healthd/public/mojom", "//chromeos/components/cdm_factory_daemon:cdm_factory_daemon_browser", "//chromeos/components/disks:prefs", - "//chromeos/components/feature_usage", "//chromeos/components/mojo_bootstrap", "//chromeos/components/onc", "//chromeos/components/quick_answers",
diff --git a/chrome/browser/chromeos/DEPS b/chrome/browser/chromeos/DEPS index c17f677a..5aedecb6b 100644 --- a/chrome/browser/chromeos/DEPS +++ b/chrome/browser/chromeos/DEPS
@@ -1,60 +1,7 @@ include_rules = [ - # //chrome/browser/chromeos is conceptually part of "ash". It is migrating to - # //chrome/browser/ash. See the Lacros source code migration design doc: - # https://docs.google.com/document/d/1g-98HpzA8XcoGBWUv1gQNr4rbnD5yfvbtYZyPDDbkaE - "+ash", + # See README.md. + "-ash", + "-chrome/browser/ash", - "+chrome/browser/image_decoder", - "+chrome/services/keymaster/public", - "+chrome/services/wilco_dtc_supportd/public", - "+components/account_manager_core", - "+components/app_constants", - "+components/app_restore", - "+components/guest_os", - "+components/reporting", - "+components/services/app_service/public", - "+cros", - "+dbus", - "+device/bluetooth", - "+media/audio/sounds", # For system sounds - "+media/base/media_switches.h", # For media command line switches. - "+media/mojo/mojom", # For platform verification mojom interface. - "+remoting/host/chromeos", # For remoting reporting module - "+services/device/public", - "+services/metrics/public", - "+services/network", - "+services/tracing/public", - "+services/viz/public/mojom", - "+third_party/ced", + "+ash/constants", ] - -specific_include_rules = { - # Dependencies specific for fuzz targets and other fuzzing-related code. - ".*fuzz.*": [ - "+third_party/libFuzzer/src/utils", # This contains FuzzedDataProvider. - ], - "child_status_collector_browsertest.cc": [ - "+mojo/core/embedder/embedder.h", - ], - "device_status_collector_browsertest.cc": [ - "+mojo/core/embedder/embedder.h", - ], - # TODO(b/209791738): Remove chrome/browser/ui dependencies from - # chrome/browser/chromeos/arc. - "arc/icon_decode_request.cc": [ - "+chrome/browser/ui/app_list/md_icon_normalizer.h", - ], - "legacy_device_status_collector_browsertest.cc": [ - "+mojo/core/embedder/embedder.h", - ], - "event_rewriter_unittest\.cc": [ - "+ui/events/devices/device_data_manager.h", - ], - "external_protocol_dialog\.cc": [ - "+chrome/browser/ui/views/external_protocol_dialog.h", - ], - "file_manager_browsertest_base.cc": [ - "+chrome/browser/ui/views/extensions/extension_dialog.h", - "+chrome/browser/ui/views/select_file_dialog_extension.h", - ], -}
diff --git a/chrome/browser/chromeos/README.md b/chrome/browser/chromeos/README.md index b475057..af5bcf5 100644 --- a/chrome/browser/chromeos/README.md +++ b/chrome/browser/chromeos/README.md
@@ -1,20 +1,15 @@ chrome/browser/chromeos ======================= -This directory should contain non UI Chrome OS specific code that has -`src/chrome` dependencies. +This directory should contain Chrome OS specific code that has `//chrome` +dependencies. -Code here should not contain any `ash/` dependencies or `chrome/browser/ui` -dependencies. Any such UI code should be moved to -[`chrome/browser/ui/ash`](/chrome/browser/ui/ash/README.md) -(which may depend on code in this directory). +This directory is for shared code between Ash and Lacros. Code that is only +used by Lacros should be in chrome/browser/lacros/ and code that is only used +by Ash should be in chrome/browser/ash/. -Example: - -* The Chrome OS network portal detection model lives in - `chrome/browser/ash/net/network_portal_detector_impl.cc`. - -* The notification controller for network portal detection lives in: - `chrome/browser/ui/ash/network/network_portal_notification_controller.cc` - (which depends on *chrome/browser/ui*, and - *chrome/browser/ash/net/network_portal_detector_impl.h*. +There are a few exceptions to the above rules while the code is being +migrated, e.g. c/b/c/exceptions/ and c/b/c/fileapi/ which are being actively +worked on to separate platform-specific code to the proper directories. See +the "Lacros: ChromeOS source code directory migration" design doc at +https://docs.google.com/document/d/1g-98HpzA8XcoGBWUv1gQNr4rbnD5yfvbtYZyPDDbkaE.
diff --git a/chrome/browser/chromeos/app_mode/DEPS b/chrome/browser/chromeos/app_mode/DEPS new file mode 100644 index 0000000..ce718c8 --- /dev/null +++ b/chrome/browser/chromeos/app_mode/DEPS
@@ -0,0 +1,9 @@ +specific_include_rules = { + "chrome_kiosk_app_launcher\.cc": [ + "+chrome/browser/ash/app_mode/kiosk_app_manager.h", + ], + "chrome_kiosk_app_launcher_unittest.cc": [ + "+ash/test/ash_test_helper.h", + "+chrome/browser/ash/app_mode/test_kiosk_extension_builder.h", + ], +}
diff --git a/chrome/browser/chromeos/app_mode/app_session.cc b/chrome/browser/chromeos/app_mode/app_session.cc index 64715c91..6389298 100644 --- a/chrome/browser/chromeos/app_mode/app_session.cc +++ b/chrome/browser/chromeos/app_mode/app_session.cc
@@ -21,6 +21,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/common/pref_names.h" +#include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" #include "content/public/browser/browser_child_process_host_iterator.h" @@ -219,10 +220,15 @@ metrics_service_->RecordKioskSessionStopped(); } -void AppSession::RegisterPrefs(PrefRegistrySimple* registry) { +void AppSession::RegisterLocalStatePrefs(PrefRegistrySimple* registry) { registry->RegisterDictionaryPref(prefs::kKioskMetrics); } +void AppSession::RegisterProfilePrefs( + user_prefs::PrefRegistrySyncable* registry) { + registry->RegisterBooleanPref(prefs::kNewWindowsInKioskAllowed, false); +} + void AppSession::Init(Profile* profile, const std::string& app_id) { SetProfile(profile); app_window_handler_ = std::make_unique<AppWindowHandler>(this);
diff --git a/chrome/browser/chromeos/app_mode/app_session.h b/chrome/browser/chromeos/app_mode/app_session.h index d295c4ac..75fb593 100644 --- a/chrome/browser/chromeos/app_mode/app_session.h +++ b/chrome/browser/chromeos/app_mode/app_session.h
@@ -43,7 +43,9 @@ AppSession& operator=(const AppSession&) = delete; virtual ~AppSession(); - static void RegisterPrefs(PrefRegistrySimple* registry); + static void RegisterLocalStatePrefs(PrefRegistrySimple* registry); + + static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); // Initializes an app session for Chrome App Kiosk. virtual void Init(Profile* profile, const std::string& app_id);
diff --git a/chrome/browser/chromeos/arc/DEPS b/chrome/browser/chromeos/arc/DEPS new file mode 100644 index 0000000..bbe4b4a --- /dev/null +++ b/chrome/browser/chromeos/arc/DEPS
@@ -0,0 +1,8 @@ +specific_include_rules = { + "open_with_menu\.cc": [ + "+chrome/browser/ash/arc/intent_helper/arc_intent_helper_mojo_ash.h", + ], + "start_smart_selection_action_menu\.cc": [ + "+ash/components/arc/metrics/arc_metrics_constants.h", + ], +}
diff --git a/chrome/browser/chromeos/extensions/DEPS b/chrome/browser/chromeos/extensions/DEPS index ee65a39..756d6f11c 100644 --- a/chrome/browser/chromeos/extensions/DEPS +++ b/chrome/browser/chromeos/extensions/DEPS
@@ -1,6 +1,16 @@ include_rules = [ + # TODO(https://crbug.com/1164001): extensions/ will be eventually split + # between Ash-only code that will be moved to chrome/browser/ash/extensions + # and generic code that will be used by both Ash and Lacros and remain here. + # The latter won't be able to depend on the directories below. Remove them + # once that is done. + "+ash", + "+chrome/browser/ash", + # TODO(tfarina): Get rid of this dependency. crbug.com/125846. # DO NOT ADD ANY MORE ITEMS TO THE LIST BELOW! "!chrome/browser/ui/views/select_file_dialog_extension.h", # DO NOT ADD ANY MORE ITEMS TO THE ABOVE LIST! + + "+third_party/ced", ]
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc index 6cf8754..f8c049c 100644 --- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc +++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
@@ -18,7 +18,7 @@ #include "ash/components/arc/session/arc_bridge_service.h" #include "ash/components/arc/session/arc_service_manager.h" #include "ash/components/arc/system_ui/arc_system_ui_bridge.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/components/settings/cros_settings_names.h" #include "ash/constants/app_types.h" #include "ash/constants/ash_pref_names.h"
diff --git a/chrome/browser/chromeos/extensions/login_screen/login/login_api_ash_unittest.cc b/chrome/browser/chromeos/extensions/login_screen/login/login_api_ash_unittest.cc index 9ac72a1a..40fb1d6 100644 --- a/chrome/browser/chromeos/extensions/login_screen/login/login_api_ash_unittest.cc +++ b/chrome/browser/chromeos/extensions/login_screen/login/login_api_ash_unittest.cc
@@ -9,9 +9,9 @@ #include <string> #include <utility> -#include "ash/components/login/auth/cryptohome_key_constants.h" -#include "ash/components/login/auth/key.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/cryptohome_key_constants.h" +#include "ash/components/login/auth/public/key.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/components/settings/cros_settings_names.h" #include "base/callback.h" #include "base/callback_helpers.h"
diff --git a/chrome/browser/chromeos/extensions/login_screen/login/login_api_lock_handler.cc b/chrome/browser/chromeos/extensions/login_screen/login/login_api_lock_handler.cc index bba82bc..f7bf4c9 100644 --- a/chrome/browser/chromeos/extensions/login_screen/login/login_api_lock_handler.cc +++ b/chrome/browser/chromeos/extensions/login_screen/login/login_api_lock_handler.cc
@@ -6,7 +6,7 @@ #include <utility> -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/bind.h" #include "base/no_destructor.h" #include "chrome/browser/ash/login/lock/screen_locker.h"
diff --git a/chrome/browser/chromeos/extensions/login_screen/login/shared_session_handler.cc b/chrome/browser/chromeos/extensions/login_screen/login/shared_session_handler.cc index 112da96..ebc9e8f 100644 --- a/chrome/browser/chromeos/extensions/login_screen/login/shared_session_handler.cc +++ b/chrome/browser/chromeos/extensions/login_screen/login/shared_session_handler.cc
@@ -6,7 +6,7 @@ #include <utility> -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/components/settings/cros_settings_names.h" #include "base/bind.h" #include "base/no_destructor.h"
diff --git a/chrome/browser/chromeos/fileapi/DEPS b/chrome/browser/chromeos/fileapi/DEPS new file mode 100644 index 0000000..b8f7974 --- /dev/null +++ b/chrome/browser/chromeos/fileapi/DEPS
@@ -0,0 +1,9 @@ +include_rules = [ + # TODO(https://crbug.com/1164001): fileapi/ will be eventually split between + # Ash-only code that will be moved to chrome/browser/ash/ and generic code + # that will be used by both Ash and Lacros and remain here. + # The latter won't be able to depend on the directories below. Remove them + # once that is done. + "+ash", + "+chrome/browser/ash", +]
diff --git a/chrome/browser/chromeos/policy/dlp/DEPS b/chrome/browser/chromeos/policy/dlp/DEPS new file mode 100644 index 0000000..4517cae --- /dev/null +++ b/chrome/browser/chromeos/policy/dlp/DEPS
@@ -0,0 +1,4 @@ +include_rules = [ + "+ash", + "+chrome/browser/ash", +]
diff --git a/chrome/browser/chromeos/printing/DEPS b/chrome/browser/chromeos/printing/DEPS new file mode 100644 index 0000000..f35f5fe6 --- /dev/null +++ b/chrome/browser/chromeos/printing/DEPS
@@ -0,0 +1,7 @@ +specific_include_rules = { + # Used to assert equality between chromeos::PrinterErrorCode and + # ash.printing.printing_manager.mojom.PrinterErrorCode values. + "printer_error_codes\.cc": [ + "+ash/webui/print_management/mojom/printing_manager.mojom.h", + ], +}
diff --git a/chrome/browser/chromeos/tablet_mode/DEPS b/chrome/browser/chromeos/tablet_mode/DEPS new file mode 100644 index 0000000..69dd4768e --- /dev/null +++ b/chrome/browser/chromeos/tablet_mode/DEPS
@@ -0,0 +1,8 @@ +specific_include_rules = { + "chrome_content_browser_client_tablet_mode_part_browsertest\.cc": [ + "+chrome/browser/ash/system_web_apps/system_web_app_manager.h", + ], + "tablet_mode_page_behavior_browsertest.cc": [ + "+ash/public/cpp/test/shell_test_api.h", + ], +}
diff --git a/chrome/browser/device_reauth/mac/BUILD.gn b/chrome/browser/device_reauth/mac/BUILD.gn new file mode 100644 index 0000000..f24fafb --- /dev/null +++ b/chrome/browser/device_reauth/mac/BUILD.gn
@@ -0,0 +1,15 @@ +# Copyright 2022 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +source_set("biometric_authentication") { + sources = [ + "biometric_authenticator_mac.h", + "biometric_authenticator_mac.mm", + ] + deps = [ + "//base", + "//components/device_reauth", + "//device/fido", + ] +}
diff --git a/chrome/browser/device_reauth/mac/biometric_authenticator_mac.h b/chrome/browser/device_reauth/mac/biometric_authenticator_mac.h new file mode 100644 index 0000000..98f83fd --- /dev/null +++ b/chrome/browser/device_reauth/mac/biometric_authenticator_mac.h
@@ -0,0 +1,59 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_DEVICE_REAUTH_MAC_BIOMETRIC_AUTHENTICATOR_MAC_H_ +#define CHROME_BROWSER_DEVICE_REAUTH_MAC_BIOMETRIC_AUTHENTICATOR_MAC_H_ + +#include "components/device_reauth/biometric_authenticator.h" + +namespace device { +namespace fido { +namespace mac { +class TouchIdContext; +} // namespace mac +} // namespace fido +} // namespace device + +class BiometricAuthenticatorMac : public device_reauth::BiometricAuthenticator { + public: + BiometricAuthenticatorMac(); + + // Returns true, when biometrics are available and also the device screen lock + // is setup, false otherwise. + bool CanAuthenticate( + device_reauth::BiometricAuthRequester requester) override; + + // Trigges an authentication flow based on biometrics, with the + // screen lock as fallback. Note: this only supports one authentication + // request at a time. + // |use_last_valid_auth| if set to false, ignores the grace 60 seconds + // period between the last valid authentication and the current + // authentication, and re-invokes system authentication. + void Authenticate(device_reauth::BiometricAuthRequester requester, + AuthenticateCallback callback, + bool use_last_valid_auth) override; + + // Trigges an authentication flow based on biometrics. + // Creates touchIdAuthentication object, request user to authenticate(proper + // box with that information will appear on the screen and the `message` will + // be displayed there) using his touchId or if it's not setUp default one with + // password will appear. + void AuthenticateWithMessage(device_reauth::BiometricAuthRequester requester, + const std::u16string message, + AuthenticateCallback callback) override; + + // Should be called by the object using the authenticator if the purpose + // for which the auth was requested becomes obsolete or the object is + // destroyed. + void Cancel(device_reauth::BiometricAuthRequester requester) override; + + private: + ~BiometricAuthenticatorMac() override; + + // TouchId authenticator object that will handle biometric authentication + // itself + std::unique_ptr<device::fido::mac::TouchIdContext> touchIdAuthObject_; +}; + +#endif // CHROME_BROWSER_DEVICE_REAUTH_MAC_BIOMETRIC_AUTHENTICATOR_MAC_H_ \ No newline at end of file
diff --git a/chrome/browser/device_reauth/mac/biometric_authenticator_mac.mm b/chrome/browser/device_reauth/mac/biometric_authenticator_mac.mm new file mode 100644 index 0000000..f124927 --- /dev/null +++ b/chrome/browser/device_reauth/mac/biometric_authenticator_mac.mm
@@ -0,0 +1,40 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/device_reauth/mac/biometric_authenticator_mac.h" + +#include "base/notreached.h" +#include "components/device_reauth/biometric_authenticator.h" +#include "device/fido/mac/touch_id_context.h" + +BiometricAuthenticatorMac::BiometricAuthenticatorMac() { + touchIdAuthObject_ = device::fido::mac::TouchIdContext::Create(); +} + +BiometricAuthenticatorMac::~BiometricAuthenticatorMac() = default; + +bool BiometricAuthenticatorMac::CanAuthenticate( + device_reauth::BiometricAuthRequester requester) { + NOTIMPLEMENTED(); + return false; +} + +void BiometricAuthenticatorMac::Authenticate( + device_reauth::BiometricAuthRequester requester, + AuthenticateCallback callback, + bool use_last_valid_auth) { + NOTIMPLEMENTED(); +} + +void BiometricAuthenticatorMac::Cancel( + device_reauth::BiometricAuthRequester requester) { + NOTIMPLEMENTED(); +} + +void BiometricAuthenticatorMac::AuthenticateWithMessage( + device_reauth::BiometricAuthRequester requester, + const std::u16string message, + AuthenticateCallback callback) { + this->touchIdAuthObject_->PromptTouchId(message, std::move(callback)); +} \ No newline at end of file
diff --git a/chrome/browser/enterprise/idle/idle_service_browsertest.cc b/chrome/browser/enterprise/idle/idle_service_browsertest.cc index 98fcb3f..efddfdf9 100644 --- a/chrome/browser/enterprise/idle/idle_service_browsertest.cc +++ b/chrome/browser/enterprise/idle/idle_service_browsertest.cc
@@ -12,6 +12,7 @@ #include "base/test/test_mock_time_task_runner.h" #include "base/threading/thread_restrictions.h" #include "base/timer/mock_timer.h" +#include "build/build_config.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/ui/browser.h" @@ -178,7 +179,13 @@ EXPECT_TRUE(ProfilePicker::IsOpen()); } -IN_PROC_BROWSER_TEST_F(IdleServiceTest, MultiProfile) { +// TODO(crbug.com/1344609): Test flaky on Mac. +#if defined(IS_MAC) +#define MAYBE_MultiProfile DISABLED_MultiProfile +#else +#define MAYBE_MultiProfile MultiProfile +#endif +IN_PROC_BROWSER_TEST_F(IdleServiceTest, MAYBE_MultiProfile) { ON_CALL(provider(), CheckIdleStateIsLocked()).WillByDefault(Return(false)); // `profile` has the IdleProfileCloseTimeout policy set to 5 minutes.
diff --git a/chrome/browser/extensions/api/certificate_provider/OWNERS b/chrome/browser/extensions/api/certificate_provider/OWNERS index 325f7c3..5f652fe 100644 --- a/chrome/browser/extensions/api/certificate_provider/OWNERS +++ b/chrome/browser/extensions/api/certificate_provider/OWNERS
@@ -1 +1,2 @@ emaxx@chromium.org +fabiansommer@chromium.org
diff --git a/chrome/browser/extensions/api/quick_unlock_private/quick_unlock_private_api.cc b/chrome/browser/extensions/api/quick_unlock_private/quick_unlock_private_api.cc index 09eeb77..6a5d1e4f 100644 --- a/chrome/browser/extensions/api/quick_unlock_private/quick_unlock_private_api.cc +++ b/chrome/browser/extensions/api/quick_unlock_private/quick_unlock_private_api.cc
@@ -9,7 +9,7 @@ #include <utility> #include "ash/components/login/auth/extended_authenticator.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/constants/ash_pref_names.h" #include "base/bind.h" #include "base/containers/contains.h"
diff --git a/chrome/browser/extensions/api/quick_unlock_private/quick_unlock_private_ash_utils.cc b/chrome/browser/extensions/api/quick_unlock_private/quick_unlock_private_ash_utils.cc index 23cbbdd7..519b4061 100644 --- a/chrome/browser/extensions/api/quick_unlock_private/quick_unlock_private_ash_utils.cc +++ b/chrome/browser/extensions/api/quick_unlock_private/quick_unlock_private_ash_utils.cc
@@ -7,7 +7,7 @@ #include <utility> #include "ash/components/login/auth/extended_authenticator.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/bind.h" #include "chrome/browser/ash/login/quick_unlock/auth_token.h" #include "chrome/browser/ash/login/quick_unlock/fingerprint_storage.h"
diff --git a/chrome/browser/feedback/system_logs/about_system_logs_fetcher.cc b/chrome/browser/feedback/system_logs/about_system_logs_fetcher.cc index c00b7ff..d1e2480a 100644 --- a/chrome/browser/feedback/system_logs/about_system_logs_fetcher.cc +++ b/chrome/browser/feedback/system_logs/about_system_logs_fetcher.cc
@@ -11,6 +11,11 @@ #include "chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.h" #include "chrome/browser/feedback/system_logs/log_sources/memory_details_log_source.h" #include "components/feedback/system_logs/system_logs_fetcher.h" +#include "net/net_buildflags.h" + +#if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED) +#include "chrome/browser/feedback/system_logs/log_sources/chrome_root_store_log_source.h" +#endif #if BUILDFLAG(IS_CHROMEOS_ASH) #include "chrome/browser/ash/system_logs/bluetooth_log_source.h" @@ -37,6 +42,10 @@ fetcher->AddSource(std::make_unique<ChromeInternalLogSource>()); fetcher->AddSource(std::make_unique<MemoryDetailsLogSource>()); +#if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED) + fetcher->AddSource(std::make_unique<ChromeRootStoreLogSource>()); +#endif + #if BUILDFLAG(IS_CHROMEOS_ASH) // These sources rely on scrubbing in SystemLogsFetcher. fetcher->AddSource(std::make_unique<BluetoothLogSource>());
diff --git a/chrome/browser/feedback/system_logs/log_sources/chrome_root_store_log_source.cc b/chrome/browser/feedback/system_logs/log_sources/chrome_root_store_log_source.cc new file mode 100644 index 0000000..35390dba --- /dev/null +++ b/chrome/browser/feedback/system_logs/log_sources/chrome_root_store_log_source.cc
@@ -0,0 +1,54 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/feedback/system_logs/log_sources/chrome_root_store_log_source.h" + +#include "base/strings/string_number_conversions.h" +#include "components/feedback/system_logs/system_logs_source.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/network_service_instance.h" +#include "services/cert_verifier/cert_verifier_service_factory.h" +#include "services/cert_verifier/public/mojom/cert_verifier_service_factory.mojom.h" + +namespace system_logs { + +namespace { + +constexpr char kChromeRootStoreKey[] = "chrome_root_store"; + +void PopulateChromeRootStoreLogsAsync( + system_logs::SysLogsSourceCallback callback, + cert_verifier::mojom::ChromeRootStoreInfoPtr info) { + auto response = std::make_unique<system_logs::SystemLogsResponse>(); + + std::string entry; + entry += "version: " + base::NumberToString(info->version) + "\n\n"; + for (auto const& cert_info : info->root_cert_info) { + entry += "hash: " + cert_info->sha256hash_hex + + " name: " + cert_info->name + "\n"; + } + response->emplace(kChromeRootStoreKey, std::move(entry)); + std::move(callback).Run(std::move(response)); +} + +} // namespace + +ChromeRootStoreLogSource::ChromeRootStoreLogSource() + : SystemLogsSource("ChromeRootStore") {} + +ChromeRootStoreLogSource::~ChromeRootStoreLogSource() {} + +void ChromeRootStoreLogSource::Fetch( + system_logs::SysLogsSourceCallback callback) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + DCHECK(!callback.is_null()); + + cert_verifier::mojom::CertVerifierServiceFactory* factory = + content::GetCertVerifierServiceFactory(); + DCHECK(factory); + factory->GetChromeRootStoreInfo( + base::BindOnce(&PopulateChromeRootStoreLogsAsync, std::move(callback))); +} + +} // namespace system_logs
diff --git a/chrome/browser/feedback/system_logs/log_sources/chrome_root_store_log_source.h b/chrome/browser/feedback/system_logs/log_sources/chrome_root_store_log_source.h new file mode 100644 index 0000000..f5f5ef6 --- /dev/null +++ b/chrome/browser/feedback/system_logs/log_sources/chrome_root_store_log_source.h
@@ -0,0 +1,28 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_FEEDBACK_SYSTEM_LOGS_LOG_SOURCES_CHROME_ROOT_STORE_LOG_SOURCE_H_ +#define CHROME_BROWSER_FEEDBACK_SYSTEM_LOGS_LOG_SOURCES_CHROME_ROOT_STORE_LOG_SOURCE_H_ + +#include "components/feedback/system_logs/system_logs_source.h" + +namespace system_logs { + +// Get information about the contents of the Chrome Root Store in use. +class ChromeRootStoreLogSource : public system_logs::SystemLogsSource { + public: + ChromeRootStoreLogSource(); + + ChromeRootStoreLogSource(const ChromeRootStoreLogSource&) = delete; + ChromeRootStoreLogSource& operator=(const ChromeRootStoreLogSource&) = delete; + + ~ChromeRootStoreLogSource() override; + + // SystemLogsSource override. + void Fetch(system_logs::SysLogsSourceCallback callback) override; +}; + +} // namespace system_logs + +#endif // CHROME_BROWSER_FEEDBACK_SYSTEM_LOGS_LOG_SOURCES_CHROME_ROOT_STORE_LOG_SOURCE_H_
diff --git a/chrome/browser/lacros/app_mode/kiosk_session_service_lacros.cc b/chrome/browser/lacros/app_mode/kiosk_session_service_lacros.cc index 543abd1..4a2a848d 100644 --- a/chrome/browser/lacros/app_mode/kiosk_session_service_lacros.cc +++ b/chrome/browser/lacros/app_mode/kiosk_session_service_lacros.cc
@@ -33,7 +33,13 @@ // static void KioskSessionServiceLacros::RegisterLocalStatePrefs( PrefRegistrySimple* registry) { - chromeos::AppSession::RegisterPrefs(registry); + chromeos::AppSession::RegisterLocalStatePrefs(registry); +} + +// static +void KioskSessionServiceLacros::RegisterProfilePrefs( + user_prefs::PrefRegistrySyncable* registry) { + chromeos::AppSession::RegisterProfilePrefs(registry); } KioskSessionServiceLacros::KioskSessionServiceLacros() {
diff --git a/chrome/browser/lacros/app_mode/kiosk_session_service_lacros.h b/chrome/browser/lacros/app_mode/kiosk_session_service_lacros.h index 6c04f9c..1953af0c 100644 --- a/chrome/browser/lacros/app_mode/kiosk_session_service_lacros.h +++ b/chrome/browser/lacros/app_mode/kiosk_session_service_lacros.h
@@ -26,9 +26,12 @@ // first before using it. static KioskSessionServiceLacros* Get(); - // Registers all prefs associated with the service. + // Registers all local state prefs associated with the service. static void RegisterLocalStatePrefs(PrefRegistrySimple* registry); + // Registers all profile prefs associated with the service. + static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); + KioskSessionServiceLacros(); KioskSessionServiceLacros(const KioskSessionServiceLacros&) = delete; KioskSessionServiceLacros& operator=(const KioskSessionServiceLacros&) =
diff --git a/chrome/browser/metrics/chrome_browser_sampling_trials.cc b/chrome/browser/metrics/chrome_browser_sampling_trials.cc new file mode 100644 index 0000000..32c451b --- /dev/null +++ b/chrome/browser/metrics/chrome_browser_sampling_trials.cc
@@ -0,0 +1,168 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/metrics/chrome_browser_sampling_trials.h" + +#include "base/metrics/field_trial.h" +#include "base/strings/string_number_conversions.h" +#include "chrome/browser/metrics/chrome_metrics_services_manager_client.h" +#include "chrome/common/channel_info.h" +#include "components/ukm/ukm_recorder_impl.h" +#include "components/variations/variations_associated_data.h" +#include "components/version_info/channel.h" + +namespace metrics { +namespace { + +// Note that the trial name must be kept in sync with the server config +// controlling sampling. If they don't match, then clients will be shuffled into +// different groups when the server config takes over from the fallback trial. +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID) +constexpr char kSamplingTrialName[] = "MetricsAndCrashSampling"; +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID) +#if BUILDFLAG(IS_ANDROID) +constexpr char kPostFREFixSamplingTrialName[] = + "PostFREFixMetricsAndCrashSampling"; +#endif // BUILDFLAG(IS_ANDROID) +constexpr char kUkmSamplingTrialName[] = "UkmSamplingRate"; + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID) +// Appends a group to the sampling controlling |trial|. The group will be +// associated with a variation param for reporting sampling |rate| in per mille. +void AppendSamplingTrialGroup(const std::string& group_name, + int rate, + base::FieldTrial* trial) { + std::map<std::string, std::string> params = { + {metrics::internal::kRateParamName, base::NumberToString(rate)}}; + variations::AssociateVariationParams(trial->trial_name(), group_name, params); + trial->AppendGroup(group_name, rate); +} + +// Unconditionally attempts to create a field trial to control client side +// metrics/crash sampling to use as a fallback when one hasn't been +// provided. This is expected to occur on first-run on platforms that don't +// have first-run variations support. This should only be called when there is +// no existing field trial controlling the sampling feature, and on the +// correct platform. |trial_name| is the name of the trial. |feature_name| is +// the name of the feature that determines sampling. |sampled_in_rate| is the +// sampling rate per mille. +void CreateFallbackSamplingTrial(const std::string& trial_name, + const std::string& feature_name, + const int sampled_in_rate_per_mille, + base::FeatureList* feature_list) { + scoped_refptr<base::FieldTrial> trial( + base::FieldTrialList::FactoryGetFieldTrial( + trial_name, /*total_probability=*/1000, "Default", + base::FieldTrial::ONE_TIME_RANDOMIZED, + /*default_group_number=*/nullptr)); + + // Like the trial name, the order that these two groups are added to the trial + // must be kept in sync with the order that they appear in the server config. + // The desired order is: OutOfReportingSample, InReportingSample. + + const char kSampledOutGroup[] = "OutOfReportingSample"; + const int sampled_out_rate_per_mille = 1000 - sampled_in_rate_per_mille; + AppendSamplingTrialGroup(kSampledOutGroup, sampled_out_rate_per_mille, + trial.get()); + + const char kInSampleGroup[] = "InReportingSample"; + AppendSamplingTrialGroup(kInSampleGroup, sampled_in_rate_per_mille, + trial.get()); + + // Set up the feature. This must be done after all groups are added since + // GetGroupNameWithoutActivation() will finalize the group choice. + const std::string& group_name = trial->GetGroupNameWithoutActivation(); + + feature_list->RegisterFieldTrialOverride( + feature_name, + group_name == kSampledOutGroup + ? base::FeatureList::OVERRIDE_DISABLE_FEATURE + : base::FeatureList::OVERRIDE_ENABLE_FEATURE, + trial.get()); +} +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID) + +// Unconditionally attempts to create a field trial to control client side +// UKM sampling to use as a fallback when one hasn't been provided. This is +// expected to occur on first-run on platforms that don't have first-run +// variations support. This should only be called when there is no existing +// field trial controlling the sampling feature. +void CreateFallbackUkmSamplingTrial(bool is_stable_channel, + base::FeatureList* feature_list) { + static const char kSampledGroup_Stable[] = "Sampled_NoSeed_Stable"; + static const char kSampledGroup_Other[] = "Sampled_NoSeed_Other"; + const char* sampled_group = kSampledGroup_Other; + int default_sampling = 1; // Sampling is 1-in-N; this is N. + + // Nothing is sampled out except for "stable" which omits almost everything + // in this configuration. This is done so that clients that fail to receive + // a configuration from the server do not bias aggregated results because + // of a relatively large number of records from them. + if (is_stable_channel) { + sampled_group = kSampledGroup_Stable; + default_sampling = 1000000; + } + + scoped_refptr<base::FieldTrial> trial( + base::FieldTrialList::FactoryGetFieldTrial( + kUkmSamplingTrialName, /*total_probability=*/100, sampled_group, + base::FieldTrial::ONE_TIME_RANDOMIZED, + /*default_group_number=*/nullptr)); + + // Everybody (100%) should have a sampling configuration. + std::map<std::string, std::string> params = { + {"_default_sampling", base::NumberToString(default_sampling)}}; + variations::AssociateVariationParams(trial->trial_name(), sampled_group, + params); + trial->AppendGroup(sampled_group, 100); + + // Setup the feature. + feature_list->RegisterFieldTrialOverride( + ukm::kUkmSamplingRateFeature.name, + base::FeatureList::OVERRIDE_ENABLE_FEATURE, trial.get()); +} + +} // namespace + +void CreateFallbackSamplingTrialsIfNeeded(base::FeatureList* feature_list) { + [[maybe_unused]] const bool is_stable = + chrome::GetChannel() == version_info::Channel::STABLE; +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID) + if (!base::FieldTrialList::TrialExists(kSamplingTrialName)) { + // On all channels except stable, we sample out at a minimal rate to ensure + // the code paths are exercised in the wild before hitting stable. + const int kPreStableSampledInRatePerMille = 990; + const int kStableSampledInRatePerMille = 100; + CreateFallbackSamplingTrial( + kSamplingTrialName, metrics::internal::kMetricsReportingFeature.name, + is_stable ? kStableSampledInRatePerMille + : kPreStableSampledInRatePerMille, + feature_list); + } +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID) +#if BUILDFLAG(IS_ANDROID) + if (!base::FieldTrialList::TrialExists(kPostFREFixSamplingTrialName)) { + // On all channels except stable, we sample out at a minimal rate to ensure + // the code paths are exercised in the wild before hitting stable. + const int kPreStableSampledInRatePerMille = 990; + const int kStableSampledInRatePerMille = 190; + CreateFallbackSamplingTrial( + kPostFREFixSamplingTrialName, + metrics::internal::kPostFREFixMetricsReportingFeature.name, + is_stable ? kStableSampledInRatePerMille + : kPreStableSampledInRatePerMille, + feature_list); + } +#endif // BUILDFLAG(IS_ANDROID) +} + +void CreateFallbackUkmSamplingTrialIfNeeded(base::FeatureList* feature_list) { + if (!base::FieldTrialList::TrialExists(kUkmSamplingTrialName)) { + const bool is_stable = + chrome::GetChannel() == version_info::Channel::STABLE; + CreateFallbackUkmSamplingTrial(is_stable, feature_list); + } +} + +} // namespace metrics
diff --git a/chrome/browser/metrics/chrome_browser_sampling_trials.h b/chrome/browser/metrics/chrome_browser_sampling_trials.h new file mode 100644 index 0000000..b3fee123 --- /dev/null +++ b/chrome/browser/metrics/chrome_browser_sampling_trials.h
@@ -0,0 +1,32 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_METRICS_CHROME_BROWSER_SAMPLING_TRIALS_H_ +#define CHROME_BROWSER_METRICS_CHROME_BROWSER_SAMPLING_TRIALS_H_ + +#include "base/feature_list.h" + +namespace metrics { + +// Create sampling trials to control metrics/crash sampling on Windows/Android +// if they do not exist (e.g., no variations seed was applied, or the variations +// seed did not contain the trials). On Windows, there is only one trial to +// control sampling. On Android, there are two (with different sampling rates, +// see crbug/1306481 for more details), but the client will only use one. The +// trial used depends on when metrics reporting was enabled. We create both +// trials regardless of which one the client would use at the time this is +// called, because the trial used may change during the session (e.g., if the +// user disables then re-enables metrics reporting during the same session). +void CreateFallbackSamplingTrialsIfNeeded(base::FeatureList* feature_list); + +// Create a field trial to control UKM sampling for Stable if it does not exist +// (e.g., no variations seed was applied, or the variations seed did not contain +// the trial). Note that UKM sampling is not per-client such as metrics/crash +// sampling (see CreateFallbackSamplingTrialsIfNeeded() above), but rather +// per-metric. +void CreateFallbackUkmSamplingTrialIfNeeded(base::FeatureList* feature_list); + +} // namespace metrics + +#endif // CHROME_BROWSER_METRICS_CHROME_BROWSER_SAMPLING_TRIALS_H_
diff --git a/chrome/browser/metrics/chrome_metrics_services_manager_client.cc b/chrome/browser/metrics/chrome_metrics_services_manager_client.cc index 1c36b2ed..98646c9 100644 --- a/chrome/browser/metrics/chrome_metrics_services_manager_client.cc +++ b/chrome/browser/metrics/chrome_metrics_services_manager_client.cc
@@ -106,17 +106,6 @@ client_info)); } -// Appends a group to the sampling controlling |trial|. The group will be -// associated with a variation param for reporting sampling |rate| in per mille. -void AppendSamplingTrialGroup(const std::string& group_name, - int rate, - base::FieldTrial* trial) { - std::map<std::string, std::string> params = { - {metrics::internal::kRateParamName, base::NumberToString(rate)}}; - variations::AssociateVariationParams(trial->trial_name(), group_name, params); - trial->AppendGroup(group_name, rate); -} - #if BUILDFLAG(IS_ANDROID) // Returns true if we should use the new sampling trial and feature to determine // sampling. See the comment on |kUsePostFREFixSamplingTrial| for more details. @@ -228,70 +217,6 @@ } // static -void ChromeMetricsServicesManagerClient::CreateFallbackSamplingTrial( - version_info::Channel channel, - base::FeatureList* feature_list) { - // The trial name must be kept in sync with the server config controlling - // sampling. If they don't match, then clients will be shuffled into different - // groups when the server config takes over from the fallback trial. - std::string trial_name = "MetricsAndCrashSampling"; - // The name of the feature used to control sampling. - std::string feature_name = metrics::internal::kMetricsReportingFeature.name; - - bool use_post_fre_fix_sampling_trial = false; -#if BUILDFLAG(IS_ANDROID) - // Depending on the |kUsePostFREFixSamplingTrial| pref, we may apply a - // different sampling trial and rate. - if (ShouldUsePostFREFixSamplingTrial()) { - use_post_fre_fix_sampling_trial = true; - trial_name = "PostFREFixMetricsAndCrashSampling"; - feature_name = metrics::internal::kPostFREFixMetricsReportingFeature.name; - } -#endif // BUILDFLAG(IS_ANDROID) - - scoped_refptr<base::FieldTrial> trial( - base::FieldTrialList::FactoryGetFieldTrial( - trial_name, 1000, "Default", base::FieldTrial::ONE_TIME_RANDOMIZED, - nullptr)); - - // On all channels except stable, we sample out at a minimal rate to ensure - // the code paths are exercised in the wild before hitting stable. - int sampled_in_rate = 990; - int sampled_out_rate = 10; - if (channel == version_info::Channel::STABLE) { - if (use_post_fre_fix_sampling_trial) { - // See crbug/1306481 for details on why the new sampling rate is 19%. - sampled_in_rate = 190; - sampled_out_rate = 810; - } else { - sampled_in_rate = 100; - sampled_out_rate = 900; - } - } - - // Like the trial name, the order that these two groups are added to the trial - // must be kept in sync with the order that they appear in the server config. - // The desired order is: OutOfReportingSample, InReportingSample. - - const char kSampledOutGroup[] = "OutOfReportingSample"; - AppendSamplingTrialGroup(kSampledOutGroup, sampled_out_rate, trial.get()); - - const char kInSampleGroup[] = "InReportingSample"; - AppendSamplingTrialGroup(kInSampleGroup, sampled_in_rate, trial.get()); - - // Set up the feature. This must be done after all groups are added since - // GetGroupNameWithoutActivation() will finalize the group choice. - const std::string& group_name = trial->GetGroupNameWithoutActivation(); - - feature_list->RegisterFieldTrialOverride( - feature_name, - group_name == kSampledOutGroup - ? base::FeatureList::OVERRIDE_DISABLE_FEATURE - : base::FeatureList::OVERRIDE_ENABLE_FEATURE, - trial.get()); -} - -// static bool ChromeMetricsServicesManagerClient::IsClientInSample() { return IsClientInSampleImpl(g_browser_process->local_state()); }
diff --git a/chrome/browser/metrics/chrome_metrics_services_manager_client.h b/chrome/browser/metrics/chrome_metrics_services_manager_client.h index f16b42e8..580ce09 100644 --- a/chrome/browser/metrics/chrome_metrics_services_manager_client.h +++ b/chrome/browser/metrics/chrome_metrics_services_manager_client.h
@@ -54,19 +54,6 @@ metrics::MetricsStateManager* GetMetricsStateManagerForTesting(); - // Unconditionally attempts to create a field trial to control client side - // metrics/crash sampling to use as a fallback when one hasn't been - // provided. This is expected to occur on first-run on platforms that don't - // have first-run variations support. This should only be called when there is - // no existing field trial controlling the sampling feature, and on the - // correct platform. |channel| will affect the sampling rates that are - // applied. Stable will be sampled at 10%, other channels at 99%. On Android - // Chrome, Stable will be sampled at 19% if the |kUsePostFREFixSamplingTrial| - // pref is set to true. See the comment on |kUsePostFREFixSamplingTrial| for - // more details. - static void CreateFallbackSamplingTrial(version_info::Channel channel, - base::FeatureList* feature_list); - // Determines if this client is eligible to send metrics. If they are, and // there was user consent, then metrics and crashes would be reported. static bool IsClientInSample();
diff --git a/chrome/browser/metrics/chrome_metrics_services_manager_client_unittest.cc b/chrome/browser/metrics/chrome_metrics_services_manager_client_unittest.cc index 1f92909f..9b591dc 100644 --- a/chrome/browser/metrics/chrome_metrics_services_manager_client_unittest.cc +++ b/chrome/browser/metrics/chrome_metrics_services_manager_client_unittest.cc
@@ -6,16 +6,12 @@ #include "base/base_switches.h" #include "base/command_line.h" -#include "base/containers/contains.h" -#include "base/metrics/field_trial.h" #include "base/test/scoped_feature_list.h" #include "chrome/browser/metrics/chrome_metrics_service_accessor.h" #include "chrome/browser/metrics/chrome_metrics_service_client.h" #include "chrome/test/base/testing_browser_process.h" #include "components/metrics/enabled_state_provider.h" #include "components/metrics/metrics_pref_names.h" -#include "components/metrics/metrics_reporting_default_state.h" -#include "components/metrics/metrics_service_accessor.h" #include "components/metrics/metrics_state_manager.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/testing_pref_service.h" @@ -56,7 +52,6 @@ TestingPrefServiceSimple local_state_; }; -using CreateFallbackSamplingTrialTest = ChromeMetricsServicesManagerClientTest; using IsClientInSampleTest = ChromeMetricsServicesManagerClientTest; TEST_F(ChromeMetricsServicesManagerClientTest, ForceTrialsDisablesReporting) { @@ -128,132 +123,6 @@ metrics_state_manager->is_background_session()); } -// Verifies that CreateFallBackSamplingTrial() uses the MetricsAndCrashSampling -// sampling trial if the |kUsePostFREFixSamplingTrial| pref is not set. This is -// the case if 1) this is a non-Android platform, or 2) this is an Android -// client that is not using the new sampling trial. This also verifies that the -// param |kRateParamName| is correctly set, depending on which group we are -// assigned to during the test (not deterministic). -TEST_F(CreateFallbackSamplingTrialTest, UsesMetricsAndCrashSamplingTrial) { -#if BUILDFLAG(IS_ANDROID) - ASSERT_FALSE( - local_state()->GetBoolean(metrics::prefs::kUsePostFREFixSamplingTrial)); -#endif - - // Initially, neither sampling trial should exist. - ASSERT_FALSE(base::FieldTrialList::TrialExists("MetricsAndCrashSampling")); - ASSERT_FALSE( - base::FieldTrialList::TrialExists("PostFREFixMetricsAndCrashSampling")); - - // Create the fallback sampling trial. - auto feature_list = std::make_unique<base::FeatureList>(); - ChromeMetricsServicesManagerClient::CreateFallbackSamplingTrial( - version_info::Channel::STABLE, feature_list.get()); - - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitWithFeatureList(std::move(feature_list)); - - // Since the |kUsePostFREFixSamplingTrial| pref was not set to true, the - // MetricsAndCrashSampling sampling trial should be registered. - EXPECT_TRUE(base::FieldTrialList::TrialExists("MetricsAndCrashSampling")); - EXPECT_FALSE( - base::FieldTrialList::TrialExists("PostFREFixMetricsAndCrashSampling")); - - // The MetricsReporting feature should be associated with the - // MetricsAndCrashSampling trial, and its state should be overridden. - base::FieldTrial* associated_trial = base::FeatureList::GetFieldTrial( - metrics::internal::kMetricsReportingFeature); - EXPECT_THAT(associated_trial, NotNull()); - EXPECT_EQ("MetricsAndCrashSampling", associated_trial->trial_name()); - EXPECT_TRUE(base::FeatureList::GetStateIfOverridden( - metrics::internal::kMetricsReportingFeature) - .has_value()); - - // Verify that we are either in the "OutOfReportingSample" or - // "InReportingSample" group, and verify that the sampling rate is what we - // expect (10% sampled in rate or 90% sampled out rate for Stable). - // TODO(crbug/1322904): Maybe make - // ChromeMetricsServicesManagerClient::GetSamplingRatePerMille return the - // sampling rate even when sampled out, so that we can replace the code below - // with ChromeMetricsServicesManagerClient::GetSamplingRatePerMille. - const std::string group_name = associated_trial->group_name(); - ASSERT_TRUE(group_name == "OutOfReportingSample" || - group_name == "InReportingSample"); - base::FieldTrialParams params; - ASSERT_TRUE( - base::GetFieldTrialParams(associated_trial->trial_name(), ¶ms)); - ASSERT_TRUE(base::Contains(params, metrics::internal::kRateParamName)); - int sampling_rate_per_mille; - ASSERT_TRUE(base::StringToInt(params[metrics::internal::kRateParamName], - &sampling_rate_per_mille)); - EXPECT_EQ(group_name == "OutOfReportingSample" ? 900 : 100, - sampling_rate_per_mille); -} - -#if BUILDFLAG(IS_ANDROID) -// Verifies that CreateFallBackSamplingTrial() uses the post-FRE-fix sampling -// trial (PostFREFixMetricsAndCrashSampling) if the -// |kUsePostFREFixSamplingTrial| pref is set. This also verifies that the param -// |kRateParamName| is correctly set, depending on which group we are assigned -// to during the test (not deterministic). -TEST_F(CreateFallbackSamplingTrialTest, UsesPostFREFixTrialWhenPrefSet) { - // Set the |kUsePostFREFixSamplingTrial| pref to true. - local_state()->SetBoolean(metrics::prefs::kUsePostFREFixSamplingTrial, true); - - // Initially, neither sampling trial should exist. - ASSERT_FALSE(base::FieldTrialList::TrialExists("MetricsAndCrashSampling")); - ASSERT_FALSE( - base::FieldTrialList::TrialExists("PostFREFixMetricsAndCrashSampling")); - - // Create the fallback sampling trial. - auto feature_list = std::make_unique<base::FeatureList>(); - ChromeMetricsServicesManagerClient::CreateFallbackSamplingTrial( - version_info::Channel::STABLE, feature_list.get()); - - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitWithFeatureList(std::move(feature_list)); - - // Since the |kUsePostFREFixSamplingTrial| pref was set to true, the - // post-FRE-fix sampling trial (PostFREFixMetricsAndCrashSampling) should be - // registered. - EXPECT_FALSE(base::FieldTrialList::TrialExists("MetricsAndCrashSampling")); - EXPECT_TRUE( - base::FieldTrialList::TrialExists("PostFREFixMetricsAndCrashSampling")); - - // The PostFREFixMetricsReporting feature should be associated with the - // PostFREFixMetricsAndCrashSampling trial, and its state should be - // overridden. - base::FieldTrial* associated_trial = base::FeatureList::GetFieldTrial( - metrics::internal::kPostFREFixMetricsReportingFeature); - EXPECT_THAT(associated_trial, NotNull()); - EXPECT_EQ("PostFREFixMetricsAndCrashSampling", - associated_trial->trial_name()); - EXPECT_TRUE(base::FeatureList::GetStateIfOverridden( - metrics::internal::kPostFREFixMetricsReportingFeature) - .has_value()); - - // Verify that we are either in the "OutOfReportingSample" or - // "InReportingSample" group, and verify that the sampling rate is what we - // expect (19% sampled in rate or 81% sampled out rate for Stable). - // TODO(crbug/1322904): Maybe make - // ChromeMetricsServicesManagerClient::GetSamplingRatePerMille return the - // sampling rate even when sampled out, so that we can replace the code below - // with ChromeMetricsServicesManagerClient::GetSamplingRatePerMille. - const std::string group_name = associated_trial->group_name(); - ASSERT_TRUE(group_name == "OutOfReportingSample" || - group_name == "InReportingSample"); - base::FieldTrialParams params; - ASSERT_TRUE( - base::GetFieldTrialParams(associated_trial->trial_name(), ¶ms)); - ASSERT_TRUE(base::Contains(params, metrics::internal::kRateParamName)); - int sampling_rate_per_mille; - ASSERT_TRUE(base::StringToInt(params[metrics::internal::kRateParamName], - &sampling_rate_per_mille)); - EXPECT_EQ(group_name == "OutOfReportingSample" ? 810 : 190, - sampling_rate_per_mille); -} -#endif // BUILDFLAG(IS_ANDROID) - // Verifies that IsClientInSample() uses the "MetricsReporting" sampling // feature to determine sampling if the |kUsePostFREFixSamplingTrial| pref is // not set. This is the case if 1) this is a non-Android platform, or 2) this is
diff --git a/chrome/browser/metrics/process_memory_metrics_emitter.cc b/chrome/browser/metrics/process_memory_metrics_emitter.cc index e7ad3ac..bcf0c211 100644 --- a/chrome/browser/metrics/process_memory_metrics_emitter.cc +++ b/chrome/browser/metrics/process_memory_metrics_emitter.cc
@@ -266,6 +266,8 @@ MetricSize::kLarge, "max_allocated_size", EmitTo::kSizeInUmaOnly, nullptr}, {"malloc/partitions/allocator", "Malloc.MaxCommittedSize", MetricSize::kLarge, "max_committed_size", EmitTo::kSizeInUmaOnly, nullptr}, + {"malloc/partitions/allocator", "Malloc.CommittedSize", MetricSize::kLarge, + "virtual_committed_size", EmitTo::kSizeInUmaOnly, nullptr}, {"malloc/partitions/allocator", "Malloc.Wasted", MetricSize::kLarge, "wasted", EmitTo::kSizeInUmaOnly, nullptr}, {"malloc/partitions/allocator", "Malloc.Fragmentation", @@ -313,7 +315,10 @@ "fragmentation", EmitTo::kSizeInUmaOnly, nullptr}, {"partition_alloc/partitions/array_buffer", "PartitionAlloc.MaxCommittedSize.ArrayBuffer", MetricSize::kLarge, - "max_committed_size", EmitTo::kSizeInUmaOnly, nullptr}, + "max_committed", EmitTo::kSizeInUmaOnly, nullptr}, + {"partition_alloc/partitions/array_buffer", + "PartitionAlloc.CommittedSize.ArrayBuffer", MetricSize::kLarge, + "virtual_committed_size", EmitTo::kSizeInUmaOnly, nullptr}, {"partition_alloc/partitions/array_buffer", "PartitionAlloc.MaxAllocatedSize.ArrayBuffer", MetricSize::kLarge, "max_allocated_size", EmitTo::kSizeInUmaOnly, nullptr}, @@ -327,7 +332,10 @@ MetricSize::kPercentage, "fragmentation", EmitTo::kSizeInUmaOnly, nullptr}, {"partition_alloc/partitions/buffer", "PartitionAlloc.MaxCommittedSize.Buffer", MetricSize::kLarge, - "max_committed_size", EmitTo::kSizeInUmaOnly, nullptr}, + "max_committed", EmitTo::kSizeInUmaOnly, nullptr}, + {"partition_alloc/partitions/buffer", "PartitionAlloc.CommittedSize.Buffer", + MetricSize::kLarge, "virtual_committed_size", EmitTo::kSizeInUmaOnly, + nullptr}, {"partition_alloc/partitions/buffer", "PartitionAlloc.MaxAllocatedSize.Buffer", MetricSize::kLarge, "max_allocated_size", EmitTo::kSizeInUmaOnly, nullptr}, @@ -342,7 +350,10 @@ "fragmentation", EmitTo::kSizeInUmaOnly, nullptr}, {"partition_alloc/partitions/fast_malloc", "PartitionAlloc.MaxCommittedSize.FastMalloc", MetricSize::kLarge, - "max_committed_size", EmitTo::kSizeInUmaOnly, nullptr}, + "max_committed", EmitTo::kSizeInUmaOnly, nullptr}, + {"partition_alloc/partitions/fast_malloc", + "PartitionAlloc.CommittedSize.FastMalloc", MetricSize::kLarge, + "virtual_committed_size", EmitTo::kSizeInUmaOnly, nullptr}, {"partition_alloc/partitions/fast_malloc", "PartitionAlloc.MaxAllocatedSize.FastMalloc", MetricSize::kLarge, "max_allocated_size", EmitTo::kSizeInUmaOnly, nullptr}, @@ -361,7 +372,10 @@ MetricSize::kPercentage, "fragmentation", EmitTo::kSizeInUmaOnly, nullptr}, {"partition_alloc/partitions/layout", "PartitionAlloc.MaxCommittedSize.Layout", MetricSize::kLarge, - "max_committed_size", EmitTo::kSizeInUmaOnly, nullptr}, + "max_committed", EmitTo::kSizeInUmaOnly, nullptr}, + {"partition_alloc/partitions/layout", "PartitionAlloc.CommittedSize.Layout", + MetricSize::kLarge, "virtual_committed_size", EmitTo::kSizeInUmaOnly, + nullptr}, {"partition_alloc/partitions/layout", "PartitionAlloc.MaxAllocatedSize.Layout", MetricSize::kLarge, "max_allocated_size", EmitTo::kSizeInUmaOnly, nullptr},
diff --git a/chrome/browser/metrics/process_memory_metrics_emitter_browsertest.cc b/chrome/browser/metrics/process_memory_metrics_emitter_browsertest.cc index 4976c590..024a072d 100644 --- a/chrome/browser/metrics/process_memory_metrics_emitter_browsertest.cc +++ b/chrome/browser/metrics/process_memory_metrics_emitter_browsertest.cc
@@ -196,6 +196,14 @@ histogram_tester, count, ValueRestriction::NONE, number_of_processes); CheckMemoryMetric(std::string("Memory.Experimental.") + process_type + + "2.Malloc.CommittedSize", + histogram_tester, count, ValueRestriction::ABOVE_ZERO, + number_of_processes); + CheckMemoryMetric(std::string("Memory.Experimental.") + process_type + + "2.Malloc.MaxCommittedSize", + histogram_tester, count, ValueRestriction::ABOVE_ZERO, + number_of_processes); + CheckMemoryMetric(std::string("Memory.Experimental.") + process_type + "2.Malloc.Fragmentation", histogram_tester, count, ValueRestriction::NONE, number_of_processes);
diff --git a/chrome/browser/metrics/ukm_browsertest.cc b/chrome/browser/metrics/ukm_browsertest.cc index 330a049..e5ee7a4c 100644 --- a/chrome/browser/metrics/ukm_browsertest.cc +++ b/chrome/browser/metrics/ukm_browsertest.cc
@@ -558,16 +558,10 @@ } #endif // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS) +// Not applicable to Android as it doesn't have multiple profiles. #if !BUILDFLAG(IS_ANDROID) - -#if BUILDFLAG(IS_MAC) && defined(ARCH_CPU_ARM64) -// https://crbug.com/1223061 -#define MAYBE_OpenNonSyncCheck DISABLED_OpenNonSyncCheck -#else -#define MAYBE_OpenNonSyncCheck OpenNonSyncCheck -#endif // Make sure that UKM is disabled while an non-sync profile's window is open. -IN_PROC_BROWSER_TEST_F(UkmBrowserTest, MAYBE_OpenNonSyncCheck) { +IN_PROC_BROWSER_TEST_F(UkmBrowserTest, OpenNonSyncCheck) { ukm::UkmTestHelper ukm_test_helper(GetUkmService()); MetricsConsentOverride metrics_consent(true); @@ -1058,15 +1052,8 @@ // ChromeOS doesn't have the concept of sign-out so this test doesn't make sense // there. Android doesn't have multiple profiles. #if !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_ANDROID) - -#if BUILDFLAG(IS_MAC) && defined(ARCH_CPU_ARM64) -// https://crbug.com/1223061 -#define MAYBE_MultiSyncSignoutCheck DISABLED_MultiSyncSignoutCheck -#else -#define MAYBE_MultiSyncSignoutCheck MultiSyncSignoutCheck -#endif // Make sure that UKM is disabled when any profile signs out of Sync. -IN_PROC_BROWSER_TEST_F(UkmBrowserTest, MAYBE_MultiSyncSignoutCheck) { +IN_PROC_BROWSER_TEST_F(UkmBrowserTest, MultiSyncSignoutCheck) { ukm::UkmTestHelper ukm_test_helper(GetUkmService()); MetricsConsentOverride metrics_consent(true);
diff --git a/chrome/browser/nearby_sharing/fast_initiation/fast_initiation_scanner_feature_usage_metrics.h b/chrome/browser/nearby_sharing/fast_initiation/fast_initiation_scanner_feature_usage_metrics.h index 5080dff..b1f8b8a 100644 --- a/chrome/browser/nearby_sharing/fast_initiation/fast_initiation_scanner_feature_usage_metrics.h +++ b/chrome/browser/nearby_sharing/fast_initiation/fast_initiation_scanner_feature_usage_metrics.h
@@ -6,7 +6,7 @@ #define CHROME_BROWSER_NEARBY_SHARING_FAST_INITIATION_FAST_INITIATION_SCANNER_FEATURE_USAGE_METRICS_H_ #include "base/memory/scoped_refptr.h" -#include "chromeos/components/feature_usage/feature_usage_metrics.h" +#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h" #include "device/bluetooth/bluetooth_adapter.h" class PrefService; @@ -14,7 +14,7 @@ // Tracks feature usage for FastInitiationScanner for the Standard Feature Usage // Logging (SFUL) framework. class FastInitiationScannerFeatureUsageMetrics final - : public feature_usage::FeatureUsageMetrics::Delegate { + : public ash::feature_usage::FeatureUsageMetrics::Delegate { public: explicit FastInitiationScannerFeatureUsageMetrics(PrefService* pref_service); FastInitiationScannerFeatureUsageMetrics( @@ -23,7 +23,7 @@ FastInitiationScannerFeatureUsageMetrics&) = delete; ~FastInitiationScannerFeatureUsageMetrics() final; - // feature_usage::FeatureUsageMetrics::Delegate: + // ash::feature_usage::FeatureUsageMetrics::Delegate: bool IsEligible() const override; bool IsEnabled() const override; @@ -32,7 +32,7 @@ private: PrefService* pref_service_; - feature_usage::FeatureUsageMetrics feature_usage_metrics_; + ash::feature_usage::FeatureUsageMetrics feature_usage_metrics_; scoped_refptr<device::BluetoothAdapter> bluetooth_adapter_; };
diff --git a/chrome/browser/nearby_sharing/fast_initiation/fast_initiation_scanner_feature_usage_metrics_unittest.cc b/chrome/browser/nearby_sharing/fast_initiation/fast_initiation_scanner_feature_usage_metrics_unittest.cc index 5d1f745..ce833e46 100644 --- a/chrome/browser/nearby_sharing/fast_initiation/fast_initiation_scanner_feature_usage_metrics_unittest.cc +++ b/chrome/browser/nearby_sharing/fast_initiation/fast_initiation_scanner_feature_usage_metrics_unittest.cc
@@ -74,10 +74,12 @@ task_environment_.FastForwardBy(base::Minutes(1)); histograms.ExpectBucketCount( - kHistogramName, feature_usage::FeatureUsageMetrics::Event::kEligible, + kHistogramName, + ash::feature_usage::FeatureUsageMetrics::Event::kEligible, is_eligible ? 1 : 0); histograms.ExpectBucketCount( - kHistogramName, feature_usage::FeatureUsageMetrics::Event::kEnabled, + kHistogramName, + ash::feature_usage::FeatureUsageMetrics::Event::kEnabled, is_enabled ? 1 : 0); } @@ -148,24 +150,24 @@ base::HistogramTester histograms; histograms.ExpectBucketCount( kHistogramName, - feature_usage::FeatureUsageMetrics::Event::kUsedWithSuccess, 0); + ash::feature_usage::FeatureUsageMetrics::Event::kUsedWithSuccess, 0); histograms.ExpectBucketCount( kHistogramName, - feature_usage::FeatureUsageMetrics::Event::kUsedWithFailure, 0); + ash::feature_usage::FeatureUsageMetrics::Event::kUsedWithFailure, 0); feature_usage_metrics.RecordUsage(/*success=*/true); histograms.ExpectBucketCount( kHistogramName, - feature_usage::FeatureUsageMetrics::Event::kUsedWithSuccess, 1); + ash::feature_usage::FeatureUsageMetrics::Event::kUsedWithSuccess, 1); histograms.ExpectBucketCount( kHistogramName, - feature_usage::FeatureUsageMetrics::Event::kUsedWithFailure, 0); + ash::feature_usage::FeatureUsageMetrics::Event::kUsedWithFailure, 0); feature_usage_metrics.RecordUsage(/*success=*/false); histograms.ExpectBucketCount( kHistogramName, - feature_usage::FeatureUsageMetrics::Event::kUsedWithSuccess, 1); + ash::feature_usage::FeatureUsageMetrics::Event::kUsedWithSuccess, 1); histograms.ExpectBucketCount( kHistogramName, - feature_usage::FeatureUsageMetrics::Event::kUsedWithFailure, 1); + ash::feature_usage::FeatureUsageMetrics::Event::kUsedWithFailure, 1); }
diff --git a/chrome/browser/nearby_sharing/nearby_share_feature_usage_metrics.cc b/chrome/browser/nearby_sharing/nearby_share_feature_usage_metrics.cc index b019545..7ca23be 100644 --- a/chrome/browser/nearby_sharing/nearby_share_feature_usage_metrics.cc +++ b/chrome/browser/nearby_sharing/nearby_share_feature_usage_metrics.cc
@@ -5,7 +5,7 @@ #include "chrome/browser/nearby_sharing/nearby_share_feature_usage_metrics.h" #include "chrome/browser/nearby_sharing/common/nearby_share_prefs.h" #include "chrome/browser/nearby_sharing/nearby_share_feature_status.h" -#include "chromeos/components/feature_usage/feature_usage_metrics.h" +#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h" #include "components/prefs/pref_service.h" namespace {
diff --git a/chrome/browser/nearby_sharing/nearby_share_feature_usage_metrics.h b/chrome/browser/nearby_sharing/nearby_share_feature_usage_metrics.h index 62130b2..8b149c3 100644 --- a/chrome/browser/nearby_sharing/nearby_share_feature_usage_metrics.h +++ b/chrome/browser/nearby_sharing/nearby_share_feature_usage_metrics.h
@@ -5,14 +5,14 @@ #ifndef CHROME_BROWSER_NEARBY_SHARING_NEARBY_SHARE_FEATURE_USAGE_METRICS_H_ #define CHROME_BROWSER_NEARBY_SHARING_NEARBY_SHARE_FEATURE_USAGE_METRICS_H_ -#include "chromeos/components/feature_usage/feature_usage_metrics.h" +#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h" class PrefService; // Tracks Nearby Share feature usage for the Standard Feature Usage Logging // (SFUL) framework. class NearbyShareFeatureUsageMetrics final - : public feature_usage::FeatureUsageMetrics::Delegate { + : public ash::feature_usage::FeatureUsageMetrics::Delegate { public: explicit NearbyShareFeatureUsageMetrics(PrefService* pref_service); NearbyShareFeatureUsageMetrics(NearbyShareFeatureUsageMetrics&) = delete; @@ -20,14 +20,14 @@ delete; ~NearbyShareFeatureUsageMetrics() override; - // feature_usage::FeatureUsageMetrics::Delegate: + // ash::feature_usage::FeatureUsageMetrics::Delegate: bool IsEligible() const override; bool IsEnabled() const override; void RecordUsage(bool success); private: PrefService* pref_service_; - feature_usage::FeatureUsageMetrics feature_usage_metrics_; + ash::feature_usage::FeatureUsageMetrics feature_usage_metrics_; }; #endif // CHROME_BROWSER_NEARBY_SHARING_NEARBY_SHARE_FEATURE_USAGE_METRICS_H_
diff --git a/chrome/browser/nearby_sharing/nearby_share_feature_usage_metrics_unittest.cc b/chrome/browser/nearby_sharing/nearby_share_feature_usage_metrics_unittest.cc index bdb4a2d6..d91f5dcd 100644 --- a/chrome/browser/nearby_sharing/nearby_share_feature_usage_metrics_unittest.cc +++ b/chrome/browser/nearby_sharing/nearby_share_feature_usage_metrics_unittest.cc
@@ -9,7 +9,7 @@ #include "chrome/browser/nearby_sharing/common/nearby_share_prefs.h" #include "chrome/browser/nearby_sharing/nearby_share_feature_status.h" #include "chrome/browser/nearby_sharing/nearby_share_feature_usage_metrics.h" -#include "chromeos/components/feature_usage/feature_usage_metrics.h" +#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h" #include "components/prefs/testing_pref_service.h" #include "testing/gtest/include/gtest/gtest.h" @@ -114,24 +114,24 @@ base::HistogramTester histograms; histograms.ExpectBucketCount( "ChromeOS.FeatureUsage.NearbyShare", - feature_usage::FeatureUsageMetrics::Event::kUsedWithSuccess, 0); + ash::feature_usage::FeatureUsageMetrics::Event::kUsedWithSuccess, 0); histograms.ExpectBucketCount( "ChromeOS.FeatureUsage.NearbyShare", - feature_usage::FeatureUsageMetrics::Event::kUsedWithFailure, 0); + ash::feature_usage::FeatureUsageMetrics::Event::kUsedWithFailure, 0); feature_usage_metrics.RecordUsage(/*success=*/true); histograms.ExpectBucketCount( "ChromeOS.FeatureUsage.NearbyShare", - feature_usage::FeatureUsageMetrics::Event::kUsedWithSuccess, 1); + ash::feature_usage::FeatureUsageMetrics::Event::kUsedWithSuccess, 1); histograms.ExpectBucketCount( "ChromeOS.FeatureUsage.NearbyShare", - feature_usage::FeatureUsageMetrics::Event::kUsedWithFailure, 0); + ash::feature_usage::FeatureUsageMetrics::Event::kUsedWithFailure, 0); feature_usage_metrics.RecordUsage(/*success=*/false); histograms.ExpectBucketCount( "ChromeOS.FeatureUsage.NearbyShare", - feature_usage::FeatureUsageMetrics::Event::kUsedWithSuccess, 1); + ash::feature_usage::FeatureUsageMetrics::Event::kUsedWithSuccess, 1); histograms.ExpectBucketCount( "ChromeOS.FeatureUsage.NearbyShare", - feature_usage::FeatureUsageMetrics::Event::kUsedWithFailure, 1); + ash::feature_usage::FeatureUsageMetrics::Event::kUsedWithFailure, 1); }
diff --git a/chrome/browser/nearby_sharing/nearby_sharing_service_impl_unittest.cc b/chrome/browser/nearby_sharing/nearby_sharing_service_impl_unittest.cc index cb986a3..c9697045f 100644 --- a/chrome/browser/nearby_sharing/nearby_sharing_service_impl_unittest.cc +++ b/chrome/browser/nearby_sharing/nearby_sharing_service_impl_unittest.cc
@@ -61,7 +61,7 @@ #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" #include "chrome/test/base/testing_profile_manager.h" -#include "chromeos/components/feature_usage/feature_usage_metrics.h" +#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h" #include "chromeos/constants/chromeos_features.h" #include "components/sync_preferences/testing_pref_service_syncable.h" #include "content/public/test/browser_task_environment.h" @@ -1059,11 +1059,11 @@ TransferMetadata::Result result = TransferMetadata::ToResult(status); histogram_tester_.ExpectBucketCount( "ChromeOS.FeatureUsage.NearbyShare", - feature_usage::FeatureUsageMetrics::Event::kUsedWithSuccess, + ash::feature_usage::FeatureUsageMetrics::Event::kUsedWithSuccess, result == TransferMetadata::Result::kSuccess ? 1 : 0); histogram_tester_.ExpectBucketCount( "ChromeOS.FeatureUsage.NearbyShare", - feature_usage::FeatureUsageMetrics::Event::kUsedWithFailure, + ash::feature_usage::FeatureUsageMetrics::Event::kUsedWithFailure, result == TransferMetadata::Result::kFailure ? 1 : 0); barrier.Run();
diff --git a/chrome/browser/net/nss_context_chromeos_browsertest.cc b/chrome/browser/net/nss_context_chromeos_browsertest.cc index 5b84ff3..cd0e61c 100644 --- a/chrome/browser/net/nss_context_chromeos_browsertest.cc +++ b/chrome/browser/net/nss_context_chromeos_browsertest.cc
@@ -6,7 +6,7 @@ #include <memory> -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/bind.h" #include "base/run_loop.h" #include "build/build_config.h"
diff --git a/chrome/browser/password_check/android/junit/src/org/chromium/chrome/browser/password_check/PasswordCheckControllerTest.java b/chrome/browser/password_check/android/junit/src/org/chromium/chrome/browser/password_check/PasswordCheckControllerTest.java index 6b4ad73e..70a2950 100644 --- a/chrome/browser/password_check/android/junit/src/org/chromium/chrome/browser/password_check/PasswordCheckControllerTest.java +++ b/chrome/browser/password_check/android/junit/src/org/chromium/chrome/browser/password_check/PasswordCheckControllerTest.java
@@ -56,10 +56,8 @@ import org.chromium.base.Callback; import org.chromium.base.metrics.RecordHistogram; -import org.chromium.base.metrics.RecordHistogramJni; import org.chromium.base.metrics.UmaRecorderHolder; import org.chromium.base.test.BaseRobolectricTestRunner; -import org.chromium.base.test.util.JniMocker; import org.chromium.chrome.browser.device_reauth.ReauthenticatorBridge; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.password_check.PasswordCheckProperties.ItemType; @@ -108,9 +106,6 @@ private static final boolean USE_LAST_VALID_AUTH = true; @Rule - public final JniMocker mJniMocker = new JniMocker(); - - @Rule public Features.JUnitProcessor mFeaturesProcessor = new Features.JUnitProcessor(); @Mock @@ -127,8 +122,6 @@ private SettingsLauncher mSettingsLauncher; @Mock private PasswordCheckIconHelper mIconHelper; - @Mock - private RecordHistogram.Natives mRecordHistogramBridge; @Captor private ArgumentCaptor<Callback<Boolean>> mCallbackCaptor; @@ -140,7 +133,6 @@ public void setUp() { UmaRecorderHolder.resetForTesting(); MockitoAnnotations.initMocks(this); - mJniMocker.mock(RecordHistogramJni.TEST_HOOKS, mRecordHistogramBridge); mModel = PasswordCheckProperties.createDefaultModel(); mMediator = new PasswordCheckMediator(mChangePasswordDelegate, mReauthenticationHelper, mReauthenticatorBridge, mSettingsLauncher, mIconHelper);
diff --git a/chrome/browser/password_entry_edit/android/internal/BUILD.gn b/chrome/browser/password_entry_edit/android/internal/BUILD.gn index 2e37ab1..26ca351 100644 --- a/chrome/browser/password_entry_edit/android/internal/BUILD.gn +++ b/chrome/browser/password_entry_edit/android/internal/BUILD.gn
@@ -44,6 +44,7 @@ deps = [ ":java", "//base:base_java", + "//base:base_java_test_support", "//base:base_junit_test_support", "//chrome/browser/password_entry_edit/android:java", "//chrome/browser/password_manager/android:java",
diff --git a/chrome/browser/password_entry_edit/android/internal/java/src/org/chromium/chrome/browser/password_entry_edit/CredentialEditControllerTest.java b/chrome/browser/password_entry_edit/android/internal/java/src/org/chromium/chrome/browser/password_entry_edit/CredentialEditControllerTest.java index e39bbff..d919ad5 100644 --- a/chrome/browser/password_entry_edit/android/internal/java/src/org/chromium/chrome/browser/password_entry_edit/CredentialEditControllerTest.java +++ b/chrome/browser/password_entry_edit/android/internal/java/src/org/chromium/chrome/browser/password_entry_edit/CredentialEditControllerTest.java
@@ -55,6 +55,7 @@ import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.UmaRecorderHolder; import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.base.test.util.DisabledTest; import org.chromium.chrome.browser.password_entry_edit.CredentialEditCoordinator.CredentialActionDelegate; import org.chromium.chrome.browser.password_entry_edit.CredentialEditMediator.CredentialEntryAction; import org.chromium.chrome.browser.password_manager.ConfirmationDialogHelper; @@ -198,6 +199,7 @@ } @Test + @DisabledTest(message = "https://crbug.com/1344781") public void testCanCopyPasswordIfReauthSucceeds() { mModel.set(PASSWORD, TEST_PASSWORD); when(mReauthenticationHelper.canReauthenticate()).thenReturn(true);
diff --git a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/PasswordStoreAndroidBackend.java b/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/PasswordStoreAndroidBackend.java index 0717f5a..74a7dc1e1 100644 --- a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/PasswordStoreAndroidBackend.java +++ b/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/PasswordStoreAndroidBackend.java
@@ -71,9 +71,9 @@ * org.chromium.components.sync.protocol.ListPasswordsResult} data. * @param failureCallback A callback that is called on failure for any reason. May return sync. */ - default void getAllLoginsBetween(Date createdAfter, Date createdBefore, + void getAllLoginsBetween(Date createdAfter, Date createdBefore, Optional<Account> syncingAccount, Callback<byte[]> loginsReply, - Callback<Exception> failureCallback){}; + Callback<Exception> failureCallback); /** * Triggers an async list call to retrieve autofillable logins.
diff --git a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/tests/FakePasswordStoreAndroidBackendTest.java b/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/tests/FakePasswordStoreAndroidBackendTest.java index a4d7d14..d37faba2 100644 --- a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/tests/FakePasswordStoreAndroidBackendTest.java +++ b/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/tests/FakePasswordStoreAndroidBackendTest.java
@@ -91,6 +91,7 @@ @Before public void setUp() { mBackend = new FakePasswordStoreAndroidBackend(); + mBackend.setSyncingAccount(sTestAccount.get()); } @Test
diff --git a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/tests/utils/FakePasswordStoreAndroidBackend.java b/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/tests/utils/FakePasswordStoreAndroidBackend.java index 98b779e..48d4b5b5 100644 --- a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/tests/utils/FakePasswordStoreAndroidBackend.java +++ b/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/tests/utils/FakePasswordStoreAndroidBackend.java
@@ -23,6 +23,7 @@ import org.chromium.content_public.browser.UiThreadTaskTraits; import java.util.ArrayList; +import java.util.Date; import java.util.HashMap; import java.util.LinkedList; import java.util.List; @@ -38,6 +39,14 @@ public static final Account sLocalDefaultAccount = new Account("Test user", "Local"); + public FakePasswordStoreAndroidBackend() { + mSavedPasswords.put(sLocalDefaultAccount, new LinkedList<>()); + } + + public void setSyncingAccount(Account syncingAccount) { + mSavedPasswords.put(syncingAccount, new LinkedList<>()); + } + @Override public void getAllLogins(Optional<Account> syncingAccount, Callback<byte[]> loginsReply, Callback<Exception> failureCallback) { @@ -53,6 +62,22 @@ } @Override + public void getAllLoginsBetween(Date createdAfter, Date createdBefore, + Optional<Account> syncingAccount, Callback<byte[]> loginsReply, + Callback<Exception> failureCallback) { + mTaskRunner.postTask(() -> { + Account account = getAccountOrFail(syncingAccount, failureCallback); + if (account == null) return; + ListPasswordsResult allLogins = + ListPasswordsResult.newBuilder() + .addAllPasswordData(filterPasswords(mSavedPasswords.get(account), + pwd -> hasDateBetween(pwd, createdAfter, createdBefore))) + .build(); + loginsReply.onResult(allLogins.toByteArray()); + }); + }; + + @Override public void getAutofillableLogins(Optional<Account> syncingAccount, Callback<byte[]> loginsReply, Callback<Exception> failureCallback) { mTaskRunner.postTask(() -> { @@ -86,15 +111,14 @@ public void addLogin(byte[] pwdWithLocalData, Optional<Account> syncingAccount, Runnable successCallback, Callback<Exception> failureCallback) { mTaskRunner.postTask(() -> { - Account account = - syncingAccount.isPresent() ? syncingAccount.get() : sLocalDefaultAccount; + Account account = getAccountOrFail(syncingAccount, failureCallback); + if (account == null) return; PasswordWithLocalData parsedPassword = parsePwdWithLocalDataOrFail(pwdWithLocalData, failureCallback); if (parsedPassword == null) return; - if (!mSavedPasswords.containsKey(account)) { - mSavedPasswords.put(account, new LinkedList<>()); - } - assert !containsPasswordWithSameUniqueKey(mSavedPasswords.get(account), parsedPassword); + assert !containsPasswordWithSameUniqueKey(mSavedPasswords.get(account), parsedPassword) + : "Trying to add password with the same unique key," + + " updateLogin() should be called."; mSavedPasswords.get(account).add(parsedPassword); successCallback.run(); }); @@ -180,6 +204,13 @@ } } + private static boolean hasDateBetween( + PasswordWithLocalData pwd, Date createdAfter, Date createdBefore) { + return pwd.getPasswordSpecificsData().hasDateCreated() + && pwd.getPasswordSpecificsData().getDateCreated() >= createdAfter.getTime() + && pwd.getPasswordSpecificsData().getDateCreated() <= createdBefore.getTime(); + } + private static boolean hasSignonRealm(PasswordWithLocalData pwd, String signonRealm) { return pwd.getPasswordSpecificsData().hasSignonRealm() && pwd.getPasswordSpecificsData().getSignonRealm().equals(signonRealm);
diff --git a/chrome/browser/payments/has_enrolled_instrument_browsertest.cc b/chrome/browser/payments/has_enrolled_instrument_browsertest.cc index ed0ca55..745a510 100644 --- a/chrome/browser/payments/has_enrolled_instrument_browsertest.cc +++ b/chrome/browser/payments/has_enrolled_instrument_browsertest.cc
@@ -2,24 +2,23 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "base/test/scoped_feature_list.h" #include "chrome/test/payments/payment_request_platform_browsertest_base.h" #include "chrome/test/payments/personal_data_manager_test_util.h" -#include "content/public/common/content_features.h" #include "content/public/test/browser_test.h" #include "testing/gtest/include/gtest/gtest.h" namespace payments { namespace { -class HasEnrolledInstrumentBaseTest +class HasEnrolledInstrumentPaymentHandlerTest : public PaymentRequestPlatformBrowserTestBase { public: - HasEnrolledInstrumentBaseTest(const HasEnrolledInstrumentBaseTest&) = delete; - HasEnrolledInstrumentBaseTest& operator=( - const HasEnrolledInstrumentBaseTest&) = delete; + HasEnrolledInstrumentPaymentHandlerTest( + const HasEnrolledInstrumentPaymentHandlerTest&) = delete; + HasEnrolledInstrumentPaymentHandlerTest& operator=( + const HasEnrolledInstrumentPaymentHandlerTest&) = delete; - ~HasEnrolledInstrumentBaseTest() override = default; + ~HasEnrolledInstrumentPaymentHandlerTest() override = default; void SetUpOnMainThread() override { PaymentRequestPlatformBrowserTestBase::SetUpOnMainThread(); @@ -28,9 +27,8 @@ // Helper function to test that all variations of hasEnrolledInstrument() // returns |expected|. - void ExpectHasEnrolledInstrumentIs( - bool expected, - const std::string& payment_method = "basic-card") { + void ExpectHasEnrolledInstrumentIs(bool expected, + const std::string& payment_method) { EXPECT_EQ(expected, content::EvalJs( GetActiveWebContents(), content::JsReplace("hasEnrolledInstrument({}, $1)", @@ -50,140 +48,12 @@ } protected: - HasEnrolledInstrumentBaseTest() = default; - base::test::ScopedFeatureList feature_list_; -}; - -class HasEnrolledInstrumentBasicCardTest - : public HasEnrolledInstrumentBaseTest { - public: - HasEnrolledInstrumentBasicCardTest() { - feature_list_.InitAndEnableFeature(features::kPaymentRequestBasicCard); - } - - HasEnrolledInstrumentBasicCardTest( - const HasEnrolledInstrumentBasicCardTest&) = delete; - HasEnrolledInstrumentBasicCardTest& operator=( - const HasEnrolledInstrumentBasicCardTest&) = delete; - - ~HasEnrolledInstrumentBasicCardTest() override = default; -}; - -IN_PROC_BROWSER_TEST_F(HasEnrolledInstrumentBasicCardTest, NoCard) { - ExpectHasEnrolledInstrumentIs(false); -} - -IN_PROC_BROWSER_TEST_F(HasEnrolledInstrumentBasicCardTest, NoBillingAddress) { - AddCreditCard(autofill::test::GetCreditCard()); - ExpectHasEnrolledInstrumentIs(true); -} - -IN_PROC_BROWSER_TEST_F(HasEnrolledInstrumentBasicCardTest, - HaveShippingNoBillingAddress) { - CreateAndAddAutofillProfile(); - AddCreditCard(autofill::test::GetCreditCard()); - - ExpectHasEnrolledInstrumentIs(true); -} - -IN_PROC_BROWSER_TEST_F(HasEnrolledInstrumentBasicCardTest, - HaveShippingAndBillingAddress) { - CreateAndAddCreditCardForProfile(CreateAndAddAutofillProfile()); - - ExpectHasEnrolledInstrumentIs(true); -} - -IN_PROC_BROWSER_TEST_F(HasEnrolledInstrumentBasicCardTest, InvalidCardNumber) { - autofill::AutofillProfile address = autofill::test::GetFullProfile(); - AddAutofillProfile(address); - autofill::CreditCard card = CreatCreditCardForProfile(address); - card.SetRawInfo(autofill::ServerFieldType::CREDIT_CARD_NUMBER, - u"1111111111111111"); - AddCreditCard(card); - - ExpectHasEnrolledInstrumentIs(false); -} - -IN_PROC_BROWSER_TEST_F(HasEnrolledInstrumentBasicCardTest, ExpiredCard) { - autofill::AutofillProfile address = autofill::test::GetFullProfile(); - AddAutofillProfile(address); - autofill::CreditCard card = CreatCreditCardForProfile(address); - card.SetExpirationYear(2000); - AddCreditCard(card); - - ExpectHasEnrolledInstrumentIs(true); -} - -// TODO(https://crbug.com/994799): Unify autofill data validation and returned -// data across platforms. -IN_PROC_BROWSER_TEST_F(HasEnrolledInstrumentBasicCardTest, - HaveNoNameShippingAndBillingAddress) { - autofill::AutofillProfile address = autofill::test::GetFullProfile(); - address.SetRawInfo(autofill::ServerFieldType::NAME_FIRST, std::u16string()); - address.SetRawInfo(autofill::ServerFieldType::NAME_MIDDLE, std::u16string()); - address.SetRawInfo(autofill::ServerFieldType::NAME_LAST, std::u16string()); - // For structured names, it is necessary to explicitly reset the full name - // and the full name with the prefix. - address.SetInfo(autofill::ServerFieldType::NAME_FULL, std::u16string(), - "en-US"); - address.SetInfo(autofill::ServerFieldType::NAME_FULL_WITH_HONORIFIC_PREFIX, - std::u16string(), "en-US"); - AddAutofillProfile(address); - CreateAndAddCreditCardForProfile(address); - - ExpectHasEnrolledInstrumentIs(true); -} - -IN_PROC_BROWSER_TEST_F(HasEnrolledInstrumentBasicCardTest, - HaveNoStreetShippingAndBillingAddress) { - autofill::AutofillProfile address = autofill::test::GetFullProfile(); - address.SetRawInfo(autofill::ServerFieldType::ADDRESS_HOME_STREET_ADDRESS, - std::u16string()); - AddAutofillProfile(address); - CreateAndAddCreditCardForProfile(address); - - ExpectHasEnrolledInstrumentIs(true); -} - -IN_PROC_BROWSER_TEST_F(HasEnrolledInstrumentBasicCardTest, NoEmailAddress) { - autofill::AutofillProfile address = autofill::test::GetFullProfile(); - address.SetRawInfo(autofill::ServerFieldType::EMAIL_ADDRESS, - std::u16string()); - AddAutofillProfile(address); - CreateAndAddCreditCardForProfile(address); - - ExpectHasEnrolledInstrumentIs(true); -} - -IN_PROC_BROWSER_TEST_F(HasEnrolledInstrumentBasicCardTest, - InvalidEmailAddress) { - autofill::AutofillProfile address = autofill::test::GetFullProfile(); - address.SetRawInfo(autofill::ServerFieldType::EMAIL_ADDRESS, - u"this-is-not-a-valid-email-address"); - AddAutofillProfile(address); - CreateAndAddCreditCardForProfile(address); - - ExpectHasEnrolledInstrumentIs(true); -} - -class HasEnrolledInstrumentPaymentHandlerTest - : public HasEnrolledInstrumentBaseTest { - public: - HasEnrolledInstrumentPaymentHandlerTest() { - feature_list_.InitAndDisableFeature(features::kPaymentRequestBasicCard); - } - - HasEnrolledInstrumentPaymentHandlerTest( - const HasEnrolledInstrumentPaymentHandlerTest&) = delete; - HasEnrolledInstrumentPaymentHandlerTest& operator=( - const HasEnrolledInstrumentPaymentHandlerTest&) = delete; - - ~HasEnrolledInstrumentPaymentHandlerTest() override = default; + HasEnrolledInstrumentPaymentHandlerTest() = default; }; IN_PROC_BROWSER_TEST_F(HasEnrolledInstrumentPaymentHandlerTest, FalseWithoutPaymentHandler) { - ExpectHasEnrolledInstrumentIs(false); + ExpectHasEnrolledInstrumentIs(false, "non-existent-payment-method"); } IN_PROC_BROWSER_TEST_F(HasEnrolledInstrumentPaymentHandlerTest,
diff --git a/chrome/browser/platform_keys/platform_keys.cc b/chrome/browser/platform_keys/platform_keys.cc index 6673dac..97efb26c 100644 --- a/chrome/browser/platform_keys/platform_keys.cc +++ b/chrome/browser/platform_keys/platform_keys.cc
@@ -275,7 +275,7 @@ return false; } - switch (EVP_PKEY_type(pkey->type)) { + switch (EVP_PKEY_id(pkey.get())) { case EVP_PKEY_RSA: { if (!VerifyRSAPublicExponent(pkey.get())) { return false;
diff --git a/chrome/browser/policy/chrome_browser_policy_connector.cc b/chrome/browser/policy/chrome_browser_policy_connector.cc index 1e6cb56..da88fd3 100644 --- a/chrome/browser/policy/chrome_browser_policy_connector.cc +++ b/chrome/browser/policy/chrome_browser_policy_connector.cc
@@ -10,6 +10,7 @@ #include "base/bind.h" #include "base/callback.h" +#include "base/check_is_test.h" #include "base/command_line.h" #include "base/path_service.h" #include "base/task/thread_pool.h" @@ -169,9 +170,12 @@ ConfigurationPolicyProvider* ChromeBrowserPolicyConnector::GetPlatformProvider() { - ConfigurationPolicyProvider* provider = - BrowserPolicyConnectorBase::GetPolicyProviderForTesting(); - return provider ? provider : platform_provider_.get(); + if (ConfigurationPolicyProvider* provider = + BrowserPolicyConnectorBase::GetPolicyProviderForTesting()) { + CHECK_IS_TEST(); + return provider; + } + return platform_provider_.get(); } #if !BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc index 5a47c7d..e1bea27 100644 --- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc +++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -1567,6 +1567,9 @@ { key::kRestrictedManagedGuestSessionExtensionCleanupExemptList, prefs::kRestrictedManagedGuestSessionExtensionCleanupExemptList, base::Value::Type::LIST }, + { key::kNewWindowsInKioskAllowed, + prefs::kNewWindowsInKioskAllowed, + base::Value::Type::BOOLEAN }, #endif // BUILDFLAG(IS_CHROMEOS) #if !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_CHROMEOS)
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java index 1148b477..f655316 100644 --- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java +++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
@@ -722,6 +722,12 @@ public static final String IS_LAST_VISITED_TAB_SRP = "Chrome.StartSurface.IsLastVisitedTabSRP"; /** + * Key used to store user actions for collapsing search resumption module on NTP. + */ + public static final String SEARCH_RESUMPTION_MODULE_COLLAPSE_ON_NTP = + "Chrome.SearchResumptionModule.Collapse"; + + /** * Contains a trial group that was used to determine whether the reached code profiler should be * enabled. */ @@ -1091,6 +1097,7 @@ SIGNIN_PROMO_NTP_LAST_SHOWN_TIME, SYNC_PROMO_TOTAL_SHOW_COUNT, START_NEXT_SHOW_ON_STARTUP_DECISION_MS, + SEARCH_RESUMPTION_MODULE_COLLAPSE_ON_NTP, START_SHOW_ON_STARTUP, TAP_FEED_CARDS_COUNT, TAP_MV_TILES_COUNT,
diff --git a/chrome/browser/prefetch/prefetch_proxy/chrome_speculation_host_delegate.cc b/chrome/browser/prefetch/prefetch_proxy/chrome_speculation_host_delegate.cc index eb7052c..2b6b2ff 100644 --- a/chrome/browser/prefetch/prefetch_proxy/chrome_speculation_host_delegate.cc +++ b/chrome/browser/prefetch/prefetch_proxy/chrome_speculation_host_delegate.cc
@@ -31,7 +31,8 @@ } void ChromeSpeculationHostDelegate::ProcessCandidates( - std::vector<blink::mojom::SpeculationCandidatePtr>& candidates) { + std::vector<blink::mojom::SpeculationCandidatePtr>& candidates, + base::WeakPtr<content::SpeculationHostDevToolsObserver> devtools_observer) { auto* web_contents = content::WebContents::FromRenderFrameHost(&render_frame_host_); auto* prefetch_proxy_tab_helper = @@ -128,7 +129,8 @@ // TODO(ryansturm): Handle CSP prefetch-src. https://crbug.com/1192857 if (prefetches.size()) { prefetch_proxy_tab_helper->PrefetchSpeculationCandidates( - prefetches, render_frame_host_.GetLastCommittedURL()); + prefetches, render_frame_host_.GetLastCommittedURL(), + std::move(devtools_observer)); } if (same_origin_prefetches_with_subresources.size() > 0) {
diff --git a/chrome/browser/prefetch/prefetch_proxy/chrome_speculation_host_delegate.h b/chrome/browser/prefetch/prefetch_proxy/chrome_speculation_host_delegate.h index 42be962..3ffd7a7 100644 --- a/chrome/browser/prefetch/prefetch_proxy/chrome_speculation_host_delegate.h +++ b/chrome/browser/prefetch/prefetch_proxy/chrome_speculation_host_delegate.h
@@ -32,7 +32,9 @@ // content::SpeculationRulesDelegate implementation. void ProcessCandidates( - std::vector<blink::mojom::SpeculationCandidatePtr>& candidates) override; + std::vector<blink::mojom::SpeculationCandidatePtr>& candidates, + base::WeakPtr<content::SpeculationHostDevToolsObserver> devtools_observer) + override; private: // content::SpeculationHostImpl, which inherits content::DocumentService,
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_container.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_container.cc index e8c73522..7c509c5b 100644 --- a/chrome/browser/prefetch/prefetch_proxy/prefetch_container.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_container.cc
@@ -19,7 +19,8 @@ size_t original_prediction_index) : url_(url), prefetch_type_(prefetch_type), - original_prediction_index_(original_prediction_index) {} + original_prediction_index_(original_prediction_index), + request_id_(base::UnguessableToken::Create().ToString()) {} PrefetchContainer::~PrefetchContainer() = default;
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_container.h b/chrome/browser/prefetch/prefetch_proxy/prefetch_container.h index a378ec6..bf34a63 100644 --- a/chrome/browser/prefetch/prefetch_proxy/prefetch_container.h +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_container.h
@@ -8,6 +8,7 @@ #include <memory> #include "base/time/time.h" +#include "chrome/browser/prefetch/prefetch_proxy/chrome_speculation_host_delegate.h" #include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_cookie_listener.h" #include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_network_context.h" #include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_prefetch_status.h" @@ -118,6 +119,20 @@ } std::unique_ptr<PrefetchProxyNetworkContext> ReleaseNetworkContext(); + // Returns request id to be used by DevTools + const std::string& RequestId() const { return request_id_; } + + void SetDevToolsObserver( + base::WeakPtr<content::SpeculationHostDevToolsObserver> + devtools_observer) { + devtools_observer_ = std::move(devtools_observer); + } + + const base::WeakPtr<content::SpeculationHostDevToolsObserver>& + GetDevToolsObserver() const { + return devtools_observer_; + } + private: // The URL that will potentially be prefetched. // TODO(crbug.com/1266876): The container needs to track the entire redirect @@ -160,6 +175,12 @@ // The network context used to prefetch |url_|. std::unique_ptr<PrefetchProxyNetworkContext> network_context_; + + // Request identifier used by DevTools + std::string request_id_; + + // Weak pointer to DevTools observer + base::WeakPtr<content::SpeculationHostDevToolsObserver> devtools_observer_; }; #endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_CONTAINER_H_
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.cc index 2edc3f8..3dac2ca 100644 --- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.cc
@@ -860,6 +860,12 @@ request->trusted_params = trusted_params; request->site_for_cookies = trusted_params.isolation_info.site_for_cookies(); + const auto& devtools_observer = prefetch_container->GetDevToolsObserver(); + if (devtools_observer && !prefetch_container->IsDecoy()) { + devtools_observer->OnStartSinglePrefetch(prefetch_container->RequestId(), + *request); + } + net::NetworkTrafficAnnotationTag traffic_annotation = net::DefineNetworkTrafficAnnotation("navigation_predictor_srp_prefetch", R"( @@ -941,6 +947,21 @@ original_url, PrefetchProxyPrefetchStatus::kPrefetchFailedRedirectsDisabled); + auto prefetch_container_iter = page_->prefetch_containers_.find(original_url); + if (prefetch_container_iter != page_->prefetch_containers_.end()) { + const auto& devtools_observer = + prefetch_container_iter->second->GetDevToolsObserver(); + if (devtools_observer) { + devtools_observer->OnPrefetchResponseReceived( + original_url, prefetch_container_iter->second->RequestId(), + response_head); + + devtools_observer->OnPrefetchRequestComplete( + prefetch_container_iter->second->RequestId(), + network::URLLoaderCompletionStatus{net::ERR_NOT_IMPLEMENTED}); + } + } + // Cancels the current request. DCHECK(page_->url_loaders_.find(loader) != page_->url_loaders_.end()); page_->url_loaders_.erase(page_->url_loaders_.find(loader)); @@ -984,6 +1005,20 @@ base::UmaHistogramSparse("PrefetchProxy.Prefetch.Mainframe.NetError", std::abs(loader->NetError())); + const auto& devtools_observer = + prefetch_container_iter->second->GetDevToolsObserver(); + if (devtools_observer) { + if (loader->ResponseInfo()) { + devtools_observer->OnPrefetchResponseReceived( + url, prefetch_container_iter->second->RequestId(), + *loader->ResponseInfo()); + } + + devtools_observer->OnPrefetchRequestComplete( + prefetch_container_iter->second->RequestId(), + loader->CompletionStatus().value_or( + network::URLLoaderCompletionStatus(loader->NetError()))); + } if (loader->CompletionStatus()) { page_->prefetch_metrics_collector_->OnMainframeResourcePrefetched( @@ -1269,7 +1304,8 @@ void PrefetchProxyTabHelper::PrefetchSpeculationCandidates( const std::vector<std::pair<GURL, PrefetchType>>& prefetches, - const GURL& source_document_url) { + const GURL& source_document_url, + base::WeakPtr<content::SpeculationHostDevToolsObserver> devtools_observer) { // Use navigation predictor by default. if (!PrefetchProxyUseSpeculationRules()) return; @@ -1296,7 +1332,7 @@ filtered_prefetches.erase(new_end, filtered_prefetches.end()); } - PrefetchUrls(filtered_prefetches); + PrefetchUrls(filtered_prefetches, std::move(devtools_observer)); } void PrefetchProxyTabHelper::OnPredictionUpdated( @@ -1342,11 +1378,13 @@ /*use_prefetch_proxy=*/true, /*can_prefetch_subresources=*/true)); } - PrefetchUrls(prefetches); + // TODO: we need to pass devtools observer here + PrefetchUrls(prefetches, nullptr); } void PrefetchProxyTabHelper::PrefetchUrls( - const std::vector<std::pair<GURL, PrefetchType>>& prefetch_targets) { + const std::vector<std::pair<GURL, PrefetchType>>& prefetch_targets, + base::WeakPtr<content::SpeculationHostDevToolsObserver> devtools_observer) { if (!PrefetchProxyIsEnabled()) { return; } @@ -1379,14 +1417,19 @@ // the navigation predictor will issue multiple predictions during a // single page load. Additional predictions should be treated as appending // to the ordering of previous predictions. + auto prefetch_container = std::make_unique<PrefetchContainer>( + prefetch_with_type.first, prefetch_with_type.second, + page_->prefetch_containers_.size()); + prefetch_container->SetDevToolsObserver(devtools_observer); page_->prefetch_containers_[prefetch_with_type.first] = - std::make_unique<PrefetchContainer>( - prefetch_with_type.first, prefetch_with_type.second, - page_->prefetch_containers_.size()); - } else if (prefetch_with_type.second != - prefetch_container_iter->second->GetPrefetchType()) { - prefetch_container_iter->second->ChangePrefetchType( - prefetch_with_type.second); + std::move(prefetch_container); + } else { + if (prefetch_with_type.second != + prefetch_container_iter->second->GetPrefetchType()) { + prefetch_container_iter->second->ChangePrefetchType( + prefetch_with_type.second); + } + prefetch_container_iter->second->SetDevToolsObserver(devtools_observer); } }
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.h b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.h index 69e9ccd..b14cbcdb 100644 --- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.h +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.h
@@ -26,6 +26,7 @@ #include "chrome/browser/prefetch/prefetch_proxy/prefetch_type.h" #include "chrome/browser/prefetch/prefetch_proxy/prefetched_mainframe_response_container.h" #include "content/public/browser/service_worker_context.h" +#include "content/public/browser/speculation_host_delegate.h" #include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_user_data.h" #include "mojo/public/cpp/bindings/pending_receiver.h" @@ -177,7 +178,9 @@ // Fetches |prefetches| (up to a limit) with the given |PrefetchType|. void PrefetchSpeculationCandidates( const std::vector<std::pair<GURL, PrefetchType>>& prefetches, - const GURL& source_document_url); + const GURL& source_document_url, + base::WeakPtr<content::SpeculationHostDevToolsObserver> + devtools_observer); // content::WebContentsObserver implementation. void DidStartNavigation( @@ -431,7 +434,9 @@ // Fetches the |prefetch_targets| with the given |PrefetchType|. void PrefetchUrls( - const std::vector<std::pair<GURL, PrefetchType>>& prefetch_targets); + const std::vector<std::pair<GURL, PrefetchType>>& prefetch_targets, + base::WeakPtr<content::SpeculationHostDevToolsObserver> + devtools_observer); // Used as a callback for when the eligibility of |url| is determined. void OnGotEligibilityResult(
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper_unittest.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper_unittest.cc index 3c8448b..ef1f1db 100644 --- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper_unittest.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper_unittest.cc
@@ -166,7 +166,7 @@ /*use_prefetch_proxy=*/true, /*can_prefetch_subresources=*/false)); } - tab_helper_->PrefetchSpeculationCandidates(prefetches, doc_url); + tab_helper_->PrefetchSpeculationCandidates(prefetches, doc_url, nullptr); } void TriggerRedirectHistogramRecording() {
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc index 37969bd..8d813f6 100644 --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc
@@ -1149,7 +1149,7 @@ chromeos::FastTransitionObserver::RegisterPrefs(registry); ash::HWDataUsageController::RegisterLocalStatePrefs(registry); ash::KerberosCredentialsManager::RegisterLocalStatePrefs(registry); - ash::KioskAppManager::RegisterPrefs(registry); + ash::KioskAppManager::RegisterLocalStatePrefs(registry); ash::KioskCryptohomeRemover::RegisterPrefs(registry); ash::language_prefs::RegisterPrefs(registry); chromeos::local_search_service::SearchMetricsReporter:: @@ -1541,12 +1541,14 @@ ProjectorAppClientImpl::RegisterProfilePrefs(registry); ash::floating_workspace_util::RegisterProfilePrefs(registry); policy::RebootNotificationsScheduler::RegisterProfilePrefs(registry); + ash::KioskAppManager::RegisterProfilePrefs(registry); #endif // BUILDFLAG(IS_CHROMEOS_ASH) #if BUILDFLAG(IS_CHROMEOS_LACROS) lacros_prefs::RegisterProfilePrefs(registry); chromeos::ProxyConfigServiceLacros::RegisterProfilePrefs(registry); lacros_prefs::RegisterExtensionControlledAshPrefs(registry); + KioskSessionServiceLacros::RegisterProfilePrefs(registry); #endif #if BUILDFLAG(IS_WIN)
diff --git a/chrome/browser/privacy_budget/privacy_budget_browsertest.cc b/chrome/browser/privacy_budget/privacy_budget_browsertest.cc index f002322a..4877f62 100644 --- a/chrome/browser/privacy_budget/privacy_budget_browsertest.cc +++ b/chrome/browser/privacy_budget/privacy_budget_browsertest.cc
@@ -41,6 +41,7 @@ #include "components/unified_consent/unified_consent_service.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" +#include "content/public/test/test_utils.h" #include "mojo/public/cpp/bindings/struct_ptr.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "services/metrics/public/cpp/ukm_builders.h" @@ -618,3 +619,62 @@ EXPECT_FALSE(settings->ShouldSampleType( blink::IdentifiableSurface::Type::kMediaCapabilities_DecodingInfo)); } + +namespace { + +class PrivacyBudgetBrowserTestActiveSampling : public PlatformBrowserTest { + public: + PrivacyBudgetBrowserTestActiveSampling() { + test::ScopedPrivacyBudgetConfig::Parameters params; + params.enabled = true; + params.enable_active_sampling = true; + params.actively_sampled_fonts = {"Arial", "Helvetica"}; + privacy_budget_config_.Apply(params); + } + + void CreatedBrowserMainParts(content::BrowserMainParts* parts) override { + PlatformBrowserTest::CreatedBrowserMainParts(parts); + ukm_recorder_ = std::make_unique<ukm::TestAutoSetUkmRecorder>(); + } + + ukm::TestUkmRecorder& ukm_recorder() { return *ukm_recorder_; } + + private: + test::ScopedPrivacyBudgetConfig privacy_budget_config_; + std::unique_ptr<ukm::TestAutoSetUkmRecorder> ukm_recorder_; + std::unique_ptr<base::RunLoop> run_loop_; +}; + +} // namespace + +IN_PROC_BROWSER_TEST_F(PrivacyBudgetBrowserTestActiveSampling, + ActiveSamplingIsPerformed) { + content::RunAllTasksUntilIdle(); + auto merged_entries = ukm_recorder().GetMergedEntriesByName( + ukm::builders::Identifiability::kEntryName); + + std::vector<uint64_t> reported_surface_keys; + for (const auto& entry : merged_entries) { + for (const auto& metric : entry.second->metrics) { + reported_surface_keys.push_back(metric.first); + } + } + + uint64_t key_model = blink::IdentifiableSurface::FromTypeAndToken( + blink::IdentifiableSurface::Type:: + kNavigatorUAData_GetHighEntropyValues, + blink::IdentifiableToken("model")) + .ToUkmMetricHash(); + uint64_t key_arial = + blink::IdentifiableSurface::FromTypeAndToken( + blink::IdentifiableSurface::Type::kFontFamilyAvailable, + blink::IdentifiableToken("arial")) + .ToUkmMetricHash(); + uint64_t key_helvetica = + blink::IdentifiableSurface::FromTypeAndToken( + blink::IdentifiableSurface::Type::kFontFamilyAvailable, + blink::IdentifiableToken("helvetica")) + .ToUkmMetricHash(); + EXPECT_THAT(reported_surface_keys, + testing::IsSupersetOf({key_model, key_arial, key_helvetica})); +}
diff --git a/chrome/browser/resources/.eslintrc.js b/chrome/browser/resources/.eslintrc.js index 65578df..a257a0a 100644 --- a/chrome/browser/resources/.eslintrc.js +++ b/chrome/browser/resources/.eslintrc.js
@@ -3,9 +3,12 @@ // found in the LICENSE file. module.exports = { - 'env': { - 'browser': true, - 'es6': true, + 'env' : { + 'browser' : true, + 'es6' : true, }, - 'rules': {'eqeqeq': ['error', 'always', {'null': 'ignore'}]}, + 'rules' : { + 'comma-dangle' : ['error', 'always-multiline'], + 'eqeqeq' : ['error', 'always', {'null' : 'ignore'}], + }, };
diff --git a/chrome/browser/resources/access_code_cast/access_code_cast.ts b/chrome/browser/resources/access_code_cast/access_code_cast.ts index 514c8fe..421cb18 100644 --- a/chrome/browser/resources/access_code_cast/access_code_cast.ts +++ b/chrome/browser/resources/access_code_cast/access_code_cast.ts
@@ -66,13 +66,13 @@ accessCode: { type: String, value: '', - observer: 'castStateChange' + observer: 'castStateChange', }, canCast: { type: Boolean, value: true, - observer: 'castStateChange' - } + observer: 'castStateChange', + }, }; }
diff --git a/chrome/browser/resources/access_code_cast/browser_proxy.ts b/chrome/browser/resources/access_code_cast/browser_proxy.ts index 2facd67b..58562d1 100644 --- a/chrome/browser/resources/access_code_cast/browser_proxy.ts +++ b/chrome/browser/resources/access_code_cast/browser_proxy.ts
@@ -89,7 +89,8 @@ } chrome.send('metricsHandler:recordMediumTime', [ - HISTOGRAM_ACCESS_CODE_INPUT_TIME, time + HISTOGRAM_ACCESS_CODE_INPUT_TIME, + time, ]); } @@ -99,13 +100,16 @@ } chrome.send('metricsHandler:recordMediumTime', [ - HISTOGRAM_CAST_ATTEMPT_LENGTH, time + HISTOGRAM_CAST_ATTEMPT_LENGTH, + time, ]); } static recordDialogCloseReason(reason: DialogCloseReason) { chrome.send('metricsHandler:recordInHistogram', [ - HISTOGRAM_DIALOG_CLOSE_REASON, reason, DialogCloseReason.COUNT + HISTOGRAM_DIALOG_CLOSE_REASON, + reason, + DialogCloseReason.COUNT, ]); }
diff --git a/chrome/browser/resources/access_code_cast/error_message/error_message.ts b/chrome/browser/resources/access_code_cast/error_message/error_message.ts index bd18845..859315d 100644 --- a/chrome/browser/resources/access_code_cast/error_message/error_message.ts +++ b/chrome/browser/resources/access_code_cast/error_message/error_message.ts
@@ -34,15 +34,15 @@ // TODO(b/216529759): Make a new ErrorMessage for profile sync // error. AddSinkResultCode.PROFILE_SYNC_ERROR, - AddSinkResultCode.INTERNAL_MEDIA_ROUTER_ERROR - ] + AddSinkResultCode.INTERNAL_MEDIA_ROUTER_ERROR, + ], ], [ ErrorMessage.ACCESS_CODE, [ AddSinkResultCode.INVALID_ACCESS_CODE, - AddSinkResultCode.ACCESS_CODE_NOT_FOUND - ] + AddSinkResultCode.ACCESS_CODE_NOT_FOUND, + ], ], [ ErrorMessage.NETWORK, @@ -51,8 +51,8 @@ AddSinkResultCode.RESPONSE_MALFORMED, AddSinkResultCode.EMPTY_RESPONSE, AddSinkResultCode.SERVICE_NOT_PRESENT, - AddSinkResultCode.SERVER_ERROR - ] + AddSinkResultCode.SERVER_ERROR, + ], ], [ErrorMessage.PERMISSION, [AddSinkResultCode.AUTH_ERROR]], [ErrorMessage.TOO_MANY_REQUESTS, [AddSinkResultCode.TOO_MANY_REQUESTS]], @@ -71,16 +71,16 @@ RouteRequestResultCode.CANCELLED, RouteRequestResultCode.ROUTE_ALREADY_EXISTS, RouteRequestResultCode.DESKTOP_PICKER_FAILED, - RouteRequestResultCode.ROUTE_ALREADY_TERMINATED - ] + RouteRequestResultCode.ROUTE_ALREADY_TERMINATED, + ], ], [ ErrorMessage.NETWORK, [ RouteRequestResultCode.TIMED_OUT, RouteRequestResultCode.ROUTE_NOT_FOUND, - RouteRequestResultCode.SINK_NOT_FOUND - ] + RouteRequestResultCode.SINK_NOT_FOUND, + ], ], ];
diff --git a/chrome/browser/resources/access_code_cast/passcode_input/passcode_input.ts b/chrome/browser/resources/access_code_cast/passcode_input/passcode_input.ts index 485fc3d..e462718 100644 --- a/chrome/browser/resources/access_code_cast/passcode_input/passcode_input.ts +++ b/chrome/browser/resources/access_code_cast/passcode_input/passcode_input.ts
@@ -32,7 +32,7 @@ }, disabled: { type: Boolean, - observer: 'disabledChange' + observer: 'disabledChange', }, length: Number, value: { @@ -41,7 +41,7 @@ observer: 'valueChange', notify: true, reflectToAttribute: true, - } + }, }; }
diff --git a/chrome/browser/resources/accessibility/accessibility.ts b/chrome/browser/resources/accessibility/accessibility.ts index 79779b0..d0b01999 100644 --- a/chrome/browser/resources/accessibility/accessibility.ts +++ b/chrome/browser/resources/accessibility/accessibility.ts
@@ -104,7 +104,7 @@ processId: number, routingId: number, requestType: RequestType, allow: string, allowEmpty: string, deny: string) { chrome.send('requestWebContentsTree', [ - {processId, routingId, requestType, filters: {allow, allowEmpty, deny}} + {processId, routingId, requestType, filters: {allow, allowEmpty, deny}}, ]); }
diff --git a/chrome/browser/resources/app_settings/app.ts b/chrome/browser/resources/app_settings/app.ts index 11ec1f2..8b3d4ad 100644 --- a/chrome/browser/resources/app_settings/app.ts +++ b/chrome/browser/resources/app_settings/app.ts
@@ -39,7 +39,7 @@ hidden: { type: Boolean, computed: 'appUnready_(app_)', - reflectToAttribute: true + reflectToAttribute: true, }, iconUrl_: {type: String, computed: 'getAppIcon_(app_)'}, showSearch_: {type: Boolean, value: false, readonly: true}, @@ -58,7 +58,8 @@ } window.CrPolicyStrings = { - controlledSettingPolicy: loadTimeData.getString('controlledSettingPolicy') + controlledSettingPolicy: + loadTimeData.getString('controlledSettingPolicy'), }; const appId = urlPath.substring(1);
diff --git a/chrome/browser/resources/bluetooth_internals/adapter_broker.js b/chrome/browser/resources/bluetooth_internals/adapter_broker.js index 10cbcfc..039d80c 100644 --- a/chrome/browser/resources/bluetooth_internals/adapter_broker.js +++ b/chrome/browser/resources/bluetooth_internals/adapter_broker.js
@@ -50,7 +50,7 @@ detail: { property: AdapterProperty.PRESENT, value: present, - } + }, })); } @@ -59,7 +59,7 @@ detail: { property: AdapterProperty.POWERED, value: powered, - } + }, })); } @@ -68,7 +68,7 @@ detail: { property: AdapterProperty.DISCOVERABLE, value: discoverable, - } + }, })); } @@ -77,7 +77,7 @@ detail: { property: AdapterProperty.DISCOVERING, value: discovering, - } + }, })); }
diff --git a/chrome/browser/resources/bluetooth_internals/device_details_page.js b/chrome/browser/resources/bluetooth_internals/device_details_page.js index f1436a7..e18691087 100644 --- a/chrome/browser/resources/bluetooth_internals/device_details_page.js +++ b/chrome/browser/resources/bluetooth_internals/device_details_page.js
@@ -232,7 +232,7 @@ detail: { address: this.deviceInfo.address, status: status, - } + }, })); } }
diff --git a/chrome/browser/resources/bluetooth_internals/device_table.js b/chrome/browser/resources/bluetooth_internals/device_table.js index f7862ab..eecdeaf5 100644 --- a/chrome/browser/resources/bluetooth_internals/device_table.js +++ b/chrome/browser/resources/bluetooth_internals/device_table.js
@@ -90,7 +90,7 @@ bubbles: true, detail: { address: this.devices_.item(index).address, - } + }, }); this.dispatchEvent(event); }, @@ -116,7 +116,7 @@ bubbles: true, detail: { address: this.devices_.item(index).address, - } + }, }); this.dispatchEvent(event); },
diff --git a/chrome/browser/resources/bookmarks/app.ts b/chrome/browser/resources/bookmarks/app.ts index aa6a0f1..49d6ffd 100644 --- a/chrome/browser/resources/bookmarks/app.ts +++ b/chrome/browser/resources/bookmarks/app.ts
@@ -181,7 +181,7 @@ this.dispatchEvent(new CustomEvent('iron-announce', { bubbles: true, composed: true, - detail: {text: loadTimeData.getString('searchCleared')} + detail: {text: loadTimeData.getString('searchCleared')}, })); } @@ -200,8 +200,8 @@ detail: { text: ids.length > 0 ? loadTimeData.getStringF('searchResults', this.searchTerm_) : - loadTimeData.getString('noSearchResults') - } + loadTimeData.getString('noSearchResults'), + }, })); }); }
diff --git a/chrome/browser/resources/bookmarks/command_manager.ts b/chrome/browser/resources/bookmarks/command_manager.ts index 7cf16bb..c966e0dd 100644 --- a/chrome/browser/resources/bookmarks/command_manager.ts +++ b/chrome/browser/resources/bookmarks/command_manager.ts
@@ -397,7 +397,7 @@ this.dispatchEvent(new CustomEvent('iron-announce', { bubbles: true, composed: true, - detail: {text: loadTimeData.getString('itemsUnselected')} + detail: {text: loadTimeData.getString('itemsUnselected')}, })); break; case Command.CUT:
diff --git a/chrome/browser/resources/bookmarks/dnd_manager.ts b/chrome/browser/resources/bookmarks/dnd_manager.ts index ae1f882..5f9c764 100644 --- a/chrome/browser/resources/bookmarks/dnd_manager.ts +++ b/chrome/browser/resources/bookmarks/dnd_manager.ts
@@ -80,7 +80,7 @@ setNativeDragData(newDragData: DragData) { this.dragData = { sameProfile: newDragData.sameProfile, - elements: newDragData.elements!.map((x) => normalizeNode(x)) + elements: newDragData.elements!.map((x) => normalizeNode(x)), }; }
diff --git a/chrome/browser/resources/bookmarks/folder_node.ts b/chrome/browser/resources/bookmarks/folder_node.ts index 7815e96..3f67e60 100644 --- a/chrome/browser/resources/bookmarks/folder_node.ts +++ b/chrome/browser/resources/bookmarks/folder_node.ts
@@ -68,7 +68,7 @@ isSelectedFolder_: { type: Boolean, reflectToAttribute: true, - computed: 'computeIsSelected_(itemId, selectedFolder_, searchActive_)' + computed: 'computeIsSelected_(itemId, selectedFolder_, searchActive_)', }, hasChildFolder_: {
diff --git a/chrome/browser/resources/bookmarks/item.ts b/chrome/browser/resources/bookmarks/item.ts index 3696ba6..65ab78c 100644 --- a/chrome/browser/resources/bookmarks/item.ts +++ b/chrome/browser/resources/bookmarks/item.ts
@@ -141,7 +141,7 @@ y: e.clientY, source: MenuSource.ITEM, targetId: this.itemId, - } + }, })); } @@ -161,7 +161,7 @@ targetElement: e.target, source: MenuSource.ITEM, targetId: this.itemId, - } + }, })); }
diff --git a/chrome/browser/resources/bookmarks/list.ts b/chrome/browser/resources/bookmarks/list.ts index 85ed8290..37697ae8 100644 --- a/chrome/browser/resources/bookmarks/list.ts +++ b/chrome/browser/resources/bookmarks/list.ts
@@ -350,7 +350,7 @@ x: e.clientX, y: e.clientY, source: MenuSource.LIST, - } + }, })); }
diff --git a/chrome/browser/resources/bookmarks/toolbar.ts b/chrome/browser/resources/bookmarks/toolbar.ts index eadfa7e..b2f6133 100644 --- a/chrome/browser/resources/bookmarks/toolbar.ts +++ b/chrome/browser/resources/bookmarks/toolbar.ts
@@ -89,7 +89,7 @@ detail: { targetElement: e.target, source: MenuSource.TOOLBAR, - } + }, })); }
diff --git a/chrome/browser/resources/browser_switch/internals/app.ts b/chrome/browser/resources/browser_switch/internals/app.ts index 0fb56910..768c7d20 100644 --- a/chrome/browser/resources/browser_switch/internals/app.ts +++ b/chrome/browser/resources/browser_switch/internals/app.ts
@@ -8,10 +8,10 @@ import {addWebUIListener} from 'chrome://resources/js/cr.m.js'; import {I18nMixin} from 'chrome://resources/js/i18n_mixin.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {PolymerElement,} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getTemplate} from './app.html.js'; -import {BrowserSwitchInternalsProxy, BrowserSwitchInternalsProxyImpl, Decision, RuleSet, RuleSetList, RulesetSources, TimestampPair,} from './browser_switch_internals_proxy.js'; +import {BrowserSwitchInternalsProxy, BrowserSwitchInternalsProxyImpl, Decision, RuleSet, RuleSetList, RulesetSources, TimestampPair} from './browser_switch_internals_proxy.js'; const BrowserSwitchInternalsAppElementBase = I18nMixin(PolymerElement);
diff --git a/chrome/browser/resources/chromeos/.eslintrc.js b/chrome/browser/resources/chromeos/.eslintrc.js index 68e8a27..09338b47 100644 --- a/chrome/browser/resources/chromeos/.eslintrc.js +++ b/chrome/browser/resources/chromeos/.eslintrc.js
@@ -3,8 +3,8 @@ // found in the LICENSE file. module.exports = { - 'rules': { - 'eqeqeq': 'off', - 'no-var': 'off', + 'rules' : { + 'eqeqeq' : 'off', + 'no-var' : 'off', }, };
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/autoclick/autoclick_test.js b/chrome/browser/resources/chromeos/accessibility/accessibility_common/autoclick/autoclick_test.js index 0a85226..1c9dcc5 100644 --- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/autoclick/autoclick_test.js +++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/autoclick/autoclick_test.js
@@ -99,7 +99,7 @@ '</div></div>'); const node = root.find({ role: RoleType.STATIC_TEXT, - attributes: {name: 'cats rock! this text wraps and overflows!'} + attributes: {name: 'cats rock! this text wraps and overflows!'}, }); await new Promise(resolve => { this.mockAccessibilityPrivate.callOnScrollableBoundsForPointRequested(
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation.js b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation.js index 9a7c39d..c54459c 100644 --- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation.js +++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation.js
@@ -438,7 +438,7 @@ // TODO(crbug.com/1288964): Finalize string and internationalization. this.uiController_.setState(UIState.MACRO_FAIL, { text: `Failed to run command: ${transcript}`, - context: HintContext.STANDBY + context: HintContext.STANDBY, }); }
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation_ui_test.js b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation_ui_test.js index 4a0172a52..6cf4241 100644 --- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation_ui_test.js +++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation_ui_test.js
@@ -88,7 +88,7 @@ await this.waitForUIProperties({ visible: true, icon: this.iconType.STANDBY, - hints: [this.hintType.TRY_SAYING, this.hintType.TYPE, this.hintType.HELP] + hints: [this.hintType.TRY_SAYING, this.hintType.TYPE, this.hintType.HELP], }); }); @@ -113,9 +113,12 @@ visible: true, icon: this.iconType.STANDBY, hints: [ - this.hintType.TRY_SAYING, this.hintType.UNDO, this.hintType.DELETE, - this.hintType.SELECT_ALL, this.hintType.HELP - ] + this.hintType.TRY_SAYING, + this.hintType.UNDO, + this.hintType.DELETE, + this.hintType.SELECT_ALL, + this.hintType.HELP, + ], }); }); @@ -141,9 +144,12 @@ visible: true, icon: this.iconType.STANDBY, hints: [ - this.hintType.TRY_SAYING, this.hintType.UNSELECT, this.hintType.COPY, - this.hintType.DELETE, this.hintType.HELP - ] + this.hintType.TRY_SAYING, + this.hintType.UNSELECT, + this.hintType.COPY, + this.hintType.DELETE, + this.hintType.HELP, + ], }); }); @@ -169,6 +175,6 @@ visible: true, icon: this.iconType.STANDBY, hints: - [this.hintType.TRY_SAYING, this.hintType.UNDO, this.hintType.HELP] + [this.hintType.TRY_SAYING, this.hintType.UNDO, this.hintType.HELP], }); });
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/input_controller.js b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/input_controller.js index d8443a5..38b695f 100644 --- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/input_controller.js +++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/input_controller.js
@@ -175,7 +175,7 @@ contextID: this.activeImeContextId_, engineID: InputController.IME_ENGINE_ID, length, - offset + offset, }); }
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/pumpkin_parse_strategy.js b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/pumpkin_parse_strategy.js index 738eaa63..f3b59b9 100644 --- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/pumpkin_parse_strategy.js +++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/pumpkin_parse_strategy.js
@@ -136,7 +136,7 @@ goog['global']['Module'] = { onRuntimeInitialized() { resolve(); - } + }, }; }); document.head.appendChild(wasmModuleScript);
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/simple_parse_strategy.js b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/simple_parse_strategy.js index cdce481..dcc2029 100644 --- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/simple_parse_strategy.js +++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/simple_parse_strategy.js
@@ -141,101 +141,101 @@ return { [MacroName.DELETE_PREV_CHAR]: { messageId: 'dictation_command_delete_prev_char', - build: RepeatableKeyPress.DeletePreviousCharacterMacro + build: RepeatableKeyPress.DeletePreviousCharacterMacro, }, [MacroName.NAV_PREV_CHAR]: { messageId: 'dictation_command_nav_prev_char', - build: RepeatableKeyPress.NavPreviousCharMacro + build: RepeatableKeyPress.NavPreviousCharMacro, }, [MacroName.NAV_NEXT_CHAR]: { messageId: 'dictation_command_nav_next_char', - build: RepeatableKeyPress.NavNextCharMacro + build: RepeatableKeyPress.NavNextCharMacro, }, [MacroName.NAV_PREV_LINE]: { messageId: 'dictation_command_nav_prev_line', - build: RepeatableKeyPress.NavPreviousLineMacro + build: RepeatableKeyPress.NavPreviousLineMacro, }, [MacroName.NAV_NEXT_LINE]: { messageId: 'dictation_command_nav_next_line', - build: RepeatableKeyPress.NavNextLineMacro + build: RepeatableKeyPress.NavNextLineMacro, }, [MacroName.COPY_SELECTED_TEXT]: { messageId: 'dictation_command_copy_selected_text', - build: RepeatableKeyPress.CopySelectedTextMacro + build: RepeatableKeyPress.CopySelectedTextMacro, }, [MacroName.PASTE_TEXT]: { messageId: 'dictation_command_paste_text', - build: RepeatableKeyPress.PasteTextMacro + build: RepeatableKeyPress.PasteTextMacro, }, [MacroName.CUT_SELECTED_TEXT]: { messageId: 'dictation_command_cut_selected_text', - build: RepeatableKeyPress.CutSelectedTextMacro + build: RepeatableKeyPress.CutSelectedTextMacro, }, [MacroName.UNDO_TEXT_EDIT]: { messageId: 'dictation_command_undo_text_edit', - build: RepeatableKeyPress.UndoTextEditMacro + build: RepeatableKeyPress.UndoTextEditMacro, }, [MacroName.REDO_ACTION]: { messageId: 'dictation_command_redo_action', - build: RepeatableKeyPress.RedoActionMacro + build: RepeatableKeyPress.RedoActionMacro, }, [MacroName.SELECT_ALL_TEXT]: { messageId: 'dictation_command_select_all_text', - build: RepeatableKeyPress.SelectAllTextMacro + build: RepeatableKeyPress.SelectAllTextMacro, }, [MacroName.UNSELECT_TEXT]: { messageId: 'dictation_command_unselect_text', - build: RepeatableKeyPress.UnselectTextMacro + build: RepeatableKeyPress.UnselectTextMacro, }, [MacroName.LIST_COMMANDS]: { messageId: 'dictation_command_list_commands', - build: ListCommandsMacro + build: ListCommandsMacro, }, [MacroName.NEW_LINE]: {messageId: 'dictation_command_new_line', build: NewLineMacro}, [MacroName.STOP_LISTENING]: { messageId: 'dictation_command_stop_listening', - build: StopListeningMacro + build: StopListeningMacro, }, [MacroName.DELETE_PREV_WORD]: { messageId: 'dictation_command_delete_prev_word', - build: RepeatableKeyPress.DeletePrevWordMacro + build: RepeatableKeyPress.DeletePrevWordMacro, }, [MacroName.DELETE_PREV_SENT]: { messageId: 'dictation_command_delete_prev_sent', - build: DeletePrevSentMacro + build: DeletePrevSentMacro, }, [MacroName.NAV_NEXT_WORD]: { messageId: 'dictation_command_nav_next_word', - build: RepeatableKeyPress.NavNextWordMacro + build: RepeatableKeyPress.NavNextWordMacro, }, [MacroName.NAV_PREV_WORD]: { messageId: 'dictation_command_nav_prev_word', - build: RepeatableKeyPress.NavPrevWordMacro + build: RepeatableKeyPress.NavPrevWordMacro, }, [MacroName.SMART_DELETE_PHRASE]: { messageId: 'dictation_command_smart_delete_phrase', - build: SmartDeletePhraseMacro + build: SmartDeletePhraseMacro, }, [MacroName.SMART_REPLACE_PHRASE]: { messageId: 'dictation_command_smart_replace_phrase', - build: SmartReplacePhraseMacro + build: SmartReplacePhraseMacro, }, [MacroName.SMART_INSERT_BEFORE]: { messageId: 'dictation_command_smart_insert_before', - build: SmartInsertBeforeMacro + build: SmartInsertBeforeMacro, }, [MacroName.SMART_SELECT_BTWN_INCL]: { messageId: 'dictation_command_smart_select_btwn_incl', - build: SmartSelectBetweenMacro + build: SmartSelectBetweenMacro, }, [MacroName.NAV_NEXT_SENT]: { messageId: 'dictation_command_nav_next_sent', - build: NavNextSentMacro + build: NavNextSentMacro, }, [MacroName.NAV_PREV_SENT]: { messageId: 'dictation_command_nav_prev_sent', - build: NavPrevSentMacro + build: NavPrevSentMacro, }, }; }
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/speech_parser.js b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/speech_parser.js index e2fda8067..62575e15 100644 --- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/speech_parser.js +++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/parse/speech_parser.js
@@ -80,5 +80,5 @@ SpeechParser.RTLLocales = new Set([ 'ar-AE', 'ar-BH', 'ar-DZ', 'ar-EG', 'ar-IL', 'ar-IQ', 'ar-JO', 'ar-KW', 'ar-LB', 'ar-MA', 'ar-OM', 'ar-PS', 'ar-QA', 'ar-SA', - 'ar-TN', 'ar-YE', 'fa-IR', 'iw-IL', 'ur-IN', 'ur-PK' + 'ar-TN', 'ar-YE', 'fa-IR', 'iw-IL', 'ur-IN', 'ur-PK', ]);
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/ui_controller.js b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/ui_controller.js index 7875998..c93a41a 100644 --- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/ui_controller.js +++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/ui_controller.js
@@ -25,7 +25,7 @@ STANDBY: 'standby', TEXT_COMMITTED: 'text_committed', TEXT_SELECTED: 'text_selected', - MACRO_SUCCESS: 'macro_success' + MACRO_SUCCESS: 'macro_success', }; /** @@ -126,13 +126,19 @@ UIController.CONTEXT_TO_HINTS_MAP_ = { [HintContext.STANDBY]: [HintType.TRY_SAYING, HintType.TYPE, HintType.HELP], [HintContext.TEXT_COMMITTED]: [ - HintType.TRY_SAYING, HintType.UNDO, HintType.DELETE, HintType.SELECT_ALL, - HintType.HELP + HintType.TRY_SAYING, + HintType.UNDO, + HintType.DELETE, + HintType.SELECT_ALL, + HintType.HELP, ], [HintContext.TEXT_SELECTED]: [ - HintType.TRY_SAYING, HintType.UNSELECT, HintType.COPY, HintType.DELETE, - HintType.HELP + HintType.TRY_SAYING, + HintType.UNSELECT, + HintType.COPY, + HintType.DELETE, + HintType.HELP, ], [HintContext.MACRO_SUCCESS]: - [HintType.TRY_SAYING, HintType.UNDO, HintType.HELP] + [HintType.TRY_SAYING, HintType.UNDO, HintType.HELP], };
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/magnifier/magnifier.js b/chrome/browser/resources/chromeos/accessibility/accessibility_common/magnifier/magnifier.js index e779ddc4..2c4ab0d 100644 --- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/magnifier/magnifier.js +++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/magnifier/magnifier.js
@@ -155,7 +155,7 @@ chrome.accessibilityPrivate.setFocusRings([{ rects: [bounds], type: chrome.accessibilityPrivate.FocusType.GLOW, - color: '#22d' + color: '#22d', }]); } }
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/magnifier/magnifier_test.js b/chrome/browser/resources/chromeos/accessibility/accessibility_common/magnifier/magnifier_test.js index 4c7f65a..620557f 100644 --- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/magnifier/magnifier_test.js +++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/magnifier/magnifier_test.js
@@ -194,7 +194,7 @@ chrome.accessibilityPrivate.sendSyntheticKeyEvent({ type: chrome.accessibilityPrivate.SyntheticKeyboardEventType.KEYDOWN, - keyCode: KeyCode.UP + keyCode: KeyCode.UP, }); // Verify new magnifier bounds include |targetBounds|. @@ -215,7 +215,7 @@ chrome.accessibilityPrivate.sendSyntheticKeyEvent({ type: chrome.accessibilityPrivate.SyntheticKeyboardEventType.KEYDOWN, keyCode: KeyCode.E, - modifiers: {alt: true} + modifiers: {alt: true}, }); // Wait for Chrome menu to open.
diff --git a/chrome/browser/resources/chromeos/accessibility/braille_ime/braille_ime.js b/chrome/browser/resources/chromeos/accessibility/braille_ime/braille_ime.js index 5c0e4485..fd44249 100644 --- a/chrome/browser/resources/chromeos/accessibility/braille_ime/braille_ime.js +++ b/chrome/browser/resources/chromeos/accessibility/braille_ime/braille_ime.js
@@ -124,7 +124,7 @@ 'KeyK': 0x10, 'KeyS': 0x04, 'KeyL': 0x20, - 'Space': 0x100 + 'Space': 0x100, }; /** @@ -450,7 +450,7 @@ engineID: this.engineID_, contextID, offset: -deleteBefore, - length: deleteBefore + length: deleteBefore, }, addText); // Make sure there's no non-zero length selection so that @@ -513,8 +513,8 @@ style: 'check', visible: true, checked: this.useStandardKeyboard_, - enabled: true - }] + enabled: true, + }], }); } }
diff --git a/chrome/browser/resources/chromeos/accessibility/braille_ime/braille_ime_unittest.js b/chrome/browser/resources/chromeos/accessibility/braille_ime/braille_ime_unittest.js index 4702c3b..84f8ac8 100644 --- a/chrome/browser/resources/chromeos/accessibility/braille_ime/braille_ime_unittest.js +++ b/chrome/browser/resources/chromeos/accessibility/braille_ime/braille_ime_unittest.js
@@ -92,8 +92,14 @@ createIme() { var IME_EVENTS = [ - 'onActivate', 'onDeactivated', 'onFocus', 'onBlur', - 'onInputContextUpdate', 'onKeyEvent', 'onReset', 'onMenuItemActivated' + 'onActivate', + 'onDeactivated', + 'onFocus', + 'onBlur', + 'onInputContextUpdate', + 'onKeyEvent', + 'onReset', + 'onMenuItemActivated', ]; for (var i = 0, name; name = IME_EVENTS[i]; ++i) { this[name] = chrome.input.ime[name] = new MockEvent(); @@ -198,8 +204,9 @@ expectTrue(this.sendKeyUp('KeyF')); assertDeepEquals(this.port.messages, [ - {type: 'brailleDots', dots: 0x03}, {type: 'brailleDots', dots: 0x09}, - {type: 'brailleDots', dots: 0} + {type: 'brailleDots', dots: 0x03}, + {type: 'brailleDots', dots: 0x09}, + {type: 'brailleDots', dots: 0}, ]); }); @@ -217,7 +224,7 @@ this.port.onMessage.dispatch({ type: 'keyEventHandled', requestId: this.lastSentKeyRequestId_ + '', - result: true + result: true, }); expectEquals(this.lastSentKeyRequestId_, this.lastHandledKeyRequestId_); expectTrue(this.lastHandledKeyResult_);
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/auto_scroll_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/auto_scroll_handler.js index ac753d7c..b8d0cfa6 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/auto_scroll_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/auto_scroll_handler.js
@@ -353,7 +353,7 @@ EventType.SCROLL_POSITION_CHANGED, // These two events are sent by Web and Views via AXEventGenerator. EventType.SCROLL_HORIZONTAL_POSITION_CHANGED, - EventType.SCROLL_VERTICAL_POSITION_CHANGED + EventType.SCROLL_VERTICAL_POSITION_CHANGED, ]; /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/auto_scroll_handler_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/auto_scroll_handler_test.js index 56aed0e..9e54419 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/auto_scroll_handler_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/auto_scroll_handler_test.js
@@ -50,7 +50,7 @@ this.numChildrenBeforeScroll_ = list.children.length; }, scrollFinished: list => - list.children.length !== this.numChildrenBeforeScroll_ + list.children.length !== this.numChildrenBeforeScroll_, }); } @@ -91,7 +91,7 @@ }, scrollFinished: list => list.children.length === 2 && list.children[0] !== this.childrenBeforeScroll_[0] && - list.children[1] !== this.childrenBeforeScroll_[1] + list.children[1] !== this.childrenBeforeScroll_[1], }); } @@ -121,7 +121,7 @@ Object.defineProperty(list, 'standardActions', { get: () => [chrome.automation.ActionType.SCROLL_FORWARD, - chrome.automation.ActionType.SCROLL_BACKWARD] + chrome.automation.ActionType.SCROLL_BACKWARD], }); // Create a fake addEventListener to dispatch an event listener of
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/automation_object_constructor_installer.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/automation_object_constructor_installer.js index 079455e..faa6282 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/automation_object_constructor_installer.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/automation_object_constructor_installer.js
@@ -35,5 +35,5 @@ }, true); }); - } + }, };
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js index 4af719d..2ea8e8e 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js
@@ -1294,7 +1294,8 @@ const mockFeedback = this.createMockFeedback(); const root = await this.runWithLoadedTree(undefined, { url: `${ - testRunnerParams.testServerBaseUrl}accessibility/in_page_links.html` + testRunnerParams + .testServerBaseUrl}accessibility/in_page_links.html`, }); mockFeedback.call(doCmd('nextObject')) .expectSpeech('Jump', 'Internal link') @@ -2765,7 +2766,7 @@ Object.defineProperty(group, 'role', { get() { return chrome.automation.RoleType.PANE; - } + }, }); }) .call(simulateHitTestResult(group)) @@ -2795,12 +2796,12 @@ Object.defineProperty(group1, 'role', { get() { return chrome.automation.RoleType.UNKNOWN; - } + }, }); Object.defineProperty(group2, 'role', { get() { return chrome.automation.RoleType.UNKNOWN; - } + }, }); const evt2 = new CustomAutomationEvent(EventType.FOCUS, group2); @@ -2982,13 +2983,13 @@ Object.defineProperty(audio, 'role', { get() { return chrome.automation.RoleType.AUDIO; - } + }, }); Object.defineProperty(video, 'role', { get() { return chrome.automation.RoleType.VIDEO; - } + }, }); mockFeedback.call(doCmd('nextObject')) @@ -3130,12 +3131,12 @@ Object.defineProperty(namedImg, 'imageAnnotation', { get() { return 'foo'; - } + }, }); Object.defineProperty(unnamedImg, 'imageAnnotation', { get() { return 'foo'; - } + }, }); mockFeedback.call(doCmd('nextObject')) @@ -3211,7 +3212,7 @@ Object.defineProperty(group, 'clickable', { get() { return true; - } + }, }); mockFeedback.call(doCmd('nextObject')) @@ -3549,7 +3550,7 @@ keyCode: KeyCode.RIGHT, metaKey: true, preventDefault: () => {}, - stopPropagation: () => {} + stopPropagation: () => {}, }); const nextObjectBraille = BrailleCommandHandler.onBrailleKeyEvent.bind( BrailleCommandHandler, {command: BrailleKeyCommand.PAN_RIGHT});
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_command_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_command_handler.js index a285a47..a3ceee9 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_command_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_command_handler.js
@@ -159,7 +159,7 @@ anchorObject: actionNode, anchorOffset: targetPosition, focusObject: actionNode, - focusOffset: targetPosition + focusOffset: targetPosition, }); } else { const start = text.getSpanStart(selectionSpan);
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_display_manager.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_display_manager.js index 66b86057..cf4326f 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_display_manager.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_display_manager.js
@@ -36,7 +36,7 @@ this.displayState_ = { available: false, textRowCount: 0, - textColumnCount: 0 + textColumnCount: 0, }; /** @private {!ExpandingBrailleTranslator.ExpansionType} valueExpansion */ @@ -232,7 +232,7 @@ this.realDisplayState_ = { available: newState.available, textRowCount: newState.textRowCount || 0, - textColumnCount: newState.textColumnCount || 0 + textColumnCount: newState.textColumnCount || 0, }; if (newState.available) { // Update the dimensions of the virtual braille captions display to those
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_display_manager_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_display_manager_test.js index d52d7481..b7fe768 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_display_manager_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_display_manager_test.js
@@ -5,7 +5,7 @@ // Include test fixture. GEN_INCLUDE([ '../../testing/chromevox_next_e2e_test_base.js', - '../../testing/fake_objects.js' + '../../testing/fake_objects.js', ]); /** @@ -51,7 +51,7 @@ this.displayState = { available: true, textRowCount: this.DISPLAY_ROW_SIZE, - textColumnCount: this.DISPLAY_COLUMN_SIZE + textColumnCount: this.DISPLAY_COLUMN_SIZE, }; } @@ -149,7 +149,7 @@ } } callback(buf.buffer, textToBraille, brailleToText); - } + }, }; /** @extends {BrailleTranslatorManager} */ @@ -173,7 +173,7 @@ getExpandingTranslator() { return this.translator; - } + }, }; AX_TEST_F('ChromeVoxBrailleDisplayManagerTest', 'NoApi', function() { @@ -336,8 +336,13 @@ const translated = '1234456'; const mapping = [0, 9, 10, 11, 12, 13, 14]; const expected = [ - ['knowledge', '1'], ['h', '2'], ['a', '3'], ['p', '4'], ['p', '4'], - ['y', '5'], ['ch', '6'] + ['knowledge', '1'], + ['h', '2'], + ['a', '3'], + ['p', '4'], + ['p', '4'], + ['y', '5'], + ['ch', '6'], ]; const offsets = {brailleOffset: 0, textOffset: 0}; @@ -355,8 +360,14 @@ const translated = '1X23X45678'; const mapping = [0, 9, 9, 10, 11, 11, 12, 13, 14, 15]; const expected = [ - ['knowledge', '1'], ['I', 'X2'], ['s', '3'], ['P', 'X4'], ['o', '5'], - ['w', '6'], ['e', '7'], ['r', '8'] + ['knowledge', '1'], + ['I', 'X2'], + ['s', '3'], + ['P', 'X4'], + ['o', '5'], + ['w', '6'], + ['e', '7'], + ['r', '8'], ]; const offsets = {brailleOffset: 0, textOffset: 0};
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler.js index ab5b45f..1ec5e03c 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler.js
@@ -331,7 +331,7 @@ this.postImeMessage_({ type: 'keyEventHandled', requestId: message['requestId'], - result: this.onBackspace_() + result: this.onBackspace_(), }); break; case 'reset': @@ -390,7 +390,7 @@ EventGenerator.sendKeyPress(numericCode, { shift: Boolean(event.shiftKey), ctrl: Boolean(event.ctrlKey), - alt: Boolean(event.altKey) + alt: Boolean(event.altKey), }); }); } @@ -624,7 +624,7 @@ type: 'replaceText', contextID: this.inputHandler_.inputContext_.contextID, deleteBefore: deleteLength, - newText: toInsert + newText: toInsert, }); } } @@ -651,7 +651,7 @@ commit() { this.inputHandler_.postImeMessage_({ type: 'commitUncommitted', - contextID: this.inputHandler_.inputContext_.contextID + contextID: this.inputHandler_.inputContext_.contextID, }); } @@ -665,7 +665,7 @@ this.inputHandler_.postImeMessage_({ type: 'setUncommitted', contextID: this.inputHandler_.inputContext_.contextID, - text: newText + text: newText, }); } };
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler_test.js index 2722fd3..ac56b12d 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler_test.js
@@ -197,7 +197,7 @@ this.contextID_++; this.message_({ type: 'inputContext', - context: {type: fieldType, contextID: this.contextID_} + context: {type: fieldType, contextID: this.contextID_}, }); } @@ -269,11 +269,11 @@ * @const Array<Array<string> > */ const UNCONTRACTED_TABLE = [ - ['0', ' '], ['1', 'a'], ['12', 'b'], ['14', 'c'], ['145', 'd'], - ['15', 'e'], ['124', 'f'], ['1245', 'g'], ['125', 'h'], ['24', 'i'], - ['245', 'j'], ['13', 'k'], ['123', 'l'], ['134', 'm'], ['1345', 'n'], - ['135', 'o'], ['1234', 'p'], ['12345', 'q'], ['1235', 'r'], ['234', 's'], - ['2345', 't'] + ['0', ' '], ['1', 'a'], ['12', 'b'], ['14', 'c'], ['145', 'd'], + ['15', 'e'], ['124', 'f'], ['1245', 'g'], ['125', 'h'], ['24', 'i'], + ['245', 'j'], ['13', 'k'], ['123', 'l'], ['134', 'm'], ['1345', 'n'], + ['135', 'o'], ['1234', 'p'], ['12345', 'q'], ['1235', 'r'], ['234', 's'], + ['2345', 't'], ]; @@ -288,7 +288,9 @@ * @const */ const CONTRACTED_TABLE = [ - ['12 1235 123', 'braille'], ['^12$', 'but'], ['1456', 'this'] + ['12 1235 123', 'braille'], + ['^12$', 'but'], + ['1456', 'this'], ].concat(UNCONTRACTED_TABLE); /** @@ -393,7 +395,7 @@ if (this.changeListener) { this.changeListener(); } - } + }, }; /** @@ -493,7 +495,7 @@ sendKeyEvent(keyCode) { const event = { command: BrailleKeyCommand.STANDARD_KEY, - standardKeyCode: keyCode + standardKeyCode: keyCode, }; return this.inputHandler.onBrailleKeyEvent(event); }
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_translator_manager_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_translator_manager_test.js index a367461..bc72a54 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_translator_manager_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_translator_manager_test.js
@@ -54,7 +54,7 @@ } } callback(result); - } + }, }; FakeTranslator = class {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator.js index 8ca5678..626d6d1a 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator.js
@@ -80,7 +80,7 @@ end: pos, cells, textToBraille: [], - brailleToText: new Array(cells.byteLength) + brailleToText: new Array(cells.byteLength), }; for (let i = 0; i < cells.byteLength; ++i) { chunk.brailleToText[i] = 0; @@ -314,7 +314,7 @@ * the user is editing a text field where it doesn't make sense to use * contracted braille (such as a url or email address). */ - ALL: 2 + ALL: 2, };
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator_test.js index 3ad9bcb..d247bb1 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator_test.js
@@ -92,7 +92,7 @@ const uncontractedTranslator = { translate(text, formTypeMap, callback) { callback(null, null, null); - } + }, }; const translationResult = null; @@ -276,41 +276,42 @@ * location and a 'c' means that the contracted translator was used. */ const TESTDATA = [ - {name: 'emptyText', input: createText(''), contractedOutput: ''}, { + {name: 'emptyText', input: createText(''), contractedOutput: ''}, + { name: 'emptyTextWithCaret', input: createText('', 0), - contractedOutput: '' + contractedOutput: '', }, { name: 'textWithNoSelection', input: createText(TEXT), - contractedOutput: 'ccccccccccccc' + contractedOutput: 'ccccccccccccc', }, { name: 'textWithCaretAtStart', input: createText(TEXT, 0), - contractedOutput: 'uuuuuuccccccc' + contractedOutput: 'uuuuuuccccccc', }, { name: 'textWithCaretAtEnd', input: createText(TEXT, TEXT.length), - contractedOutput: 'cccccccuuuuuu' + contractedOutput: 'cccccccuuuuuu', }, { name: 'textWithCaretInWhitespace', input: createText(TEXT, 6), - contractedOutput: 'uuuuuuucccccc' + contractedOutput: 'uuuuuuucccccc', }, { name: 'textWithSelectionEndInWhitespace', input: createText(TEXT, 0, 7), - contractedOutput: 'uuuuuuucccccc' + contractedOutput: 'uuuuuuucccccc', }, { name: 'textWithSelectionInTwoWords', input: createText(TEXT, 2, 9), - contractedOutput: 'uuuuuucuuuuuu' - } + contractedOutput: 'uuuuuucuuuuuu', + }, ]; const TESTDATA_WITH_SELECTION = TESTDATA.filter(function(testCase) { return testCase.input.getSpanInstanceOf(ValueSelectionSpan);
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/liblouis.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/liblouis.js index 0af2c69..bc1a0b2 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/liblouis.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/liblouis.js
@@ -175,7 +175,7 @@ ITALIC: 1, UNDERLINE: 2, BOLD: 4, - COMPUTER_BRAILLE: 8 + COMPUTER_BRAILLE: 8, }; @@ -229,7 +229,7 @@ const message = { 'table_names': this.tableNames_, text, - form_type_map: formTypeMap + form_type_map: formTypeMap, }; this.instance_.rpc_('Translate', message, reply => { let cells = null; @@ -271,7 +271,7 @@ } const message = { 'table_names': this.tableNames_, - 'cells': LibLouis.Translator.encodeHexString_(cells) + 'cells': LibLouis.Translator.encodeHexString_(cells), }; this.instance_.rpc_('BackTranslate', message, reply => { if (!reply['success'] || !goog.isString(reply['text'])) {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/pan_strategy.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/pan_strategy.js index 511760c..bde40bb 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/pan_strategy.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/pan_strategy.js
@@ -93,7 +93,7 @@ return { brailleOffset: this.viewPort_.firstRow * this.displaySize_.columns, textOffset: this.brailleToText - [this.viewPort_.firstRow * this.displaySize_.columns] + [this.viewPort_.firstRow * this.displaySize_.columns], }; }
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/pan_strategy_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/pan_strategy_test.js index a73ed70..3c2d5ed 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/pan_strategy_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/pan_strategy_test.js
@@ -263,7 +263,7 @@ const content = createArrayBuffer('11234567 9112345678911 345 789'); const mapping = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, ]; panner.setContent('11234567 9112345678911 345 789', content, mapping, 0); assertEqualsJSON({firstRow: 0, lastRow: 0}, panner.viewPort);
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js index 7ee4765..0bc1d74d 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js
@@ -124,7 +124,7 @@ case 'showLearnModePage': const explorerPage = { url: 'chromevox/learn_mode/learn_mode.html', - type: 'panel' + type: 'panel', }; chrome.windows.create(explorerPage); break; @@ -436,7 +436,8 @@ DesktopAutomationInterface.instance.textEditHandler .injectInferredIntents([{ command: chrome.automation.IntentCommandType.MOVE_SELECTION, - textBoundary: chrome.automation.IntentTextBoundaryType.CHARACTER + textBoundary: + chrome.automation.IntentTextBoundaryType.CHARACTER, }]); } return true; @@ -459,7 +460,7 @@ command: chrome.automation.IntentCommandType.MOVE_SELECTION, textBoundary: command === 'nativeNextWord' ? chrome.automation.IntentTextBoundaryType.WORD_END : - chrome.automation.IntentTextBoundaryType.WORD_START + chrome.automation.IntentTextBoundaryType.WORD_START, }]); } return true;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/desktop_automation_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/desktop_automation_handler.js index 543624a2..79d86faa 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/desktop_automation_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/desktop_automation_handler.js
@@ -270,7 +270,7 @@ new CustomAutomationEvent(evt.type, selectionStart, { eventFrom: evt.eventFrom, eventFromAction: evt.eventFromAction, - intents: evt.intents + intents: evt.intents, })); } @@ -335,7 +335,7 @@ const event = new CustomAutomationEvent(EventType.FOCUS, node, { eventFrom: evt.eventFrom, eventFromAction: evt.eventFromAction, - intents: evt.intents + intents: evt.intents, }); this.onEventDefault(event);
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/desktop_automation_handler_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/desktop_automation_handler_test.js index 3907d4c..08ff23f6 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/desktop_automation_handler_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/desktop_automation_handler_test.js
@@ -181,7 +181,7 @@ const root = await this.runWithLoadedTree(site); const combobox = root.find({ role: RoleType.TEXT_FIELD_WITH_COMBO_BOX, - attributes: {name: 'Choose one'} + attributes: {name: 'Choose one'}, }); assertTrue(Boolean(combobox)); combobox.focus();
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/download_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/download_handler.js index 1290dd27..cd997df 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/download_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/download_handler.js
@@ -179,19 +179,19 @@ } else if (timeRemaining < 60) { // Seconds. Use up until 1 minute remaining. timeUnit = new goog.i18n.MessageFormat(Msgs.getMsg('seconds')).format({ - COUNT: timeRemaining + COUNT: timeRemaining, }); } else if (timeRemaining < 3600) { // Minutes. Use up until 1 hour remaining. timeRemaining = Math.floor(timeRemaining / 60); timeUnit = new goog.i18n.MessageFormat(Msgs.getMsg('minutes')).format({ - COUNT: timeRemaining + COUNT: timeRemaining, }); } else if (timeRemaining < 36000) { // Hours. Use up until 10 hours remaining. timeRemaining = Math.floor(timeRemaining / 3600); timeUnit = new goog.i18n.MessageFormat(Msgs.getMsg('hours')).format({ - COUNT: timeRemaining + COUNT: timeRemaining, }); } else { // If 10+ hours remaining, do not report progress. @@ -199,7 +199,10 @@ } const optSubs = [ - storedItem.percentComplete, storedItem.fileName, timeRemaining, timeUnit + storedItem.percentComplete, + storedItem.fileName, + timeRemaining, + timeUnit, ]; DownloadHandler.speechAndBrailleOutput( 'download_progress', QueueMode.FLUSH, optSubs);
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/download_handler_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/download_handler_test.js index 8ad8d38..a24457b 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/download_handler_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/download_handler_test.js
@@ -28,7 +28,7 @@ chrome.downloads.State = { IN_PROGRESS: 'in_progress', COMPLETE: 'complete', - INTERRUPTED: 'interrupted' + INTERRUPTED: 'interrupted', }; } @@ -116,7 +116,7 @@ state: { current: chrome.downloads.State.COMPLETE, previous: chrome.downloads.State.IN_PROGRESS, - } + }, })); mockFeedback.expectSpeech('Download started test.pdf') @@ -143,7 +143,7 @@ state: { current: chrome.downloads.State.INTERRUPTED, previous: chrome.downloads.State.IN_PROGRESS, - } + }, })); mockFeedback.expectSpeech('Download started test.pdf') .expectSpeech('Download stopped test.pdf') @@ -169,7 +169,7 @@ paused: { current: true, previous: false, - } + }, })); mockFeedback.expectSpeech('Download started test.pdf') .expectSpeech('Download paused test.pdf') @@ -194,7 +194,7 @@ paused: { current: false, previous: true, - } + }, })); mockFeedback.expectSpeech('Download started test.pdf') .expectSpeech('Download resumed test.pdf')
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/earcon_engine.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/earcon_engine.js index 09e5f8d..4f1ed15 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/earcon_engine.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/earcon_engine.js
@@ -524,7 +524,7 @@ gain: 0.008, freq: freq1, overtones: 1, - overtoneFactor: 0.1 + overtoneFactor: 0.1, }); } @@ -711,7 +711,7 @@ gain: 0.3, freq: freq1, overtones: 3, - overtoneFactor: 0.1 + overtoneFactor: 0.1, }); this.generateSinusoidal({ attack: 0.02, @@ -720,7 +720,7 @@ gain: 0.3, freq: freq2, overtones: 3, - overtoneFactor: 0.1 + overtoneFactor: 0.1, }); this.currentTrackedEarcon_ = undefined; @@ -741,7 +741,7 @@ freq: freq1, endFreq: freq2, overtones: 1, - overtoneFactor: 0.1 + overtoneFactor: 0.1, }); } @@ -755,12 +755,12 @@ let t = this.progressTime_ - this.context_.currentTime; this.progressSources_.push([ this.progressTime_, - this.play('static', {gain: 0.5 * this.progressGain_, time: t}) + this.play('static', {gain: 0.5 * this.progressGain_, time: t}), ]); this.progressSources_.push([ this.progressTime_, this.play( - this.controlSound, {pitch: 20, time: t, gain: this.progressGain_}) + this.controlSound, {pitch: 20, time: t, gain: this.progressGain_}), ]); if (this.progressGain_ > this.progressFinalGain) { @@ -770,12 +770,12 @@ this.progressSources_.push([ this.progressTime_, - this.play('static', {gain: 0.5 * this.progressGain_, time: t}) + this.play('static', {gain: 0.5 * this.progressGain_, time: t}), ]); this.progressSources_.push([ this.progressTime_, this.play( - this.controlSound, {pitch: 8, time: t, gain: this.progressGain_}) + this.controlSound, {pitch: 8, time: t, gain: this.progressGain_}), ]); if (this.progressGain_ > this.progressFinalGain) {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_text_base.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_text_base.js index 10715ca9..276901f 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_text_base.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_text_base.js
@@ -68,7 +68,7 @@ WORD: 1, CHARACTER_AND_WORD: 2, NONE: 3, - COUNT: 4 + COUNT: 4, }; @@ -116,7 +116,7 @@ }.bind(this), set: function(val) { this.value_ = val.replace('\u00a0', ' '); - }.bind(this) + }.bind(this), }); this.value = value; @@ -304,7 +304,7 @@ if (this.isPassword) { this.speak( (new goog.i18n.MessageFormat(Msgs.getMsg('bullet')).format({ - 'COUNT': 1 + 'COUNT': 1, })), evt.triggeredByUser); return; @@ -413,7 +413,7 @@ if (this.isPassword) { this.speak( (new goog.i18n.MessageFormat(Msgs.getMsg('bullet')).format({ - 'COUNT': 1 + 'COUNT': 1, })), evt.triggeredByUser, personality); return;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_text_base_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_text_base_test.js index ed65232..4b672d25 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_text_base_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_text_base_test.js
@@ -162,8 +162,19 @@ obj.changed(new TextChangeEvent('Hello, World.', 13, 13)); assertEqualStringArrays( [ - 'H', 'e', 'l', 'l', 'o', 'Hello,', ' ', 'W', 'o', 'r', 'l', 'd', - 'World.' + 'H', + 'e', + 'l', + 'l', + 'o', + 'Hello,', + ' ', + 'W', + 'o', + 'r', + 'l', + 'd', + 'World.', ], tts.get()); @@ -216,9 +227,18 @@ obj.changed(new TextChangeEvent('Hello, world.', 0, 6)); assertEqualStringArrays( [ - 'H', 'selected', 'e', 'added_to_selection', 'l', 'added_to_selection', - 'l', 'added_to_selection', 'o', 'added_to_selection', ',', - 'added_to_selection' + 'H', + 'selected', + 'e', + 'added_to_selection', + 'l', + 'added_to_selection', + 'l', + 'added_to_selection', + 'o', + 'added_to_selection', + ',', + 'added_to_selection', ], tts.get()); obj.changed(new TextChangeEvent('Hello, world.', 0, 12)); @@ -387,9 +407,12 @@ // clearer to read. assertEqualStringArrays( [ - 'h', url.slice(2), - /* 'r', */ url.slice(3), 'o', url.slice(4), - /* 'm', */ url.slice(5) + 'h', + url.slice(2), + /* 'r', */ url.slice(3), + 'o', + url.slice(4), + /* 'm', */ url.slice(5), ], tts.get()); });
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing_test.js index 5828782b..9c2dfec6 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing_test.js
@@ -629,11 +629,12 @@ {speech: ['s'], braille: [lineText, {startIndex: 5, endIndex: 5}]}, {speech: [' '], braille: [lineText, {startIndex: 6, endIndex: 6}]}, {speech: ['a'], braille: [lineText, {startIndex: 7, endIndex: 7}]}, - {speech: [' '], braille: [lineText, {startIndex: 8, endIndex: 8}]}, { + {speech: [' '], braille: [lineText, {startIndex: 8, endIndex: 8}]}, + { speech: ['cat', 'Image'], - braille: [lineOnCatText, {startIndex: 9, endIndex: 9}] + braille: [lineOnCatText, {startIndex: 9, endIndex: 9}], }, - {speech: [' '], braille: [lineText, {startIndex: 12, endIndex: 12}]} + {speech: [' '], braille: [lineText, {startIndex: 12, endIndex: 12}]}, ]; for (const item of moves) { @@ -1944,12 +1945,12 @@ const ctrlDown = () => chrome.accessibilityPrivate.sendSyntheticKeyEvent({ type: chrome.accessibilityPrivate.SyntheticKeyboardEventType.KEYDOWN, keyCode: KeyCode.DOWN, - modifiers: {ctrl: true} + modifiers: {ctrl: true}, }); const ctrlUp = () => chrome.accessibilityPrivate.sendSyntheticKeyEvent({ type: chrome.accessibilityPrivate.SyntheticKeyboardEventType.KEYDOWN, keyCode: KeyCode.UP, - modifiers: {ctrl: true} + modifiers: {ctrl: true}, }); mockFeedback.expectSpeech('Text area') @@ -2091,7 +2092,7 @@ 11000000 /* cursor _ */, - 101011 /* ed contraction */ + 101011, /* ed contraction */ ]); this.press(KeyCode.HOME)(); @@ -2106,7 +2107,7 @@ 0 /* space */, - 101011 /* ed contraction */ + 101011, /* ed contraction */ ]); });
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/focus_bounds.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/focus_bounds.js index 911aadce..84fb28bf 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/focus_bounds.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/focus_bounds.js
@@ -21,9 +21,9 @@ chrome.accessibilityPrivate.setFocusRings([{ rects: bounds, type: chrome.accessibilityPrivate.FocusType.GLOW, - color: constants.FOCUS_COLOR + color: constants.FOCUS_COLOR, }]); - } + }, }; /** @private {!Array<!chrome.accessibilityPrivate.ScreenRect>} */
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/keyboard_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/keyboard_handler.js index 0fd5bfb..f5ae18f 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/keyboard_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/keyboard_handler.js
@@ -28,7 +28,7 @@ // The pass through shortcut command has been pressed and released, waiting // for the user to press/release a shortcut to be passed through. - PENDING_SHORTCUT_KEYUPS: 'pending_shortcut_keyups' + PENDING_SHORTCUT_KEYUPS: 'pending_shortcut_keyups', }; export class BackgroundKeyboardHandler {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js index 203b9fb7..e9e5fb8 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js
@@ -430,7 +430,7 @@ node, outputFormat: formatStr, outputBuffer: this.speechBuffer_, - outputRuleString: this.speechRulesStr_ + outputRuleString: this.speechRulesStr_, }); return this; @@ -453,7 +453,7 @@ node, outputFormat: formatStr, outputBuffer: this.brailleBuffer_, - outputRuleString: this.brailleRulesStr_ + outputRuleString: this.brailleRulesStr_, }); return this; } @@ -978,7 +978,7 @@ node, outputFormat: '$descendants', outputBuffer: buff, - outputRuleString: ruleStr + outputRuleString: ruleStr, }); } } @@ -1030,7 +1030,7 @@ node, outputFormat: '@' + msg, outputBuffer: buff, - outputRuleString: ruleStr + outputRuleString: ruleStr, }); } } @@ -1049,7 +1049,7 @@ node, outputFormat: '@' + msg, outputBuffer: buff, - outputRuleString: ruleStr + outputRuleString: ruleStr, }); } } @@ -1068,7 +1068,7 @@ node, outputFormat: '@' + msg, outputBuffer: buff, - outputRuleString: ruleStr + outputRuleString: ruleStr, }); } } @@ -1089,7 +1089,7 @@ node, outputFormat: '$' + s, outputBuffer: buff, - outputRuleString: ruleStr + outputRuleString: ruleStr, }); } }.bind(this)); @@ -1116,7 +1116,7 @@ node, outputFormat: formatString, outputBuffer: buff, - outputRuleString: ruleStr + outputRuleString: ruleStr, }); } } @@ -1183,7 +1183,7 @@ node, outputFormat: '$descendants', outputBuffer: unjoined, - outputRuleString: ruleStr + outputRuleString: ruleStr, }); this.append_(buff, unjoined.join(' '), options); ruleStr.write( @@ -1286,7 +1286,7 @@ $if($tableCellAriaColumnIndex, $tableCellAriaColumnIndex, $tableCellColumnIndex))`, outputBuffer: buff, - outputRuleString: ruleStr + outputRuleString: ruleStr, }); } } @@ -1357,7 +1357,7 @@ node, outputFormat: '$name', outputBuffer: buff, - outputRuleString: ruleStr + outputRuleString: ruleStr, }); return; } @@ -1374,7 +1374,7 @@ // into it. return n !== root && AutomationPredicate.leafOrStaticText(n); }, - root: r => r === root + root: r => r === root, }); const outputStrings = []; while (walker.next().node) { @@ -1496,7 +1496,7 @@ node, outputFormat: cond.nextSibling || '', outputBuffer: buff, - outputRuleString: ruleStr + outputRuleString: ruleStr, }); } else if (Output.isFalsey(node, attrib)) { ruleStr.write(attrib + '==false => '); @@ -1504,7 +1504,7 @@ node, outputFormat: cond.nextSibling.nextSibling || '', outputBuffer: buff, - outputRuleString: ruleStr + outputRuleString: ruleStr, }); } } else if (token === 'nif') { @@ -1517,7 +1517,7 @@ node, outputFormat: cond.nextSibling || '', outputBuffer: buff, - outputRuleString: ruleStr + outputRuleString: ruleStr, }); } else if (Output.isTruthy(node, attrib)) { ruleStr.write(attrib + '==true => '); @@ -1525,7 +1525,7 @@ node, outputFormat: cond.nextSibling.nextSibling || '', outputBuffer: buff, - outputRuleString: ruleStr + outputRuleString: ruleStr, }); } } else if (token === 'earcon') { @@ -1580,7 +1580,7 @@ node, outputFormat: curArg, outputBuffer: msgBuff, - outputRuleString: ruleStr + outputRuleString: ruleStr, }); // Fill in empty string if nothing was formatted. if (!msgBuff.length) { @@ -1624,7 +1624,7 @@ node, outputFormat: arg, outputBuffer: argBuff, - outputRuleString: ruleStr + outputRuleString: ruleStr, }); const namedArgs = {COUNT: Number(argBuff[0])}; msg = new goog.i18n.MessageFormat(msg).format(namedArgs); @@ -1817,7 +1817,7 @@ type, ancestors: info.leaveAncestors, formatName: 'leave', - exclude: [...info.enterAncestors, node] + exclude: [...info.enterAncestors, node], }); this.ancestryHelper_({ node, @@ -1827,7 +1827,7 @@ type, ancestors: info.enterAncestors, formatName: 'enter', - excludePreviousAncestors: true + excludePreviousAncestors: true, }); if (optionalArgs.suppressStartEndAncestry) { @@ -1844,7 +1844,7 @@ type, ancestors: info.startAncestors, formatName: 'startOf', - excludePreviousAncestors: true + excludePreviousAncestors: true, }); } @@ -1857,7 +1857,7 @@ type, ancestors: info.endAncestors, formatName: 'endOf', - exclude: [...info.startAncestors].concat(node) + exclude: [...info.startAncestors].concat(node), }); } } @@ -1934,7 +1934,7 @@ outputFormat: enterFormat, outputBuffer: buff, outputRuleString: ruleStr, - opt_prevNode: prevNode + opt_prevNode: prevNode, }); if (this.formatOptions_.braille && buff.length) { @@ -1997,7 +1997,7 @@ outputFormat: eventBlock[rule.role][rule.output], outputBuffer: buff, outputRuleString: ruleStr, - opt_prevNode: prevNode + opt_prevNode: prevNode, }); // Restore braille and add an annotation for this node. @@ -2159,7 +2159,7 @@ outputFormat: msg.outputFormat, outputBuffer: buff, outputRuleString: ruleStr, - opt_speechProps: msg.props + opt_speechProps: msg.props, }); } else { throw new Error('Unexpected hint: ' + msg); @@ -2207,7 +2207,7 @@ if (currentNode.ariaCurrentState && Output.ARIA_CURRENT_STATE_INFO_[currentNode.ariaCurrentState]) { ret.push({ - msgId: Output.ARIA_CURRENT_STATE_INFO_[currentNode.ariaCurrentState] + msgId: Output.ARIA_CURRENT_STATE_INFO_[currentNode.ariaCurrentState], }); break; } @@ -2234,7 +2234,7 @@ if (node.state[StateType.EDITABLE]) { ret.push({ msgId: node.state[StateType.FOCUSED] ? 'hint_is_editing' : - 'hint_double_tap_to_edit' + 'hint_double_tap_to_edit', }); return ret; } @@ -2319,7 +2319,7 @@ [RoleType.MENU, RoleType.MENU_BAR]))))) { ret.push({ msgId: foundAncestor.state.horizontal ? 'hint_menu_horizontal' : - 'hint_menu' + 'hint_menu', }); } if (uniqueAncestors.find( @@ -2565,7 +2565,7 @@ expanded: {on: {msgId: 'aria_expanded_true'}}, multiselectable: {on: {msgId: 'aria_multiselectable_true'}}, required: {on: {msgId: 'aria_required_true'}}, - visited: {on: {msgId: 'visited_state'}} + visited: {on: {msgId: 'visited_state'}}, }; /** @@ -2579,7 +2579,7 @@ [AriaCurrentState.STEP]: 'aria_current_step', [AriaCurrentState.LOCATION]: 'aria_current_location', [AriaCurrentState.DATE]: 'aria_current_date', - [AriaCurrentState.TIME]: 'aria_current_time' + [AriaCurrentState.TIME]: 'aria_current_time', }; /** @@ -2614,7 +2614,7 @@ Output.CHECKED_STATE_MAP = { 'true': 'checked_true', 'false': 'checked_false', - 'mixed': 'checked_mixed' + 'mixed': 'checked_mixed', }; /** @@ -2625,7 +2625,7 @@ Output.PRESSED_STATE_MAP = { 'true': 'aria_pressed_true', 'false': 'aria_pressed_false', - 'mixed': 'aria_pressed_mixed' + 'mixed': 'aria_pressed_mixed', }; /** @@ -2646,15 +2646,15 @@ 'default': { speak: `$name $node(activeDescendant) $value $state $restriction $role $description`, - braille: `` + braille: ``, }, abstractContainer: { startOf: `$nameFromNode $role $state $description`, - endOf: `@end_of_container($role)` + endOf: `@end_of_container($role)`, }, abstractFormFieldContainer: { enter: `$nameFromNode $role $state $description`, - leave: `@exited_container($role)` + leave: `@exited_container($role)`, }, abstractItem: { // Note that ChromeVox generally does not output position/count. Only for @@ -2664,12 +2664,12 @@ $if($posInSet, @describe_index($posInSet, $setSize))`, speak: `$state $nameOrTextContent= $role $if($posInSet, @describe_index($posInSet, $setSize)) - $description $restriction` + $description $restriction`, }, abstractList: { startOf: `$nameFromNode $role @@list_with_items($setSize) $restriction $description`, - endOf: `@end_of_container($role) @@list_nested_level($listNestedLevel)` + endOf: `@end_of_container($role) @@list_nested_level($listNestedLevel)`, }, abstractNameFromContents: { speak: `$nameOrDescendants $node(activeDescendant) $value $state @@ -2680,26 +2680,26 @@ $if($value, $value, $if($valueForRange, $valueForRange)) $state $restriction $if($minValueForRange, @aria_value_min($minValueForRange)) - $if($maxValueForRange, @aria_value_max($maxValueForRange))` + $if($maxValueForRange, @aria_value_max($maxValueForRange))`, }, abstractSpan: { startOf: `$nameFromNode $role $state $description`, - endOf: `@end_of_container($role)` + endOf: `@end_of_container($role)`, }, alert: { enter: `$name $role $state`, speak: `$earcon(ALERT_NONMODAL) $role $nameOrTextContent $description - $state` + $state`, }, alertDialog: { enter: `$earcon(ALERT_MODAL) $name $state $description $roleDescription $textContent`, speak: `$earcon(ALERT_MODAL) $name $nameOrTextContent $description $state - $role` + $role`, }, button: { speak: `$name $node(activeDescendant) $state $restriction $role - $description` + $description`, }, cell: { enter: { @@ -2713,12 +2713,12 @@ braille: `$state $name $cellIndexText $node(tableCellColumnHeaders) $roleDescription $description - $if($selected, @aria_selected_true)` + $if($selected, @aria_selected_true)`, }, checkBox: { speak: `$if($checked, $earcon(CHECK_ON), $earcon(CHECK_OFF)) $name $role $if($checkedStateDescription, $checkedStateDescription, $checked) - $description $state $restriction` + $description $state $restriction`, }, client: {speak: `$name`}, comboBoxMenuButton: { @@ -2730,18 +2730,18 @@ dialog: {enter: `$nameFromNode $role $description`}, genericContainer: { enter: `$nameFromNode $description $state`, - speak: `$nameOrTextContent $description $state` + speak: `$nameOrTextContent $description $state`, }, embeddedObject: {speak: `$name`}, grid: { speak: `$name $node(activeDescendant) $role $state $restriction - $description` + $description`, }, group: { enter: `$nameFromNode $roleDescription $state $restriction $description`, speak: `$nameOrDescendants $value $state $restriction $roleDescription $description`, - leave: `` + leave: ``, }, heading: { enter: `!relativePitch(hierarchicalLevel) @@ -2751,7 +2751,7 @@ speak: `!relativePitch(hierarchicalLevel) $nameOrDescendants= $if($hierarchicalLevel, @tag_h+$hierarchicalLevel, $role) $state - $restriction $description` + $restriction $description`, }, image: { speak: `$if($name, $name, @@ -2773,11 +2773,11 @@ }, list: { speak: `$nameFromNode $descendants $role - @@list_with_items($setSize) $description $state` + @@list_with_items($setSize) $description $state`, }, listBox: { enter: `$nameFromNode $role @@list_with_items($setSize) - $restriction $description` + $restriction $description`, }, listBoxOption: { speak: `$state $name $role @describe_index($posInSet, $setSize) @@ -2785,29 +2785,29 @@ $nif($selected, @aria_selected_false)`, braille: `$state $name $role @describe_index($posInSet, $setSize) $description $restriction - $if($selected, @aria_selected_true, @aria_selected_false)` + $if($selected, @aria_selected_true, @aria_selected_false)`, }, listMarker: {speak: `$name`}, menu: { enter: `$name $role `, speak: `$name $node(activeDescendant) - $role @@list_with_items($setSize) $description $state $restriction` + $role @@list_with_items($setSize) $description $state $restriction`, }, menuItem: { speak: `$name $role $if($hasPopup, @has_submenu) - @describe_index($posInSet, $setSize) $description $state $restriction` + @describe_index($posInSet, $setSize) $description $state $restriction`, }, menuItemCheckBox: { speak: `$if($checked, $earcon(CHECK_ON), $earcon(CHECK_OFF)) $name $role $checked $state $restriction $description - @describe_index($posInSet, $setSize)` + @describe_index($posInSet, $setSize)`, }, menuItemRadio: { speak: `$if($checked, $earcon(CHECK_ON), $earcon(CHECK_OFF)) $if($checked, @describe_menu_item_radio_selected($name), @describe_menu_item_radio_unselected($name)) $state $roleDescription $restriction $description - @describe_index($posInSet, $setSize)` + @describe_index($posInSet, $setSize)`, }, menuListOption: { speak: `$name $role @describe_index($posInSet, $setSize) $state @@ -2815,7 +2815,7 @@ $restriction $description`, braille: `$name $role @describe_index($posInSet, $setSize) $state $if($selected, @aria_selected_true, @aria_selected_false) - $restriction $description` + $restriction $description`, }, paragraph: {speak: `$nameOrDescendants $roleDescription`}, radioButton: { @@ -2823,21 +2823,21 @@ $if($checked, @describe_radio_selected($name), @describe_radio_unselected($name)) @describe_index($posInSet, $setSize) - $roleDescription $description $state $restriction` + $roleDescription $description $state $restriction`, }, rootWebArea: {enter: `$name`, speak: `$if($name, $name, @web_content)`}, region: {speak: `$state $nameOrTextContent $description $roleDescription`}, row: { startOf: `$node(tableRowHeader) $roleDescription`, speak: `$name $node(activeDescendant) $value $state $restriction $role - $if($selected, @aria_selected_true) $description` + $if($selected, @aria_selected_true) $description`, }, staticText: {speak: `$precedingBullet $name= $description`}, switch: { speak: `$if($checked, $earcon(CHECK_ON), $earcon(CHECK_OFF)) $if($checked, @describe_switch_on($name), @describe_switch_off($name)) $roleDescription - $description $state $restriction` + $description $state $restriction`, }, tab: { speak: `@describe_tab($name) $roleDescription $description @@ -2848,7 +2848,7 @@ enter: `$roleDescription @table_summary($name, $if($ariaRowCount, $ariaRowCount, $tableRowCount), $if($ariaColumnCount, $ariaColumnCount, $tableColumnCount)) - $node(tableHeader)` + $node(tableHeader)`, }, tabList: { speak: `$name $node(activeDescendant) $state $restriction $role @@ -2859,15 +2859,15 @@ $if($roleDescription, $roleDescription, $if($multiline, @tag_textarea, $if($inputType, $inputType, $role))) - $description $state $restriction` + $description $state $restriction`, }, timer: { speak: `$nameFromNode $descendants $value $state $role - $description` + $description`, }, toggleButton: { speak: `$if($checked, $earcon(CHECK_ON), $earcon(CHECK_OFF)) - $name $role $pressed $description $state $restriction` + $name $role $pressed $description $state $restriction`, }, toolbar: {enter: `$name $role $description $restriction`}, tree: {enter: `$name $role @@list_with_items($setSize) $restriction`}, @@ -2879,13 +2879,13 @@ $role $description $state $restriction $nif($selected, @aria_selected_false) @describe_index($posInSet, $setSize) - @describe_depth($hierarchicalLevel)` + @describe_depth($hierarchicalLevel)`, }, unknown: {speak: ``}, window: { enter: `@describe_window($name) $description`, - speak: `@describe_window($name) $description $earcon(OBJECT_OPEN)` - } + speak: `@describe_window($name) $description $earcon(OBJECT_OPEN)`, + }, }, menuStart: {'default': {speak: `@chrome_menu_opened($name) $earcon(OBJECT_OPEN)`}}, @@ -2894,12 +2894,12 @@ 'default': { speak: `$value $name $find({"state": {"selected": true, "invisible": false}}, - @describe_index($posInSet, $setSize)) ` - } + @describe_index($posInSet, $setSize)) `, + }, }, alert: { - default: {speak: `$earcon(ALERT_NONMODAL) $nameOrTextContent $description`} - } + default: {speak: `$earcon(ALERT_NONMODAL) $nameOrTextContent $description`}, + }, }; /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_role_info.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_role_info.js index 92e6dcc..4ce6c85 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_role_info.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_role_info.js
@@ -46,19 +46,19 @@ msgId: 'role_comment', contextOrder: OutputContextOrder.FIRST_AND_LAST, verboseAncestry: true, - inherits: 'abstractSpan' + inherits: 'abstractSpan', }, contentDeletion: { msgId: 'role_content_deletion', contextOrder: OutputContextOrder.FIRST_AND_LAST, verboseAncestry: true, - inherits: 'abstractSpan' + inherits: 'abstractSpan', }, contentInsertion: { msgId: 'role_content_insertion', contextOrder: OutputContextOrder.FIRST_AND_LAST, verboseAncestry: true, - inherits: 'abstractSpan' + inherits: 'abstractSpan', }, contentInfo: {msgId: 'role_contentinfo', inherits: 'abstractContainer'}, date: {msgId: 'input_type_date', inherits: 'abstractFormFieldContainer'}, @@ -69,7 +69,7 @@ dialog: { msgId: 'role_dialog', contextOrder: OutputContextOrder.DIRECTED, - ignoreAncestry: true + ignoreAncestry: true, }, directory: {msgId: 'role_directory', inherits: 'abstractContainer'}, docAbstract: {msgId: 'role_doc_abstract', inherits: 'abstractSpan'}, @@ -82,7 +82,7 @@ docBiblioEntry: { msgId: 'role_doc_biblio_entry', earconId: 'LIST_ITEM', - inherits: 'abstractItem' + inherits: 'abstractItem', }, docBibliography: {msgId: 'role_doc_bibliography', inherits: 'abstractSpan'}, docBiblioRef: @@ -97,7 +97,7 @@ docEndnote: { msgId: 'role_doc_endnote', earconId: 'LIST_ITEM', - inherits: 'abstractItem' + inherits: 'abstractItem', }, docEndnotes: {msgId: 'role_doc_endnotes', earconId: 'LISTBOX', inherits: 'list'}, @@ -108,7 +108,7 @@ docFootnote: { msgId: 'role_doc_footnote', earconId: 'LIST_ITEM', - inherits: 'abstractItem' + inherits: 'abstractItem', }, docForeword: {msgId: 'role_doc_foreword', inherits: 'abstractSpan'}, docGlossary: {msgId: 'role_doc_glossary', inherits: 'abstractSpan'}, @@ -160,14 +160,14 @@ msgId: 'role_mark', contextOrder: OutputContextOrder.FIRST_AND_LAST, verboseAncestry: true, - inherits: 'abstractContainer' + inherits: 'abstractContainer', }, marquee: {msgId: 'role_marquee', inherits: 'abstractNameFromContents'}, math: {msgId: 'role_math', inherits: 'abstractContainer'}, menu: { msgId: 'role_menu', contextOrder: OutputContextOrder.FIRST, - ignoreAncestry: true + ignoreAncestry: true, }, menuBar: { msgId: 'role_menubar', @@ -185,7 +185,7 @@ popUpButton: { msgId: 'role_button', earconId: 'POP_UP_BUTTON', - inherits: 'comboBoxMenuButton' + inherits: 'comboBoxMenuButton', }, radioButton: {msgId: 'role_radio'}, radioGroup: @@ -201,7 +201,7 @@ spinButton: { msgId: 'role_spinbutton', inherits: 'abstractRange', - earconId: 'LISTBOX' + earconId: 'LISTBOX', }, splitter: {msgId: 'role_separator', inherits: 'abstractSpan'}, status: {msgId: 'role_status', inherits: 'abstractNameFromContents'}, @@ -210,7 +210,7 @@ msgId: 'role_suggestion', contextOrder: OutputContextOrder.FIRST_AND_LAST, verboseAncestry: true, - inherits: 'abstractSpan' + inherits: 'abstractSpan', }, superscript: {msgId: 'role_superscript', inherits: 'abstractSpan'}, tab: {msgId: 'role_tab', inherits: 'abstractContainer'}, @@ -226,5 +226,5 @@ tree: {msgId: 'role_tree'}, treeItem: {msgId: 'role_treeitem'}, video: {msgId: 'tag_video', inherits: 'abstractFormFieldContainer'}, - window: {ignoreAncestry: true} + window: {ignoreAncestry: true}, };
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_test.js index 21405afd..5ee3aa9 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_test.js
@@ -3,7 +3,7 @@ // found in the LICENSE file. GEN_INCLUDE([ - '//chrome/browser/resources/chromeos/accessibility/chromevox/testing/chromevox_next_e2e_test_base.js' + '//chrome/browser/resources/chromeos/accessibility/chromevox/testing/chromevox_next_e2e_test_base.js', ]); /** @@ -130,8 +130,8 @@ // Link earcon (based on the name). {value: {earconId: 'LINK'}, start: 0, end: 10}, - {value: {'delay': true}, start: 25, end: 55} - ] + {value: {'delay': true}, start: 25, end: 55}, + ], }, o.speechOutputForTest); checkBrailleOutput( @@ -149,7 +149,7 @@ [ {value: new OutputEarconAction('CHECK_OFF'), start: 0, end: 0}, {value: 'role', start: 1, end: 10}, - {value: {'delay': true}, start: 23, end: 51} + {value: {'delay': true}, start: 23, end: 51}, ], o); checkBrailleOutput( @@ -169,8 +169,8 @@ string_: 'OK', 'spans_': [ // Attributes. - {value: 'name', start: 0, end: 2} - ] + {value: 'name', start: 0, end: 2}, + ], }, o.speechOutputForTest); checkBrailleOutput( @@ -185,8 +185,8 @@ string_: 'OK', 'spans_': [ // Attributes. - {value: 'name', start: 0, end: 2} - ] + {value: 'name', start: 0, end: 2}, + ], }, o.speechOutputForTest); checkBrailleOutput( @@ -207,8 +207,8 @@ string_: letter + '|Heading ' + i, 'spans_': [ // Attributes. - {value: 'nameOrDescendants', start: 0, end: 1} - ] + {value: 'nameOrDescendants', start: 0, end: 1}, + ], }, o.speechOutputForTest); checkBrailleOutput( @@ -225,8 +225,8 @@ 'spans_': [ {value: 'name', start: 0, end: 1}, {value: new OutputEarconAction('LINK'), start: 0, end: 1}, - {value: 'role', start: 2, end: 6} - ] + {value: 'role', start: 2, end: 6}, + ], }, o.speechOutputForTest); checkBrailleOutput( @@ -234,7 +234,7 @@ [ {value: new OutputNodeSpan(el.firstChild.firstChild), start: 0, end: 1}, {value: new OutputNodeSpan(el), start: 0, end: 8}, - {value: new OutputNodeSpan(el.firstChild), start: 2, end: 5} + {value: new OutputNodeSpan(el.firstChild), start: 2, end: 5}, ], o); }); @@ -252,7 +252,8 @@ 'play|Disabled|Button|audio|Tool bar', [ {value: new OutputEarconAction('BUTTON'), start: 0, end: 4}, - {value: 'name', start: 21, end: 26}, {value: 'role', start: 27, end: 35} + {value: 'name', start: 21, end: 26}, + {value: 'role', start: 27, end: 35}, ], o); @@ -260,7 +261,7 @@ 'play xx btn audio tlbar', [ {value: new OutputNodeSpan(el), start: 0, end: 11}, - {value: new OutputNodeSpan(el.parent), start: 12, end: 23} + {value: new OutputNodeSpan(el.parent), start: 12, end: 23}, ], o); @@ -277,7 +278,7 @@ {value: new OutputEarconAction('SLIDER'), start: 0, end: 0}, {value: 'description', start: 1, end: 20}, {value: 'role', start: 21, end: 27}, - {value: 'value', start: 28, end: 32} + {value: 'value', start: 28, end: 32}, ], o); checkBrailleOutput( @@ -301,25 +302,29 @@ {value: 'name', start: 0, end: 0}, {value: new OutputEarconAction('EDITABLE_TEXT'), start: 0, end: 0}, {value: new OutputSelectionSpan(0, 0, 0), start: 1, end: 1}, - {value: 'value', start: 1, end: 1}, {value: 'inputType', start: 2} + {value: 'value', start: 1, end: 1}, + {value: 'inputType', start: 2}, ]; const expectedSpansForSearchBox = [ {value: 'name', start: 0, end: 0}, {value: new OutputEarconAction('EDITABLE_TEXT'), start: 0, end: 0}, {value: new OutputSelectionSpan(0, 0, 0), start: 1, end: 1}, - {value: 'value', start: 1, end: 1}, {value: 'role', start: 2, end: 8} + {value: 'value', start: 1, end: 1}, + {value: 'role', start: 2, end: 8}, ]; const expectedSpeechValues = [ - '||Edit text', '||Edit text, email entry', '||Password edit text', + '||Edit text', + '||Edit text, email entry', + '||Password edit text', '||Edit text numeric only', [ '|Spin button', [ {value: 'name', start: 0, end: 0}, {value: new OutputEarconAction('LISTBOX'), start: 0, end: 0}, - {value: 'role', start: 1, end: 12} - ] + {value: 'role', start: 1, end: 12}, + ], ], ['Time control', [{value: 'role', start: 0, end: 12}]], ['Date control', [{value: 'role', start: 0, end: 12}]], @@ -328,17 +333,25 @@ [ {value: 'name', start: 0, end: 27}, {value: new OutputEarconAction('BUTTON'), start: 0, end: 27}, - {value: 'role', start: 28, end: 34} - ] + {value: 'role', start: 28, end: 34}, + ], ], - '||Search', '||Edit text' + '||Search', + '||Edit text', ]; // TODO(plundblad): Some of these are wrong, there should be an initial // space for the cursor in edit fields. const expectedBrailleValues = [ - ' ed', ' @ed 8dot', ' pwded', ' #ed', {string_: 'spnbtn', spans_: []}, - {string_: 'time'}, {string_: 'date'}, - {string_: 'No file chosen, Choose File btn'}, ' search', ' ed' + ' ed', + ' @ed 8dot', + ' pwded', + ' #ed', + {string_: 'spnbtn', spans_: []}, + {string_: 'time'}, + {string_: 'date'}, + {string_: 'No file chosen, Choose File btn'}, + ' search', + ' ed', ]; assertEquals(expectedSpeechValues.length, expectedBrailleValues.length); @@ -369,14 +382,18 @@ expectedValue, [ {value: {startIndex: 0, endIndex: 0}, start: 0, end: 0}, - {value: new OutputNodeSpan(el), start: 0, end: expectedValue.length} + { + value: new OutputNodeSpan(el), + start: 0, + end: expectedValue.length, + }, ], o); } else { let spans = [{ value: new OutputNodeSpan(el), start: 0, - end: expectedValue.string_.length + end: expectedValue.string_.length, }]; if (expectedValue.spans_) { spans = spans.concat(expectedValue.spans_); @@ -398,7 +415,8 @@ 'a|List item|first|List|with 3 items', [ {value: {earconId: 'LIST_ITEM'}, start: 0, end: 1}, - {value: 'name', start: 12, end: 17}, {value: 'role', start: 18, end: 22} + {value: 'name', start: 12, end: 17}, + {value: 'role', start: 18, end: 22}, ], o); // TODO(plundblad): This output is wrong. Add special handling for @@ -407,7 +425,7 @@ 'a lstitm first lst +3', [ {value: new OutputNodeSpan(el), start: 0, end: 8}, - {value: new OutputNodeSpan(el.parent), start: 9, end: 21} + {value: new OutputNodeSpan(el.parent), start: 9, end: 21}, ], o); }); @@ -436,7 +454,7 @@ [ {value: new OutputNodeSpan(el), start: 0, end: 1}, {value: new OutputNodeSpan(el.parent), start: 2, end: 22}, - {value: new OutputNodeSpan(el.parent.parent), start: 22, end: 29} + {value: new OutputNodeSpan(el.parent.parent), start: 22, end: 29}, ], o); @@ -446,7 +464,8 @@ checkSpeechOutput( 'b|Tree item| 2 of 3 | level 1 |Tree|with 3 items', [ - {value: 'name', start: 0, end: 1}, {value: 'role', 'start': 31, end: 35} + {value: 'name', start: 0, end: 1}, + {value: 'role', 'start': 31, end: 35}, ], o); checkBrailleOutput( @@ -454,7 +473,7 @@ [ {value: new OutputNodeSpan(el), start: 0, end: 1}, {value: new OutputNodeSpan(el.parent), start: 2, end: 20}, - {value: new OutputNodeSpan(el.parent.parent), start: 20, end: 27} + {value: new OutputNodeSpan(el.parent.parent), start: 20, end: 27}, ], o); @@ -474,7 +493,7 @@ [ {value: new OutputNodeSpan(el), start: 0, end: 1}, {value: new OutputNodeSpan(el.parent), start: 2, end: 22}, - {value: new OutputNodeSpan(el.parent.parent), start: 22, end: 29} + {value: new OutputNodeSpan(el.parent.parent), start: 22, end: 29}, ], o); }); @@ -500,7 +519,7 @@ 'a mnuitm 1/3 mnu', [ {value: new OutputNodeSpan(el), start: 0, end: 12}, - {value: new OutputNodeSpan(el.parent), start: 13, end: 16} + {value: new OutputNodeSpan(el.parent), start: 13, end: 16}, ], o); @@ -513,7 +532,7 @@ 'Press up or down arrow to navigate; enter to activate', [ {value: 'role', start: 0, end: 4}, - {value: {delay: true}, start: 18, end: 71} + {value: {delay: true}, start: 18, end: 71}, ], o); @@ -524,7 +543,7 @@ 'Menu bar|Press left or right arrow to navigate; enter to activate', [ {value: 'role', start: 0, end: 8}, - {value: {delay: true}, start: 9, end: 65} + {value: {delay: true}, start: 9, end: 65}, ], o); }); @@ -544,14 +563,14 @@ [ {value: 'name', start: 0, end: 1}, {value: new OutputEarconAction('LIST_ITEM'), start: 0, end: 1}, - {value: 'role', start: 34, end: 42} + {value: 'role', start: 34, end: 42}, ], o); checkBrailleOutput( '1 lstitm 1/2 ( ) lstbx +2', [ {value: new OutputNodeSpan(el), start: 0, end: 16}, - {value: new OutputNodeSpan(el.parent), start: 17, end: 25} + {value: new OutputNodeSpan(el.parent), start: 17, end: 25}, ], o); }); @@ -721,8 +740,8 @@ // Attributes. {value: 'nameOrDescendants', start: 0, end: 1}, - {value: {'relativePitch': -0.2}, start: 2, end: 2} - ] + {value: {'relativePitch': -0.2}, start: 2, end: 2}, + ], }, o.speechOutputForTest); el = el.nextSibling; @@ -742,8 +761,8 @@ {value: {earconId: 'CHECK_ON'}, start: 0, end: 0}, {value: 'name', start: 1, end: 10}, {value: 'role', start: 11, end: 24}, - {value: {'delay': true}, start: 33, end: 61} - ] + {value: {'delay': true}, start: 33, end: 61}, + ], }, o.speechOutputForTest); assertEquals('Subscribe tgl btn =', o.brailleOutputForTest.string_); @@ -802,7 +821,7 @@ [ {value: new OutputNodeSpan(start), start: 0, end: 10}, {value: new OutputNodeSpan(start.nextSibling), start: 10, end: 14}, - {value: new OutputNodeSpan(end), start: 15, end: 33} + {value: new OutputNodeSpan(end), start: 15, end: 33}, ], o); }); @@ -825,7 +844,7 @@ {value: new OutputNodeSpan(text), start: 0, end: 4}, {value: new OutputNodeSpan(link), start: 5, end: 8}, {value: new OutputNodeSpan(listItem), start: 9, end: 15}, - {value: new OutputNodeSpan(list), start: 16, end: 23} + {value: new OutputNodeSpan(list), start: 16, end: 23}, ], o); @@ -838,7 +857,7 @@ [ {value: new OutputNodeSpan(bullet), start: 0, end: 2}, {value: new OutputNodeSpan(listItem), start: 2, end: 8}, - {value: new OutputNodeSpan(list), start: 9, end: 15} + {value: new OutputNodeSpan(list), start: 9, end: 15}, ], o); }); @@ -861,7 +880,8 @@ [ {value: 'name', start: 0, end: 6}, {value: new OutputEarconAction('SLIDER'), start: 0, end: 6}, - {value: 'role', start: 7, end: 13}, {value: 'value', start: 14, end: 15} + {value: 'role', start: 7, end: 13}, + {value: 'value', start: 14, end: 15}, ], o); @@ -870,8 +890,9 @@ checkSpeechOutput( 'volume|Progress indicator|2|Min 1|Max 10', [ - {value: 'name', start: 0, end: 6}, {value: 'role', start: 7, end: 25}, - {value: 'value', start: 26, end: 27} + {value: 'name', start: 0, end: 6}, + {value: 'role', start: 7, end: 25}, + {value: 'value', start: 26, end: 27}, ], o); @@ -880,8 +901,9 @@ checkSpeechOutput( 'volume|Meter|2|Min 1|Max 10', [ - {value: 'name', start: 0, end: 6}, {value: 'role', start: 7, end: 12}, - {value: 'value', start: 13, end: 14} + {value: 'name', start: 0, end: 6}, + {value: 'role', start: 7, end: 12}, + {value: 'value', start: 13, end: 14}, ], o); @@ -892,7 +914,8 @@ [ {value: 'name', start: 0, end: 6}, {value: new OutputEarconAction('LISTBOX'), start: 0, end: 6}, - {value: 'role', start: 7, end: 18}, {value: 'value', start: 19, end: 20} + {value: 'role', start: 7, end: 18}, + {value: 'value', start: 19, end: 20}, ], o); }); @@ -908,7 +931,7 @@ [ {value: 'name', start: 0, end: 2}, {value: new OutputEarconAction('BUTTON'), start: 0, end: 2}, - {value: 'role', start: 3, end: 6} + {value: 'role', start: 3, end: 6}, ], o); }); @@ -953,10 +976,17 @@ // This filters out known roles that don't have states or descriptions. const notStated = [ - RoleType.CLIENT, RoleType.EMBEDDED_OBJECT, RoleType.IME_CANDIDATE, - RoleType.INLINE_TEXT_BOX, RoleType.LINE_BREAK, RoleType.LIST_MARKER, - RoleType.PARAGRAPH, RoleType.ROOT_WEB_AREA, RoleType.STATIC_TEXT, - RoleType.PLUGIN_OBJECT, RoleType.WINDOW + RoleType.CLIENT, + RoleType.EMBEDDED_OBJECT, + RoleType.IME_CANDIDATE, + RoleType.INLINE_TEXT_BOX, + RoleType.LINE_BREAK, + RoleType.LIST_MARKER, + RoleType.PARAGRAPH, + RoleType.ROOT_WEB_AREA, + RoleType.STATIC_TEXT, + RoleType.PLUGIN_OBJECT, + RoleType.WINDOW, ]; const notRestricted = [ RoleType.ALERT, @@ -979,13 +1009,20 @@ RoleType.STATIC_TEXT, RoleType.TABLE_HEADER_CONTAINER, RoleType.TIMER, - RoleType.WINDOW + RoleType.WINDOW, ]; const notDescribed = [ - RoleType.CLIENT, RoleType.EMBEDDED_OBJECT, RoleType.IME_CANDIDATE, - RoleType.INLINE_TEXT_BOX, RoleType.LINE_BREAK, RoleType.LIST_MARKER, - RoleType.PARAGRAPH, RoleType.PLUGIN_OBJECT, RoleType.ROOT_WEB_AREA, - RoleType.STATIC_TEXT, RoleType.WINDOW + RoleType.CLIENT, + RoleType.EMBEDDED_OBJECT, + RoleType.IME_CANDIDATE, + RoleType.INLINE_TEXT_BOX, + RoleType.LINE_BREAK, + RoleType.LIST_MARKER, + RoleType.PARAGRAPH, + RoleType.PLUGIN_OBJECT, + RoleType.ROOT_WEB_AREA, + RoleType.STATIC_TEXT, + RoleType.WINDOW, ]; missingState = missingState.filter(function(state) { return notStated.indexOf(state) === -1; @@ -1027,10 +1064,16 @@ const roleOrRoleDescStr = '$role'; const missingRole = []; const allowedMissingRoles = [ - RoleType.CLIENT, RoleType.GENERIC_CONTAINER, RoleType.EMBEDDED_OBJECT, - RoleType.IME_CANDIDATE, RoleType.INLINE_TEXT_BOX, RoleType.LINE_BREAK, - RoleType.LIST_MARKER, RoleType.ROOT_WEB_AREA, RoleType.STATIC_TEXT, - RoleType.WINDOW + RoleType.CLIENT, + RoleType.GENERIC_CONTAINER, + RoleType.EMBEDDED_OBJECT, + RoleType.IME_CANDIDATE, + RoleType.INLINE_TEXT_BOX, + RoleType.LINE_BREAK, + RoleType.LIST_MARKER, + RoleType.ROOT_WEB_AREA, + RoleType.STATIC_TEXT, + RoleType.WINDOW, ]; for (const key in Output.RULES.navigate) { if (allowedMissingRoles.indexOf(key) !== -1) { @@ -1183,8 +1226,8 @@ string_: 'label|title', spans_: [ {value: 'name', start: 0, end: 5}, - {value: 'description', start: 6, end: 11} - ] + {value: 'description', start: 6, end: 11}, + ], }, o.speechOutputForTest); @@ -1196,8 +1239,8 @@ string_: 'title|describedby', spans_: [ {value: 'name', start: 0, end: 5}, - {value: 'description', start: 6, end: 17} - ] + {value: 'description', start: 6, end: 17}, + ], }, o.speechOutputForTest); @@ -1209,8 +1252,8 @@ string_: 'label|describedby', spans_: [ {value: 'name', start: 0, end: 5}, - {value: 'description', start: 6, end: 17} - ] + {value: 'description', start: 6, end: 17}, + ], }, o.speechOutputForTest); @@ -1224,7 +1267,7 @@ assertEqualsJSON( { string_: 'tooltip', - spans_: [{value: {'delay': true}, start: 0, end: 7}] + spans_: [{value: {'delay': true}, start: 0, end: 7}], }, o.speechOutputForTest); }); @@ -1247,7 +1290,7 @@ o.withInitialSpeechProperties({ phoneticCharacters: true, // This should not override existing value. - category: TtsCategory.LIVE + category: TtsCategory.LIVE, }); o.go(); assertEqualsJSON( @@ -1306,8 +1349,8 @@ string_: 'OK|error|Press Search+Space to activate', spans_: [ {value: 'name', start: 3, end: 8}, - {value: {delay: true}, start: 9, end: 39} - ] + {value: {delay: true}, start: 9, end: 39}, + ], }, o.speechOutputForTest); @@ -1318,8 +1361,9 @@ string_: 'OK|error|placeholder|Press Search+Space to activate', spans_: [ {value: 'name', start: 3, end: 8}, - {value: {delay: true}, start: 9, end: 20}, {start: 21, end: 51} - ] + {value: {delay: true}, start: 9, end: 20}, + {start: 21, end: 51}, + ], }, o.speechOutputForTest); }); @@ -1359,7 +1403,7 @@ [ {value: new OutputEarconAction('CHECK_OFF'), start: 0, end: 0}, {value: 'role', start: 1, end: 10}, - {value: 'checkedStateDescription', start: 11, end: 36} + {value: 'checkedStateDescription', start: 11, end: 36}, ], o); }); @@ -1376,7 +1420,7 @@ 'test|Actions available. Press Search+Ctrl+A to view', [ {value: 'name', start: 0, end: 4}, - {value: {delay: true}, start: 5, end: 51} + {value: {delay: true}, start: 5, end: 51}, ], o); });
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_types.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_types.js index 6bcd027..9cc3b4ce 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_types.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_types.js
@@ -21,7 +21,7 @@ LAST: 'last', // Ancestor context is placed both before and after node output. - FIRST_AND_LAST: 'firstAndLast' + FIRST_AND_LAST: 'firstAndLast', }; /** @@ -123,5 +123,5 @@ * @enum {string} */ export const OutputEventType = { - NAVIGATE: 'navigate' + NAVIGATE: 'navigate', };
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/i_search_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/i_search_test.js index ad36353..f247e95f 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/i_search_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/i_search_test.js
@@ -4,7 +4,7 @@ // Include test fixture. GEN_INCLUDE([ - '//chrome/browser/resources/chromeos/accessibility/chromevox/testing/chromevox_next_e2e_test_base.js' + '//chrome/browser/resources/chromeos/accessibility/chromevox/testing/chromevox_next_e2e_test_base.js', ]); /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_background.js index b7650c47..812871a9 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_background.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_background.js
@@ -241,7 +241,7 @@ o.withString([ node.name.substr(0, opt_start), node.name.substr(opt_start, opt_end - opt_start), - node.name.substr(opt_end) + node.name.substr(opt_end), ].join(', ')); o.format('$role', node); } else {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_node_menu_background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_node_menu_background.js index a8347460..7b6fd20 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_node_menu_background.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_node_menu_background.js
@@ -68,7 +68,7 @@ this.walker_ = new AutomationTreeWalker(root, constants.Dir.FORWARD, { visit(node) { return !AutomationPredicate.shouldIgnoreNode(node); - } + }, }); this.nodeCount_ = 0; this.findMoreNodes_();
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_node_menu_background_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_node_menu_background_test.js index 2bbdcbde..17945a3 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_node_menu_background_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_node_menu_background_test.js
@@ -9,7 +9,7 @@ // Fake Msgs object. const Msgs = { - getMsg: (id) => (id === 'panel_menu_item_none' ? 'None' : '_') + getMsg: (id) => (id === 'panel_menu_item_none' ? 'None' : '_'), }; // Fake PanelBridge. @@ -123,7 +123,7 @@ Documents.main, Documents.navigation, Documents.region, - Documents.search + Documents.search, ].join('\n'); } @@ -141,14 +141,14 @@ Documents.table, Documents.region, Documents.link, - Documents.header + Documents.header, ].join('\n'); } get tablesDoc() { return [ - Documents.grid, - Documents.table + Documents.grid, + Documents.table, ].join('\n'); } };
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/portals_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/portals_test.js index be63a608..ececb1cf 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/portals_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/portals_test.js
@@ -73,7 +73,7 @@ AX_TEST_F('ChromeVoxPortalsTest', 'ShouldFocusPortal', async function() { const root = await this.runWithLoadedTree(null, { - url: `${testRunnerParams.testServerBaseUrl}portal/portal-and-button.html` + url: `${testRunnerParams.testServerBaseUrl}portal/portal-and-button.html`, }); const portal = root.find({role: RoleType.PORTAL}); const button = root.find({role: RoleType.BUTTON}); @@ -98,7 +98,7 @@ AX_TEST_F('ChromeVoxPortalsTest', 'PortalName', async function() { const root = await this.runWithLoadedTree(null, { - url: `${testRunnerParams.testServerBaseUrl}portal/portal-with-text.html` + url: `${testRunnerParams.testServerBaseUrl}portal/portal-with-text.html`, }); const portal = root.find({role: RoleType.PORTAL}); assertEquals(RoleType.PORTAL, portal.role);
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/prefs.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/prefs.js index a60edab..c41c03c4 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/prefs.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/prefs.js
@@ -199,7 +199,7 @@ 'textChanged': true, 'textSelectionChanged': true, 'treeChanged': true, - 'valueInTextFieldChanged': true + 'valueInTextFieldChanged': true, };
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/range_automation_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/range_automation_handler.js index fb999bc..069c40b 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/range_automation_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/range_automation_handler.js
@@ -215,7 +215,7 @@ new CustomAutomationEvent(EventType.CHECKED_STATE_CHANGED, evt.target, { eventFrom: evt.eventFrom, eventFromAction: evt.eventFromAction, - intents: evt.intents + intents: evt.intents, }); this.onEventIfInRange(event); }
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/tts_background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/tts_background.js index e0abeba..c57ec7a 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/tts_background.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/tts_background.js
@@ -892,8 +892,17 @@ * @const */ TtsBackground.ALLOWED_PROPERTIES_ = [ - 'desiredEventTypes', 'enqueue', 'extensionId', 'gender', 'lang', 'onEvent', - 'pitch', 'rate', 'requiredEventTypes', 'voiceName', 'volume' + 'desiredEventTypes', + 'enqueue', + 'extensionId', + 'gender', + 'lang', + 'onEvent', + 'pitch', + 'rate', + 'requiredEventTypes', + 'voiceName', + 'volume', ];
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/tts_background_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/tts_background_test.js index 1f2da8a5..53ba75f5 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/tts_background_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/tts_background_test.js
@@ -98,7 +98,7 @@ {lang: 'zh-CN', voiceName: 'Chinese'}, {lang: 'zh-TW', voiceName: 'Chinese (Taiwan)'}, {lang: 'es', voiceName: 'Spanish'}, - {lang: 'en-US', voiceName: 'U.S. English'} + {lang: 'en-US', voiceName: 'U.S. English'}, ]; chrome.tts.getVoices = function(callback) { @@ -131,7 +131,7 @@ voices[3].lang = 'en'; }, testVoice: 'U.S. English', - expectedVoice: 'U.S. English' + expectedVoice: 'U.S. English', }, { @@ -140,7 +140,7 @@ voices[3].voiceName = 'French'; }, testVoice: '', - expectedVoice: constants.SYSTEM_VOICE + expectedVoice: constants.SYSTEM_VOICE, }, {testVoice: 'French', expectedVoice: 'French'}, @@ -165,7 +165,7 @@ ++endCalls; assertEquals(speakCalls, endCalls); assertEquals(endCalls, startCalls); - }) + }), }); }; @@ -438,7 +438,7 @@ this.expectUtteranceQueueIsLike([ {textString: 'Hi', queueMode: QueueMode.FLUSH}, {textString: 'there.', queueMode: QueueMode.QUEUE}, - {textString: 'How are you?', queueMode: QueueMode.QUEUE} + {textString: 'How are you?', queueMode: QueueMode.QUEUE}, ]); // Interject a single utterance now. @@ -456,14 +456,14 @@ {textString: 'Sorry; busy!', queueMode: QueueMode.INTERJECT}, {textString: 'Hi', queueMode: QueueMode.FLUSH}, {textString: 'there.', queueMode: QueueMode.QUEUE}, - {textString: 'How are you?', queueMode: QueueMode.QUEUE} + {textString: 'How are you?', queueMode: QueueMode.QUEUE}, ]); // Try interjecting again. Notice it interrupts the previous interjection. tts.speak('Actually, not busy after all!', QueueMode.INTERJECT, {}); this.expectUtteranceQueueIsLike([{ textString: 'Actually, not busy after all!', - queueMode: QueueMode.INTERJECT + queueMode: QueueMode.INTERJECT, }]); // Before the end of the current callstack, simulated by calling the callback @@ -474,10 +474,10 @@ this.expectUtteranceQueueIsLike([ { textString: 'Actually, not busy after all!', - queueMode: QueueMode.INTERJECT + queueMode: QueueMode.INTERJECT, }, {textString: 'I am good.', queueMode: QueueMode.QUEUE}, - {textString: 'How about you?', queueMode: QueueMode.QUEUE} + {textString: 'How about you?', queueMode: QueueMode.QUEUE}, ]); // The above call should have resulted in a setTimeout; call it. @@ -489,13 +489,13 @@ this.expectUtteranceQueueIsLike([ { textString: 'Actually, not busy after all!', - queueMode: QueueMode.INTERJECT + queueMode: QueueMode.INTERJECT, }, {textString: 'I am good.', queueMode: QueueMode.INTERJECT}, {textString: 'How about you?', queueMode: QueueMode.INTERJECT}, {textString: 'Hi', queueMode: QueueMode.FLUSH}, {textString: 'there.', queueMode: QueueMode.QUEUE}, - {textString: 'How are you?', queueMode: QueueMode.QUEUE} + {textString: 'How are you?', queueMode: QueueMode.QUEUE}, ]); // Interject again. Notice all previous interjections get cancelled again. @@ -513,7 +513,7 @@ {textString: 'Sorry! Gotta go!', queueMode: QueueMode.INTERJECT}, {textString: 'Hi', queueMode: QueueMode.FLUSH}, {textString: 'there.', queueMode: QueueMode.QUEUE}, - {textString: 'How are you?', queueMode: QueueMode.QUEUE} + {textString: 'How are you?', queueMode: QueueMode.QUEUE}, ]); }); @@ -531,7 +531,7 @@ tts.speak('world.', QueueMode.QUEUE, {}); this.expectUtteranceQueueIsLike([ {textString: 'Hello', queueMode: QueueMode.FLUSH}, - {textString: 'world.', queueMode: QueueMode.QUEUE} + {textString: 'world.', queueMode: QueueMode.QUEUE}, ]); // Toggle speech off.
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/user_action_monitor.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/user_action_monitor.js index 3e6fad84..2ca1796c 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/user_action_monitor.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/user_action_monitor.js
@@ -307,7 +307,7 @@ value, shouldPropagate, beforeActionCallback, - afterActionCallback + afterActionCallback, }); }
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/user_action_monitor_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/user_action_monitor_test.js index 9b08552..40336a05 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/user_action_monitor_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/user_action_monitor_test.js
@@ -55,7 +55,7 @@ value: {'keys': {'keyCode': [KeyCode.SPACE]}}, }, {type: 'braille', value: 'jumpToTop'}, - {type: 'gesture', value: Gesture.SWIPE_UP1} + {type: 'gesture', value: Gesture.SWIPE_UP1}, ]; const onFinished = () => finished = true; @@ -84,7 +84,7 @@ {type: 'key_sequence', value: {keys: {keyCode: [KeyCode.SPACE]}}}); const keySequenceActionTwo = new UserActionMonitor.Action({ type: 'key_sequence', - value: new KeySequence(TestUtils.createMockKeyEvent(KeyCode.A)) + value: new KeySequence(TestUtils.createMockKeyEvent(KeyCode.A)), }); const gestureActionOne = UserActionMonitor.Action.fromActionInfo( {type: 'gesture', value: Gesture.SWIPE_UP1}); @@ -198,14 +198,14 @@ type: 'gesture', value: Gesture.SWIPE_UP1, beforeActionMsg: 'First instruction', - afterActionMsg: 'Congratulations!' + afterActionMsg: 'Congratulations!', }, { type: 'gesture', value: Gesture.SWIPE_UP1, beforeActionMsg: 'Second instruction', - afterActionMsg: 'You did it!' - } + afterActionMsg: 'You did it!', + }, ]; const onFinished = () => finished = true; @@ -257,7 +257,7 @@ let finished = false; const actions = [{ type: 'key_sequence', - value: {'cvoxModifier': true, 'keys': {'keyCode': [KeyCode.O, KeyCode.B]}} + value: {'cvoxModifier': true, 'keys': {'keyCode': [KeyCode.O, KeyCode.B]}}, }]; const onFinished = () => finished = true; @@ -291,18 +291,18 @@ type: 'key_sequence', value: { 'keys': - {'altKey': [true], 'shiftKey': [true], 'keyCode': [KeyCode.L]} + {'altKey': [true], 'shiftKey': [true], 'keyCode': [KeyCode.L]}, }, - afterActionMsg: 'You pressed the first sequence!' + afterActionMsg: 'You pressed the first sequence!', }, { type: 'key_sequence', value: { 'keys': - {'altKey': [true], 'shiftKey': [true], 'keyCode': [KeyCode.S]} + {'altKey': [true], 'shiftKey': [true], 'keyCode': [KeyCode.S]}, }, - afterActionMsg: 'You pressed the second sequence!' - } + afterActionMsg: 'You pressed the second sequence!', + }, ]; const onFinished = () => finished = true; @@ -341,12 +341,12 @@ const actions = [ { type: 'key_sequence', - value: {'cvoxModifier': true, 'keys': {'keyCode': [KeyCode.RIGHT]}} + value: {'cvoxModifier': true, 'keys': {'keyCode': [KeyCode.RIGHT]}}, }, { type: 'key_sequence', - value: {'cvoxModifier': true, 'keys': {'keyCode': [KeyCode.LEFT]}} - } + value: {'cvoxModifier': true, 'keys': {'keyCode': [KeyCode.LEFT]}}, + }, ]; const onFinished = () => finished = true; @@ -439,7 +439,7 @@ const actions = [{ type: 'key_sequence', value: {keys: {keyCode: [KeyCode.CONTROL]}}, - shouldPropagate: false + shouldPropagate: false, }]; const onFinished = () => finished = true; UserActionMonitor.create(actions, onFinished); @@ -477,7 +477,7 @@ const actions = [{ type: 'gesture', value: Gesture.SWIPE_RIGHT1, - afterActionCmd: 'announceBatteryDescription' + afterActionCmd: 'announceBatteryDescription', }]; const onFinished = () => finished = true;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/abstract_tts.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/abstract_tts.js index 07e2206..b645a15 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/abstract_tts.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/abstract_tts.js
@@ -321,7 +321,7 @@ name: 'none', msg: 'no_punctuation', regexp: /[-$#"()*;:<>\n\\\/+='~`@_]/g, - clear: true + clear: true, }, // Punctuation echoed for the 'some' option. @@ -329,7 +329,7 @@ name: 'some', msg: 'some_punctuation', regexp: /[$#"*<>\\\/\{\}+=~`%\u2022\u25e6\u25a0]/g, - clear: false + clear: false, }, // Punctuation echoed for the 'all' option. @@ -337,8 +337,8 @@ name: 'all', msg: 'all_punctuation', regexp: /[-$#"()*;:<>\n\\\/\{\}\[\]+='~`!@_.,?%\u2022\u25e6\u25a0]/g, - clear: false - } + clear: false, + }, ]; /** TTS pause property. @type {string} */ @@ -353,7 +353,7 @@ 'relativePitch': -0.25, // TODO:(rshearer) Added this color change for I/O presentation. 'color': 'yellow', - 'punctuationEcho': 'none' + 'punctuationEcho': 'none', }; @@ -363,7 +363,7 @@ * @type {Object} */ AbstractTts.PERSONALITY_ANNOUNCEMENT = { - 'punctuationEcho': 'none' + 'punctuationEcho': 'none', }; /** @@ -373,7 +373,7 @@ */ AbstractTts.PERSONALITY_SYSTEM_ALERT = { 'punctuationEcho': 'none', - 'doNotInterrupt': true + 'doNotInterrupt': true, }; /** @@ -382,7 +382,7 @@ */ AbstractTts.PERSONALITY_ASIDE = { 'relativePitch': -0.1, - 'color': '#669' + 'color': '#669', }; @@ -391,7 +391,7 @@ * @type {Object} */ AbstractTts.PERSONALITY_CAPITAL = { - 'relativePitch': 0.2 + 'relativePitch': 0.2, }; @@ -401,7 +401,7 @@ */ AbstractTts.PERSONALITY_DELETED = { 'punctuationEcho': 'none', - 'relativePitch': -0.6 + 'relativePitch': -0.6, }; @@ -412,7 +412,7 @@ AbstractTts.PERSONALITY_QUOTE = { 'relativePitch': 0.1, 'color': '#b6b', - 'fontWeight': 'bold' + 'fontWeight': 'bold', }; @@ -423,7 +423,7 @@ AbstractTts.PERSONALITY_STRONG = { 'relativePitch': 0.1, 'color': '#b66', - 'fontWeight': 'bold' + 'fontWeight': 'bold', }; @@ -435,7 +435,7 @@ 'relativeVolume': 0.1, 'relativeRate': -0.1, 'color': '#6bb', - 'fontWeight': 'bold' + 'fontWeight': 'bold', }; @@ -491,7 +491,7 @@ '\\': 'backslash', '\u2022': 'bullet', '\u25e6': 'white_bullet', - '\u25a0': 'square_bullet' + '\u25a0': 'square_bullet', }; @@ -552,7 +552,7 @@ '\u25c4': 'left pointer', '\u25c5': 'left pointer', '\uf8ff': 'apple', - '£': 'pound sterling' + '£': 'pound sterling', };
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/braille/braille_key_types.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/braille/braille_key_types.js index 38ce3df..bb32871 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/braille/braille_key_types.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/braille/braille_key_types.js
@@ -32,7 +32,7 @@ SECONDARY_ROUTING: 'secondary_routing', DOTS: 'dots', CHORD: 'chord', - STANDARD_KEY: 'standard_key' + STANDARD_KEY: 'standard_key', }; @@ -148,7 +148,7 @@ 0b10110: '6', 0b110110: '7', 0b100110: '8', - 0b10100: '9' + 0b10100: '9', }; /** @@ -159,7 +159,7 @@ 0b1000000: 'Backspace', 0b10100: 'Tab', 0b110101: 'Escape', - 0b101000: 'Enter' + 0b101000: 'Enter', }; /** @@ -170,7 +170,7 @@ 0b100100: {altKey: true}, 0b1000100: {shiftKey: true}, 0b1010010: {ctrlKey: true, shiftKey: true}, - 0b1100100: {altKey: true, shiftKey: true} + 0b1100100: {altKey: true, shiftKey: true}, }; @@ -194,7 +194,7 @@ 'Insert': KeyCode.INSERT, 'Delete': KeyCode.DELETE, 'AudioVolumeDown': KeyCode.VOLUME_DOWN, - 'AudioVolumeUp': KeyCode.VOLUME_UP + 'AudioVolumeUp': KeyCode.VOLUME_UP, }; (function() {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/braille/nav_braille.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/braille/nav_braille.js index 08dedcc7..8002d5b3 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/braille/nav_braille.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/braille/nav_braille.js
@@ -72,7 +72,7 @@ return new NavBraille({ text: Spannable.fromJson(json.spannable), startIndex: json.startIndex, - endIndex: json.endIndex + endIndex: json.endIndex, }); } @@ -104,7 +104,7 @@ return { spannable: this.text.toJson(), startIndex: this.startIndex, - endIndex: this.endIndex + endIndex: this.endIndex, }; } };
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/command_store.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/command_store.js index 7c10b02..344a0d4 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/command_store.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/command_store.js
@@ -141,7 +141,7 @@ 'passThroughMode': { announce: false, msgId: 'pass_through_key_description', - category: 'modifier_keys' + category: 'modifier_keys', }, 'stopSpeech': { @@ -149,53 +149,53 @@ denyContinuation: true, doDefault: true, msgId: 'stop_speech_key', - category: 'controlling_speech' + category: 'controlling_speech', }, 'openChromeVoxMenus': {announce: false, msgId: 'menus_title'}, 'resetTextToSpeechSettings': { announce: false, msgId: 'reset_tts_settings', - category: 'controlling_speech' + category: 'controlling_speech', }, 'decreaseTtsRate': { announce: false, msgId: 'decrease_tts_rate', - category: 'controlling_speech' + category: 'controlling_speech', }, 'increaseTtsRate': { announce: false, msgId: 'increase_tts_rate', - category: 'controlling_speech' + category: 'controlling_speech', }, 'decreaseTtsPitch': { announce: false, msgId: 'decrease_tts_pitch', - category: 'controlling_speech' + category: 'controlling_speech', }, 'increaseTtsPitch': { announce: false, msgId: 'increase_tts_pitch', - category: 'controlling_speech' + category: 'controlling_speech', }, 'decreaseTtsVolume': { announce: false, msgId: 'decrease_tts_volume', - category: 'controlling_speech' + category: 'controlling_speech', }, 'increaseTtsVolume': { announce: false, msgId: 'increase_tts_volume', - category: 'controlling_speech' + category: 'controlling_speech', }, 'cyclePunctuationEcho': { announce: false, msgId: 'cycle_punctuation_echo', - category: 'controlling_speech' + category: 'controlling_speech', }, 'cycleTypingEcho': { announce: false, msgId: 'cycle_typing_echo', - category: 'controlling_speech' + category: 'controlling_speech', }, 'toggleDictation': @@ -211,13 +211,13 @@ allowEvents: true, msgId: 'handle_tab_next', denyContinuation: true, - category: 'navigation' + category: 'navigation', }, 'handleTabPrev': { allowEvents: true, msgId: 'handle_tab_prev', denyContinuation: true, - category: 'navigation' + category: 'navigation', }, 'forward': {forward: true, announce: true, msgId: 'forward', category: 'navigation'}, @@ -225,7 +225,7 @@ backward: true, announce: true, msgId: 'backward', - category: 'navigation' + category: 'navigation', }, 'right': {forward: true, announce: true, msgId: 'right', category: 'navigation'}, @@ -238,7 +238,7 @@ 'previousAtGranularity': { announce: true, msgId: 'previous_at_granularity', - category: 'navigation' + category: 'navigation', }, 'nextAtGranularity': {announce: true, msgId: 'next_at_granularity', category: 'navigation'}, @@ -248,119 +248,119 @@ announce: true, msgId: 'previous_character', skipInput: true, - category: 'navigation' + category: 'navigation', }, 'nextCharacter': { forward: true, announce: true, msgId: 'next_character', skipInput: true, - category: 'navigation' + category: 'navigation', }, 'previousWord': { backward: true, announce: true, msgId: 'previous_word', skipInput: true, - category: 'navigation' + category: 'navigation', }, 'nextWord': { forward: true, announce: true, msgId: 'next_word', skipInput: true, - category: 'navigation' + category: 'navigation', }, 'previousLine': { backward: true, announce: true, msgId: 'previous_line', - category: 'navigation' + category: 'navigation', }, 'nextLine': { forward: true, announce: true, msgId: 'next_line', - category: 'navigation' + category: 'navigation', }, 'previousSentence': { backward: true, announce: true, msgId: 'previous_sentence', skipInput: true, - category: 'navigation' + category: 'navigation', }, 'nextSentence': { forward: true, announce: true, msgId: 'next_sentence', skipInput: true, - category: 'navigation' + category: 'navigation', }, 'previousObject': { backward: true, announce: true, msgId: 'previous_object', skipInput: true, - category: 'navigation' + category: 'navigation', }, 'nextObject': { forward: true, announce: true, msgId: 'next_object', skipInput: true, - category: 'navigation' + category: 'navigation', }, 'previousGroup': { backward: true, announce: true, msgId: 'previous_group', skipInput: true, - category: 'navigation' + category: 'navigation', }, 'nextGroup': { forward: true, announce: true, msgId: 'next_group', skipInput: true, - category: 'navigation' + category: 'navigation', }, 'previousSimilarItem': { backward: true, announce: true, msgId: 'previous_similar_item', - category: 'navigation' + category: 'navigation', }, 'nextSimilarItem': { forward: true, announce: true, msgId: 'next_similar_item', - category: 'navigation' + category: 'navigation', }, 'previousInvalidItem': { backward: true, announce: true, msgId: 'previous_invalid_item', - category: 'navigation' + category: 'navigation', }, 'nextInvalidItem': { forward: true, announce: true, msgId: 'next_invalid_item', - category: 'navigation' + category: 'navigation', }, 'jumpToTop': { forward: true, announce: true, msgId: 'jump_to_top', - category: 'navigation' + category: 'navigation', }, 'jumpToBottom': { backward: true, announce: true, msgId: 'jump_to_bottom', - category: 'navigation' + category: 'navigation', }, // Intentionally uncategorized. 'moveToStartOfLine': {forward: true, announce: true}, @@ -373,7 +373,7 @@ forward: true, announce: false, msgId: 'read_from_here', - category: 'navigation' + category: 'navigation', }, 'forceClickOnCurrentItem': { @@ -381,7 +381,7 @@ denyContinuation: true, allowEvents: true, msgId: 'force_click_on_current_item', - category: 'actions' + category: 'actions', }, 'forceDoubleClickOnCurrentItem': {announce: true, allowEvents: true, denyContinuation: true}, @@ -404,7 +404,7 @@ announce: false, denyContinuation: true, msgId: 'toggle_search_widget', - category: 'information' + category: 'information', }, 'toggleScreen': @@ -417,7 +417,7 @@ announce: false, denyContinuation: true, msgId: 'show_panel_menu', - category: 'help_commands' + category: 'help_commands', }, 'showPanelMenuMostRecent': {announce: false, msgId: 'show_panel_menu', category: 'help_commands'}, @@ -425,13 +425,13 @@ announce: false, msgId: 'help', denyContinuation: true, - category: 'help_commands' + category: 'help_commands', }, 'contextMenu': { announce: false, msgId: 'show_context_menu', denyContinuation: true, - category: 'information' + category: 'information', }, 'showOptionsPage': { @@ -439,27 +439,27 @@ denyContinuation: true, msgId: 'show_options_page', denySignedOut: true, - category: 'help_commands' + category: 'help_commands', }, 'showLogPage': { announce: false, denyContinuation: true, msgId: 'show_log_page', denySignedOut: true, - category: 'help_commands' + category: 'help_commands', }, 'showLearnModePage': { announce: false, denyContinuation: true, msgId: 'show_kb_explorer_page', denySignedOut: true, - category: 'help_commands' + category: 'help_commands', }, 'showTtsSettings': { announce: false, msgId: 'show_tts_settings', category: 'help_commands', - denySignedOut: true + denySignedOut: true, }, 'toggleBrailleCaptions': {announce: false, msgId: 'braille_captions', category: 'help_commands'}, @@ -467,7 +467,7 @@ announce: false, denySignedOut: true, msgId: 'panel_menu_item_report_issue', - category: 'help_commands' + category: 'help_commands', }, 'showFormsList': { @@ -475,35 +475,35 @@ denyContinuation: true, nodeList: 'formField', msgId: 'show_forms_list', - category: 'overview' + category: 'overview', }, 'showHeadingsList': { announce: false, nodeList: 'heading', denyContinuation: true, msgId: 'show_headings_list', - category: 'overview' + category: 'overview', }, 'showLandmarksList': { announce: false, nodeList: 'landmark', denyContinuation: true, msgId: 'show_landmarks_list', - category: 'overview' + category: 'overview', }, 'showLinksList': { announce: false, nodeList: 'link', denyContinuation: true, msgId: 'show_links_list', - category: 'overview' + category: 'overview', }, 'showTablesList': { announce: false, nodeList: 'table', denyContinuation: true, msgId: 'show_tables_list', - category: 'overview' + category: 'overview', }, 'nextArticle': {forward: true, findNext: 'article'}, @@ -512,123 +512,123 @@ forward: true, findNext: 'button', msgId: 'next_button', - category: 'jump_commands' + category: 'jump_commands', }, 'nextCheckbox': { forward: true, findNext: 'checkbox', msgId: 'next_checkbox', - category: 'jump_commands' + category: 'jump_commands', }, 'nextComboBox': { forward: true, findNext: 'combobox', msgId: 'next_combo_box', - category: 'jump_commands' + category: 'jump_commands', }, 'nextControl': {forward: true, findNext: 'control'}, 'nextEditText': { forward: true, findNext: 'editText', msgId: 'next_edit_text', - category: 'jump_commands' + category: 'jump_commands', }, 'nextFormField': { forward: true, findNext: 'formField', msgId: 'next_form_field', - category: 'jump_commands' + category: 'jump_commands', }, 'nextGraphic': { forward: true, findNext: 'graphic', msgId: 'next_graphic', - category: 'jump_commands' + category: 'jump_commands', }, 'nextHeading': { forward: true, findNext: 'heading', msgId: 'next_heading', - category: 'jump_commands' + category: 'jump_commands', }, 'nextHeading1': { forward: true, findNext: 'heading1', msgId: 'next_heading1', - category: 'jump_commands' + category: 'jump_commands', }, 'nextHeading2': { forward: true, findNext: 'heading2', msgId: 'next_heading2', - category: 'jump_commands' + category: 'jump_commands', }, 'nextHeading3': { forward: true, findNext: 'heading3', msgId: 'next_heading3', - category: 'jump_commands' + category: 'jump_commands', }, 'nextHeading4': { forward: true, findNext: 'heading4', msgId: 'next_heading4', - category: 'jump_commands' + category: 'jump_commands', }, 'nextHeading5': { forward: true, findNext: 'heading5', msgId: 'next_heading5', - category: 'jump_commands' + category: 'jump_commands', }, 'nextHeading6': { forward: true, findNext: 'heading6', msgId: 'next_heading6', - category: 'jump_commands' + category: 'jump_commands', }, 'nextLandmark': { forward: true, findNext: 'landmark', msgId: 'next_landmark', - category: 'jump_commands' + category: 'jump_commands', }, 'nextLink': { forward: true, findNext: 'link', msgId: 'next_link', - category: 'jump_commands' + category: 'jump_commands', }, 'nextList': { forward: true, findNext: 'list', msgId: 'next_list', - category: 'jump_commands' + category: 'jump_commands', }, 'nextListItem': { forward: true, findNext: 'listItem', msgId: 'next_list_item', - category: 'jump_commands' + category: 'jump_commands', }, 'nextMath': { forward: true, findNext: 'math', msgId: 'next_math', - category: 'jump_commands' + category: 'jump_commands', }, 'nextMedia': { forward: true, findNext: 'media', msgId: 'next_media', - category: 'jump_commands' + category: 'jump_commands', }, 'nextRadio': { forward: true, findNext: 'radio', msgId: 'next_radio', - category: 'jump_commands' + category: 'jump_commands', }, 'nextSection': {forward: true, findNext: 'section'}, 'nextSlider': {forward: true, findNext: 'slider'}, @@ -636,13 +636,13 @@ forward: true, findNext: 'table', msgId: 'next_table', - category: 'jump_commands' + category: 'jump_commands', }, 'nextVisitedLink': { forward: true, findNext: 'visitedLink', msgId: 'next_visited_link', - category: 'jump_commands' + category: 'jump_commands', }, @@ -652,123 +652,123 @@ backward: true, findNext: 'button', msgId: 'previous_button', - category: 'jump_commands' + category: 'jump_commands', }, 'previousCheckbox': { backward: true, findNext: 'checkbox', msgId: 'previous_checkbox', - category: 'jump_commands' + category: 'jump_commands', }, 'previousComboBox': { backward: true, findNext: 'combobox', msgId: 'previous_combo_box', - category: 'jump_commands' + category: 'jump_commands', }, 'previousControl': {backward: true, findNext: 'control'}, 'previousEditText': { backward: true, findNext: 'editText', msgId: 'previous_edit_text', - category: 'jump_commands' + category: 'jump_commands', }, 'previousFormField': { backward: true, findNext: 'formField', msgId: 'previous_form_field', - category: 'jump_commands' + category: 'jump_commands', }, 'previousGraphic': { backward: true, findNext: 'graphic', msgId: 'previous_graphic', - category: 'jump_commands' + category: 'jump_commands', }, 'previousHeading': { backward: true, findNext: 'heading', msgId: 'previous_heading', - category: 'jump_commands' + category: 'jump_commands', }, 'previousHeading1': { backward: true, findNext: 'heading1', msgId: 'previous_heading1', - category: 'jump_commands' + category: 'jump_commands', }, 'previousHeading2': { backward: true, findNext: 'heading2', msgId: 'previous_heading2', - category: 'jump_commands' + category: 'jump_commands', }, 'previousHeading3': { backward: true, findNext: 'heading3', msgId: 'previous_heading3', - category: 'jump_commands' + category: 'jump_commands', }, 'previousHeading4': { backward: true, findNext: 'heading4', msgId: 'previous_heading4', - category: 'jump_commands' + category: 'jump_commands', }, 'previousHeading5': { backward: true, findNext: 'heading5', msgId: 'previous_heading5', - category: 'jump_commands' + category: 'jump_commands', }, 'previousHeading6': { backward: true, findNext: 'heading6', msgId: 'previous_heading6', - category: 'jump_commands' + category: 'jump_commands', }, 'previousLandmark': { backward: true, findNext: 'landmark', msgId: 'previous_landmark', - category: 'jump_commands' + category: 'jump_commands', }, 'previousLink': { backward: true, findNext: 'link', msgId: 'previous_link', - category: 'jump_commands' + category: 'jump_commands', }, 'previousList': { backward: true, findNext: 'list', msgId: 'previous_list', - category: 'jump_commands' + category: 'jump_commands', }, 'previousListItem': { backward: true, findNext: 'listItem', msgId: 'previous_list_item', - category: 'jump_commands' + category: 'jump_commands', }, 'previousMath': { backward: true, findNext: 'math', msgId: 'previous_math', - category: 'jump_commands' + category: 'jump_commands', }, 'previousMedia': { backward: true, findNext: 'media', msgId: 'previous_media', - category: 'jump_commands' + category: 'jump_commands', }, 'previousRadio': { backward: true, findNext: 'radio', msgId: 'previous_radio', - category: 'jump_commands' + category: 'jump_commands', }, 'previousSection': {backward: true, findNext: 'section'}, 'previousSlider': {backward: true, findNext: 'slider'}, @@ -776,13 +776,13 @@ backward: true, findNext: 'table', msgId: 'previous_table', - category: 'jump_commands' + category: 'jump_commands', }, 'previousVisitedLink': { backward: true, findNext: 'visitedLink', msgId: 'previous_visited_link', - category: 'jump_commands' + category: 'jump_commands', }, @@ -807,28 +807,28 @@ announce: true, skipInput: true, msgId: 'skip_to_prev_row', - category: 'tables' + category: 'tables', }, 'previousCol': { backward: true, announce: true, skipInput: true, msgId: 'skip_to_prev_col', - category: 'tables' + category: 'tables', }, 'nextRow': { forward: true, announce: true, skipInput: true, msgId: 'skip_to_next_row', - category: 'tables' + category: 'tables', }, 'nextCol': { forward: true, announce: true, skipInput: true, msgId: 'skip_to_next_col', - category: 'tables' + category: 'tables', }, // Generic Actions. @@ -847,17 +847,17 @@ 'announceBatteryDescription': { announce: true, msgId: 'announce_battery_description', - category: 'information' + category: 'information', }, 'announceRichTextDescription': { announce: true, msgId: 'announce_rich_text_description', - category: 'information' + category: 'information', }, 'readPhoneticPronunciation': { announce: true, msgId: 'read_phonetic_pronunciation', - category: 'information' + category: 'information', }, // Scrolling actions. @@ -873,43 +873,43 @@ announce: false, allowEvents: true, msgId: 'braille_routing', - category: 'braille' + category: 'braille', }, 'pan_left': { backward: true, announce: true, msgId: 'braille_pan_left', - category: 'braille' + category: 'braille', }, 'pan_right': { forward: true, announce: true, msgId: 'braille_pan_right', - category: 'braille' + category: 'braille', }, 'line_up': { backward: true, announce: true, msgId: 'braille_line_up', - category: 'braille' + category: 'braille', }, 'line_down': { forward: true, announce: true, msgId: 'braille_line_down', - category: 'braille' + category: 'braille', }, 'top': { forward: true, announce: true, msgId: 'braille_top', - category: 'braille' + category: 'braille', }, 'bottom': { backward: true, announce: true, msgId: 'braille_bottom', - category: 'braille' + category: 'braille', }, 'viewGraphicAsBraille': {announce: true, msgId: 'view_graphic_as_braille', category: 'braille'}, @@ -924,7 +924,7 @@ 'debug': {announce: false}, - 'nop': {announce: false} + 'nop': {announce: false}, }; @@ -943,148 +943,148 @@ predicate: 'checkboxPredicate', forwardError: 'no_next_checkbox', backwardError: 'no_previous_checkbox', - typeMsg: 'role_checkbox' + typeMsg: 'role_checkbox', }, 'radio': { predicate: 'radioPredicate', forwardError: 'no_next_radio_button', backwardError: 'no_previous_radio_button', - typeMsg: 'role_radio' + typeMsg: 'role_radio', }, 'slider': { predicate: 'sliderPredicate', forwardError: 'no_next_slider', backwardError: 'no_previous_slider', - typeMsg: 'role_slider' + typeMsg: 'role_slider', }, 'graphic': { predicate: 'graphicPredicate', forwardError: 'no_next_graphic', backwardError: 'no_previous_graphic', - typeMsg: 'UNUSED' + typeMsg: 'UNUSED', }, 'article': { predicate: 'articlePredicate', forwardError: 'no_next_ARTICLE', backwardError: 'no_previous_ARTICLE', - typeMsg: 'TAG_ARTICLE' + typeMsg: 'TAG_ARTICLE', }, 'button': { predicate: 'buttonPredicate', forwardError: 'no_next_button', backwardError: 'no_previous_button', - typeMsg: 'role_button' + typeMsg: 'role_button', }, 'combobox': { predicate: 'comboBoxPredicate', forwardError: 'no_next_combo_box', backwardError: 'no_previous_combo_box', - typeMsg: 'role_combobox' + typeMsg: 'role_combobox', }, 'editText': { predicate: 'editTextPredicate', forwardError: 'no_next_edit_text', backwardError: 'no_previous_edit_text', - typeMsg: 'input_type_text' + typeMsg: 'input_type_text', }, 'heading': { predicate: 'headingPredicate', forwardError: 'no_next_heading', backwardError: 'no_previous_heading', - typeMsg: 'role_heading' + typeMsg: 'role_heading', }, 'heading1': { predicate: 'heading1Predicate', forwardError: 'no_next_heading_1', - backwardError: 'no_previous_heading_1' + backwardError: 'no_previous_heading_1', }, 'heading2': { predicate: 'heading2Predicate', forwardError: 'no_next_heading_2', - backwardError: 'no_previous_heading_2' + backwardError: 'no_previous_heading_2', }, 'heading3': { predicate: 'heading3Predicate', forwardError: 'no_next_heading_3', - backwardError: 'no_previous_heading_3' + backwardError: 'no_previous_heading_3', }, 'heading4': { predicate: 'heading4Predicate', forwardError: 'no_next_heading_4', - backwardError: 'no_previous_heading_4' + backwardError: 'no_previous_heading_4', }, 'heading5': { predicate: 'heading5Predicate', forwardError: 'no_next_heading_5', - backwardError: 'no_previous_heading_5' + backwardError: 'no_previous_heading_5', }, 'heading6': { predicate: 'heading6Predicate', forwardError: 'no_next_heading_6', - backwardError: 'no_previous_heading_6' + backwardError: 'no_previous_heading_6', }, 'link': { predicate: 'linkPredicate', forwardError: 'no_next_link', backwardError: 'no_previous_link', - typeMsg: 'role_link' + typeMsg: 'role_link', }, 'table': { predicate: 'tablePredicate', forwardError: 'no_next_table', backwardError: 'no_previous_table', - typeMsg: 'table_strategy' + typeMsg: 'table_strategy', }, 'visitedLink': { predicate: 'visitedLinkPredicate', forwardError: 'no_next_visited_link', backwardError: 'no_previous_visited_link', - typeMsg: 'role_link' + typeMsg: 'role_link', }, 'list': { predicate: 'listPredicate', forwardError: 'no_next_list', backwardError: 'no_previous_list', - typeMsg: 'role_list' + typeMsg: 'role_list', }, 'listItem': { predicate: 'listItemPredicate', forwardError: 'no_next_list_item', backwardError: 'no_previous_list_item', - typeMsg: 'role_listitem' + typeMsg: 'role_listitem', }, 'formField': { predicate: 'formFieldPredicate', forwardError: 'no_next_form_field', backwardError: 'no_previous_form_field', - typeMsg: 'role_form' + typeMsg: 'role_form', }, 'landmark': { predicate: 'landmarkPredicate', forwardError: 'no_next_landmark', backwardError: 'no_previous_landmark', - typeMsg: 'role_landmark' + typeMsg: 'role_landmark', }, 'math': { predicate: 'mathPredicate', forwardError: 'no_next_math', backwardError: 'no_previous_math', - typeMsg: 'math_expr' + typeMsg: 'math_expr', }, 'media': { predicate: 'mediaPredicate', forwardError: 'no_next_media_widget', - backwardError: 'no_previous_media_widget' + backwardError: 'no_previous_media_widget', }, 'section': { predicate: 'sectionPredicate', forwardError: 'no_next_section', - backwardError: 'no_previous_section' + backwardError: 'no_previous_section', }, 'control': { predicate: 'controlPredicate', forwardError: 'no_next_control', - backwardError: 'no_previous_control' - } + backwardError: 'no_previous_control', + }, };
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/event_source_type.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/event_source_type.js index 74ef9a81..c8b911f0 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/event_source_type.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/event_source_type.js
@@ -11,5 +11,5 @@ NONE: 'none', BRAILLE_KEYBOARD: 'brailleKeyboard', STANDARD_KEYBOARD: 'standardKeyboard', - TOUCH_GESTURE: 'touchGesture' + TOUCH_GESTURE: 'touchGesture', };
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/gesture_command_data.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/gesture_command_data.js index 15900d18..da63564 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/gesture_command_data.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/gesture_command_data.js
@@ -25,44 +25,44 @@ 'swipeUp1': { msgId: 'swipeup1_gesture', command: 'previousAtGranularity', - menuKeyOverride: {keyCode: KeyCode.UP} + menuKeyOverride: {keyCode: KeyCode.UP}, }, 'swipeDown1': { msgId: 'swipedown1_gesture', command: 'nextAtGranularity', - menuKeyOverride: {keyCode: KeyCode.DOWN} + menuKeyOverride: {keyCode: KeyCode.DOWN}, }, 'swipeLeft1': { msgId: 'swipeleft1_gesture', command: 'previousObject', - menuKeyOverride: {keyCode: KeyCode.LEFT} + menuKeyOverride: {keyCode: KeyCode.LEFT}, }, 'swipeRight1': { msgId: 'swiperight1_gesture', command: 'nextObject', - menuKeyOverride: {keyCode: KeyCode.RIGHT} + menuKeyOverride: {keyCode: KeyCode.RIGHT}, }, 'swipeUp2': {msgId: 'swipeup2_gesture', command: 'jumpToTop'}, 'swipeDown2': {msgId: 'swipedown2_gesture', command: 'readFromHere'}, 'swipeLeft2': { msgId: 'swipeleft2_gesture', commandDescriptionMsgId: 'escape_gesture_description', - globalKey: {keyCode: KeyCode.ESCAPE} + globalKey: {keyCode: KeyCode.ESCAPE}, }, 'swipeRight2': { msgId: 'swiperight2_gesture', commandDescriptionMsgId: 'enter_gesture_description', - globalKey: {keyCode: KeyCode.RETURN} + globalKey: {keyCode: KeyCode.RETURN}, }, 'swipeUp3': { msgId: 'swipeup3_gesture', commandDescriptionMsgId: 'next_page_gesture_description', - command: 'nextPage' + command: 'nextPage', }, 'swipeDown3': { msgId: 'swipedown3_gesture', commandDescriptionMsgId: 'previous_page_gesture_description', - command: 'previousPage' + command: 'previousPage', }, 'swipeLeft3': {msgId: 'swipeleft3_gesture', command: 'previousGranularity'}, 'swipeRight3': {msgId: 'swiperight3_gesture', command: 'nextGranularity'}, @@ -70,13 +70,13 @@ msgId: 'swipeleft4_gesture', commandDescriptionMsgId: 'previous_pane_gesture_description', acceleratorAction: - chrome.accessibilityPrivate.AcceleratorAction.FOCUS_PREVIOUS_PANE + chrome.accessibilityPrivate.AcceleratorAction.FOCUS_PREVIOUS_PANE, }, 'swipeRight4': { msgId: 'swiperight4_gesture', commandDescriptionMsgId: 'next_pane_gesture_description', acceleratorAction: - chrome.accessibilityPrivate.AcceleratorAction.FOCUS_NEXT_PANE + chrome.accessibilityPrivate.AcceleratorAction.FOCUS_NEXT_PANE, }, 'touchExplore': {msgId: 'touch_explore_gesture'}, @@ -96,5 +96,5 @@ HEADING: 3, LINK: 4, FORM_FIELD_CONTROL: 5, - COUNT: 6 + COUNT: 6, };
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/key_map.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/key_map.js index 377091ce..8ccce888 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/key_map.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/key_map.js
@@ -214,425 +214,438 @@ KeyMap.BINDINGS_ = [ { command: 'previousObject', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.LEFT]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.LEFT]}}, }, { command: 'previousLine', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.UP]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.UP]}}, }, { command: 'nextObject', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.RIGHT]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.RIGHT]}}, }, { command: 'nextLine', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.DOWN]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.DOWN]}}, }, { command: 'nextCharacter', - sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.RIGHT], shiftKey: [true]}} + sequence: { + cvoxModifier: true, + keys: {keyCode: [KeyCode.RIGHT], shiftKey: [true]}, + }, }, { command: 'previousCharacter', sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.LEFT], shiftKey: [true]}} + {cvoxModifier: true, keys: {keyCode: [KeyCode.LEFT], shiftKey: [true]}}, }, { command: 'nativeNextCharacter', - sequence: {cvoxModifier: false, keys: {keyCode: [KeyCode.RIGHT]}} + sequence: {cvoxModifier: false, keys: {keyCode: [KeyCode.RIGHT]}}, }, { command: 'nativePreviousCharacter', - sequence: {cvoxModifier: false, keys: {keyCode: [KeyCode.LEFT]}} + sequence: {cvoxModifier: false, keys: {keyCode: [KeyCode.LEFT]}}, }, { command: 'nextWord', sequence: { cvoxModifier: true, - keys: {keyCode: [KeyCode.RIGHT], ctrlKey: [true], shiftKey: [true]} - } + keys: {keyCode: [KeyCode.RIGHT], ctrlKey: [true], shiftKey: [true]}, + }, }, { command: 'previousWord', sequence: { cvoxModifier: true, - keys: {keyCode: [KeyCode.LEFT], ctrlKey: [true], shiftKey: [true]} - } + keys: {keyCode: [KeyCode.LEFT], ctrlKey: [true], shiftKey: [true]}, + }, }, { command: 'nativeNextWord', - sequence: - {cvoxModifier: false, keys: {keyCode: [KeyCode.RIGHT], ctrlKey: [true]}} + sequence: { + cvoxModifier: false, + keys: {keyCode: [KeyCode.RIGHT], ctrlKey: [true]}, + }, }, { command: 'nativePreviousWord', sequence: - {cvoxModifier: false, keys: {keyCode: [KeyCode.LEFT], ctrlKey: [true]}} + {cvoxModifier: false, keys: {keyCode: [KeyCode.LEFT], ctrlKey: [true]}}, }, { command: 'nextButton', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.B]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.B]}}, }, { command: 'previousButton', sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.B], shiftKey: [true]}} + {cvoxModifier: true, keys: {keyCode: [KeyCode.B], shiftKey: [true]}}, }, { command: 'nextCheckbox', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.X]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.X]}}, }, { command: 'previousCheckbox', sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.X], shiftKey: [true]}} + {cvoxModifier: true, keys: {keyCode: [KeyCode.X], shiftKey: [true]}}, }, { command: 'nextComboBox', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.C]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.C]}}, }, { command: 'previousComboBox', sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.C], shiftKey: [true]}} + {cvoxModifier: true, keys: {keyCode: [KeyCode.C], shiftKey: [true]}}, }, { command: 'nextEditText', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.E]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.E]}}, }, { command: 'previousEditText', sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.E], shiftKey: [true]}} + {cvoxModifier: true, keys: {keyCode: [KeyCode.E], shiftKey: [true]}}, }, { command: 'nextFormField', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.F]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.F]}}, }, { command: 'previousFormField', sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.F], shiftKey: [true]}} + {cvoxModifier: true, keys: {keyCode: [KeyCode.F], shiftKey: [true]}}, }, { command: 'previousGraphic', sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.G], shiftKey: [true]}} + {cvoxModifier: true, keys: {keyCode: [KeyCode.G], shiftKey: [true]}}, }, { command: 'nextGraphic', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.G]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.G]}}, }, { command: 'nextHeading', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.H]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.H]}}, }, { command: 'nextHeading1', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.ONE]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.ONE]}}, }, { command: 'nextHeading2', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.TWO]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.TWO]}}, }, { command: 'nextHeading3', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.THREE]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.THREE]}}, }, { command: 'nextHeading4', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.FOUR]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.FOUR]}}, }, { command: 'nextHeading5', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.FIVE]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.FIVE]}}, }, { command: 'nextHeading6', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.SIX]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.SIX]}}, }, { command: 'previousHeading', sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.H], shiftKey: [true]}} + {cvoxModifier: true, keys: {keyCode: [KeyCode.H], shiftKey: [true]}}, }, { command: 'previousHeading1', sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.ONE], shiftKey: [true]}} + {cvoxModifier: true, keys: {keyCode: [KeyCode.ONE], shiftKey: [true]}}, }, { command: 'previousHeading2', sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.TWO], shiftKey: [true]}} + {cvoxModifier: true, keys: {keyCode: [KeyCode.TWO], shiftKey: [true]}}, }, { command: 'previousHeading3', - sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.THREE], shiftKey: [true]}} + sequence: { + cvoxModifier: true, + keys: {keyCode: [KeyCode.THREE], shiftKey: [true]}, + }, }, { command: 'previousHeading4', sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.FOUR], shiftKey: [true]}} + {cvoxModifier: true, keys: {keyCode: [KeyCode.FOUR], shiftKey: [true]}}, }, { command: 'previousHeading5', sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.FIVE], shiftKey: [true]}} + {cvoxModifier: true, keys: {keyCode: [KeyCode.FIVE], shiftKey: [true]}}, }, { command: 'previousHeading6', sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.SIX], shiftKey: [true]}} + {cvoxModifier: true, keys: {keyCode: [KeyCode.SIX], shiftKey: [true]}}, }, { command: 'nextLink', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.L]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.L]}}, }, { command: 'previousLink', sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.L], shiftKey: [true]}} + {cvoxModifier: true, keys: {keyCode: [KeyCode.L], shiftKey: [true]}}, }, { command: 'nextTable', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.T]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.T]}}, }, { command: 'previousTable', sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.T], shiftKey: [true]}} + {cvoxModifier: true, keys: {keyCode: [KeyCode.T], shiftKey: [true]}}, }, { command: 'nextVisitedLink', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.V]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.V]}}, }, { command: 'previousVisitedLink', sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.V], shiftKey: [true]}} + {cvoxModifier: true, keys: {keyCode: [KeyCode.V], shiftKey: [true]}}, }, { command: 'nextLandmark', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.OEM_1]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.OEM_1]}}, }, { command: 'previousLandmark', - sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.OEM_1], shiftKey: [true]}} + sequence: { + cvoxModifier: true, + keys: {keyCode: [KeyCode.OEM_1], shiftKey: [true]}, + }, }, { command: 'jumpToBottom', sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.RIGHT], ctrlKey: [true]}} + {cvoxModifier: true, keys: {keyCode: [KeyCode.RIGHT], ctrlKey: [true]}}, }, { command: 'jumpToTop', sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.LEFT], ctrlKey: [true]}} + {cvoxModifier: true, keys: {keyCode: [KeyCode.LEFT], ctrlKey: [true]}}, }, { command: 'forceClickOnCurrentItem', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.SPACE]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.SPACE]}}, }, { command: 'contextMenu', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.M]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.M]}}, }, { command: 'readFromHere', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.R]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.R]}}, }, { command: 'toggleStickyMode', sequence: { skipStripping: false, doubleTap: true, - keys: {keyCode: [KeyCode.SEARCH]} - } + keys: {keyCode: [KeyCode.SEARCH]}, + }, }, { command: 'passThroughMode', sequence: { cvoxModifier: true, - keys: {keyCode: [KeyCode.ESCAPE], shiftKey: [true]} - } + keys: {keyCode: [KeyCode.ESCAPE], shiftKey: [true]}, + }, }, { command: 'toggleKeyboardHelp', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.OEM_PERIOD]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.OEM_PERIOD]}}, }, { command: 'stopSpeech', sequence: { cvoxModifier: false, - keys: {ctrlKey: [true], keyCode: [KeyCode.CONTROL]} - } + keys: {ctrlKey: [true], keyCode: [KeyCode.CONTROL]}, + }, }, { command: 'decreaseTtsRate', - sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.OEM_4], shiftKey: [true]}} + sequence: { + cvoxModifier: true, + keys: {keyCode: [KeyCode.OEM_4], shiftKey: [true]}, + }, }, { command: 'increaseTtsRate', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.OEM_4]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.OEM_4]}}, }, { command: 'decreaseTtsPitch', - sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.OEM_6], shiftKey: [true]}} + sequence: { + cvoxModifier: true, + keys: {keyCode: [KeyCode.OEM_6], shiftKey: [true]}, + }, }, { command: 'increaseTtsPitch', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.OEM_6]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.OEM_6]}}, }, { command: 'stopSpeech', - sequence: {keys: {ctrlKey: [true], keyCode: [KeyCode.CONTROL]}} + sequence: {keys: {ctrlKey: [true], keyCode: [KeyCode.CONTROL]}}, }, { command: 'cyclePunctuationEcho', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.P]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.P]}}, }, { command: 'showLearnModePage', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.O, KeyCode.K]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.O, KeyCode.K]}}, }, { command: 'cycleTypingEcho', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.T]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.T]}}, }, { command: 'showOptionsPage', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.O, KeyCode.O]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.O, KeyCode.O]}}, }, { command: 'showLogPage', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.O, KeyCode.W]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.O, KeyCode.W]}}, }, { command: 'enableLogging', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.O, KeyCode.E]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.O, KeyCode.E]}}, }, { command: 'disableLogging', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.O, KeyCode.D]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.O, KeyCode.D]}}, }, { command: 'dumpTree', sequence: { cvoxModifier: true, - keys: {keyCode: [KeyCode.D, KeyCode.T], ctrlKey: [true]} - } + keys: {keyCode: [KeyCode.D, KeyCode.T], ctrlKey: [true]}, + }, }, { command: 'help', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.O, KeyCode.T]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.O, KeyCode.T]}}, }, { command: 'toggleEarcons', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.E]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.E]}}, }, { command: 'speakTimeAndDate', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.D]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.D]}}, }, { command: 'readCurrentTitle', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.W]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.W]}}, }, { command: 'readCurrentURL', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.U]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.U]}}, }, { command: 'reportIssue', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.I]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.I]}}, }, { command: 'toggleSearchWidget', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.OEM_2]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.OEM_2]}}, }, { command: 'showHeadingsList', sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.H], ctrlKey: [true]}} + {cvoxModifier: true, keys: {keyCode: [KeyCode.H], ctrlKey: [true]}}, }, { command: 'showFormsList', sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.F], ctrlKey: [true]}} + {cvoxModifier: true, keys: {keyCode: [KeyCode.F], ctrlKey: [true]}}, }, { command: 'showLandmarksList', sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.OEM_1], ctrlKey: [true]}} + {cvoxModifier: true, keys: {keyCode: [KeyCode.OEM_1], ctrlKey: [true]}}, }, { command: 'showLinksList', sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.L], ctrlKey: [true]}} + {cvoxModifier: true, keys: {keyCode: [KeyCode.L], ctrlKey: [true]}}, }, { command: 'showActionsMenu', sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.A], ctrlKey: [true]}} + {cvoxModifier: true, keys: {keyCode: [KeyCode.A], ctrlKey: [true]}}, }, { command: 'showTablesList', sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.T], ctrlKey: [true]}} + {cvoxModifier: true, keys: {keyCode: [KeyCode.T], ctrlKey: [true]}}, }, { command: 'toggleBrailleCaptions', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.B]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.B]}}, }, { command: 'toggleBrailleTable', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.G]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.G]}}, }, { command: 'viewGraphicAsBraille', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.G], altKey: [true]}} + sequence: + {cvoxModifier: true, keys: {keyCode: [KeyCode.G], altKey: [true]}}, }, { command: 'toggleSelection', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.S]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.S]}}, }, { command: 'fullyDescribe', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.K]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.K]}}, }, { command: 'previousRow', sequence: { cvoxModifier: true, - keys: {keyCode: [KeyCode.UP], ctrlKey: [true], altKey: [true]} - } + keys: {keyCode: [KeyCode.UP], ctrlKey: [true], altKey: [true]}, + }, }, { command: 'nextRow', sequence: { cvoxModifier: true, - keys: {keyCode: [KeyCode.DOWN], ctrlKey: [true], altKey: [true]} - } + keys: {keyCode: [KeyCode.DOWN], ctrlKey: [true], altKey: [true]}, + }, }, { command: 'nextCol', sequence: { cvoxModifier: true, - keys: {keyCode: [KeyCode.RIGHT], ctrlKey: [true], altKey: [true]} - } + keys: {keyCode: [KeyCode.RIGHT], ctrlKey: [true], altKey: [true]}, + }, }, { command: 'previousCol', sequence: { cvoxModifier: true, - keys: {keyCode: [KeyCode.LEFT], ctrlKey: [true], altKey: [true]} - } + keys: {keyCode: [KeyCode.LEFT], ctrlKey: [true], altKey: [true]}, + }, }, { command: 'goToRowFirstCell', @@ -642,9 +655,9 @@ keyCode: [KeyCode.LEFT], ctrlKey: [true], altKey: [true], - shiftKey: [true] - } - } + shiftKey: [true], + }, + }, }, { command: 'goToColFirstCell', @@ -654,9 +667,9 @@ keyCode: [KeyCode.UP], ctrlKey: [true], altKey: [true], - shiftKey: [true] - } - } + shiftKey: [true], + }, + }, }, { command: 'goToColLastCell', @@ -666,23 +679,23 @@ keyCode: [KeyCode.DOWN], ctrlKey: [true], altKey: [true], - shiftKey: [true] - } - } + shiftKey: [true], + }, + }, }, { command: 'goToFirstCell', sequence: { cvoxModifier: true, - keys: {keyCode: [KeyCode.LEFT], altKey: [true], shiftKey: [true]} - } + keys: {keyCode: [KeyCode.LEFT], altKey: [true], shiftKey: [true]}, + }, }, { command: 'goToLastCell', sequence: { cvoxModifier: true, - keys: {keyCode: [KeyCode.RIGHT], altKey: [true], shiftKey: [true]} - } + keys: {keyCode: [KeyCode.RIGHT], altKey: [true], shiftKey: [true]}, + }, }, { command: 'goToRowLastCell', @@ -692,115 +705,115 @@ keyCode: [KeyCode.RIGHT], ctrlKey: [true], altKey: [true], - shiftKey: [true] - } - } + shiftKey: [true], + }, + }, }, { command: 'previousGroup', sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.UP], ctrlKey: [true]}} + {cvoxModifier: true, keys: {keyCode: [KeyCode.UP], ctrlKey: [true]}}, }, { command: 'nextGroup', sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.DOWN], ctrlKey: [true]}} + {cvoxModifier: true, keys: {keyCode: [KeyCode.DOWN], ctrlKey: [true]}}, }, { command: 'previousSimilarItem', sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.I], shiftKey: [true]}} + {cvoxModifier: true, keys: {keyCode: [KeyCode.I], shiftKey: [true]}}, }, { command: 'nextSimilarItem', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.I]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.I]}}, }, { command: 'previousInvalidItem', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.P, KeyCode.I]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.P, KeyCode.I]}}, }, { command: 'nextInvalidItem', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.N, KeyCode.I]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.N, KeyCode.I]}}, }, { command: 'jumpToDetails', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.J]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.J]}}, }, { command: 'toggleScreen', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.BRIGHTNESS_UP]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.BRIGHTNESS_UP]}}, }, { command: 'toggleSpeechOnOrOff', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.VOLUME_MUTE]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.VOLUME_MUTE]}}, }, { command: 'enableChromeVoxArcSupportForCurrentApp', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.OEM_4]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.OEM_4]}}, }, { command: 'disableChromeVoxArcSupportForCurrentApp', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.OEM_6]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.OEM_6]}}, }, { command: 'showTalkBackKeyboardShortcuts', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.K]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.K]}}, }, { command: 'forceClickOnCurrentItem', sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.SPACE]}, doubleTap: true} + {cvoxModifier: true, keys: {keyCode: [KeyCode.SPACE]}, doubleTap: true}, }, { command: 'showTtsSettings', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.O, KeyCode.S]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.O, KeyCode.S]}}, }, { command: 'announceBatteryDescription', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.O, KeyCode.B]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.O, KeyCode.B]}}, }, { command: 'announceRichTextDescription', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.F]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.F]}}, }, { command: 'readPhoneticPronunciation', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.C]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.C]}}, }, { command: 'readLinkURL', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.L]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.L]}}, }, { command: 'nextList', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.J, KeyCode.L]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.J, KeyCode.L]}}, }, { command: 'previousList', sequence: { cvoxModifier: true, - keys: {keyCode: [KeyCode.J, KeyCode.L], shiftKey: [true]} - } + keys: {keyCode: [KeyCode.J, KeyCode.L], shiftKey: [true]}, + }, }, { command: 'resetTextToSpeechSettings', sequence: { cvoxModifier: true, - keys: {keyCode: [KeyCode.OEM_5], ctrlKey: [true], shiftKey: [true]} - } + keys: {keyCode: [KeyCode.OEM_5], ctrlKey: [true], shiftKey: [true]}, + }, }, { command: 'logLanguageInformationForCurrentNode', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.P, KeyCode.L]}} + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.P, KeyCode.L]}}, }, { command: 'copy', sequence: - {cvoxModifier: true, keys: {keyCode: [KeyCode.C], ctrlKey: [true]}} + {cvoxModifier: true, keys: {keyCode: [KeyCode.C], ctrlKey: [true]}}, }, { command: 'toggleDictation', - sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.D]}} - } + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.D]}}, + }, ];
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/key_sequence.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/key_sequence.js index adc7257..971a6a0 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/key_sequence.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/key_sequence.js
@@ -88,7 +88,7 @@ altGraphKey: [], shiftKey: [], metaKey: [], - keyCode: [] + keyCode: [], }; this.extractKey_(originalEvent); @@ -537,7 +537,7 @@ 59: 186, 91: 219, 92: 220, - 93: 221 + 93: 221, }; /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/key_sequence_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/key_sequence_test.js index 5b65e27..0f97bfa 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/key_sequence_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/key_sequence_test.js
@@ -442,8 +442,8 @@ 'altGraphKey': [false], 'shiftKey': [false], 'metaKey': [false], - 'keyCode': [KeyCode.DOWN] - } + 'keyCode': [KeyCode.DOWN], + }, }); assertTrue(forwardSequence.cvoxModifier); assertEqualsJSON(forwardSequence.keys.keyCode, [KeyCode.DOWN]); @@ -459,8 +459,8 @@ 'altGraphKey': [false], 'shiftKey': [false], 'metaKey': [false], - 'keyCode': [KeyCode.CONTROL] - } + 'keyCode': [KeyCode.CONTROL], + }, }); assertEqualsJSON(ctrlSequence.keys.ctrlKey, [true]); assertEqualsJSON(ctrlSequence.keys.keyCode, [KeyCode.CONTROL]);
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/locale_output_helper_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/locale_output_helper_test.js index 82b1cd9f9..9924d7a3 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/locale_output_helper_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/locale_output_helper_test.js
@@ -41,9 +41,17 @@ callback([ // All properties of TtsVoice object are optional. // https://developer.chrome.com/apps/tts#type-TtsVoice. - {}, {voiceName: 'Android'}, {'lang': 'en-US'}, {'lang': 'fr-CA'}, - {'lang': 'es-ES'}, {'lang': 'it-IT'}, {'lang': 'ja-JP'}, - {'lang': 'ko-KR'}, {'lang': 'zh-TW'}, {'lang': 'ast'}, {'lang': 'pt'} + {}, + {voiceName: 'Android'}, + {'lang': 'en-US'}, + {'lang': 'fr-CA'}, + {'lang': 'es-ES'}, + {'lang': 'it-IT'}, + {'lang': 'ja-JP'}, + {'lang': 'ko-KR'}, + {'lang': 'zh-TW'}, + {'lang': 'ast'}, + {'lang': 'pt'}, ]); }; }
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/panel_menu_data.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/panel_menu_data.js index 542666d..034d5a2d 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/panel_menu_data.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/panel_menu_data.js
@@ -21,7 +21,7 @@ LANDMARK: 2, LINK: 3, FORM_CONTROL: 4, - TABLE: 5 + TABLE: 5, }; /** @@ -51,26 +51,26 @@ { menuId: PanelNodeMenuId.HEADING, titleId: 'role_heading', - predicate: AutomationPredicate.heading + predicate: AutomationPredicate.heading, }, { menuId: PanelNodeMenuId.LANDMARK, titleId: 'role_landmark', - predicate: AutomationPredicate.landmark + predicate: AutomationPredicate.landmark, }, { menuId: PanelNodeMenuId.LINK, titleId: 'role_link', - predicate: AutomationPredicate.link + predicate: AutomationPredicate.link, }, { menuId: PanelNodeMenuId.FORM_CONTROL, titleId: 'panel_menu_form_controls', - predicate: AutomationPredicate.formField + predicate: AutomationPredicate.formField, }, { menuId: PanelNodeMenuId.TABLE, titleId: 'role_table', - predicate: AutomationPredicate.table + predicate: AutomationPredicate.table, }, ];
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/spannable.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/spannable.js index 88a3fa1..fdbd070 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/spannable.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/spannable.js
@@ -322,7 +322,7 @@ const spanObj = { type: serializeInfo.name, start: span.start, - end: span.end + end: span.end, }; if (serializeInfo.toJson) { spanObj.value = serializeInfo.toJson.apply(span.value);
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/tts_interface.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/tts_interface.js index 54a1ad1..256bca5 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/tts_interface.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/tts_interface.js
@@ -26,7 +26,7 @@ */ TtsCategory = { LIVE: 'live', - NAV: 'nav' + NAV: 'nav', }; /** @@ -51,7 +51,7 @@ CATEGORY_FLUSH: 2, /** Append this utterance to the end of the queue. */ - QUEUE: 3 + QUEUE: 3, }; /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/injected/api_implementation.js b/chrome/browser/resources/chromeos/accessibility/chromevox/injected/api_implementation.js index dd61d52b..97581c4 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/injected/api_implementation.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/injected/api_implementation.js
@@ -92,7 +92,7 @@ 'action': 'speak', 'text': textString, queueMode, - properties + properties, }; ContentExtensionBridge.send(message);
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/learn_mode_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/learn_mode_test.js index 35556cfb..2530329 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/learn_mode_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/learn_mode_test.js
@@ -65,7 +65,7 @@ chrome.runtime.sendMessage({ target: 'LearnMode', action: 'onKeyDown', - args: [this.makeMockKeyEvent(evt)] + args: [this.makeMockKeyEvent(evt)], }); }; } @@ -75,7 +75,7 @@ chrome.runtime.sendMessage({ target: 'LearnMode', action: 'onKeyUp', - args: [this.makeMockKeyEvent(evt)] + args: [this.makeMockKeyEvent(evt)], }); }; } @@ -85,7 +85,7 @@ chrome.runtime.sendMessage({ target: 'LearnMode', action: 'onAccessibilityGesture', - args: [gesture] + args: [gesture], }); }; }
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/log_page/log.js b/chrome/browser/resources/chromeos/accessibility/chromevox/log_page/log.js index f0d1ce0..dac31c5 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/log_page/log.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/log_page/log.js
@@ -75,8 +75,12 @@ const date = new Date(); a.download = [ - 'chromevox_logpage', date.getMonth() + 1, date.getDate(), - date.getHours(), date.getMinutes(), date.getSeconds() + 'chromevox_logpage', + date.getMonth() + 1, + date.getDate(), + date.getHours(), + date.getMinutes(), + date.getSeconds(), ].join('_') + '.txt'; a.href = 'data:text/plain; charset=utf-8,' + encodeURI(outputText);
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/options/bluetooth_braille_display_manager.js b/chrome/browser/resources/chromeos/accessibility/chromevox/options/bluetooth_braille_display_manager.js index 0f9cdf1..a098465 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/options/bluetooth_braille_display_manager.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/options/bluetooth_braille_display_manager.js
@@ -97,7 +97,7 @@ 'SuperVario', 'TSM', 'VarioConnect', - 'VarioUltra' + 'VarioUltra', ]; /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/options/bluetooth_braille_display_manager_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/options/bluetooth_braille_display_manager_test.js index 90b4bbe..c574f6ab 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/options/bluetooth_braille_display_manager_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/options/bluetooth_braille_display_manager_test.js
@@ -136,7 +136,7 @@ // An unrecognized device was added. devices = [ {name: 'Focus 40 BT', address: '1234'}, - {name: 'headphones', address: '4321'} + {name: 'headphones', address: '4321'}, ]; manager.handleDevicesChanged(); assertEquals(1, listener.displays.length); @@ -145,7 +145,7 @@ // A named variant of Focus 40 BT was added. devices = [ {name: 'Focus 40 BT', address: '1234'}, - {name: 'Focus 40 BT rev 123', address: '4321'} + {name: 'Focus 40 BT rev 123', address: '4321'}, ]; manager.handleDevicesChanged(); assertEquals(2, listener.displays.length);
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/options/bluetooth_braille_display_ui_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/options/bluetooth_braille_display_ui_test.js index 34592be..719a9e7 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/options/bluetooth_braille_display_ui_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/options/bluetooth_braille_display_ui_test.js
@@ -116,7 +116,7 @@ // Added one display; not paired, not connected. displays = [ {name: 'Focus 40 BT', address: 'abcd1234', paired: true}, - {name: 'Focus 40 BT rev 2', address: '4321dcba'} + {name: 'Focus 40 BT rev 2', address: '4321dcba'}, ]; ui.onDisplayListChanged(displays); assertEqualsDOM(
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/options/options_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/options/options_test.js index f328ae7..39fa356 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/options/options_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/options/options_test.js
@@ -59,7 +59,7 @@ const [mockFeedback, evt] = await this.loadOptionsPage(); const numberStyleSelect = evt.target.find({ role: RoleType.POP_UP_BUTTON, - attributes: {name: 'Read numbers as:'} + attributes: {name: 'Read numbers as:'}, }); assertNotNullNorUndefined(numberStyleSelect); mockFeedback.call(numberStyleSelect.focus.bind(numberStyleSelect)) @@ -93,7 +93,7 @@ const PUNCTUATION_ECHO_ALL = '2'; const punctuationEchoSelect = evt.target.find({ role: RoleType.POP_UP_BUTTON, - attributes: {name: 'Punctuation echo:'} + attributes: {name: 'Punctuation echo:'}, }); assertNotNullNorUndefined(punctuationEchoSelect); mockFeedback.call(punctuationEchoSelect.focus.bind(punctuationEchoSelect)) @@ -136,7 +136,7 @@ const smartStickyModeCheckbox = evt.target.find({ role: RoleType.CHECK_BOX, attributes: - {name: 'Turn off sticky mode when editing text (Smart Sticky Mode)'} + {name: 'Turn off sticky mode when editing text (Smart Sticky Mode)'}, }); assertNotNullNorUndefined(smartStickyModeCheckbox); mockFeedback.call(smartStickyModeCheckbox.focus.bind(smartStickyModeCheckbox)) @@ -165,12 +165,12 @@ role: RoleType.CHECK_BOX, attributes: { name: 'Change pitch when speaking element types and quoted, ' + - 'deleted, bolded, parenthesized, or capitalized text.' - } + 'deleted, bolded, parenthesized, or capitalized text.', + }, }); const capitalStrategySelect = evt.target.find({ role: RoleType.POP_UP_BUTTON, - attributes: {name: 'When reading capitals:'} + attributes: {name: 'When reading capitals:'}, }); assertNotNullNorUndefined(pitchChangesCheckbox); assertNotNullNorUndefined(capitalStrategySelect);
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel.js b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel.js index e36c246..6301da3 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel.js
@@ -351,7 +351,7 @@ 'actions': actionsMenu, 'braille': null, - 'developer': null + 'developer': null, }; // TODO(accessibility): Commands should be based off of CommandStore and @@ -1232,7 +1232,7 @@ increment: 'action_increment_description', scrollBackward: 'action_scroll_backward_description', scrollForward: 'action_scroll_forward_description', - showContextMenu: 'show_context_menu' + showContextMenu: 'show_context_menu', };
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/tutorial_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/tutorial_test.js index 37926d0..48e8f61 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/tutorial_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/tutorial_test.js
@@ -301,7 +301,7 @@ tutorial.onKeyDown({ key: 'Escape', preventDefault: () => {}, - stopPropagation: () => {} + stopPropagation: () => {}, }); }) .expectSpeech('Some web content')
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/testing/chromevox_e2e_test_base.js b/chrome/browser/resources/chromeos/accessibility/chromevox/testing/chromevox_e2e_test_base.js index 8946cb3..4bb5fb06 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/testing/chromevox_e2e_test_base.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/testing/chromevox_e2e_test_base.js
@@ -3,8 +3,9 @@ // found in the LICENSE file. GEN_INCLUDE([ - 'common.js', '../../common/testing/assert_additions.js', - '../../common/testing/e2e_test_base.js' + 'common.js', + '../../common/testing/assert_additions.js', + '../../common/testing/e2e_test_base.js', ]); /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/testing/mock_feedback.js b/chrome/browser/resources/chromeos/accessibility/chromevox/testing/mock_feedback.js index 93daf54..8ca6861 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/testing/mock_feedback.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/testing/mock_feedback.js
@@ -114,7 +114,7 @@ const MockTts = function() {}; MockTts.prototype = { __proto__: TtsInterface.prototype, - speak: this.addUtterance_.bind(this) + speak: this.addUtterance_.bind(this), }; ChromeVox.tts = new MockTts(); @@ -122,7 +122,7 @@ const MockBraille = function() {}; MockBraille.prototype = { __proto__: BrailleInterface.prototype, - write: this.addBraille_.bind(this) + write: this.addBraille_.bind(this), }; ChromeVox.braille = new MockBraille(); @@ -130,7 +130,7 @@ const MockEarcons = function() {}; MockEarcons.prototype = { __proto__: AbstractEarcons.prototype, - playEarcon: this.addEarcon_.bind(this) + playEarcon: this.addEarcon_.bind(this), }; // ChromeVox.earcons is a getter that switches between Classic and @@ -170,7 +170,7 @@ }.bind(this), toString() { return 'Speak \'' + text + '\''; - } + }, }); }.bind(this)); return this; @@ -245,7 +245,7 @@ toString() { return 'Speak \'' + text + '\' with props ' + JSON.stringify(expectedProps); - } + }, }); }.bind(this)); return this; @@ -281,7 +281,7 @@ }.bind(this), toString() { return 'Do not speak \'' + text + '\''; - } + }, }); }.bind(this)); return this; @@ -309,7 +309,7 @@ }.bind(this), toString() { return 'Braille \'' + text + '\' ' + JSON.stringify(props); - } + }, }); return this; } @@ -330,7 +330,7 @@ }.bind(this), toString() { return 'Earcon \'' + earconName + '\''; - } + }, }); return this; } @@ -351,7 +351,7 @@ }, toString() { return 'Callback'; - } + }, }); return this; }
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/testing/mock_feedback_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/testing/mock_feedback_test.js index 5dcfbac..20be4b6 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/testing/mock_feedback_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/testing/mock_feedback_test.js
@@ -69,7 +69,7 @@ endCallback() { assertFalse(spruiousStringEndCallbackCalled); spruiousStringEndCallbackCalled = true; - } + }, }); speak('Fourth string'); }) @@ -93,7 +93,7 @@ assertFalse(onlyStartCallbackCalled); onlyStartCallbackCalled = true; assertFalse(onlyEndCallbackCalled); - } + }, }); speak('Only end callback', { endCallback() { @@ -101,7 +101,7 @@ assertFalse(onlyEndCallbackCalled); onlyEndCallbackCalled = true; assertFalse(bothCallbacksStartCalled); - } + }, }); speak('Both callbacks', { startCallback() { @@ -114,7 +114,7 @@ assertTrue(bothCallbacksStartCalled); assertFalse(bothCallbacksEndCalled); bothCallbacksEndCalled = true; - } + }, }); mock.expectSpeech('Both callbacks'); mock.replay(); @@ -200,7 +200,7 @@ speak('MyButton', { startCallback() { earcon('BUTTON'); - } + }, }); }) .expectSpeech('MyButton') @@ -210,7 +210,7 @@ speak('MyTextField', { startCallback() { earcon('EDITABLE_TEXT'); - } + }, }); }) .expectEarcon(Earcon.ALERT_MODAL)
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/third_party/tamachiyomi/ja_phonetic_data.js b/chrome/browser/resources/chromeos/accessibility/chromevox/third_party/tamachiyomi/ja_phonetic_data.js index f162f589..6f8ba9e 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/third_party/tamachiyomi/ja_phonetic_data.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/third_party/tamachiyomi/ja_phonetic_data.js
@@ -317,7 +317,7 @@ case JaPhoneticData.CharacterSet.FULL_WIDTH_CYRILLIC_OR_GREEK_UPPER: return { delimiter: true, - prefix: JaPhoneticData.getDefaultPrefix(currentCharacterSet) + prefix: JaPhoneticData.getDefaultPrefix(currentCharacterSet), }; } return {delimiter: true, prefix: null}; @@ -327,7 +327,7 @@ // Returns the default prefix. return { delimiter: true, - prefix: JaPhoneticData.getDefaultPrefix(currentCharacterSet) + prefix: JaPhoneticData.getDefaultPrefix(currentCharacterSet), }; } @@ -367,7 +367,7 @@ FULL_WIDTH_SYMBOL: 14, // '@' FULL_WIDTH_CYRILLIC_OR_GREEK_UPPER: 15, // 'Α' FULL_WIDTH_CYRILLIC_OR_GREEK_LOWER: 16, // 'α' - OTHER: 17 // Kanji and unsupported symbols + OTHER: 17, // Kanji and unsupported symbols }; /** @@ -388,7 +388,7 @@ // 'ァ' [ JaPhoneticData.CharacterSet.HALF_WIDTH_KATAKANA_SMALL_LETTER, - 'ハンカク チイサイ' + 'ハンカク チイサイ', ], // 'A' [JaPhoneticData.CharacterSet.HALF_WIDTH_ALPHABET_UPPER, 'オオモジ'],
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/third_party/tamachiyomi/ja_phonetic_map.js b/chrome/browser/resources/chromeos/accessibility/chromevox/third_party/tamachiyomi/ja_phonetic_map.js index 3e7eda6..bb85cb5 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/third_party/tamachiyomi/ja_phonetic_map.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/third_party/tamachiyomi/ja_phonetic_map.js
@@ -796,7 +796,8 @@ ['憂', 'ユウウツ ノ ユウ,ウレウ'], ['憾', 'イカンナク ノ カン'], [ - '憺', 'クシンサンタンノタン,リッシンベンニタンニンノタンノキュウジノツクリ' + '憺', + 'クシンサンタンノタン,リッシンベンニタンニンノタンノキュウジノツクリ', ], ['憶', 'キオク ノ オク,オボエル'], ['憲', 'ケンポウキネンビ ノ ケン'], @@ -956,7 +957,7 @@ ['愧', 'ザンキニタエナイノキ'], [ '飃', - 'ヒョウヒョウトシタノヒョウノイタイジ,カゼノミギニトウヒョウスルノヒョウ' + 'ヒョウヒョウトシタノヒョウノイタイジ,カゼノミギニトウヒョウスルノヒョウ', ], ['愨', 'マコトヲイミスルカク'], ['愬', 'ソ,ハッサクノサクノシタニココロ'], @@ -1946,7 +1947,8 @@ ['覿', 'コウカテキメンノテキ'], ['観', 'カンキャク ノ カン'], [ - '覲', 'キン,キンムノキンノキュウジタイノチカラノカワリニケンブツスルノケン' + '覲', + 'キン,キンムノキンノキュウジタイノチカラノカワリニケンブツスルノケン', ], ['覩', 'ト,カガクシャノシャノキュウジタイノミギニケンブツスルノケン'], ['親', 'オヤ,リョウシン ノ シン'], @@ -2277,7 +2279,7 @@ ['蘿', 'ラ,クサカンムリニモウラスルノラ'], [ '蘂', - 'メシベノシベ,ズイノイタイジ,クサカンムリニココロミッツニジュモクノモク' + 'メシベノシベ,ズイノイタイジ,クサカンムリニココロミッツニジュモクノモク', ], ['蘇', 'ソセイスル ノ ソ,ヨミガエル'], ['蘆', 'アシ,クサカンムリニハゼノキノハゼノツクリ'], @@ -2336,7 +2338,7 @@ ['翻', 'ホンヤクスル ノ ホン'], [ '翰', - 'ショカンヲ オクル ノ カン,シンカンセン ノ カン ノ ホス ノ カワリニ ウモウ ノ ウ' + 'ショカンヲ オクル ノ カン,シンカンセン ノ カン ノ ホス ノ カワリニ ウモウ ノ ウ', ], ['翳', 'カゲリ,エイ,オイシャサンノイニルマタ,ソノシタニウモウノウ'], ['翩', 'ヘンポントヒルガエルノヘン'], @@ -3401,7 +3403,7 @@ ['蒜', 'ショクブツ ノ ヒル'], [ '蒟', - 'コンニャクノイチモジメ,クサカンムリニドクリツノリツ,ソノミギニハイクノク' + 'コンニャクノイチモジメ,クサカンムリニドクリツノリツ,ソノミギニハイクノク', ], ['蒙', 'ケイモウスル ノ モウ'], ['蒔', 'タネヲマク ノ マク'], @@ -4505,7 +4507,7 @@ ['哈', 'ゴウ,クチヘンニゴウカクノゴウ'], [ '剱', - 'ケン,ツルギノイタイジ,ジョウヨウカンジノケンノツクリガヤイバノイタイジ' + 'ケン,ツルギノイタイジ,ジョウヨウカンジノケンノツクリガヤイバノイタイジ', ], ['茜', 'アカネイロ ノ アカネ'], ['茘', 'クダモノノレイシノレイ,クサカンムリニカタナガミッツ'], @@ -5507,7 +5509,8 @@ ['撚', 'ヒネル,テヘン ニ シゼン ノ ゼン'], ['鹿', 'ドウブツ ノ シカ'], [ - '鹹', 'カンスイコノカン,カライ,ロカクノロノミギニハリキュウノハリノツクリ' + '鹹', + 'カンスイコノカン,カライ,ロカクノロノミギニハリキュウノハリノツクリ', ], ['撞', 'ジカドウチャク ノ ドウ,ツク'], ['W', 'ダブリュー ウィンドウ'], @@ -5979,7 +5982,8 @@ ['羈', 'キビセイサクノキ'], ['美', 'ビジン ノ ビ,ウツクシイ'], [ - '羌', 'チュウゴクホクセイブミンゾクノヒトツ,キョウ,ヒツジノシタニヒトアシ' + '羌', + 'チュウゴクホクセイブミンゾクノヒトツ,キョウ,ヒツジノシタニヒトアシ', ], ['羔', 'コウ,コヒツジ,ヒツジノシタニレンガ'], ['羚', 'レイ,ヒツジヘンニメイレイスルノレイ'], @@ -6709,7 +6713,8 @@ ['P', 'ピー パパ'], ['蟶', 'マテガイノマテ,ムシヘンニヒジリ'], [ - '蟷', 'カマキリヲイミスルトウロウノトウ,ムシヘンニベントウノトウノキュウジ' + '蟷', + 'カマキリヲイミスルトウロウノトウ,ムシヘンニベントウノトウノキュウジ', ], ['蟲', 'ムシ,コンチュウノチュウノキュウジ'], ['蟾', 'セン,ムシヘンニタンニンノタンノキュウジノツクリ'], @@ -7091,7 +7096,7 @@ ['趁', 'チン,ソウニョウニメズラシイノツクリ'], [ '鐫', - 'セン、カネヘンニフルトリノシタニオウトツノオウノシタ1カクヲトッタモノ' + 'セン、カネヘンニフルトリノシタニオウトツノオウノシタ1カクヲトッタモノ', ], ['*', 'アスタリスク'], ['超', 'チョウノウリョク ノ チョウ,コエル'], @@ -7147,5 +7152,5 @@ ['煤', 'スス,バイエン ノ バイ'], ['煩', 'ボンノウ ノ ボン,ワズラワシイ'], ['煮', 'ニモノ ノ ニ,シャフツ ノ シャ'], - ['煬', 'ヨウ,ヒヘンニタイヨウケイノヨウノツクリ'] + ['煬', 'ヨウ,ヒヘンニタイヨウケイノヨウノツクリ'], ]);
diff --git a/chrome/browser/resources/chromeos/accessibility/common/automation_predicate.js b/chrome/browser/resources/chromeos/accessibility/common/automation_predicate.js index ef2ba0b..46182d6 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/automation_predicate.js +++ b/chrome/browser/resources/chromeos/accessibility/common/automation_predicate.js
@@ -458,11 +458,19 @@ return AutomationPredicate.match({ anyRole: [ - Role.GENERIC_CONTAINER, Role.DOCUMENT, Role.GROUP, Role.LIST, - Role.LIST_ITEM, Role.TAB, Role.TAB_PANEL, Role.TOOLBAR, Role.WINDOW + Role.GENERIC_CONTAINER, + Role.DOCUMENT, + Role.GROUP, + Role.LIST, + Role.LIST_ITEM, + Role.TAB, + Role.TAB_PANEL, + Role.TOOLBAR, + Role.WINDOW, ], anyPredicate: [ - AutomationPredicate.landmark, AutomationPredicate.structuralContainer, + AutomationPredicate.landmark, + AutomationPredicate.structuralContainer, function(node) { // For example, crosh. return node.role === Role.TEXT_FIELD && @@ -472,8 +480,8 @@ return ( node.state[State.EDITABLE] && node.parent && !node.parent.state[State.EDITABLE]); - } - ] + }, + ], })(node); } @@ -586,9 +594,16 @@ // Ignore some roles. return AutomationPredicate.leaf(node) && (AutomationPredicate.roles([ - Role.CLIENT, Role.COLUMN, Role.GENERIC_CONTAINER, Role.GROUP, - Role.IMAGE, Role.PARAGRAPH, Role.STATIC_TEXT, Role.SVG_ROOT, - Role.TABLE_HEADER_CONTAINER, Role.UNKNOWN + Role.CLIENT, + Role.COLUMN, + Role.GENERIC_CONTAINER, + Role.GROUP, + Role.IMAGE, + Role.PARAGRAPH, + Role.STATIC_TEXT, + Role.SVG_ROOT, + Role.TABLE_HEADER_CONTAINER, + Role.UNKNOWN, ])(node)); } @@ -749,9 +764,11 @@ return AutomationPredicate.match({ anyRole: [Role.HEADING, Role.LIST, Role.PARAGRAPH], anyPredicate: [ - AutomationPredicate.editText, AutomationPredicate.formField, - AutomationPredicate.object, AutomationPredicate.table - ] + AutomationPredicate.editText, + AutomationPredicate.formField, + AutomationPredicate.object, + AutomationPredicate.table, + ], })(node); } @@ -831,19 +848,25 @@ anyPredicate: [node => node.role === Role.LIST_ITEM && node.children.length === 2 && node.firstChild.role === Role.LIST_MARKER && - node.lastChild.role === Role.STATIC_TEXT] + node.lastChild.role === Role.STATIC_TEXT], }); /** @type {AutomationPredicate.Unary} */ AutomationPredicate.formField = AutomationPredicate.match({ anyPredicate: [ - AutomationPredicate.button, AutomationPredicate.comboBox, - AutomationPredicate.editText + AutomationPredicate.button, + AutomationPredicate.comboBox, + AutomationPredicate.editText, ], anyRole: [ - Role.CHECK_BOX, Role.COLOR_WELL, Role.LIST_BOX, Role.SLIDER, Role.SWITCH, - Role.TAB, Role.TREE - ] + Role.CHECK_BOX, + Role.COLOR_WELL, + Role.LIST_BOX, + Role.SLIDER, + Role.SWITCH, + Role.TAB, + Role.TREE, + ], }); /** @type {AutomationPredicate.Unary} */ @@ -852,9 +875,13 @@ AutomationPredicate.formField, ], anyRole: [ - Role.DISCLOSURE_TRIANGLE, Role.MENU_ITEM, Role.MENU_ITEM_CHECK_BOX, - Role.MENU_ITEM_RADIO, Role.MENU_LIST_OPTION, Role.SCROLL_BAR - ] + Role.DISCLOSURE_TRIANGLE, + Role.MENU_ITEM, + Role.MENU_ITEM_CHECK_BOX, + Role.MENU_ITEM_RADIO, + Role.MENU_LIST_OPTION, + Role.SCROLL_BAR, + ], }); @@ -864,8 +891,15 @@ /** @type {AutomationPredicate.Unary} */ AutomationPredicate.landmark = AutomationPredicate.roles([ - Role.APPLICATION, Role.BANNER, Role.COMPLEMENTARY, Role.CONTENT_INFO, - Role.FORM, Role.MAIN, Role.NAVIGATION, Role.REGION, Role.SEARCH + Role.APPLICATION, + Role.BANNER, + Role.COMPLEMENTARY, + Role.CONTENT_INFO, + Role.FORM, + Role.MAIN, + Role.NAVIGATION, + Role.REGION, + Role.SEARCH, ]); /** @@ -875,10 +909,21 @@ * @return {boolean} */ AutomationPredicate.structuralContainer = AutomationPredicate.roles([ - Role.ALERT_DIALOG, Role.CLIENT, Role.DIALOG, Role.LAYOUT_TABLE, - Role.LAYOUT_TABLE_CELL, Role.LAYOUT_TABLE_ROW, Role.ROOT_WEB_AREA, - Role.WEB_VIEW, Role.WINDOW, Role.EMBEDDED_OBJECT, Role.IFRAME, - Role.IFRAME_PRESENTATIONAL, Role.PLUGIN_OBJECT, Role.UNKNOWN, Role.PANE + Role.ALERT_DIALOG, + Role.CLIENT, + Role.DIALOG, + Role.LAYOUT_TABLE, + Role.LAYOUT_TABLE_CELL, + Role.LAYOUT_TABLE_ROW, + Role.ROOT_WEB_AREA, + Role.WEB_VIEW, + Role.WINDOW, + Role.EMBEDDED_OBJECT, + Role.IFRAME, + Role.IFRAME_PRESENTATIONAL, + Role.PLUGIN_OBJECT, + Role.UNKNOWN, + Role.PANE, ]); @@ -889,13 +934,14 @@ */ AutomationPredicate.clickable = AutomationPredicate.match({ anyPredicate: [ - AutomationPredicate.button, AutomationPredicate.link, + AutomationPredicate.button, + AutomationPredicate.link, node => { return node.defaultActionVerb === chrome.automation.DefaultActionVerb.CLICK; - } + }, ], - anyAttribute: {clickable: true} + anyAttribute: {clickable: true}, }); // Table related predicates. @@ -939,7 +985,10 @@ * @return {boolean} */ AutomationPredicate.selectableText = AutomationPredicate.roles([ - Role.STATIC_TEXT, Role.INLINE_TEXT_BOX, Role.LINE_BREAK, Role.LIST_MARKER + Role.STATIC_TEXT, + Role.INLINE_TEXT_BOX, + Role.LINE_BREAK, + Role.LIST_MARKER, ]); }); // goog.scope
diff --git a/chrome/browser/resources/chromeos/accessibility/common/automation_util.js b/chrome/browser/resources/chromeos/accessibility/common/automation_util.js index afc038e..6f87556 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/automation_util.js +++ b/chrome/browser/resources/chromeos/accessibility/common/automation_util.js
@@ -477,7 +477,7 @@ leaf: undefined, root: undefined, visit: undefined, - skipInitialSubtree: !AutomationPredicate.container(cur) && pred(cur) + skipInitialSubtree: !AutomationPredicate.container(cur) && pred(cur), }; restrictions.root = opt_restrictions.root || AutomationPredicate.root;
diff --git a/chrome/browser/resources/chromeos/accessibility/common/automation_util_test.js b/chrome/browser/resources/chromeos/accessibility/common/automation_util_test.js index 7065aef..9c12caf1 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/automation_util_test.js +++ b/chrome/browser/resources/chromeos/accessibility/common/automation_util_test.js
@@ -5,7 +5,8 @@ // Include test fixture. GEN_INCLUDE([ '../select_to_speak/select_to_speak_e2e_test_base.js', - 'testing/assert_additions.js', '../chromevox/testing/snippets.js' + 'testing/assert_additions.js', + '../chromevox/testing/snippets.js', ]); /**
diff --git a/chrome/browser/resources/chromeos/accessibility/common/constants.js b/chrome/browser/resources/chromeos/accessibility/common/constants.js index 832839e9..0efe074 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/constants.js +++ b/chrome/browser/resources/chromeos/accessibility/common/constants.js
@@ -17,7 +17,7 @@ FORWARD: 'forward', /** Search from right to left. */ - BACKWARD: 'backward' + BACKWARD: 'backward', }; /**
diff --git a/chrome/browser/resources/chromeos/accessibility/common/cursors/cursor.js b/chrome/browser/resources/chromeos/accessibility/common/cursors/cursor.js index a9fa1e8..6e15812 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/cursors/cursor.js +++ b/chrome/browser/resources/chromeos/accessibility/common/cursors/cursor.js
@@ -44,7 +44,7 @@ * A node or in line textbox that immediately precedes or follows a visual * line break. */ - LINE: 'line' + LINE: 'line', }; /** @@ -62,7 +62,7 @@ * Move to the beginning or end of the current cursor. Only supports * Unit.CHARACTER and Unit.WORD */ - SYNC: 'sync' + SYNC: 'sync', }; /**
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 d1811ffc..ec7b2d3 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/cursors/cursors_test.js +++ b/chrome/browser/resources/chromeos/accessibility/common/cursors/cursors_test.js
@@ -4,7 +4,7 @@ // Include test fixture. GEN_INCLUDE([ - '//chrome/browser/resources/chromeos/accessibility/chromevox/testing/chromevox_next_e2e_test_base.js' + '//chrome/browser/resources/chromeos/accessibility/chromevox/testing/chromevox_next_e2e_test_base.js', ]); /** @@ -201,7 +201,7 @@ [WORD, DIRECTIONAL, BACKWARD, {index: 0, value: 'same line'}], [WORD, DIRECTIONAL, BACKWARD, {index: 0, value: 'start '}], - [WORD, DIRECTIONAL, BACKWARD, {index: 0, value: undefined}] + [WORD, DIRECTIONAL, BACKWARD, {index: 0, value: undefined}], ]); }); @@ -220,7 +220,7 @@ [WORD, DIRECTIONAL, BACKWARD, {index: 0, value: 'same line'}], [CHARACTER, DIRECTIONAL, BACKWARD, {index: 5, value: 'start '}], [CHARACTER, DIRECTIONAL, BACKWARD, {index: 4, value: 'start '}], - [WORD, DIRECTIONAL, BACKWARD, {index: 0, value: 'start '}] + [WORD, DIRECTIONAL, BACKWARD, {index: 0, value: 'start '}], ]); }); @@ -238,7 +238,7 @@ [LINE, DIRECTIONAL, BACKWARD, {value: 'same line'}], // Bump against an edge. [LINE, DIRECTIONAL, BACKWARD, {value: 'same line'}], - [LINE, BOUND, BACKWARD, {value: 'start '}] + [LINE, BOUND, BACKWARD, {value: 'start '}], ]); }); @@ -263,58 +263,84 @@ this.simpleDoc, [ [ - CHARACTER, FORWARD, {value: 'start ', index: 1}, - {value: 'start ', index: 2} + CHARACTER, + FORWARD, + {value: 'start ', index: 1}, + {value: 'start ', index: 2}, ], [ - CHARACTER, FORWARD, {value: 'start ', index: 2}, - {value: 'start ', index: 3} + CHARACTER, + FORWARD, + {value: 'start ', index: 2}, + {value: 'start ', index: 3}, ], [ - CHARACTER, FORWARD, {value: 'start ', index: 3}, - {value: 'start ', index: 4} + CHARACTER, + FORWARD, + {value: 'start ', index: 3}, + {value: 'start ', index: 4}, ], [ - CHARACTER, FORWARD, {value: 'start ', index: 4}, - {value: 'start ', index: 5} + CHARACTER, + FORWARD, + {value: 'start ', index: 4}, + {value: 'start ', index: 5}, ], [ - CHARACTER, FORWARD, {value: 'start ', index: 5}, - {value: 'start ', index: 6} + CHARACTER, + FORWARD, + {value: 'start ', index: 5}, + {value: 'start ', index: 6}, ], [ - CHARACTER, FORWARD, {value: 'same line', index: 0}, - {value: 'same line', index: 1} + CHARACTER, + FORWARD, + {value: 'same line', index: 0}, + {value: 'same line', index: 1}, ], [ - CHARACTER, BACKWARD, {value: 'start ', index: 5}, - {value: 'start ', index: 6} + CHARACTER, + BACKWARD, + {value: 'start ', index: 5}, + {value: 'start ', index: 6}, ], [ - CHARACTER, BACKWARD, {value: 'start ', index: 4}, - {value: 'start ', index: 5} + CHARACTER, + BACKWARD, + {value: 'start ', index: 4}, + {value: 'start ', index: 5}, ], [ - CHARACTER, BACKWARD, {value: 'start ', index: 3}, - {value: 'start ', index: 4} + CHARACTER, + BACKWARD, + {value: 'start ', index: 3}, + {value: 'start ', index: 4}, ], [ - CHARACTER, BACKWARD, {value: 'start ', index: 2}, - {value: 'start ', index: 3} + CHARACTER, + BACKWARD, + {value: 'start ', index: 2}, + {value: 'start ', index: 3}, ], [ - CHARACTER, BACKWARD, {value: 'start ', index: 1}, - {value: 'start ', index: 2} + CHARACTER, + BACKWARD, + {value: 'start ', index: 1}, + {value: 'start ', index: 2}, ], [ - CHARACTER, BACKWARD, {value: 'start ', index: 0}, - {value: 'start ', index: 1} + CHARACTER, + BACKWARD, + {value: 'start ', index: 0}, + {value: 'start ', index: 1}, ], [ - CHARACTER, BACKWARD, {value: undefined, index: 0}, - {value: undefined, index: 1} + CHARACTER, + BACKWARD, + {value: undefined, index: 0}, + {value: undefined, index: 1}, ], ], this.RANGE); @@ -325,33 +351,45 @@ this.simpleDoc, [ [ - WORD, FORWARD, {value: 'same line', index: 0}, - {value: 'same line', index: 4} + WORD, + FORWARD, + {value: 'same line', index: 0}, + {value: 'same line', index: 4}, ], [ - WORD, FORWARD, {value: 'same line', index: 5}, - {value: 'same line', index: 9} + WORD, + FORWARD, + {value: 'same line', index: 5}, + {value: 'same line', index: 9}, ], [WORD, FORWARD, {value: 'end', index: 0}, {value: 'end', index: 3}], [WORD, FORWARD, {value: 'end', index: 0}, {value: 'end', index: 3}], [ - WORD, BACKWARD, {value: 'same line', index: 5}, - {value: 'same line', index: 9} + WORD, + BACKWARD, + {value: 'same line', index: 5}, + {value: 'same line', index: 9}, ], [ - WORD, BACKWARD, {value: 'same line', index: 0}, - {value: 'same line', index: 4} + WORD, + BACKWARD, + {value: 'same line', index: 0}, + {value: 'same line', index: 4}, ], [ - WORD, BACKWARD, {value: 'start ', index: 0}, - {value: 'start ', index: 5} + WORD, + BACKWARD, + {value: 'start ', index: 0}, + {value: 'start ', index: 5}, ], [ - WORD, BACKWARD, {value: undefined, index: 0}, - {value: undefined, index: 5} + WORD, + BACKWARD, + {value: undefined, index: 0}, + {value: undefined, index: 5}, ], ], this.RANGE); @@ -368,14 +406,18 @@ [LINE, FORWARD, {value: 'end', index: 0}, {value: 'end', index: 3}], [ - LINE, BACKWARD, {value: 'start ', index: 0}, - {value: 'same line', index: 9} + LINE, + BACKWARD, + {value: 'start ', index: 0}, + {value: 'same line', index: 9}, ], [ - LINE, BACKWARD, {value: 'start ', index: 0}, - {value: 'same line', index: 9} - ] + LINE, + BACKWARD, + {value: 'start ', index: 0}, + {value: 'same line', index: 9}, + ], ], this.RANGE); }); @@ -623,43 +665,58 @@ [WORD, BOUND, FORWARD, {index: 19, value: 'Inline text content'}], // 'Button' start and end indices. [ - WORD, DIRECTIONAL, FORWARD, - {index: 0, value: 'Button example content'} + WORD, + DIRECTIONAL, + FORWARD, + {index: 0, value: 'Button example content'}, ], [WORD, BOUND, FORWARD, {index: 6, value: 'Button example content'}], // 'example' start and end indices. [ - WORD, DIRECTIONAL, FORWARD, - {index: 7, value: 'Button example content'} + WORD, + DIRECTIONAL, + FORWARD, + {index: 7, value: 'Button example content'}, ], [WORD, BOUND, FORWARD, {index: 14, value: 'Button example content'}], // 'content' start index. Reached last word of last object. [ - WORD, DIRECTIONAL, FORWARD, - {index: 15, value: 'Button example content'} + WORD, + DIRECTIONAL, + FORWARD, + {index: 15, value: 'Button example content'}, ], [ - WORD, DIRECTIONAL, FORWARD, - {index: 15, value: 'Button example content'} + WORD, + DIRECTIONAL, + FORWARD, + {index: 15, value: 'Button example content'}, ], // Move backward by word. // Only test start indices. [ - WORD, DIRECTIONAL, BACKWARD, - {index: 7, value: 'Button example content'} + WORD, + DIRECTIONAL, + BACKWARD, + {index: 7, value: 'Button example content'}, ], [ - WORD, DIRECTIONAL, BACKWARD, - {index: 0, value: 'Button example content'} + WORD, + DIRECTIONAL, + BACKWARD, + {index: 0, value: 'Button example content'}, ], [ - WORD, DIRECTIONAL, BACKWARD, {index: 12, value: 'Inline text content'} + WORD, + DIRECTIONAL, + BACKWARD, + {index: 12, value: 'Inline text content'}, ], [WORD, DIRECTIONAL, BACKWARD, {index: 7, value: 'Inline text content'}], [WORD, DIRECTIONAL, BACKWARD, {index: 0, value: 'Inline text content'}], // Reached first word of first object. - [WORD, DIRECTIONAL, BACKWARD, {index: 0, value: 'Inline text content'}] + [WORD, DIRECTIONAL, BACKWARD, {index: 0, value: 'Inline text content'}], ]); });
diff --git a/chrome/browser/resources/chromeos/accessibility/common/cursors/range.js b/chrome/browser/resources/chromeos/accessibility/common/cursors/range.js index 4c8d524..2021fbc 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/cursors/range.js +++ b/chrome/browser/resources/chromeos/accessibility/common/cursors/range.js
@@ -254,7 +254,7 @@ anchorObject: startNode, anchorOffset: startIndex, focusObject: endNode, - focusOffset: endIndex + focusOffset: endIndex, }); } }
diff --git a/chrome/browser/resources/chromeos/accessibility/common/event_generator.js b/chrome/browser/resources/chromeos/accessibility/common/event_generator.js index 66a920c6..b4f783d 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/event_generator.js +++ b/chrome/browser/resources/chromeos/accessibility/common/event_generator.js
@@ -34,7 +34,7 @@ */ static sendMouseClick(x, y, params = { delayMs: 0, - mouseButton: chrome.accessibilityPrivate.SyntheticMouseEventButton.LEFT + mouseButton: chrome.accessibilityPrivate.SyntheticMouseEventButton.LEFT, }) { if (EventGenerator.currentlyMidMouseClick) { EventGenerator.mouseClickQueue.push(arguments);
diff --git a/chrome/browser/resources/chromeos/accessibility/common/rect_util.js b/chrome/browser/resources/chromeos/accessibility/common/rect_util.js index e0c56eb..ac42ac55 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/rect_util.js +++ b/chrome/browser/resources/chromeos/accessibility/common/rect_util.js
@@ -150,7 +150,7 @@ top: outer.top, left: outer.left, width: outer.width, - height: (subtrahend.top - outer.top) + height: (subtrahend.top - outer.top), }; } @@ -159,7 +159,7 @@ top: RectUtil.bottom(subtrahend), left: outer.left, width: outer.width, - height: (RectUtil.bottom(outer) - RectUtil.bottom(subtrahend)) + height: (RectUtil.bottom(outer) - RectUtil.bottom(subtrahend)), }; } @@ -168,7 +168,7 @@ top: outer.top, left: outer.left, width: (subtrahend.left - outer.left), - height: outer.height + height: outer.height, }; } @@ -177,7 +177,7 @@ top: outer.top, left: RectUtil.right(subtrahend), width: (RectUtil.right(outer) - RectUtil.right(subtrahend)), - height: outer.height + height: outer.height, }; } @@ -365,5 +365,5 @@ result = RectUtil.union(result, rects[i]); } return result; - } + }, };
diff --git a/chrome/browser/resources/chromeos/accessibility/common/repeated_event_handler_test.js b/chrome/browser/resources/chromeos/accessibility/common/repeated_event_handler_test.js index dbf37f2..680684b6 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/repeated_event_handler_test.js +++ b/chrome/browser/resources/chromeos/accessibility/common/repeated_event_handler_test.js
@@ -5,7 +5,7 @@ // Include test fixture. GEN_INCLUDE([ '../select_to_speak/select_to_speak_e2e_test_base.js', - 'repeated_event_handler.js' + 'repeated_event_handler.js', ]); /** Test fixture for array_util.js. */
diff --git a/chrome/browser/resources/chromeos/accessibility/common/repeated_tree_change_handler_test.js b/chrome/browser/resources/chromeos/accessibility/common/repeated_tree_change_handler_test.js index 1b44148..c48c6e7 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/repeated_tree_change_handler_test.js +++ b/chrome/browser/resources/chromeos/accessibility/common/repeated_tree_change_handler_test.js
@@ -5,7 +5,7 @@ // Include test fixture. GEN_INCLUDE([ '../select_to_speak/select_to_speak_e2e_test_base.js', - 'repeated_tree_change_handler.js' + 'repeated_tree_change_handler.js', ]); /** Test fixture for array_util.js. */
diff --git a/chrome/browser/resources/chromeos/accessibility/common/testing/callback_helper.js b/chrome/browser/resources/chromeos/accessibility/common/testing/callback_helper.js index 776f3a5c1..580c5cd9 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/testing/callback_helper.js +++ b/chrome/browser/resources/chromeos/accessibility/common/testing/callback_helper.js
@@ -62,7 +62,7 @@ savedArgs.arguments = Array.prototype.slice.call(arguments); runAll.invoke(); }; - } + }, }; /**
diff --git a/chrome/browser/resources/chromeos/accessibility/common/testing/e2e_test_base.js b/chrome/browser/resources/chromeos/accessibility/common/testing/e2e_test_base.js index 7eafdc25..93c1d8f 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/testing/e2e_test_base.js +++ b/chrome/browser/resources/chromeos/accessibility/common/testing/e2e_test_base.js
@@ -3,8 +3,11 @@ // found in the LICENSE file. GEN_INCLUDE([ - 'accessibility_test_base.js', 'assert_additions.js', 'callback_helper.js', - 'common.js', 'doc_utils.js' + 'accessibility_test_base.js', + 'assert_additions.js', + 'callback_helper.js', + 'common.js', + 'doc_utils.js', ]); /**
diff --git a/chrome/browser/resources/chromeos/accessibility/common/testing/mock_accessibility_private.js b/chrome/browser/resources/chromeos/accessibility/common/testing/mock_accessibility_private.js index a987029..146389b 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/testing/mock_accessibility_private.js +++ b/chrome/browser/resources/chromeos/accessibility/common/testing/mock_accessibility_private.js
@@ -102,7 +102,7 @@ if (MockAccessibilityPrivate.boundsListener_ === listener) { MockAccessibilityPrivate.boundsListener_ = null; } - } + }, }, onMagnifierBoundsChanged: @@ -136,7 +136,7 @@ if (MockAccessibilityPrivate.dictationToggleListener_ === listener) { MockAccessibilityPrivate.dictationToggleListener_ = null; } - } + }, }, onSelectToSpeakStateChangeRequested: {
diff --git a/chrome/browser/resources/chromeos/accessibility/common/testing/mock_input_ime.js b/chrome/browser/resources/chromeos/accessibility/common/testing/mock_input_ime.js index 4d65b617..cef0672 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/testing/mock_input_ime.js +++ b/chrome/browser/resources/chromeos/accessibility/common/testing/mock_input_ime.js
@@ -64,7 +64,7 @@ if (MockInputIme.onFocusListener_ === listener) { MockInputIme.onFocusListener_ = null; } - } + }, }, onBlur: { @@ -84,7 +84,7 @@ if (MockInputIme.onBlurListener_ === listener) { MockInputIme.onBlurListener_ = null; } - } + }, }, /** @param {!MockImeCompositionParameters} composition */ @@ -165,5 +165,5 @@ return new Promise(resolve => { this.waitForCommitResolve_ = resolve; }); - } + }, };
diff --git a/chrome/browser/resources/chromeos/accessibility/common/testing/mock_speech_recognition_private.js b/chrome/browser/resources/chromeos/accessibility/common/testing/mock_speech_recognition_private.js index b450508..62d39d05 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/testing/mock_speech_recognition_private.js +++ b/chrome/browser/resources/chromeos/accessibility/common/testing/mock_speech_recognition_private.js
@@ -60,7 +60,7 @@ if (this.onStopListener_ === listener) { this.onStopListener_ = null; } - } + }, }; /** @@ -76,7 +76,7 @@ if (this.onResultListener_ === listener) { this.onResultListener_ = null; } - } + }, }; /** @@ -92,7 +92,7 @@ if (this.onErrorListener_ === listener) { this.onErrorListener_ = null; } - } + }, }; } @@ -108,7 +108,7 @@ // If speech recognition is already active when calling start(), the real // API will set chrome.runtime.lastError. Do the same for the mock API. chrome.runtime.lastError = { - message: 'Speech recognition already started' + message: 'Speech recognition already started', }; } @@ -136,7 +136,7 @@ // If speech recognition is already inactive when calling stop(), the real // API will set chrome.runtime.lastError. Do the same for the mock API. chrome.runtime.lastError = { - message: 'Speech recognition already stopped' + message: 'Speech recognition already stopped', }; }
diff --git a/chrome/browser/resources/chromeos/accessibility/common/testing/mock_storage.js b/chrome/browser/resources/chromeos/accessibility/common/testing/mock_storage.js index b8d9b0ae..578ba19 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/testing/mock_storage.js +++ b/chrome/browser/resources/chromeos/accessibility/common/testing/mock_storage.js
@@ -43,7 +43,7 @@ remove: key => { delete MockStorage.local_[key]; MockStorage.callOnChangedListeners(this.local_); - } + }, }, sync: { @@ -74,7 +74,7 @@ remove: key => { delete MockStorage.sync_[key]; MockStorage.callOnChangedListeners(this.sync_); - } + }, }, onChanged: { @@ -111,5 +111,5 @@ MockStorage.local_ = {}; MockStorage.sync_ = {}; MockStorage.callbacks_ = []; - } + }, };
diff --git a/chrome/browser/resources/chromeos/accessibility/common/testing/mock_tts.js b/chrome/browser/resources/chromeos/accessibility/common/testing/mock_tts.js index 74b0fadb..b6397c3 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/testing/mock_tts.js +++ b/chrome/browser/resources/chromeos/accessibility/common/testing/mock_tts.js
@@ -104,9 +104,11 @@ voiceName: 'English US', lang: 'en-US', eventTypes: [ - this.EventType.START, this.EventTypeEND, this.EventType.WORD, - this.EventType.CANCELLED - ] + this.EventType.START, + this.EventTypeEND, + this.EventType.WORD, + this.EventType.CANCELLED, + ], }]); }, isSpeaking(callback) { @@ -144,5 +146,5 @@ const [options, event] = this.pendingEvents_.pop(); options.onEvent(event); } - } + }, };
diff --git a/chrome/browser/resources/chromeos/accessibility/common/tree_walker.js b/chrome/browser/resources/chromeos/accessibility/common/tree_walker.js index bec85137..4424313 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/tree_walker.js +++ b/chrome/browser/resources/chromeos/accessibility/common/tree_walker.js
@@ -25,7 +25,7 @@ /** Walker is on a descendant of initial node. */ DESCENDANT: 'descendant', /** Walker is on a node not covered by any other phase. */ - OTHER: 'other' + OTHER: 'other', }; /**
diff --git a/chrome/browser/resources/chromeos/accessibility/common/tree_walker_test.js b/chrome/browser/resources/chromeos/accessibility/common/tree_walker_test.js index f8959e0..dfb38f4 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/tree_walker_test.js +++ b/chrome/browser/resources/chromeos/accessibility/common/tree_walker_test.js
@@ -5,7 +5,7 @@ // Include test fixture. GEN_INCLUDE([ '../select_to_speak/select_to_speak_e2e_test_base.js', - '../chromevox/testing/snippets.js' + '../chromevox/testing/snippets.js', ]); /** @@ -228,7 +228,7 @@ new AutomationTreeWalker(r.firstChild, 'backward', { root(node) { return node === r; - } + }, }); assertEquals(r, backwardWalker.next().node); assertEquals(null, backwardWalker.next().node); @@ -237,7 +237,7 @@ new AutomationTreeWalker(r.firstChild.lastChild, 'forward', { root(node) { return node === r; - } + }, }); // Advance to the static text box of button contains text "Forward". assertEquals('Forward', forwardWalker.next().node.name);
diff --git a/chrome/browser/resources/chromeos/accessibility/common/tutorial/chromevox_tutorial.js b/chrome/browser/resources/chromeos/accessibility/common/tutorial/chromevox_tutorial.js index f8395d3c..f73614c 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/tutorial/chromevox_tutorial.js +++ b/chrome/browser/resources/chromeos/accessibility/common/tutorial/chromevox_tutorial.js
@@ -30,7 +30,7 @@ */ const NudgeType = { GENERAL: 'general', - PRACTICE_AREA: 'practice_area' + PRACTICE_AREA: 'practice_area', }; Polymer({ @@ -97,8 +97,8 @@ title: 'tutorial_touch_orientation_title', curriculum: Curriculum.TOUCH_ORIENTATION, medium: InteractionMedium.TOUCH, - } - ] + }, + ], }, /** @type {Array<!LessonData>} */ @@ -111,7 +111,7 @@ medium: InteractionMedium.KEYBOARD, curriculums: [Curriculum.QUICK_ORIENTATION], actions: [ - {type: 'key_sequence', value: {keys: {keyCode: [32 /* Space */]}}} + {type: 'key_sequence', value: {keys: {keyCode: [32 /* Space */]}}}, ], autoInteractive: true, }, @@ -124,7 +124,7 @@ actions: [{ type: 'key_sequence', value: {keys: {keyCode: [17 /* Ctrl */]}}, - shouldPropagate: false + shouldPropagate: false, }], autoInteractive: true, }, @@ -135,7 +135,7 @@ medium: InteractionMedium.KEYBOARD, curriculums: [Curriculum.QUICK_ORIENTATION], actions: [ - {type: 'key_sequence', value: {keys: {keyCode: [16 /* Shift */]}}} + {type: 'key_sequence', value: {keys: {keyCode: [16 /* Shift */]}}}, ], autoInteractive: true, }, @@ -156,7 +156,7 @@ title: 'tutorial_quick_orientation_basic_navigation_title', content: [ 'tutorial_quick_orientation_basic_navigation_move_text', - 'tutorial_quick_orientation_basic_navigation_click_text' + 'tutorial_quick_orientation_basic_navigation_click_text', ], medium: InteractionMedium.KEYBOARD, curriculums: [Curriculum.QUICK_ORIENTATION], @@ -168,7 +168,7 @@ { type: 'key_sequence', value: {cvoxModifier: true, keys: {keyCode: [32]}}, - } + }, ], autoInteractive: true, }, @@ -203,7 +203,7 @@ medium: InteractionMedium.KEYBOARD, curriculums: [Curriculum.QUICK_ORIENTATION], actions: [ - {type: 'key_sequence', value: {keys: {keyCode: [13 /* Enter */]}}} + {type: 'key_sequence', value: {keys: {keyCode: [13 /* Enter */]}}}, ], autoInteractive: true, }, @@ -212,7 +212,7 @@ title: 'tutorial_quick_orientation_lists_title', content: [ 'tutorial_quick_orientation_lists_text', - 'tutorial_quick_orientation_lists_continue_text' + 'tutorial_quick_orientation_lists_continue_text', ], medium: InteractionMedium.KEYBOARD, curriculums: [Curriculum.QUICK_ORIENTATION], @@ -222,14 +222,14 @@ practiceFile: 'selects', practiceState: {}, events: [], - hints: [] + hints: [], }, { title: 'tutorial_quick_orientation_complete_title', content: [ 'tutorial_quick_orientation_complete_text', - 'tutorial_quick_orientation_complete_additional_text' + 'tutorial_quick_orientation_complete_additional_text', ], medium: InteractionMedium.KEYBOARD, curriculums: [Curriculum.QUICK_ORIENTATION], @@ -270,7 +270,7 @@ practiceFile: 'jump_commands', practiceState: {}, events: [], - hints: [] + hints: [], }, { @@ -279,7 +279,7 @@ 'tutorial_menus', ], medium: InteractionMedium.KEYBOARD, - curriculums: [Curriculum.COMMAND_REFERENCES] + curriculums: [Curriculum.COMMAND_REFERENCES], }, { @@ -289,14 +289,14 @@ 'tutorial_chromebook_ctrl_forward', ], medium: InteractionMedium.KEYBOARD, - curriculums: [Curriculum.COMMAND_REFERENCES] + curriculums: [Curriculum.COMMAND_REFERENCES], }, { title: 'tutorial_earcon_page_title', content: ['tutorial_earcon_page_body'], medium: InteractionMedium.KEYBOARD, - curriculums: [Curriculum.SOUNDS_AND_SETTINGS] + curriculums: [Curriculum.SOUNDS_AND_SETTINGS], }, { @@ -329,10 +329,10 @@ content: [ 'tutorial_touch_orientation_next_item_text', 'tutorial_touch_orientation_previous_item_text', - 'tutorial_touch_orientation_next_previous_continue_text' + 'tutorial_touch_orientation_next_previous_continue_text', ], medium: InteractionMedium.TOUCH, - curriculums: [Curriculum.TOUCH_ORIENTATION] + curriculums: [Curriculum.TOUCH_ORIENTATION], }, { @@ -344,7 +344,7 @@ 'tutorial_touch_orientation_touch_explore_continue_text', ], medium: InteractionMedium.TOUCH, - curriculums: [Curriculum.TOUCH_ORIENTATION] + curriculums: [Curriculum.TOUCH_ORIENTATION], }, { @@ -380,9 +380,9 @@ type: 'gesture', value: 'swipeRight4', shouldPropagate: false, - afterActionCmd: 'nextObject' + afterActionCmd: 'nextObject', }, - {type: 'gesture', value: 'swipeLeft4', shouldPropagate: false} + {type: 'gesture', value: 'swipeLeft4', shouldPropagate: false}, ], autoInteractive: true, }, @@ -392,13 +392,13 @@ content: [ 'tutorial_touch_orientation_complete_text', 'tutorial_touch_orientation_complete_help_center_text', - 'tutorial_touch_orientation_complete_more_tutorials_text' + 'tutorial_touch_orientation_complete_more_tutorials_text', ], medium: InteractionMedium.TOUCH, - curriculums: [Curriculum.TOUCH_ORIENTATION] + curriculums: [Curriculum.TOUCH_ORIENTATION], }, - ] - } + ], + }, }, /** @override */ @@ -558,12 +558,14 @@ } else if (type === NudgeType.GENERAL) { const messages = this.medium === InteractionMedium.KEYBOARD ? [ - 'tutorial_hint_navigate', 'tutorial_hint_click', - 'tutorial_hint_exit' + 'tutorial_hint_navigate', + 'tutorial_hint_click', + 'tutorial_hint_exit', ] : [ - 'tutorial_touch_hint_navigate', 'tutorial_touch_hint_click', - 'tutorial_touch_hint_exit' + 'tutorial_touch_hint_navigate', + 'tutorial_touch_hint_click', + 'tutorial_touch_hint_exit', ]; this.nudgeArray_ = [ this.requestFullyDescribe.bind(this), @@ -572,7 +574,7 @@ maybeGiveNudge.bind(this, this.getMsg(messages[0])), maybeGiveNudge.bind(this, this.getMsg(messages[1])), this.requestSpeech.bind( - this, this.getMsg(messages[2]), QueueMode.INTERJECT) + this, this.getMsg(messages[2]), QueueMode.INTERJECT), ]; } else { throw new Error('Invalid NudgeType: ' + type); @@ -705,15 +707,15 @@ { msgId: 'next_command_reference', link: - 'https://support.google.com/chromebook/answer/7031755#zippy=%2Cmove-through-a-page-with-keyboard-shortcuts' + 'https://support.google.com/chromebook/answer/7031755#zippy=%2Cmove-through-a-page-with-keyboard-shortcuts', }, { msgId: 'chrome_keyboard_shortcuts', - link: 'https://support.google.com/chromebook/answer/183101?hl=en' + link: 'https://support.google.com/chromebook/answer/183101?hl=en', }, { msgId: 'touchscreen_accessibility', - link: 'https://support.google.com/chromebook/answer/6103702?hl=en' + link: 'https://support.google.com/chromebook/answer/6103702?hl=en', }, ]; for (const resource of resources) { @@ -759,5 +761,5 @@ // Automatically return the description for touch, since the only supported // interaction mediums are touch and keyboard. return 'tutorial_touch_lesson_menu_header_description'; - } + }, });
diff --git a/chrome/browser/resources/chromeos/accessibility/common/tutorial/lesson_container.js b/chrome/browser/resources/chromeos/accessibility/common/tutorial/lesson_container.js index de230d0..5fcdf8c2 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/tutorial/lesson_container.js +++ b/chrome/browser/resources/chromeos/accessibility/common/tutorial/lesson_container.js
@@ -64,5 +64,5 @@ } return lessons; - } + }, });
diff --git a/chrome/browser/resources/chromeos/accessibility/common/tutorial/lesson_menu.js b/chrome/browser/resources/chromeos/accessibility/common/tutorial/lesson_menu.js index 7a6be18..40c0f60 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/tutorial/lesson_menu.js +++ b/chrome/browser/resources/chromeos/accessibility/common/tutorial/lesson_menu.js
@@ -95,5 +95,5 @@ */ shouldHideLessonButton_(validCurriculums, curriculum) { return !validCurriculums.includes(curriculum); - } + }, });
diff --git a/chrome/browser/resources/chromeos/accessibility/common/tutorial/localization.js b/chrome/browser/resources/chromeos/accessibility/common/tutorial/localization.js index 469b2ed6..6c0eb06 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/tutorial/localization.js +++ b/chrome/browser/resources/chromeos/accessibility/common/tutorial/localization.js
@@ -20,5 +20,5 @@ */ getMsg(id, opt_subs) { return Msgs.getMsg(id, opt_subs); - } + }, };
diff --git a/chrome/browser/resources/chromeos/accessibility/common/tutorial/tutorial_behavior.js b/chrome/browser/resources/chromeos/accessibility/common/tutorial/tutorial_behavior.js index 3445740..17b9dc037 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/tutorial/tutorial_behavior.js +++ b/chrome/browser/resources/chromeos/accessibility/common/tutorial/tutorial_behavior.js
@@ -17,14 +17,14 @@ curriculum: { type: String, value: Curriculum.NONE, - observer: 'updateIncludedLessons_' + observer: 'updateIncludedLessons_', }, /** @type {InteractionMedium} */ medium: { type: String, value: InteractionMedium.NONE, - observer: 'updateIncludedLessons_' + observer: 'updateIncludedLessons_', }, /** @@ -55,7 +55,7 @@ activeLessonId: { type: Number, value: NO_ACTIVE_LESSON, - observer: 'onActiveLessonIdChanged_' + observer: 'onActiveLessonIdChanged_', }, /** @type {Screen} */ @@ -153,7 +153,7 @@ ret.push({ title: this.lessonData[i].title, curriculums: this.lessonData[i].curriculums, - lessonId: i + lessonId: i, }); } return ret; @@ -269,5 +269,5 @@ onActiveLessonIdChanged_() {}, /** @private */ - onTutorialVisibilityChanged_() {} + onTutorialVisibilityChanged_() {}, };
diff --git a/chrome/browser/resources/chromeos/accessibility/enhanced_network_tts/enhanced_network_tts_e2e_test_base.js b/chrome/browser/resources/chromeos/accessibility/enhanced_network_tts/enhanced_network_tts_e2e_test_base.js index 37fb27e..99d4396d 100644 --- a/chrome/browser/resources/chromeos/accessibility/enhanced_network_tts/enhanced_network_tts_e2e_test_base.js +++ b/chrome/browser/resources/chromeos/accessibility/enhanced_network_tts/enhanced_network_tts_e2e_test_base.js
@@ -26,7 +26,7 @@ addListener: callback => { this.onStopListeners.push(callback); }, - } + }, }; }
diff --git a/chrome/browser/resources/chromeos/accessibility/enhanced_network_tts/enhanced_network_tts_unittest.js b/chrome/browser/resources/chromeos/accessibility/enhanced_network_tts/enhanced_network_tts_unittest.js index 1b663bb..0b700ec6 100644 --- a/chrome/browser/resources/chromeos/accessibility/enhanced_network_tts/enhanced_network_tts_unittest.js +++ b/chrome/browser/resources/chromeos/accessibility/enhanced_network_tts/enhanced_network_tts_unittest.js
@@ -43,21 +43,21 @@ audioBuffer: EnhancedNetworkTts.subarrayFrom(decodedAudioData, 0, bufferSize), charIndex: undefined, - isLastBuffer: false + isLastBuffer: false, }, // 0.04s - 0.08s contains the start of the first word. { audioBuffer: EnhancedNetworkTts.subarrayFrom( decodedAudioData, bufferSize, bufferSize), charIndex: 0, - isLastBuffer: false + isLastBuffer: false, }, // 0.08s - 0.12s is a part of the first word. { audioBuffer: EnhancedNetworkTts.subarrayFrom( decodedAudioData, bufferSize * 2, bufferSize), charIndex: undefined, - isLastBuffer: false + isLastBuffer: false, }, // 0.12s - 0.16s contains the end of the first word and the start of the // second. @@ -65,21 +65,21 @@ audioBuffer: EnhancedNetworkTts.subarrayFrom( decodedAudioData, bufferSize * 3, bufferSize), charIndex: 6, - isLastBuffer: false + isLastBuffer: false, }, // 0.16s - 0.2s is a part of the second word. { audioBuffer: EnhancedNetworkTts.subarrayFrom( decodedAudioData, bufferSize * 4, bufferSize), charIndex: undefined, - isLastBuffer: false + isLastBuffer: false, }, // The last buffer runs 0.0135s. { audioBuffer: EnhancedNetworkTts.subarrayFrom( decodedAudioData, bufferSize * 5, bufferSize), charIndex: undefined, - isLastBuffer: true + isLastBuffer: true, }, ]; const sendTtsAudio = function(receivedBuffer) { @@ -198,21 +198,21 @@ audioBuffer: EnhancedNetworkTts.subarrayFrom(decodedAudioData, 0, bufferSize), charIndex: undefined, - isLastBuffer: false + isLastBuffer: false, }, // 0.04s - 0.08s contains the start of the first word. { audioBuffer: EnhancedNetworkTts.subarrayFrom( decodedAudioData, bufferSize, bufferSize), charIndex: 0, - isLastBuffer: false + isLastBuffer: false, }, // 0.08s - 0.12s is a part of the first word. { audioBuffer: EnhancedNetworkTts.subarrayFrom( decodedAudioData, bufferSize * 2, bufferSize), charIndex: undefined, - isLastBuffer: false + isLastBuffer: false, }, // 0.12s - 0.16s contains the end of the first word and the start of the // second. @@ -220,21 +220,21 @@ audioBuffer: EnhancedNetworkTts.subarrayFrom( decodedAudioData, bufferSize * 3, bufferSize), charIndex: 6, - isLastBuffer: false + isLastBuffer: false, }, // 0.16s - 0.2s is a part of the second word. { audioBuffer: EnhancedNetworkTts.subarrayFrom( decodedAudioData, bufferSize * 4, bufferSize), charIndex: undefined, - isLastBuffer: false + isLastBuffer: false, }, // The last buffer runs 0.0135s. { audioBuffer: EnhancedNetworkTts.subarrayFrom( decodedAudioData, bufferSize * 5, bufferSize), charIndex: undefined, - isLastBuffer: true + isLastBuffer: true, }, ]; // Copy the expectedBuffers but modify |isLastBuffer|. @@ -289,7 +289,7 @@ 218, 164, 141, 181, 7, 252, 252, 185, 183, 181, 96, 71, 167, 143, 221, 7, 142, 104, 12, 209, 169, 168, 188, 105, 184, 244, 111, 145, 71, 40, 74, 40, 33, 234, 158, 16, 44, 104, 9, 73, 154, 65, 180, 184, 46, - 212, 58, 33, 41, 158, 252, 16, 100, 140, 106, 65, 21, 168, 221 + 212, 58, 33, 41, 158, 252, 16, 100, 140, 106, 65, 21, 168, 221, ]; return new Uint8Array(testData).buffer; } @@ -308,13 +308,13 @@ 'text': 'Hello', 'textOffset': 0, // The word offset to the start of the utterance. 'timeOffset': '0.05s', // Start time at the entire playback. - 'duration': '0.1s' // The word lasts 0.1s. + 'duration': '0.1s', // The word lasts 0.1s. }, { 'text': 'world', 'textOffset': 6, // The word offset to the start of the utterance. 'timeOffset': '0.15s', // Start time at the entire playback. - 'duration': '0.06s' // The word lasts 0.6s. - } // The last 0.0035s in the playback is empty. + 'duration': '0.06s', // The word lasts 0.6s. + }, // The last 0.0035s in the playback is empty. ]; }
diff --git a/chrome/browser/resources/chromeos/accessibility/enhanced_network_tts/mock_mojo_private.js b/chrome/browser/resources/chromeos/accessibility/enhanced_network_tts/mock_mojo_private.js index 32ae91d..07b2f01 100644 --- a/chrome/browser/resources/chromeos/accessibility/enhanced_network_tts/mock_mojo_private.js +++ b/chrome/browser/resources/chromeos/accessibility/enhanced_network_tts/mock_mojo_private.js
@@ -102,7 +102,7 @@ enqueueAudioData(audio, timeInfo, lastData) { const response = {'data': {audio, timeInfo, lastData}}; this.queuedResults_.push(response); - } + }, }; /**
diff --git a/chrome/browser/resources/chromeos/accessibility/select_to_speak/metrics_utils.js b/chrome/browser/resources/chromeos/accessibility/select_to_speak/metrics_utils.js index 20d92c2..bdfd1bfe 100644 --- a/chrome/browser/resources/chromeos/accessibility/select_to_speak/metrics_utils.js +++ b/chrome/browser/resources/chromeos/accessibility/select_to_speak/metrics_utils.js
@@ -171,7 +171,7 @@ */ MetricsUtils.START_SPEECH_METHOD_METRIC = { EVENT_COUNT: Object.keys(MetricsUtils.StartSpeechMethod).length, - METRIC_NAME: 'Accessibility.CrosSelectToSpeak.StartSpeechMethod' + METRIC_NAME: 'Accessibility.CrosSelectToSpeak.StartSpeechMethod', }; /** @@ -192,7 +192,7 @@ */ MetricsUtils.STATE_CHANGE_METRIC = { EVENT_COUNT: Object.keys(MetricsUtils.StateChangeEvent).length, - METRIC_NAME: 'Accessibility.CrosSelectToSpeak.StateChangeEvent' + METRIC_NAME: 'Accessibility.CrosSelectToSpeak.StateChangeEvent', }; /** @@ -215,7 +215,7 @@ */ MetricsUtils.TTS_ENGINE_USED_METRIC = { EVENT_COUNT: Object.keys(MetricsUtils.TtsEngineUsed).length, - METRIC_NAME: 'Accessibility.CrosSelectToSpeak.TtsEngineUsed' + METRIC_NAME: 'Accessibility.CrosSelectToSpeak.TtsEngineUsed', }; /**
diff --git a/chrome/browser/resources/chromeos/accessibility/select_to_speak/node_navigation_utils_unittest.js b/chrome/browser/resources/chromeos/accessibility/select_to_speak/node_navigation_utils_unittest.js index 5f92f70..72ac956 100644 --- a/chrome/browser/resources/chromeos/accessibility/select_to_speak/node_navigation_utils_unittest.js +++ b/chrome/browser/resources/chromeos/accessibility/select_to_speak/node_navigation_utils_unittest.js
@@ -167,7 +167,7 @@ role: 'staticText', parent: paragraph2, root: otherRoot, - name: 'Line 2' + name: 'Line 2', }); let result = NodeNavigationUtils.getNextParagraphWithNode_( @@ -204,13 +204,13 @@ role: 'paragraph', display: 'block', parent: iframeRoot, - root: iframeRoot + root: iframeRoot, }); const text2 = createMockNode({ role: 'staticText', parent: paragraph2, root: iframeRoot, - name: 'Line 2' + name: 'Line 2', }); const paragraph3 = createMockNode( {role: 'paragraph', display: 'block', parent: root, root}); @@ -285,7 +285,7 @@ role: 'staticText', parent: nestedParagraph, root, - name: 'Middle text' + name: 'Middle text', }); const text3 = createMockNode( {role: 'staticText', parent: paragraph1, root, name: 'After text'}); @@ -609,14 +609,14 @@ parent: paragraph1, root, name: 'Line 1.', - sentenceStarts: [0] + sentenceStarts: [0], }); const text2 = createMockNode({ role: 'staticText', parent: paragraph1, root, name: 'Line 2.', - sentenceStarts: [0] + sentenceStarts: [0], }); const paragraph2 = createMockNode( {role: 'paragraph', display: 'block', parent: root, root}); @@ -625,14 +625,14 @@ parent: paragraph2, root, name: 'Line 3.', - sentenceStarts: [0] + sentenceStarts: [0], }); const text4 = createMockNode({ role: 'staticText', parent: paragraph2, root, name: 'Line 4.', - sentenceStarts: [0] + sentenceStarts: [0], }); const nodeGroupForParagraph1 = ParagraphUtils.buildNodeGroup( [text1, text2], 0 /* index */, {splitOnLanguage: false}); @@ -754,35 +754,35 @@ parent: paragraph1, root, name: 'Line 1.', - sentenceStarts: [0] + sentenceStarts: [0], }); const text2 = createMockNode({ role: 'staticText', parent: paragraph1, root, name: 'This sentence', - sentenceStarts: [0] + sentenceStarts: [0], }); const text3 = createMockNode({ role: 'staticText', parent: paragraph1, root, name: 'is chopped. Another', - sentenceStarts: [12] + sentenceStarts: [12], }); const text4 = createMockNode({ role: 'staticText', parent: paragraph1, root, name: 'chopped', - sentenceStarts: [] + sentenceStarts: [], }); const text5 = createMockNode({ role: 'staticText', parent: paragraph1, root, name: 'sentence.', - sentenceStarts: [] + sentenceStarts: [], }); const nodeGroup = ParagraphUtils.buildNodeGroup( [text1, text2, text3, text4, text5], 0 /* index */,
diff --git a/chrome/browser/resources/chromeos/accessibility/select_to_speak/node_utils.js b/chrome/browser/resources/chromeos/accessibility/select_to_speak/node_utils.js index a51470c9..a1387b7 100644 --- a/chrome/browser/resources/chromeos/accessibility/select_to_speak/node_utils.js +++ b/chrome/browser/resources/chromeos/accessibility/select_to_speak/node_utils.js
@@ -239,7 +239,7 @@ return { node: automationPosition.node, - offset: automationPosition.textOffset + offset: automationPosition.textOffset, }; } @@ -272,7 +272,7 @@ node: /** @type {!AutomationNode} */ (child), offset: isStart ? 0 : - NodeUtils.nameLength(/** @type {!AutomationNode} */ (child)) + NodeUtils.nameLength(/** @type {!AutomationNode} */ (child)), }; } else if (isStart && !NodeUtils.isTextField(parent)) { // We are off the edge of this parent. Go to the next leaf node that is @@ -293,7 +293,7 @@ if (previousNode) { return { node: previousNode, - offset: NodeUtils.nameLength(previousNode) + offset: NodeUtils.nameLength(previousNode), }; } } @@ -353,7 +353,7 @@ if (leafNode) { return { node: leafNode, - offset: isStart ? 0 : NodeUtils.nameLength(leafNode) + offset: isStart ? 0 : NodeUtils.nameLength(leafNode), }; } } @@ -370,7 +370,7 @@ if (leafNode) { return { node: leafNode, - offset: isStart ? 0 : NodeUtils.nameLength(leafNode) + offset: isStart ? 0 : NodeUtils.nameLength(leafNode), }; } }
diff --git a/chrome/browser/resources/chromeos/accessibility/select_to_speak/node_utils_unittest.js b/chrome/browser/resources/chromeos/accessibility/select_to_speak/node_utils_unittest.js index 690d66b..565a97d 100644 --- a/chrome/browser/resources/chromeos/accessibility/select_to_speak/node_utils_unittest.js +++ b/chrome/browser/resources/chromeos/accessibility/select_to_speak/node_utils_unittest.js
@@ -34,14 +34,14 @@ const invisibleNode1 = { root: {}, parent: {role: ''}, - state: {invisible: true} + state: {invisible: true}, }; // Currently nodes aren't actually marked 'invisible', so we need to // navigate up their tree. const invisibleNode2 = { root: {}, parent: {role: 'window', state: {invisible: true}}, - state: {} + state: {}, }; const invisibleNode3 = {root: {}, parent: invisibleNode2, state: {}}; const invisibleNode4 = {root: {}, parent: invisibleNode3, state: {}}; @@ -58,7 +58,7 @@ const normalNode1 = { root: {}, parent: {role: 'window', state: {}}, - state: {} + state: {}, }; const normalNode2 = {root: {}, parent: {normalNode1}, state: {}}; assertEquals( @@ -127,7 +127,7 @@ state: {}, role: 'rootWebArea', state: {}, - location: {left: 0, top: 0, width: 600, height: 600} + location: {left: 0, top: 0, width: 600, height: 600}, }; const container1 = { root: rootNode, @@ -135,14 +135,14 @@ role: 'staticText', name: 'one two', state: {}, - location: {left: 0, top: 0, width: 200, height: 200} + location: {left: 0, top: 0, width: 200, height: 200}, }; const container2 = { root: rootNode, parent: rootNode, state: {}, role: 'genericContainer', - location: {left: 0, top: 0, width: 200, height: 200} + location: {left: 0, top: 0, width: 200, height: 200}, }; const node1 = { root: rootNode, @@ -150,7 +150,7 @@ name: 'one', role: 'inlineTextBox', state: {}, - location: {left: 50, top: 0, width: 50, height: 50} + location: {left: 50, top: 0, width: 50, height: 50}, }; const node2 = { root: rootNode, @@ -158,7 +158,7 @@ name: 'two', role: 'inlineTextBox', state: {}, - location: {left: 0, top: 50, width: 50, height: 50} + location: {left: 0, top: 50, width: 50, height: 50}, }; const node3 = { root: rootNode, @@ -166,7 +166,7 @@ value: 'text', role: 'textField', state: {}, - location: {left: 0, top: 0, width: 25, height: 25} + location: {left: 0, top: 0, width: 25, height: 25}, }; // Set up relationships between nodes. @@ -230,7 +230,7 @@ parent: container2, name: 'four', state: {}, - location: {left: 0, top: 50, width: 50, height: 50} + location: {left: 0, top: 50, width: 50, height: 50}, }; container2.firstChild = node4; assertTrue(NodeUtils.findAllMatching(rootNode, rect, result)); @@ -261,7 +261,7 @@ root: {}, state: {}, role: 'rootWebArea', - location: {left: 0, top: 0, width: 600, height: 600} + location: {left: 0, top: 0, width: 600, height: 600}, }; const checkbox = { root: rootNode, @@ -269,7 +269,7 @@ role: 'checkBox', state: {}, location: {left: 0, top: 0, width: 200, height: 200}, - checked: 'true' + checked: 'true', }; rootNode.children = [checkbox]; rootNode.firstChild = checkbox; @@ -304,7 +304,7 @@ name: 'Hello, world', children: [child1, child2], role: 'staticText', - state: {} + state: {}, }; child1.parent = root; child2.parent = root; @@ -345,7 +345,7 @@ role: 'staticText', state: {}, firstChild: child1, - lastChild: child3 + lastChild: child3, }; child1.parent = child4; child2.parent = child4; @@ -361,7 +361,7 @@ role: 'staticText', state: {}, firstChild: child5, - lastChild: child6 + lastChild: child6, }; child5.parent = child7; child6.parent = child7; @@ -372,7 +372,7 @@ role: 'genericContainer', state: {}, firstChild: child4, - lastChild: child7 + lastChild: child7, }; child4.parent = root; child7.parent = root; @@ -408,30 +408,30 @@ const gNode1 = { role: 'genericContainer', parent: svgRootNode, - unclippedLocation: {left: 300, top: 10, width: 100, height: 50} + unclippedLocation: {left: 300, top: 10, width: 100, height: 50}, }; const gNode2 = { role: 'genericContainer', parent: svgRootNode, - unclippedLocation: {left: 20, top: 10, width: 100, height: 50} + unclippedLocation: {left: 20, top: 10, width: 100, height: 50}, }; const textNode1 = { role: 'staticText', parent: gNode2, unclippedLocation: {left: 50, top: 10, width: 20, height: 50}, - name: 'one' + name: 'one', }; const textNode2 = { role: 'staticText', parent: gNode1, unclippedLocation: {left: 300, top: 10, width: 20, height: 50}, - name: 'two' + name: 'two', }; const textNode3 = { role: 'staticText', parent: gNode1, unclippedLocation: {left: 350, top: 10, width: 20, height: 50}, - name: 'three' + name: 'three', }; const nodes = [textNode3, textNode2, textNode1]; @@ -450,13 +450,13 @@ role: 'staticText', parent: svg1RootNode, unclippedLocation: {left: 0, top: 10, width: 20, height: 50}, - name: 'SVG 1 Node 1' + name: 'SVG 1 Node 1', }; const svg1Node2 = { role: 'staticText', parent: svg1RootNode, unclippedLocation: {left: 50, top: 10, width: 20, height: 50}, - name: 'SVG 1 Node 2' + name: 'SVG 1 Node 2', }; const textNode2 = {role: 'staticText', name: 'Text Node 2'}; const svg2RootNode = {role: 'svgRoot'}; @@ -464,19 +464,24 @@ role: 'staticText', parent: svg2RootNode, unclippedLocation: {left: 300, top: 10, width: 20, height: 50}, - name: 'SVG 2 Node 1' + name: 'SVG 2 Node 1', }; const svg2Node2 = { role: 'staticText', parent: svg2RootNode, unclippedLocation: {left: 350, top: 10, width: 20, height: 50}, - name: 'SVG 2 Node 2' + name: 'SVG 2 Node 2', }; const textNode3 = {role: 'staticText', name: 'Text Node 3'}; const nodes = [ - textNode1, svg1Node2, svg1Node1, textNode2, svg2Node2, svg2Node1, - textNode3 + textNode1, + svg1Node2, + svg1Node1, + textNode2, + svg2Node2, + svg2Node1, + textNode3, ]; NodeUtils.sortSvgNodesByReadingOrder(nodes);
diff --git a/chrome/browser/resources/chromeos/accessibility/select_to_speak/paragraph_utils.js b/chrome/browser/resources/chromeos/accessibility/select_to_speak/paragraph_utils.js index 0eeae60d..545e09b 100644 --- a/chrome/browser/resources/chromeos/accessibility/select_to_speak/paragraph_utils.js +++ b/chrome/browser/resources/chromeos/accessibility/select_to_speak/paragraph_utils.js
@@ -478,7 +478,7 @@ return { nodeGroup, startIndexInGroup: opt_startIndex, - endIndexInGroup: opt_endIndex + endIndexInGroup: opt_endIndex, }; } @@ -530,7 +530,7 @@ return inlineTextNode ? { node: inlineTextNode, offset: currentNodeOffset - - ParagraphUtils.getStartCharIndexInParent(inlineTextNode) + ParagraphUtils.getStartCharIndexInParent(inlineTextNode), } : {node: currentNode, offset: currentNodeOffset}; }
diff --git a/chrome/browser/resources/chromeos/accessibility/select_to_speak/paragraph_utils_unittest.js b/chrome/browser/resources/chromeos/accessibility/select_to_speak/paragraph_utils_unittest.js index 1aa4363f..60cb56d 100644 --- a/chrome/browser/resources/chromeos/accessibility/select_to_speak/paragraph_utils_unittest.js +++ b/chrome/browser/resources/chromeos/accessibility/select_to_speak/paragraph_utils_unittest.js
@@ -124,25 +124,25 @@ 'SelectToSpeakParagraphUnitTest', 'GetStartCharIndexInParent', function() { const staticText = { role: 'staticText', - name: 'My name is Bond, James Bond' + name: 'My name is Bond, James Bond', }; const inline1 = { role: 'inlineTextBox', name: 'My name is ', indexInParent: 0, - parent: staticText + parent: staticText, }; const inline2 = { role: 'inlineTextBox', name: 'Bond, ', indexInParent: 1, - parent: staticText + parent: staticText, }; const inline3 = { role: 'inlineTextBox', name: 'James Bond', indexInParent: 2, - parent: staticText + parent: staticText, }; staticText.children = [inline1, inline2, inline3]; assertEquals(ParagraphUtils.getStartCharIndexInParent(inline1), 0); @@ -155,7 +155,7 @@ function() { const staticText = { role: 'staticText', - name: 'My name is Bond, James Bond' + name: 'My name is Bond, James Bond', }; const inline1 = {role: 'inlineTextBox', name: 'My name is '}; const inline2 = {role: 'inlineTextBox', name: 'Bond, '}; @@ -190,7 +190,7 @@ function() { const staticText = { role: 'staticText', - name: 'My name is Bond, James Bond' + name: 'My name is Bond, James Bond', }; const inline1 = {role: 'inlineTextBox', name: 'My name is '}; const inline2 = {role: 'inlineTextBox', name: 'Bond, '}; @@ -292,21 +292,21 @@ parent: root, name: 'text1', root, - detectedLanguage: 'en-US' + detectedLanguage: 'en-US', }; const text2 = { role: 'staticText', parent: root, name: 'text2', root, - detectedLanguage: 'en-US' + detectedLanguage: 'en-US', }; const text3 = { role: 'staticText', parent: root, name: 'text3', root, - detectedLanguage: 'fr-FR' + detectedLanguage: 'fr-FR', }; const result1 = ParagraphUtils.buildNodeGroup( @@ -368,7 +368,7 @@ parent: root, name: 'text3', root, - detectedLanguage: 'fr-FR' + detectedLanguage: 'fr-FR', }; const result = ParagraphUtils.buildNodeGroup( [text1, text2, text3], 0, {splitOnLanguage}); @@ -398,7 +398,7 @@ parent: root, name: 'text2', root, - detectedLanguage: 'en-US' + detectedLanguage: 'en-US', }; const text3 = {role: 'staticText', parent: root, name: 'text3', root}; const text4 = { @@ -406,7 +406,7 @@ parent: root, name: 'text4', root, - detectedLanguage: 'fr-FR' + detectedLanguage: 'fr-FR', }; const result = ParagraphUtils.buildNodeGroup( [text1, text2, text3, text4], 0, {splitOnLanguage}); @@ -434,7 +434,7 @@ parent: root, name: 'text2', root, - detectedLanguage: 'en-US' + detectedLanguage: 'en-US', }; const text3 = {role: 'staticText', parent: root, name: 'text3', root}; const text4 = { @@ -442,7 +442,7 @@ parent: root, name: 'text4', root, - detectedLanguage: 'fr-FR' + detectedLanguage: 'fr-FR', }; const result = ParagraphUtils.buildNodeGroup( [text1, text2, text3, text4], 0, {splitOnLanguage}); @@ -492,7 +492,7 @@ role: 'textField', name: 'Address and search bar', value: 'http://www.google.com', - children: [] + children: [], }; let result = ParagraphUtils.buildNodeGroup([searchBar], 0); assertEquals('http://www.google.com ', result.text); @@ -652,45 +652,45 @@ const text1 = { name: 'The first sentence.', role: 'staticText', - parent: paragraph + parent: paragraph, }; const inlineText1 = { role: 'inlineTextBox', name: 'The first', indexInParent: 0, - parent: text1 + parent: text1, }; const inlineText2 = { role: 'inlineTextBox', name: ' sentence.', indexInParent: 1, - parent: text1 + parent: text1, }; text1.children = [inlineText1, inlineText2]; const text2 = { name: 'The second sentence is longer.', role: 'staticText', - parent: paragraph + parent: paragraph, }; const inlineText3 = { role: 'inlineTextBox', name: 'The second', indexInParent: 0, - parent: text2 + parent: text2, }; const inlineText4 = { role: 'inlineTextBox', name: ' sentence is longer.', indexInParent: 1, - parent: text2 + parent: text2, }; text2.children = [inlineText3, inlineText4]; const text3 = { name: 'No child sentence.', role: 'staticText', - parent: paragraph + parent: paragraph, }; return [inlineText1, inlineText2, inlineText3, inlineText4, text3];
diff --git a/chrome/browser/resources/chromeos/accessibility/select_to_speak/prefs_manager.js b/chrome/browser/resources/chromeos/accessibility/select_to_speak/prefs_manager.js index 27841739c..7ad904c 100644 --- a/chrome/browser/resources/chromeos/accessibility/select_to_speak/prefs_manager.js +++ b/chrome/browser/resources/chromeos/accessibility/select_to_speak/prefs_manager.js
@@ -270,9 +270,16 @@ const updatePrefs = () => { chrome.storage.sync.get( [ - 'voice', 'rate', 'pitch', 'wordHighlight', 'highlightColor', - 'backgroundShading', 'navigationControls', 'enhancedNetworkVoices', - 'enhancedVoicesDialogShown', 'enhancedVoiceName' + 'voice', + 'rate', + 'pitch', + 'wordHighlight', + 'highlightColor', + 'backgroundShading', + 'navigationControls', + 'enhancedNetworkVoices', + 'enhancedVoicesDialogShown', + 'enhancedVoiceName', ], prefs => { if (prefs['voice']) { @@ -311,7 +318,7 @@ prefs['enhancedNetworkVoices']; } else { chrome.storage.sync.set({ - 'enhancedNetworkVoices': this.enhancedNetworkVoicesEnabled_ + 'enhancedNetworkVoices': this.enhancedNetworkVoicesEnabled_, }); } // Tests can set |this.enhancedVoicesDialogShown_|. @@ -321,7 +328,7 @@ prefs['enhancedVoicesDialogShown']; } else { chrome.storage.sync.set({ - 'enhancedVoicesDialogShown': this.enhancedVoicesDialogShown_ + 'enhancedVoicesDialogShown': this.enhancedVoicesDialogShown_, }); } if (prefs['rate'] && prefs['pitch']) {
diff --git a/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak.js b/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak.js index 2054204..9373bb4 100644 --- a/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak.js +++ b/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak.js
@@ -429,13 +429,13 @@ // relates to a node that doesn't exist. this.startSpeechQueue_(nodes, { clearFocusRing: userRequested, - startCharIndex: firstPosition.offset + startCharIndex: firstPosition.offset, }); } else { this.startSpeechQueue_(nodes, { clearFocusRing: userRequested, startCharIndex: firstPosition.offset, - endCharIndex: lastPosition.offset + endCharIndex: lastPosition.offset, }); } if (focusedNode) { @@ -466,7 +466,7 @@ chrome.tabs.executeScript(tab.id, { allFrames: true, matchAboutBlank: true, - code: 'document.execCommand("copy");' + code: 'document.execCommand("copy");', }); if (userRequested) { MetricsUtils.recordStartEvent( @@ -690,8 +690,8 @@ { url: [ 'https://docs.google.com/document*', - 'https://docs.sandbox.google.com/*' - ] + 'https://docs.sandbox.google.com/*', + ], }, tabs => { tabs.forEach(tab => { @@ -744,7 +744,7 @@ this.cancelIfSpeaking_(true /* clear the focus ring */); }, // onTextReceived: Text received from a 'paste' event to read aloud. - onTextReceived: text => this.startSpeech_(text) + onTextReceived: text => this.startSpeech_(text), }); this.inputHandler_.setUpEventListeners(); @@ -1373,7 +1373,8 @@ if (hasLength) { this.currentNodeWord_ = { 'start': event.charIndex - this.currentNodeGroupItem_.startChar, - 'end': event.charIndex + length - this.currentNodeGroupItem_.startChar + 'end': + event.charIndex + length - this.currentNodeGroupItem_.startChar, }; this.updateUi_(); } else {
diff --git a/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak_enhanced_voices_test.js b/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak_enhanced_voices_test.js index 3d02da7..223c3eba 100644 --- a/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak_enhanced_voices_test.js +++ b/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak_enhanced_voices_test.js
@@ -27,7 +27,7 @@ this.mockSettingsPrivate_ = new settings.FakeSettingsPrivate([ {type: 'number', key: 'settings.tts.speech_rate', value: 1.0}, {type: 'number', key: 'settings.tts.speech_pitch', value: 1.0}, - {type: 'boolean', key: this.enhancedNetworkVoicesPolicyKey_, value: true} + {type: 'boolean', key: this.enhancedNetworkVoicesPolicyKey_, value: true}, ]); this.mockSettingsPrivate_.allowSetPref(); chrome.settingsPrivate = this.mockSettingsPrivate_; @@ -35,7 +35,7 @@ chrome.i18n = { getMessage(msgid) { return msgid; - } + }, }; } @@ -88,7 +88,7 @@ const textNode = this.findTextNode(root, 'This is some text'); const event = { screenX: textNode.location.left + 1, - screenY: textNode.location.top + 1 + screenY: textNode.location.top + 1, }; this.triggerReadMouseSelectedText(event, event); }); @@ -115,7 +115,7 @@ const textNode = this.findTextNode(root, 'This is some text'); const event = { screenX: textNode.location.left + 1, - screenY: textNode.location.top + 1 + screenY: textNode.location.top + 1, }; this.triggerReadMouseSelectedText(event, event); }); @@ -142,7 +142,7 @@ const textNode = this.findTextNode(root, 'This is some text'); const event = { screenX: textNode.location.left + 1, - screenY: textNode.location.top + 1 + screenY: textNode.location.top + 1, }; this.triggerReadMouseSelectedText(event, event); }); @@ -172,7 +172,7 @@ const textNode = this.findTextNode(root, 'This is some text'); const event = { screenX: textNode.location.left + 1, - screenY: textNode.location.top + 1 + screenY: textNode.location.top + 1, }; this.triggerReadMouseSelectedText(event, event); });
diff --git a/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak_keystroke_selection_test.js b/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak_keystroke_selection_test.js index 4b22ec6..22091b0c 100644 --- a/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak_keystroke_selection_test.js +++ b/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak_keystroke_selection_test.js
@@ -50,7 +50,7 @@ anchorObject: textNode, anchorOffset, focusObject: textNode, - focusOffset + focusOffset, }); }, expected); } @@ -137,7 +137,7 @@ anchorObject: firstNode, anchorOffset: 0, focusObject: lastNode, - focusOffset: 5 + focusOffset: 5, }); }, 'This is some bold text'); @@ -156,7 +156,7 @@ anchorObject: firstNode, anchorOffset: 5, focusObject: lastNode, - focusOffset: 0 + focusOffset: 0, }); }, 'This is some bold text'); @@ -175,7 +175,7 @@ anchorObject: firstNode, anchorOffset: 0, focusObject: lastNode, - focusOffset: 1 + focusOffset: 1, }); }; setFocusCallback = this.newCallback(setFocusCallback); @@ -213,7 +213,7 @@ anchorObject: firstNode, anchorOffset: 0, focusObject: lastNode, - focusOffset: 5 + focusOffset: 5, }); }, 'This is some bold text'); @@ -232,7 +232,7 @@ anchorObject: firstNode, anchorOffset: 0, focusObject: lastNode, - focusOffset: 5 + focusOffset: 5, }); }, 'This is some text'); @@ -248,7 +248,7 @@ anchorObject: container, anchorOffset: 0, focusObject: container, - focusOffset: 1 + focusOffset: 1, }); }, 'one'); }); @@ -265,7 +265,7 @@ anchorObject: container, anchorOffset: 1, focusObject: container, - focusOffset: 2 + focusOffset: 2, }); }, 'two');
diff --git a/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak_mouse_selection_test.js b/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak_mouse_selection_test.js index 2979dc62..bb528ab 100644 --- a/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak_mouse_selection_test.js +++ b/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak_mouse_selection_test.js
@@ -34,7 +34,7 @@ tapTrayButton(desktop, callback) { const button = desktop.find({ - attributes: {className: SELECT_TO_SPEAK_TRAY_CLASS_NAME} + attributes: {className: SELECT_TO_SPEAK_TRAY_CLASS_NAME}, }); callback = this.newCallback(callback); @@ -65,7 +65,7 @@ const textNode = this.findTextNode(root, 'This is some text'); const event = { screenX: textNode.location.left + 1, - screenY: textNode.location.top + 1 + screenY: textNode.location.top + 1, }; this.triggerReadMouseSelectedText(event, event); }); @@ -88,17 +88,17 @@ this.newCallback(function(utterance) { this.assertEqualsCollapseWhitespace( utterance, 'This is some more text'); - }) + }), ]); const firstNode = this.findTextNode(root, 'This is some text'); const downEvent = { screenX: firstNode.location.left + 1, - screenY: firstNode.location.top + 1 + screenY: firstNode.location.top + 1, }; const lastNode = this.findTextNode(root, 'This is some more text'); const upEvent = { screenX: lastNode.location.left + lastNode.location.width, - screenY: lastNode.location.top + lastNode.location.height + screenY: lastNode.location.top + lastNode.location.height, }; this.triggerReadMouseSelectedText(downEvent, upEvent); }); @@ -124,12 +124,12 @@ root, 'This is some text in a paragraph that wraps. '); const downEvent = { screenX: firstNode.location.left + 1, - screenY: firstNode.location.top + 1 + screenY: firstNode.location.top + 1, }; const lastNode = this.findTextNode(root, 'Italic text'); const upEvent = { screenX: lastNode.location.left + lastNode.location.width, - screenY: lastNode.location.top + lastNode.location.height + screenY: lastNode.location.top + lastNode.location.height, }; this.triggerReadMouseSelectedText(downEvent, upEvent); }); @@ -152,7 +152,7 @@ const textNode = this.findTextNode(root, 'This is some text'); const event = { screenX: textNode.location.left + 1, - screenY: textNode.location.top + 1 + screenY: textNode.location.top + 1, }; // A state change request should shift us into 'selecting' state // from 'inactive'. @@ -172,7 +172,7 @@ const textNode = this.findTextNode(root, 'This is some text'); const event = { screenX: textNode.location.left + 1, - screenY: textNode.location.top + 1 + screenY: textNode.location.top + 1, }; // A state change request should shift us into 'selecting' state // from 'inactive'. @@ -214,7 +214,7 @@ const textNode = this.findTextNode(root, 'This is some text'); const event = { screenX: textNode.location.left + 1, - screenY: textNode.location.top + 1 + screenY: textNode.location.top + 1, }; this.triggerReadMouseSelectedText(event, event); }); @@ -233,7 +233,7 @@ this.tapTrayButton(desktop, () => { assertEquals(selectToSpeak.state_, SelectToSpeakState.SELECTING); const button = desktop.find({ - attributes: {className: SELECT_TO_SPEAK_TRAY_CLASS_NAME} + attributes: {className: SELECT_TO_SPEAK_TRAY_CLASS_NAME}, }); // Use the same automation callbacks as Select-to-Speak to make @@ -252,7 +252,7 @@ const event = { screenX: button.location.left + 1, - screenY: button.location.top + 1 + screenY: button.location.top + 1, }; selectToSpeak.fireMockMouseDownEvent(event); selectToSpeak.fireMockMouseUpEvent(event);
diff --git a/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak_navigation_control_test.js b/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak_navigation_control_test.js index a47fde6..61e8402 100644 --- a/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak_navigation_control_test.js +++ b/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak_navigation_control_test.js
@@ -166,17 +166,17 @@ const textNode2 = this.findTextNode(root, 'two'); const mouseEvent2 = { screenX: textNode2.location.left + 1, - screenY: textNode2.location.top + 1 + screenY: textNode2.location.top + 1, }; this.triggerReadMouseSelectedText(mouseEvent2, mouseEvent2); - }) + }), ]); // Click on node in first paragraph. const textNode1 = this.findTextNode(root, 'one'); const event1 = { screenX: textNode1.location.left + 1, - screenY: textNode1.location.top + 1 + screenY: textNode1.location.top + 1, }; this.triggerReadMouseSelectedText(event1, event1); }); @@ -444,7 +444,7 @@ anchorObject: firstNode, anchorOffset: 5, focusObject: lastNode, - focusOffset: 6 + focusOffset: 6, }); }); const root = await this.runWithLoadedTree(bodyHtml); @@ -826,7 +826,7 @@ anchorObject: node, anchorOffset: 0, focusObject: node, - focusOffset: 5 + focusOffset: 5, }); }); const root = await this.runWithLoadedTree(bodyHtml); @@ -997,7 +997,7 @@ anchorObject: textNode, anchorOffset: 0, focusObject: textNode, - focusOffset: 0 + focusOffset: 0, }); // Perform Search key + S, which should restore focus to
diff --git a/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak_prefs_test.js b/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak_prefs_test.js index 9b45378..210e03e 100644 --- a/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak_prefs_test.js +++ b/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak_prefs_test.js
@@ -23,7 +23,7 @@ this.mockSettingsPrivate_ = new settings.FakeSettingsPrivate([ {type: 'number', key: 'settings.tts.speech_rate', value: 1.0}, {type: 'number', key: 'settings.tts.speech_pitch', value: 1.0}, - {type: 'boolean', key: enhancedNetworkVoicesAllowedKey, value: true} + {type: 'boolean', key: enhancedNetworkVoicesAllowedKey, value: true}, ]); this.mockSettingsPrivate_.allowSetPref(); chrome.settingsPrivate = this.mockSettingsPrivate_; @@ -31,7 +31,7 @@ chrome.i18n = { getMessage(msgid) { return msgid; - } + }, }; }
diff --git a/chrome/browser/resources/chromeos/accessibility/select_to_speak/sentence_utils_unittest.js b/chrome/browser/resources/chromeos/accessibility/select_to_speak/sentence_utils_unittest.js index 6808bbb5..2e478bd 100644 --- a/chrome/browser/resources/chromeos/accessibility/select_to_speak/sentence_utils_unittest.js +++ b/chrome/browser/resources/chromeos/accessibility/select_to_speak/sentence_utils_unittest.js
@@ -276,7 +276,7 @@ const staticText = { sentenceStarts: [0, 7, 12], name: 'Hello. New. World.', - role: 'staticText' + role: 'staticText', }; const node = {node: staticText, startChar: 0}; return {nodes: [node], text: 'Hello. New. World.'}; @@ -286,14 +286,14 @@ const staticText1 = { name: 'Hello. New. ', role: 'staticText', - sentenceStarts: [0, 7] + sentenceStarts: [0, 7], }; const node1 = {node: staticText1, startChar: 0}; const staticText2 = { name: 'Beautiful. World.', role: 'staticText', - sentenceStarts: [0, 11] + sentenceStarts: [0, 11], }; const node2 = {node: staticText2, startChar: 12}; @@ -307,7 +307,7 @@ const staticText2 = { name: ' world. New', role: 'staticText', - sentenceStarts: [8] + sentenceStarts: [8], }; const node2 = {node: staticText2, startChar: 5};
diff --git a/chrome/browser/resources/chromeos/accessibility/select_to_speak/test_node_generator.js b/chrome/browser/resources/chromeos/accessibility/select_to_speak/test_node_generator.js index b9134bd..d3ae16f5 100644 --- a/chrome/browser/resources/chromeos/accessibility/select_to_speak/test_node_generator.js +++ b/chrome/browser/resources/chromeos/accessibility/select_to_speak/test_node_generator.js
@@ -49,31 +49,31 @@ role: 'inlineTextBox', name: 'The first', indexInParent: 0, - parent: text1 + parent: text1, }); const inlineText2 = createMockNode({ role: 'inlineTextBox', name: ' sentence.', indexInParent: 1, - parent: text1 + parent: text1, }); const text2 = createMockNode({ name: 'The second sentence is longer.', role: 'staticText', - parent: paragraph + parent: paragraph, }); const inlineText3 = createMockNode({ role: 'inlineTextBox', name: 'The second', indexInParent: 0, - parent: text2 + parent: text2, }); const inlineText4 = createMockNode({ role: 'inlineTextBox', name: ' sentence is longer.', indexInParent: 1, - parent: text2 + parent: text2, }); const text3 = createMockNode(
diff --git a/chrome/browser/resources/chromeos/accessibility/select_to_speak/tts_manager.js b/chrome/browser/resources/chromeos/accessibility/select_to_speak/tts_manager.js index fd94a403..987828ca 100644 --- a/chrome/browser/resources/chromeos/accessibility/select_to_speak/tts_manager.js +++ b/chrome/browser/resources/chromeos/accessibility/select_to_speak/tts_manager.js
@@ -123,7 +123,7 @@ } TtsManager.sendEventToOptions(ttsOptions, { type: chrome.tts.EventType.START, - charIndex: this.currentCharIndex_ + charIndex: this.currentCharIndex_, }); break; case chrome.tts.EventType.END: @@ -131,7 +131,7 @@ this.currentCharIndex_ = text.length + offset; TtsManager.sendEventToOptions(ttsOptions, { type: chrome.tts.EventType.END, - charIndex: this.currentCharIndex_ + charIndex: this.currentCharIndex_, }); break; case chrome.tts.EventType.WORD: @@ -140,7 +140,7 @@ TtsManager.sendEventToOptions(ttsOptions, { type: chrome.tts.EventType.WORD, charIndex: this.currentCharIndex_, - length: event.length + length: event.length, }); break; case chrome.tts.EventType.INTERRUPTED: @@ -151,7 +151,7 @@ if (this.pauseCompleteCallback_) { TtsManager.sendEventToOptions(ttsOptions, { type: chrome.tts.EventType.PAUSE, - charIndex: this.currentCharIndex_ + charIndex: this.currentCharIndex_, }); this.pauseCompleteCallback_(); break; @@ -203,7 +203,7 @@ if (this.text_.slice(this.currentCharIndex_).trim().length === 0) { TtsManager.sendEventToOptions(ttsOptions, { type: chrome.tts.EventType.ERROR, - errorMessage: TtsManager.ErrorMessage.RESUME_WITH_EMPTY_CONTENT + errorMessage: TtsManager.ErrorMessage.RESUME_WITH_EMPTY_CONTENT, }); return; }
diff --git a/chrome/browser/resources/chromeos/accessibility/select_to_speak/word_utils_unittest.js b/chrome/browser/resources/chromeos/accessibility/select_to_speak/word_utils_unittest.js index f853954..15ee2f7 100644 --- a/chrome/browser/resources/chromeos/accessibility/select_to_speak/word_utils_unittest.js +++ b/chrome/browser/resources/chromeos/accessibility/select_to_speak/word_utils_unittest.js
@@ -58,7 +58,7 @@ function() { const inlineText = { wordStarts: [0, 5, 10, 16], - name: 'once upon kitty cat' + name: 'once upon kitty cat', }; const staticText = {children: [inlineText], name: 'once upon kitty cat'}; const node = {node: staticText, startChar: 9, hasInlineText: true}; @@ -83,16 +83,16 @@ const inlineText1 = { wordStarts: [0, 6], name: 'kitty cat ', - indexInParent: 0 + indexInParent: 0, }; const inlineText2 = { wordStarts: [0, 3], name: 'is cute', - indexInParent: 1 + indexInParent: 1, }; const staticText = { children: [inlineText1, inlineText2], - name: 'kitty cat is cute' + name: 'kitty cat is cute', }; inlineText1.parent = staticText; inlineText2.parent = staticText; @@ -127,12 +127,12 @@ const inlineText1 = { wordEnds: [5, 9], name: 'kitty cat ', - indexInParent: 0 + indexInParent: 0, }; const inlineText2 = {wordEnds: [2, 7], name: 'is cute', indexInParent: 1}; const staticText = { children: [inlineText1, inlineText2], - name: 'kitty cat is cute' + name: 'kitty cat is cute', }; inlineText1.parent = staticText; inlineText2.parent = staticText;
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/action_manager.js b/chrome/browser/resources/chromeos/accessibility/switch_access/action_manager.js index 0a100d9..22b0ae8 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/action_manager.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/action_manager.js
@@ -184,7 +184,7 @@ SwitchAccessMenuAction.MOVE_FORWARD_ONE_WORD_OF_TEXT, SwitchAccessMenuAction.MOVE_BACKWARD_ONE_CHAR_OF_TEXT, SwitchAccessMenuAction.MOVE_FORWARD_ONE_CHAR_OF_TEXT, - SwitchAccessMenuAction.END_TEXT_SELECTION + SwitchAccessMenuAction.END_TEXT_SELECTION, ]; case SAConstants.MenuType.POINT_SCAN_MENU: return [ @@ -252,7 +252,7 @@ left: Math.floor(Navigator.byPoint.currentPoint.x), top: Math.floor(Navigator.byPoint.currentPoint.y), width: 1, - height: 1 + height: 1, }; }
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/commands.js b/chrome/browser/resources/chromeos/accessibility/switch_access/commands.js index 9cdc081..274f1a9 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/commands.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/commands.js
@@ -22,12 +22,12 @@ [SwitchAccessCommand.SELECT, ActionManager.onSelect], [ SwitchAccessCommand.NEXT, - Navigator.byItem.moveForward.bind(Navigator.byItem) + Navigator.byItem.moveForward.bind(Navigator.byItem), ], [ SwitchAccessCommand.PREVIOUS, - Navigator.byItem.moveBackward.bind(Navigator.byItem) - ] + Navigator.byItem.moveBackward.bind(Navigator.byItem), + ], ]); chrome.accessibilityPrivate.onSwitchAccessCommand.addListener(
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/focus_ring_manager.js b/chrome/browser/resources/chromeos/accessibility/switch_access/focus_ring_manager.js index 2b75fb12..522a5392 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/focus_ring_manager.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/focus_ring_manager.js
@@ -24,7 +24,8 @@ /** @private {!Map<SAConstants.Focus.ID, SAChildNode>} */ this.ringNodesForTesting_ = new Map([ - [SAConstants.Focus.ID.PRIMARY, null], [SAConstants.Focus.ID.PREVIEW, null] + [SAConstants.Focus.ID.PRIMARY, null], + [SAConstants.Focus.ID.PREVIEW, null], ]); /** @@ -155,7 +156,7 @@ rects: [], type: chrome.accessibilityPrivate.FocusType.SOLID, color: SAConstants.Focus.PRIMARY_COLOR, - secondaryColor: SAConstants.Focus.OUTER_COLOR + secondaryColor: SAConstants.Focus.OUTER_COLOR, }; const previewRing = { @@ -163,12 +164,12 @@ rects: [], type: chrome.accessibilityPrivate.FocusType.DASHED, color: SAConstants.Focus.PREVIEW_COLOR, - secondaryColor: SAConstants.Focus.OUTER_COLOR + secondaryColor: SAConstants.Focus.OUTER_COLOR, }; return new Map([ [SAConstants.Focus.ID.PRIMARY, primaryRing], - [SAConstants.Focus.ID.PREVIEW, previewRing] + [SAConstants.Focus.ID.PREVIEW, previewRing], ]); }
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/item_scan_manager.js b/chrome/browser/resources/chromeos/accessibility/switch_access/item_scan_manager.js index f1801d38..df6ab389 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/item_scan_manager.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/item_scan_manager.js
@@ -420,7 +420,7 @@ treeChange => this.onTreeChange_(treeChange), { predicate: treeChange => this.group_.findChild(treeChange.target) != null || - this.group_.isEquivalentTo(treeChange.target) + this.group_.isEquivalentTo(treeChange.target), }); // The status tray fires a SHOW event when it opens. @@ -428,7 +428,7 @@ this.desktop_, [ chrome.automation.EventType.MENU_START, - chrome.automation.EventType.SHOW + chrome.automation.EventType.SHOW, ], event => this.onModalDialog_(event)) .start();
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/item_scan_manager_test.js b/chrome/browser/resources/chromeos/accessibility/switch_access/item_scan_manager_test.js index 08b55fd..6541091f 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/item_scan_manager_test.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/item_scan_manager_test.js
@@ -470,7 +470,7 @@ // Fake a children changed event. handler.eventStack_ = [{ type: chrome.automation.EventType.CHILDREN_CHANGED, - target: automationGroup + target: automationGroup, }]; handler.handleEvent_(); @@ -585,7 +585,7 @@ // Wait for focus to move to the password field. await this.untilFocusIs({ role: chrome.automation.RoleType.TEXT_FIELD, - name: 'Password for stub-user@example.com' + name: 'Password for stub-user@example.com', }); // The button is no longer in the tree because the screen is locked.
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/menu_manager.js b/chrome/browser/resources/chromeos/accessibility/switch_access/menu_manager.js index 087f4139..26578af 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/menu_manager.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/menu_manager.js
@@ -134,7 +134,7 @@ SwitchAccess.findNodeMatching( { role: chrome.automation.RoleType.MENU, - attributes: {className: 'SwitchAccessMenuView'} + attributes: {className: 'SwitchAccessMenuView'}, }, node => this.jumpToMenuAutomationNode_(node)); } @@ -163,7 +163,7 @@ node, [ chrome.automation.EventType.CHILDREN_CHANGED, - chrome.automation.EventType.LOCATION_CHANGED + chrome.automation.EventType.LOCATION_CHANGED, ], () => this.jumpToMenuAutomationNode_(node), {listenOnce: true}) .start();
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/metrics.js b/chrome/browser/resources/chromeos/accessibility/switch_access/metrics.js index af01687..5b75b79 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/metrics.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/metrics.js
@@ -24,5 +24,5 @@ const underscoreAndWhitespaceRegex = /(\s|_)+/g; return str.replace(wordRegex, word => word.toUpperCase()) .replace(underscoreAndWhitespaceRegex, ''); - } + }, };
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/back_button_node.js b/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/back_button_node.js index adcdb19e..697608c 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/back_button_node.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/back_button_node.js
@@ -155,7 +155,7 @@ SwitchAccess.findNodeMatching( { role: chrome.automation.RoleType.BUTTON, - attributes: {className: 'SwitchAccessBackButtonView'} + attributes: {className: 'SwitchAccessBackButtonView'}, }, BackButtonNode.saveAutomationNode_); }
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/combo_box_node.js b/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/combo_box_node.js index d4d6eeb..85875619 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/combo_box_node.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/combo_box_node.js
@@ -86,5 +86,5 @@ BasicNode.creators.push({ predicate: AutomationPredicate.comboBox, - creator: (node, parent) => new ComboBoxNode(node, parent) + creator: (node, parent) => new ComboBoxNode(node, parent), });
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/editable_text_node.js b/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/editable_text_node.js index 20d3cd4..c111c06 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/editable_text_node.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/editable_text_node.js
@@ -145,5 +145,5 @@ BasicNode.creators.push({ predicate: SwitchAccessPredicate.isTextInput, - creator: (node, parentNode) => new EditableTextNode(node, parentNode) + creator: (node, parentNode) => new EditableTextNode(node, parentNode), });
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/keyboard_node.js b/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/keyboard_node.js index b0a74eb3..17f0058 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/keyboard_node.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/keyboard_node.js
@@ -263,5 +263,5 @@ BasicRootNode.builders.push({ predicate: rootNode => rootNode.role === chrome.automation.RoleType.KEYBOARD, - builder: KeyboardRootNode.buildTree + builder: KeyboardRootNode.buildTree, });
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/slider_node.js b/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/slider_node.js index 09c846f..21839eb2 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/slider_node.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/slider_node.js
@@ -48,5 +48,5 @@ BasicNode.creators.push({ predicate: baseNode => baseNode.role === chrome.automation.RoleType.SLIDER, - creator: (node, parent) => new SliderNode(node, parent) + creator: (node, parent) => new SliderNode(node, parent), });
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/tab_node.js b/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/tab_node.js index 0d40436c..5dafc4e 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/tab_node.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/tab_node.js
@@ -131,5 +131,5 @@ BasicNode.creators.push({ predicate: baseNode => baseNode.role === chrome.automation.RoleType.TAB && baseNode.root.role === chrome.automation.RoleType.DESKTOP, - creator: TabNode.create + creator: TabNode.create, });
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/window_node.js b/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/window_node.js index 4b66072a..02ba461 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/window_node.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/window_node.js
@@ -38,5 +38,5 @@ BasicRootNode.builders.push({ predicate: rootNode => SwitchAccessPredicate.isWindow(rootNode), - builder: WindowRootNode.buildTree + builder: WindowRootNode.buildTree, });
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/saatlite/compiler/parser.js b/chrome/browser/resources/chromeos/accessibility/switch_access/saatlite/compiler/parser.js index b4fb73f..7c671f6 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/saatlite/compiler/parser.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/saatlite/compiler/parser.js
@@ -618,7 +618,7 @@ options: { type: 'lalr', hasPartialLrUpgradeOnConflict: true, - errorRecoveryTokenDiscardCount: 3 + errorRecoveryTokenDiscardCount: 3, }, symbols_: { '$accept': 0, @@ -650,7 +650,7 @@ 'statement': 22, 'statements': 21, 'string_literal': 28, - 'test': 19 + 'test': 19, }, terminals_: { 1: 'EOF', @@ -670,7 +670,7 @@ 15: 'FOCUS', 16: 'ON', 17: 'ROLE', - 18: 'STRING_LITERAL' + 18: 'STRING_LITERAL', }, TERROR: 2, EOF: 1, @@ -792,13 +792,29 @@ }, productions_: bp({ pop: u([ - 19, 19, 20, 20, s, [21, 4], s, [22, 4], 23, 23, 24, 24, 25, 25, 26, s, - [27, 4], 28 + 19, + 19, + 20, + 20, + s, + [21, 4], + s, + [22, 4], + 23, + 23, + 24, + 24, + 25, + 25, + 26, + s, + [27, 4], + 28, ]), rule: u([ - 3, 2, 2, 3, s, [3, 4, -1], 1, 1, 2, 2, c, [4, 3], 1, 5, 0, c, [18, 3], - s, [1, 3] - ]) + 3, 2, 2, 3, s, [3, 4, -1], 1, 1, 2, 2, + c, [4, 3], 1, 5, 0, c, [18, 3], s, [1, 3], + ]), }), performAction: function parser__PerformAction( yystate /* action[1] */, yysp, yyvstack) { @@ -1022,7 +1038,7 @@ table: bt({ len: u([ 11, 1, 8, 2, 5, s, [0, 3], 4, 2, 2, 0, 7, 0, 4, 7, - s, [0, 3], 1, 0, 1, s, [0, 4], 1, 4, 1, 0, 4, 3, c, [12, 5] + s, [0, 3], 1, 0, 1, s, [0, 4], 1, 4, 1, 0, 4, 3, c, [12, 5], ]), symbol: u([ 1, s, [3, 6, 1], s, [19, 4, 1], 1, 1, c, [11, 5], @@ -1030,29 +1046,30 @@ 4, 11, 25, 15, 26, 1, 4, c, [23, 6], 22, c, [19, 6], c, [11, 4], 10, 12, 16, 13, 17, 18, 27, 28, 12, 1, 4, 18, 28, - 1, 4, 17, 14 + 1, 4, 17, 14, ]), type: u([ s, [2, 7], s, [0, 4], 1, c, [11, 8], c, [7, 10], 0, 2, c, [13, 6], c, [11, 5], c, - [26, 8], c, [51, 9], c, [23, 7], 2, 2 + [26, 8], c, [51, 9], c, [23, 7], 2, 2, ]), state: u([1, 2, 3, 5, 10, 5, 13, 15, 18, 20, 23, 24, 15, 29, 31, 34]), mode: u([ 2, 1, 2, s, [1, 4], 2, c, [6, 5], s, [1, 5], - c, [11, 6], c, [17, 8], s, [2, 6], c, [27, 10], c, [12, 4] + c, [11, 6], c, [17, 8], s, [2, 6], c, [27, 10], c, [12, 4], ]), goto: u([ 8, 4, 8, s, [6, 4, 1], 8, c, [6, 5], 11, 12, 14, 16, 17, 18, 18, 19, 21, 22, 12, s, [6, 3], c, [17, 3], 16, 17, s, [13, 6], s, [25, 4, 1], 30, - 32, 33, 22, 22, 32, 23, 23, 35, 36 - ]) + 32, 33, 22, 22, 32, 23, 23, 35, 36, + ]), }), defaultActions: bda({ idx: u( [5, 6, 7, 11, 13, 16, 17, 18, 20, s, [22, 4, 1], 29, 32, 34, 35, 36]), - goto: u([7, 9, 10, 2, 3, 14, 16, 11, 12, 1, 5, 4, 15, 19, 24, 20, 21, 17]) + goto: + u([7, 9, 10, 2, 3, 14, 16, 11, 12, 1, 5, 4, 15, 19, 24, 20, 21, 17]), }), parseError: function parseError(str, hash, ExceptionClass) { if (hash.recoverable) { @@ -1093,7 +1110,7 @@ var ERROR_RECOVERY_TOKEN_DISCARD_COUNT = (this.options.errorRecoveryTokenDiscardCount | 0) || 3; var NO_ACTION = [ - 0, 37 /* === table.length :: ensures that anyone using this new state + 0, 37, /* === table.length :: ensures that anyone using this new state will fail dramatically! */ ]; @@ -1112,9 +1129,9 @@ pre_parse: undefined, post_parse: undefined, pre_lex: undefined, - post_lex: - undefined // WARNING: must be written this way for the code - // expanders to work correctly in both ES5 and ES6 modes! + post_lex: undefined, // WARNING: must be written this way for the code + // expanders to work correctly in both ES5 and ES6 + // modes! }; var ASSERT; @@ -1318,7 +1335,7 @@ } } this.recoverable = rec; - } + }, }; // track this instance so we can `destroy()` it once we deem it // superfluous and ready for garbage collection! @@ -1609,7 +1626,7 @@ } // /finally return retval; - } + }, }; parser.originalParseError = parser.parseError; parser.originalQuoteName = parser.quoteName; @@ -2079,7 +2096,7 @@ } this.recoverable = rec; - } + }, }; // track this instance so we can `destroy()` it once we deem it @@ -2201,7 +2218,7 @@ first_column: col, last_line: this.yylineno + 1, last_column: col, - range: [this.offset, this.offset] + range: [this.offset, this.offset], }; }, @@ -2273,7 +2290,7 @@ first_column: 0, last_line: 1, last_column: 0, - range: [0, 0] + range: [0, 0], }; this.offset = 0; @@ -2656,7 +2673,7 @@ first_column: 0, last_line: 1, last_column: 0, - range: [0, 0] + range: [0, 0], }; if (actual) { @@ -2951,7 +2968,7 @@ last_line: this.yylloc.last_line, first_column: this.yylloc.first_column, last_column: this.yylloc.last_column, - range: this.yylloc.range.slice(0) + range: this.yylloc.range.slice(0), }, yytext: this.yytext, @@ -2967,7 +2984,7 @@ yy: this.yy, conditionStack: this.conditionStack.slice(0), - done: this.done + done: this.done, }; } @@ -3009,8 +3026,11 @@ // // function lexer__performAction(yy, yyrulenumber, YY_START) {...} token = this.performAction.call( - this, this.yy, indexed_rule, - this.conditionStack[this.conditionStack.length - 1] /* = YY_START */ + this, + this.yy, + indexed_rule, + this.conditionStack[this.conditionStack.length - 1], /* = YY_START + */ ); // otherwise, when the action codes are all simple return token @@ -3278,7 +3298,7 @@ this.yy && typeof this.yy.post_lex === 'function' || typeof this.options.post_lex === 'function' || typeof this.post_lex === 'function') && - typeof this.fastLex === 'function' + typeof this.fastLex === 'function', }; return rv; @@ -3472,7 +3492,7 @@ /*! Conditions:: INITIAL */ /*! Rule:: $ */ - 20: 1 + 20: 1, }, rules: [ @@ -3497,19 +3517,19 @@ /* 18: */ /^(?:textField)/i, /* 19: */ /^(?:textFieldWithComboBox)/i, /* 20: */ /^(?:$)/i, - /* 21: */ /^(?:\s)/i + /* 21: */ /^(?:\s)/i, ], conditions: { 'INITIAL': { rules: [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21 + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, ], - inclusive: true - } - } + inclusive: true, + }, + }, }; return lexer;
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_constants.js b/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_constants.js index fa3358a..0f39c2b1 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_constants.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_constants.js
@@ -145,7 +145,7 @@ PRIMARY: 'primary', // The ID for the ring showing a preview of the next focus, if the user // selects the current element. - PREVIEW: 'preview' + PREVIEW: 'preview', }, /**
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_e2e_test_base.js b/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_e2e_test_base.js index 115ca3b..49fb290 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_e2e_test_base.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_e2e_test_base.js
@@ -3,7 +3,8 @@ // found in the LICENSE file. GEN_INCLUDE([ - '../common/testing/assert_additions.js', '../common/testing/e2e_test_base.js' + '../common/testing/assert_additions.js', + '../common/testing/e2e_test_base.js', ]); /** Base class for browser tests for Switch Access. */
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_predicate.js b/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_predicate.js index 1db8ec6..af2f8011 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_predicate.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_predicate.js
@@ -241,7 +241,7 @@ return { leaf: SwitchAccessPredicate.leaf(scope, cache), root: SwitchAccessPredicate.root(scope), - visit: SwitchAccessPredicate.visit(scope, cache) + visit: SwitchAccessPredicate.visit(scope, cache), }; }, @@ -281,5 +281,5 @@ visit(scope, cache) { return node => node.role !== RoleType.DESKTOP && SwitchAccessPredicate.isInteresting(node, scope, cache); - } + }, };
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_predicate_test.js b/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_predicate_test.js index 45c055a7..87bdb7b 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_predicate_test.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_predicate_test.js
@@ -86,7 +86,7 @@ leaf4, leaf5, leaf6, - leaf7 + leaf7, }; }
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/test_support.js b/chrome/browser/resources/chromeos/accessibility/switch_access/test_support.js index 79e652c..fd9ddc8 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/test_support.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/test_support.js
@@ -25,7 +25,7 @@ const focusRingState = { 'primary': {'role': '', 'name': ''}, - 'preview': {'role': '', 'name': ''} + 'preview': {'role': '', 'name': ''}, }; let expectedType = ''; let expectedRole = '';
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/text_navigation_manager.js b/chrome/browser/resources/chromeos/accessibility/switch_access/text_navigation_manager.js index 337b6c95..02acb39 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/text_navigation_manager.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/text_navigation_manager.js
@@ -382,7 +382,7 @@ anchorObject: this.selectionStartObject_, anchorOffset: this.selectionStartIndex_, focusObject: this.selectionEndObject_, - focusOffset: this.selectionEndIndex_ + focusOffset: this.selectionEndIndex_, }); } }
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/text_navigation_manager_test.js b/chrome/browser/resources/chromeos/accessibility/switch_access/text_navigation_manager_test.js index 53547dc..44080ecae 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/text_navigation_manager_test.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/text_navigation_manager_test.js
@@ -218,7 +218,7 @@ targetIndex: 0, navigationAction: () => { TextNavigationManager.jumpToBeginning(); - } + }, }); }); @@ -232,7 +232,7 @@ targetIndex: 8, navigationAction: () => { TextNavigationManager.jumpToEnd(); - } + }, }); }); @@ -246,7 +246,7 @@ targetIndex: 6, navigationAction: () => { TextNavigationManager.moveBackwardOneChar(); - } + }, }); }); @@ -260,7 +260,7 @@ targetIndex: 0, navigationAction: () => { TextNavigationManager.moveBackwardOneWord(); - } + }, }); }); @@ -274,7 +274,7 @@ targetIndex: 1, navigationAction: () => { TextNavigationManager.moveForwardOneChar(); - } + }, }); }); @@ -288,7 +288,7 @@ targetIndex: 12, navigationAction: () => { TextNavigationManager.moveForwardOneWord(); - } + }, }); }); @@ -304,7 +304,7 @@ wrap: 'hard', navigationAction: () => { TextNavigationManager.moveUpOneLine(); - } + }, }); }); @@ -320,7 +320,7 @@ wrap: 'hard', navigationAction: () => { TextNavigationManager.moveDownOneLine(); - } + }, }); }); @@ -386,7 +386,7 @@ wrap: 'hard', navigationAction: () => { TextNavigationManager.moveForwardOneChar(); - } + }, }); }); @@ -407,7 +407,7 @@ navigationAction: () => { TextNavigationManager.moveBackwardOneWord(); }, - backward: true + backward: true, }); });
diff --git a/chrome/browser/resources/chromeos/arc_account_picker/arc_account_picker_app.js b/chrome/browser/resources/chromeos/arc_account_picker/arc_account_picker_app.js index 7926fd1..ca5d212 100644 --- a/chrome/browser/resources/chromeos/arc_account_picker/arc_account_picker_app.js +++ b/chrome/browser/resources/chromeos/arc_account_picker/arc_account_picker_app.js
@@ -65,7 +65,7 @@ */ accounts_: { type: Array, - } + }, }; }
diff --git a/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_graphics_tracing.js b/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_graphics_tracing.js index 3ed8fd2..d4399b3 100644 --- a/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_graphics_tracing.js +++ b/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_graphics_tracing.js
@@ -25,7 +25,7 @@ setModel(model) { setGraphicBuffersModel(model); - } + }, }; });
diff --git a/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_graphics_tracing_ui.js b/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_graphics_tracing_ui.js index 13ede3c..c85c45e6 100644 --- a/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_graphics_tracing_ui.js +++ b/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_graphics_tracing_ui.js
@@ -126,8 +126,7 @@ memoryBands.addChartSources( [ new Events(model.system.memory, 2 /* kSwapRead */, 2 /* kSwapRead */), - new Events( - model.system.memory, 3 /* kSwapWrite */, 3 /* kSwapWrite */) + new Events(model.system.memory, 3 /* kSwapWrite */, 3 /* kSwapWrite */), ], true /* smooth */); // Geom objects and size.
diff --git a/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_overview_tracing_ui.js b/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_overview_tracing_ui.js index 644b55f..2efa9cbb 100644 --- a/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_overview_tracing_ui.js +++ b/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_overview_tracing_ui.js
@@ -100,7 +100,7 @@ if (deltas.events.length < 3) { return [ - 0.0 /* % */, 0.0 /* ms */ + 0.0 /* % */, 0.0, /* ms */ ]; } @@ -112,7 +112,7 @@ return [ renderQuality * 100.0 /* convert to % */, - commitDeviation * 0.001 /* mcs to ms */ + commitDeviation * 0.001, /* mcs to ms */ ]; } @@ -738,7 +738,7 @@ minValue: 0, name: 'ms', scale: 1.0 / 1000.0, - width: 1.0 + width: 1.0, }; for (i = 0; i < models.length; i++) { var attributes = Object.assign({}, attributesTemplate); @@ -769,7 +769,7 @@ minValue: 0, name: 'watts', scale: 1.0 / 1000, - width: 1.0 + width: 1.0, }; for (i = 0; i < models.length; i++) { var events = new Events(models[i].system.memory, eventType, eventType);
diff --git a/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_tracing_ui.js b/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_tracing_ui.js index d701e5e..ea568a5 100644 --- a/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_tracing_ui.js +++ b/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_tracing_ui.js
@@ -17,8 +17,19 @@ // Supported zooms, mcs per pixel var zooms = [ - 2.5, 5.0, 10.0, 25.0, 50.0, 100.0, 250.0, 500.0, 1000.0, 2500.0, 5000.0, - 10000.0, 25000.0 + 2.5, + 5.0, + 10.0, + 25.0, + 50.0, + 100.0, + 250.0, + 500.0, + 1000.0, + 2500.0, + 5000.0, + 10000.0, + 25000.0, ]; // Active zoom level, as index in |zooms|. By default 100 mcs per pixel. @@ -88,7 +99,7 @@ color: '#ff0000', name: 'Android composition jank', width: 1.0, - radius: 4.0 + radius: 4.0, }, // kVsyncTimestamp 406: {color: '#ff3300', name: 'vsync', width: 0.5}, @@ -108,7 +119,7 @@ color: '#ff0000', name: 'Chrome composition jank', width: 1.0, - radius: 4.0 + radius: 4.0, }, // kCustomEvent @@ -185,7 +196,7 @@ minRange: 512.0, name: 'used mb', scale: 1.0 / 1024.0, - width: 1.0 + width: 1.0, }, // kSwapRead. 2: { @@ -193,7 +204,7 @@ minRange: 32.0, name: 'swap read sectors', scale: 1.0, - width: 1.0 + width: 1.0, }, // kSwapWrite. 3: { @@ -201,7 +212,7 @@ minRange: 32.0, name: 'swap write sectors', scale: 1.0, - width: 1.0 + width: 1.0, }, // kGemObjects. 5: { @@ -209,7 +220,7 @@ minRange: 1000, name: 'geom. objects', scale: 1.0, - width: 1.0 + width: 1.0, }, // kGemSize. 6: { @@ -217,7 +228,7 @@ minRange: 256.0, name: 'geom. size mb', scale: 1.0 / 1024.0, - width: 1.0 + width: 1.0, }, // kGpuFrequency. 7: { @@ -225,7 +236,7 @@ minRange: 300.0, name: 'GPU frequency mhz', scale: 1.0, - width: 1.0 + width: 1.0, }, // kCpuTemperature. 8: { @@ -233,7 +244,7 @@ minRange: 20.0, name: 'CPU celsius.', scale: 1.0 / 1000.0, - width: 1.0 + width: 1.0, }, // kCpuFrequency. 9: { @@ -241,7 +252,7 @@ minRange: 300.0, name: 'CPU Mhz.', scale: 1.0 / 1000.0, - width: 1.0 + width: 1.0, }, // kCpuPower. 10: { @@ -249,7 +260,7 @@ minRange: 0.0, name: 'CPU milli-watts.', scale: 1.0, - width: 1.0 + width: 1.0, }, // kGpuPower. 11: { @@ -257,7 +268,7 @@ minRange: 0.0, name: 'GPU milli-watts.', scale: 1.0, - width: 1.0 + width: 1.0, }, // kMemoryPower. 12: { @@ -265,7 +276,7 @@ minRange: 0.0, name: 'Memory milli-watts.', scale: 1.0, - width: 1.0 + width: 1.0, }, // kPackagePowerConstraint. 13: { @@ -273,7 +284,7 @@ minRange: 0.0, name: 'CPU package constraint milli-watts.', scale: 1.0, - width: 1.0 + width: 1.0, }, }; @@ -644,7 +655,7 @@ this.bands.push({ band: eventBand, top: this.nextYOffset, - bottom: this.nextYOffset + height + bottom: this.nextYOffset + height, }); this.updateHeight(height, padding); @@ -674,7 +685,7 @@ this.charts.push({ sourcesWithBounds: [], top: this.nextYOffset, - bottom: this.nextYOffset + height + bottom: this.nextYOffset + height, }); this.updateHeight(height, padding); @@ -793,7 +804,7 @@ minValue: minValue, maxValue: maxValue, source: source, - smooth: smooth + smooth: smooth, }); SVG.addPolyline(this.svg, points, attributes.color, attributes.width); @@ -844,7 +855,7 @@ bottom: y + height - 1, tooltip: tooltip, tooltipWidth: tooltipWidth, - tooltipHeight: tooltipHeight + tooltipHeight: tooltipHeight, }); } @@ -1589,8 +1600,9 @@ // Add center and boundary lines. var kTimeMark = 10000; var timeEvents = [ - [kTimeMark, minTimestamp], [kTimeMark, eventTimestamp], - [kTimeMark, maxTimestamp - 1] + [kTimeMark, minTimestamp], + [kTimeMark, eventTimestamp], + [kTimeMark, maxTimestamp - 1], ]; bands.addGlobal(new Events(timeEvents, kTimeMark, kTimeMark));
diff --git a/chrome/browser/resources/chromeos/arc_power_control/arc_power_control.js b/chrome/browser/resources/chromeos/arc_power_control/arc_power_control.js index ed05a12..6b9f8b3 100644 --- a/chrome/browser/resources/chromeos/arc_power_control/arc_power_control.js +++ b/chrome/browser/resources/chromeos/arc_power_control/arc_power_control.js
@@ -148,7 +148,7 @@ new Events( activeModel.system.memory, 2 /* kSwapRead */, 2 /* kSwapRead */), new Events( - activeModel.system.memory, 3 /* kSwapWrite */, 3 /* kSwapWrite */) + activeModel.system.memory, 3 /* kSwapWrite */, 3 /* kSwapWrite */), ], true /* smooth */); // Geom objects and size.
diff --git a/chrome/browser/resources/chromeos/arc_support/arc_optin_focus_manager.js b/chrome/browser/resources/chromeos/arc_support/arc_optin_focus_manager.js index 8e304d9..a31ca6b 100644 --- a/chrome/browser/resources/chromeos/arc_support/arc_optin_focus_manager.js +++ b/chrome/browser/resources/chromeos/arc_support/arc_optin_focus_manager.js
@@ -22,5 +22,5 @@ } else { return $('overlay-page'); } - } + }, };
diff --git a/chrome/browser/resources/chromeos/arc_support/background.js b/chrome/browser/resources/chromeos/arc_support/background.js index 00aa1849..c001e12 100644 --- a/chrome/browser/resources/chromeos/arc_support/background.js +++ b/chrome/browser/resources/chromeos/arc_support/background.js
@@ -335,15 +335,15 @@ name: 'preProcess', matches: ['https://play.google.com/*'], js: {code: scriptInitTermsView}, - run_at: 'document_start' + run_at: 'document_start', }, { name: 'postProcess', matches: ['https://play.google.com/*'], css: {files: ['playstore.css']}, js: {files: ['playstore.js']}, - run_at: 'document_end' - } + run_at: 'document_end', + }, ]); // webview is not allowed to open links in the new window. Hook these @@ -502,7 +502,7 @@ isBackupRestoreEnabled: this.backupRestoreCheckbox_.isChecked(), isBackupRestoreManaged: this.backupRestoreCheckbox_.isManaged(), isLocationServiceEnabled: this.locationServiceCheckbox_.isChecked(), - isLocationServiceManaged: this.locationServiceCheckbox_.isManaged() + isLocationServiceManaged: this.locationServiceCheckbox_.isManaged(), }; } @@ -685,7 +685,7 @@ } else { sendNativeMessage('onAuthFailed', { errorMessage: - 'Status code ' + details.statusCode + ' in DM server response.' + 'Status code ' + details.statusCode + ' in DM server response.', }); } } @@ -1040,7 +1040,7 @@ name: 'postProcess', matches: ['https://support.google.com/*'], css: {files: ['overlay.css']}, - run_at: 'document_end' + run_at: 'document_end', }]); focusManager = new appWindow.contentWindow.ArcOptInFocusManager(); @@ -1077,7 +1077,7 @@ 'resizable': false, 'hidden': true, 'frame': {type: 'chrome', color: '#ffffff'}, - 'outerBounds': {'width': OUTER_WIDTH, 'height': OUTER_HEIGHT} + 'outerBounds': {'width': OUTER_WIDTH, 'height': OUTER_HEIGHT}, }; chrome.app.window.create('main.html', options, onWindowCreated); });
diff --git a/chrome/browser/resources/chromeos/arc_support/bubble.js b/chrome/browser/resources/chromeos/arc_support/bubble.js index 0cebbb9..3ae4562 100644 --- a/chrome/browser/resources/chromeos/arc_support/bubble.js +++ b/chrome/browser/resources/chromeos/arc_support/bubble.js
@@ -26,7 +26,7 @@ // The arrow is positioned at the bottom and the end of the bubble. In // left to right mode this is the bottom right. The entire bubble is // positioned above the anchor node. - BOTTOM_END: 'bottom-end' + BOTTOM_END: 'bottom-end', }; /** @@ -48,7 +48,7 @@ // taken into account as the preferred alignment but may be overruled if // there is insufficient space (see BubbleBase.reposition for the exact // placement algorithm). - ENTIRELY_VISIBLE: 'entirely-visible' + ENTIRELY_VISIBLE: 'entirely-visible', }; /**
diff --git a/chrome/browser/resources/chromeos/assistant_optin/assistant_value_prop.js b/chrome/browser/resources/chromeos/assistant_optin/assistant_value_prop.js index 9ff6882..d99e410e1 100644 --- a/chrome/browser/resources/chromeos/assistant_optin/assistant_value_prop.js +++ b/chrome/browser/resources/chromeos/assistant_optin/assistant_value_prop.js
@@ -63,7 +63,7 @@ type: String, value: function() { return this.urlTemplate_.replace('$', 'en_us'); - } + }, }, /**
diff --git a/chrome/browser/resources/chromeos/assistant_optin/setting_zippy.js b/chrome/browser/resources/chromeos/assistant_optin/setting_zippy.js index c2a894a..48b6af0 100644 --- a/chrome/browser/resources/chromeos/assistant_optin/setting_zippy.js +++ b/chrome/browser/resources/chromeos/assistant_optin/setting_zippy.js
@@ -39,7 +39,7 @@ nativeIconLabel: { type: String, value: null, - } + }, }; }
diff --git a/chrome/browser/resources/chromeos/assistant_optin/utils.js b/chrome/browser/resources/chromeos/assistant_optin/utils.js index f1fb288..6b7b54ad 100644 --- a/chrome/browser/resources/chromeos/assistant_optin/utils.js +++ b/chrome/browser/resources/chromeos/assistant_optin/utils.js
@@ -8,9 +8,9 @@ matches: ['<all_urls>'], js: { code: 'document.querySelectorAll(\'a\').forEach(' + - 'function(anchor){anchor.href=\'javascript:void(0)\';})' + 'function(anchor){anchor.href=\'javascript:void(0)\';})', }, - run_at: 'document_end' + run_at: 'document_end', }; /**
diff --git a/chrome/browser/resources/chromeos/audio/input_page.ts b/chrome/browser/resources/chromeos/audio/input_page.ts index a56ec07ee..c9a9836 100644 --- a/chrome/browser/resources/chromeos/audio/input_page.ts +++ b/chrome/browser/resources/chromeos/audio/input_page.ts
@@ -63,11 +63,11 @@ [ { canvas: $('channel-l') as HTMLCanvasElement, - analyser: this.analyserLeft + analyser: this.analyserLeft, }, { canvas: $('channel-r') as HTMLCanvasElement, - analyser: this.analyserRight + analyser: this.analyserRight, }, ]; const draw = () => {
diff --git a/chrome/browser/resources/chromeos/audio/output_page.ts b/chrome/browser/resources/chromeos/audio/output_page.ts index 8a682316..60a56e1 100644 --- a/chrome/browser/resources/chromeos/audio/output_page.ts +++ b/chrome/browser/resources/chromeos/audio/output_page.ts
@@ -24,35 +24,35 @@ freqency: 440, channelCount: 1, pan: 0, - description: '44.1k mono 440Hz sine tone' + description: '44.1k mono 440Hz sine tone', }, { sampleRate: 48000, freqency: 440, channelCount: 1, pan: 0, - description: '48k mono 440Hz sine tone' + description: '48k mono 440Hz sine tone', }, { sampleRate: 48000, freqency: 440, channelCount: 2, pan: 0, - description: '48k stereo 440Hz sine tone' + description: '48k stereo 440Hz sine tone', }, { sampleRate: 48000, freqency: 440, channelCount: 2, pan: -1, - description: '48k stereo 440Hz sine tone - Left channel only' + description: '48k stereo 440Hz sine tone - Left channel only', }, { sampleRate: 48000, freqency: 440, channelCount: 2, pan: 1, - description: '48k stereo 440Hz sine tone - Right channel only' + description: '48k stereo 440Hz sine tone - Right channel only', }, ];
diff --git a/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/bluetooth_pairing_dialog.js b/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/bluetooth_pairing_dialog.js index 6e373d2..5460616 100644 --- a/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/bluetooth_pairing_dialog.js +++ b/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/bluetooth_pairing_dialog.js
@@ -42,7 +42,7 @@ type: Boolean, value() { return loadTimeData.getBoolean('enableBluetoothRevamp'); - } + }, }, /**
diff --git a/chrome/browser/resources/chromeos/browser_options.js b/chrome/browser/resources/chromeos/browser_options.js index 51814e4..8a7a220 100644 --- a/chrome/browser/resources/chromeos/browser_options.js +++ b/chrome/browser/resources/chromeos/browser_options.js
@@ -24,7 +24,7 @@ initializePage() { chrome.bluetoothPrivate.onPairing.addListener( BluetoothPairing.onBluetoothPairingEvent); - } + }, }; // Export
diff --git a/chrome/browser/resources/chromeos/chromebox_for_meetings/cfm_network_settings.js b/chrome/browser/resources/chromeos/chromebox_for_meetings/cfm_network_settings.js index 77324fef..179a169 100644 --- a/chrome/browser/resources/chromeos/chromebox_for_meetings/cfm_network_settings.js +++ b/chrome/browser/resources/chromeos/chromebox_for_meetings/cfm_network_settings.js
@@ -51,7 +51,7 @@ type: Array, notify: false, readOnly: true, - } + }, }; }
diff --git a/chrome/browser/resources/chromeos/contact_center_insights/background.js b/chrome/browser/resources/chromeos/contact_center_insights/background.js index dd75cec..70084612 100644 --- a/chrome/browser/resources/chromeos/contact_center_insights/background.js +++ b/chrome/browser/resources/chromeos/contact_center_insights/background.js
@@ -73,7 +73,7 @@ const request = { recordData: record.serializeBinary(), priority: proto.reporting.Priority.FAST_BATCH, - eventType: chrome.enterprise.reportingPrivate.EventType.USER + eventType: chrome.enterprise.reportingPrivate.EventType.USER, }; // Report prepared request
diff --git a/chrome/browser/resources/chromeos/crostini_installer/app.js b/chrome/browser/resources/chromeos/crostini_installer/app.js index b9ad312..932f1d7 100644 --- a/chrome/browser/resources/chromeos/crostini_installer/app.js +++ b/chrome/browser/resources/chromeos/crostini_installer/app.js
@@ -67,7 +67,7 @@ 'pulse', 'android-root', 'chronos-access', - 'android-everybody' + 'android-everybody', ]; Polymer({ @@ -562,5 +562,5 @@ onDiskSizeRadioChanged_(event) { this.showDiskSlider_ = (event.detail.value !== 'recommended' || !!this.isLowSpaceAvailable_); - } + }, });
diff --git a/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_button.js b/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_button.js index dca8f481..9dfe067ee 100644 --- a/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_button.js +++ b/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_button.js
@@ -162,6 +162,6 @@ this.fire('go-action'); return; } - } + }, });
diff --git a/chrome/browser/resources/chromeos/emoji_picker/emoji_group.js b/chrome/browser/resources/chromeos/emoji_picker/emoji_group.js index fd0fd15..483fff6 100644 --- a/chrome/browser/resources/chromeos/emoji_picker/emoji_group.js +++ b/chrome/browser/resources/chromeos/emoji_picker/emoji_group.js
@@ -13,7 +13,7 @@ */ export const EmojiGroupLayoutType = { GRID_LAYOUT: 'grid-layout', - FLEX_LAYOUT: 'flex-layout' + FLEX_LAYOUT: 'flex-layout', }; const DEFAULT_CATEGORY_LAYOUTS = { @@ -44,12 +44,12 @@ category: { type: String, value: CategoryEnum.EMOJI, - readonly: true + readonly: true, }, /** @type {?string} */ layoutType: { type: String, - value: null + value: null, }, /** @type {boolean} */ showClearRecents: {type: Boolean, value: false},
diff --git a/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.js b/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.js index 6d3f6c4d8..d24e0a31 100644 --- a/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.js +++ b/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.js
@@ -64,7 +64,7 @@ type: Boolean, value: false, computed: 'isTextSubcategoryBarEnabled(v2Enabled, category)', - reflectToAttribute: true + reflectToAttribute: true, }, /** @private {boolean} */ v2Enabled: {type: Boolean, value: false, reflectToAttribute: true}, @@ -205,16 +205,15 @@ // Create a flat list of urls (with details) that need to be fetched and // rendered sequentially. const dataUrls = categoryDataUrls.flatMap( - item => - // Create url details of the category. + item => + // Create url details of the category. item.urls.map( - (url, index) => ({ + (url, index) => ({ 'category': item.category, 'url': url, - 'categoryLastPartition': - index === item.urls.length - 1, - }) - ) + 'categoryLastPartition': index === item.urls.length - 1, + }), + ), ); // Update feature list, incognito state and fetch data of first url. @@ -252,21 +251,26 @@ // Create a chain of promises for fetching and rendering data of // different categories in the correct order. remainingData.forEach( - (dataUrl, index) => { - // Fetch the url only after the previous url is fetched. - prevFetchPromise = prevFetchPromise.then(() => - this.fetchOrderingData(dataUrl.url)); - // Update category data after the data is fetched and the previous - // category data update/rendering completed successfully. - prevRenderPromise = Promise.all( - [prevRenderPromise, prevFetchPromise] - ).then((values) => values[1]).then((data) => - this.updateCategoryData( - data, dataUrl.category, dataUrl.categoryLastPartition, - index === remainingData.length - 1 - ) - ); - } + (dataUrl, index) => { + // Fetch the url only after the previous url is fetched. + prevFetchPromise = + prevFetchPromise.then(() => this.fetchOrderingData(dataUrl.url)); + // Update category data after the data is fetched and the previous + // category data update/rendering completed successfully. + prevRenderPromise = Promise + .all( + [prevRenderPromise, prevFetchPromise], + ) + .then((values) => values[1]) + .then( + (data) => this.updateCategoryData( + data, + dataUrl.category, + dataUrl.categoryLastPartition, + index === remainingData.length - 1, + ), + ); + }, ); } @@ -332,9 +336,9 @@ const tabIndex = baseIndex + index; const tabCategory = V2_SUBCATEGORY_TABS[tabIndex].category; categoriesGroupElements.push( - this.createEmojiGroupElement( - emojiGroup.emoji, this.getEmojiGroupPreference(category), - false, tabIndex) + this.createEmojiGroupElement( + emojiGroup.emoji, this.getEmojiGroupPreference(category), false, + tabIndex), ); // TODO(b/233271528): Remove assert after removing metadata. @@ -366,15 +370,18 @@ V2_SUBCATEGORY_TABS[numEmojiGroups].category !== CategoryEnum.EMOJI; // Ensure hard-coded tabs match the loaded data. - console.assert(dataMatchSubcategoryTabs, - `The Number of tabs "${V2_SUBCATEGORY_TABS.length}" does not match ` + - ` the number of loaded groups "${numEmojiGroups}".` + console.assert( + dataMatchSubcategoryTabs, + `The Number of tabs "${V2_SUBCATEGORY_TABS.length}" does not match ` + + ` the number of loaded groups "${numEmojiGroups}".`, ); - afterNextRender(this, () => { - this.dispatchEvent(events.createCustomEvent( - events.EMOJI_PICKER_READY, {'v2Enabled': this.v2Enabled})); - } + afterNextRender( + this, + () => { + this.dispatchEvent(events.createCustomEvent( + events.EMOJI_PICKER_READY, {'v2Enabled': this.v2Enabled})); + }, ); } } @@ -730,8 +737,8 @@ */ updateHistoryTabDisabledProperty() { this.set( - ['emojiGroupTabs', 0, 'disabled'], - this.isCategoryHistoryEmpty(this.category) + ['emojiGroupTabs', 0, 'disabled'], + this.isCategoryHistoryEmpty(this.category), ); } @@ -748,10 +755,10 @@ } return this.categoriesHistory[category].data.history.map( - emoji => ({ - base: {string: emoji.base, name: emoji.name, keywords: []}, - alternates: emoji.alternates - })); + emoji => ({ + base: {string: emoji.base, name: emoji.name, keywords: []}, + alternates: emoji.alternates, + })); } /** @@ -1062,7 +1069,7 @@ return CATEGORY_METADATA.map(data => ({ name: data.name, icon: data.icon, - active: data.name === category + active: data.name === category, })); } }
diff --git a/chrome/browser/resources/chromeos/emoji_picker/emoji_search.js b/chrome/browser/resources/chromeos/emoji_picker/emoji_search.js index 8af6bb4e..f4891188 100644 --- a/chrome/browser/resources/chromeos/emoji_picker/emoji_search.js +++ b/chrome/browser/resources/chromeos/emoji_picker/emoji_search.js
@@ -34,7 +34,7 @@ type: Boolean, value: false, reflectToAttribute: true, - readonly: true + readonly: true, }, /** @private {!boolean} */ needIndexing: {type: Boolean, value: false}, @@ -43,7 +43,7 @@ static get observers() { return [ - 'categoriesDataChanged(categoriesData.splices,lazyIndexing)' + 'categoriesDataChanged(categoriesData.splices,lazyIndexing)', ]; } @@ -58,7 +58,7 @@ keys: [ {name: 'base.name', weight: 10}, // Increase scoring of emoji name. 'base.keywords', - ] + ], }; /** @private {Map<CategoryEnum,Object>} */ this.fuseInstances = new Map();
diff --git a/chrome/browser/resources/chromeos/emoji_picker/metadata_extension.js b/chrome/browser/resources/chromeos/emoji_picker/metadata_extension.js index d2ef6a15..5fdbb2a 100644 --- a/chrome/browser/resources/chromeos/emoji_picker/metadata_extension.js +++ b/chrome/browser/resources/chromeos/emoji_picker/metadata_extension.js
@@ -34,35 +34,35 @@ for (const category of categories) { // Add recently used tab. groupTabs.push( - { - name: RECENTLY_USED_NAME, - icon: 'emoji_picker:schedule', - category: category, - groupId: `${category}-history`, - active: false, - disabled: true, - pagination: 1, - } + { + name: RECENTLY_USED_NAME, + icon: 'emoji_picker:schedule', + category: category, + groupId: `${category}-history`, + active: false, + disabled: true, + pagination: 1, + }, ); let pagination = 1; categoryBaseEmojis[category].forEach( - tab => { - // Update pagination if provided. - pagination = tab.pagination || pagination; - // Add new tab. - groupTabs.push( - { - name: tab.name, - icon: tab.icon, - category: category, - pagination: pagination, - groupId: groupId.toString(), - active: false, - disabled: false, - } - ); - groupId ++; - } + tab => { + // Update pagination if provided. + pagination = tab.pagination || pagination; + // Add new tab. + groupTabs.push( + { + name: tab.name, + icon: tab.icon, + category: category, + pagination: pagination, + groupId: groupId.toString(), + active: false, + disabled: false, + }, + ); + groupId++; + }, ); } return groupTabs; @@ -127,29 +127,29 @@ }, ], 'emoticon': [ - {name: 'Classic', pagination: 1,}, - {name: 'Smiling',}, - {name: 'Loving',}, - {name: 'Hugging',}, - {name: 'Flexing',}, - {name: 'Animals', pagination: 2,}, - {name: 'Surprising',}, - {name: 'Dancing', }, - {name: 'Shrugging',}, - {name: 'Table Flipping', pagination: 3,}, - {name: 'Disapproving',}, - {name: 'Crying',}, - {name: 'Worrying', pagination: 4,}, - {name: 'Pointing',}, - {name: 'Sparkling',}, + {name: 'Classic', pagination: 1}, + {name: 'Smiling'}, + {name: 'Loving'}, + {name: 'Hugging'}, + {name: 'Flexing'}, + {name: 'Animals', pagination: 2}, + {name: 'Surprising'}, + {name: 'Dancing'}, + {name: 'Shrugging'}, + {name: 'Table Flipping', pagination: 3}, + {name: 'Disapproving'}, + {name: 'Crying'}, + {name: 'Worrying', pagination: 4}, + {name: 'Pointing'}, + {name: 'Sparkling'}, ], 'symbol': [ - {name: 'Arrows', pagination: 1,}, - {name: 'Bullet/Stars',}, - {name: 'Currency',}, - {name: 'Letterlike', pagination: 2,}, - {name: 'Math',}, - {name: 'Miscellaneous',}, + {name: 'Arrows', pagination: 1}, + {name: 'Bullet/Stars'}, + {name: 'Currency'}, + {name: 'Letterlike', pagination: 2}, + {name: 'Math'}, + {name: 'Miscellaneous'}, ], }; @@ -165,9 +165,11 @@ // A mapping from each category to the index of their first tab. export const V2_TABS_CATEGORY_START_INDEX = Object.fromEntries( - new Map(V2_SUBCATEGORY_TABS.map( - (item, index) => [item.category, index]).reverse() - ).entries() + new Map( + V2_SUBCATEGORY_TABS.map((item, index) => [item.category, index]) + .reverse(), + ) + .entries(), ); export const EMOJI_GROUP_TABS = _MakeGroupTabs(['emoji'], CATEGORY_TABS); \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/emoji_picker/prefix_search.js b/chrome/browser/resources/chromeos/emoji_picker/prefix_search.js index 7c05111..f613a4be 100644 --- a/chrome/browser/resources/chromeos/emoji_picker/prefix_search.js +++ b/chrome/browser/resources/chromeos/emoji_picker/prefix_search.js
@@ -101,7 +101,7 @@ pos, isMatched: token.startsWith(term), token, - weight: PRIMARY_NAME_WEIGHT + weight: PRIMARY_NAME_WEIGHT, })) .filter(item => item.isMatched); } @@ -170,7 +170,7 @@ const results = Array.from(queryScores.keys()).map(emoji => ({ item: this.emojiMap_.get(emoji), - score: queryScores.get(emoji) + score: queryScores.get(emoji), })); return this.sort_(results); }
diff --git a/chrome/browser/resources/chromeos/emulator/audio_settings.js b/chrome/browser/resources/chromeos/emulator/audio_settings.js index 2a8a40e..d7afbe0 100644 --- a/chrome/browser/resources/chromeos/emulator/audio_settings.js +++ b/chrome/browser/resources/chromeos/emulator/audio_settings.js
@@ -86,7 +86,7 @@ type: Number, value() { return -1; - } + }, }, /** @@ -98,7 +98,7 @@ type: Number, value() { return 0; - } + }, }, /** @@ -109,7 +109,7 @@ type: Array, value() { return []; - } + }, }, /** @@ -132,9 +132,9 @@ {name: 'Aokr', type: AudioNodeType.AOKR}, {name: 'Post Mix Loopback', type: AudioNodeType.POST_MIX_LOOPBACK}, {name: 'Post Dsp Loopback', type: AudioNodeType.POST_DSP_LOOPBACK}, - {name: 'Other', type: AudioNodeType.OTHER} + {name: 'Other', type: AudioNodeType.OTHER}, ]; - } + }, }, }, @@ -230,5 +230,5 @@ newNodeList.push(node); } this.nodes = newNodeList; - } + }, });
diff --git a/chrome/browser/resources/chromeos/emulator/battery_settings.js b/chrome/browser/resources/chromeos/emulator/battery_settings.js index 99291d7a..8f0a42c 100644 --- a/chrome/browser/resources/chromeos/emulator/battery_settings.js +++ b/chrome/browser/resources/chromeos/emulator/battery_settings.js
@@ -68,7 +68,7 @@ type: 'DedicatedCharger', port: 0, connected: false, - power: 'high' + power: 'high', }, { id: '1', @@ -76,7 +76,7 @@ type: 'DedicatedCharger', port: 0, connected: false, - power: 'high' + power: 'high', }, { id: '2', @@ -85,7 +85,7 @@ port: 0, connected: false, power: 'low', - variablePower: true + variablePower: true, }, { id: '3', @@ -94,7 +94,7 @@ port: 0, connected: false, power: 'low', - variablePower: true + variablePower: true, }, { id: '4', @@ -102,7 +102,7 @@ type: 'DualRoleUSB', port: 0, connected: false, - power: 'low' + power: 'low', }, { id: '5', @@ -110,7 +110,7 @@ type: 'DualRoleUSB', port: 1, connected: false, - power: 'low' + power: 'low', }, { id: '6', @@ -118,7 +118,7 @@ type: 'DualRoleUSB', port: 2, connected: false, - power: 'low' + power: 'low', }, { id: '7', @@ -126,7 +126,7 @@ type: 'DualRoleUSB', port: 3, connected: false, - power: 'low' + power: 'low', }, ]; },
diff --git a/chrome/browser/resources/chromeos/emulator/bluetooth_settings.js b/chrome/browser/resources/chromeos/emulator/bluetooth_settings.js index 360dd24..190242e 100644 --- a/chrome/browser/resources/chromeos/emulator/bluetooth_settings.js +++ b/chrome/browser/resources/chromeos/emulator/bluetooth_settings.js
@@ -83,7 +83,7 @@ type: Array, value() { return []; - } + }, }, /** @@ -94,7 +94,7 @@ type: Array, value() { return []; - } + }, }, /** @@ -115,7 +115,7 @@ type: Number, value() { return -1; - } + }, }, /** @@ -128,11 +128,14 @@ type: Array, value() { return [ - {text: 'Unknown', value: 0}, {text: 'Mouse', value: 0x2580}, - {text: 'Keyboard', value: 0x2540}, {text: 'Audio', value: 0x240408}, - {text: 'Phone', value: 0x7a020c}, {text: 'Computer', value: 0x104} + {text: 'Unknown', value: 0}, + {text: 'Mouse', value: 0x2580}, + {text: 'Keyboard', value: 0x2540}, + {text: 'Audio', value: 0x240408}, + {text: 'Phone', value: 0x7a020c}, + {text: 'Computer', value: 0x104}, ]; - } + }, }, /** @@ -144,7 +147,7 @@ type: Array, value() { return []; - } + }, }, /** @@ -156,7 +159,7 @@ type: Array, value() { return []; - } + }, }, }, @@ -341,7 +344,7 @@ deviceList.push(devices[i]); this.devicePaths[devices[i].path] = { predefined: predefined, - index: deviceList.length - 1 + index: deviceList.length - 1, }; } @@ -473,7 +476,7 @@ this.push('devices', device); this.devicePaths[device.path] = { predefined: false, - index: this.devices.length - 1 + index: this.devices.length - 1, }; },
diff --git a/chrome/browser/resources/chromeos/gaia_action_buttons/gaia_action_buttons.js b/chrome/browser/resources/chromeos/gaia_action_buttons/gaia_action_buttons.js index 265ebae3..26d8f0f3 100644 --- a/chrome/browser/resources/chromeos/gaia_action_buttons/gaia_action_buttons.js +++ b/chrome/browser/resources/chromeos/gaia_action_buttons/gaia_action_buttons.js
@@ -78,7 +78,7 @@ secondaryActionButtonLabel: '', secondaryActionButtonEnabled: true, }; - } + }, }, }; }
diff --git a/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js b/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js index ff3c708a..109804f 100644 --- a/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js +++ b/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js
@@ -34,7 +34,7 @@ type: Boolean, value() { return loadTimeData.getBoolean('shareNetworkAllowEnable'); - } + }, }, /** @private */ @@ -42,7 +42,7 @@ type: Boolean, value() { return loadTimeData.getBoolean('shareNetworkDefault'); - } + }, }, /**
diff --git a/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.js b/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.js index 52b83caa..648ca06f 100644 --- a/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.js +++ b/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.js
@@ -72,7 +72,7 @@ value() { return loadTimeData.valueExists('showTechnologyBadge') && loadTimeData.getBoolean('showTechnologyBadge'); - } + }, }, /** @@ -94,7 +94,7 @@ disabled_: { type: Boolean, value: false, - computed: 'computeDisabled_(deviceState_.*)' + computed: 'computeDisabled_(deviceState_.*)', }, /** @private {!chromeos.networkConfig.mojom.GlobalPolicy|undefined} */ @@ -667,5 +667,5 @@ // If this is a cellular device and inhibited, state cannot be changed, so // the dialog's inputs should be disabled. return OncMojo.deviceIsInhibited(this.deviceState_); - } + }, });
diff --git a/chrome/browser/resources/chromeos/login/animations/all_set_dark.json b/chrome/browser/resources/chromeos/login/animations/all_set_dark.json index ba1d3f7..cc99930 100644 --- a/chrome/browser/resources/chromeos/login/animations/all_set_dark.json +++ b/chrome/browser/resources/chromeos/login/animations/all_set_dark.json
@@ -1 +1 @@ -{"v":"5.9.2","fr":30,"ip":0,"op":321,"w":346,"h":280,"nm":"12_You'reallset-NoLoop - 346x280","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Main Scale Null","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[173,140,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[70,70,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":382,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":" 16","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-39.648,-96.013,0],"ix":2,"l":2},"a":{"a":0,"k":[-54.248,-97.763,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":48,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-0.958,1.833],[-2.887,0.78],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[0.958,-1.833],[3.083,-0.833],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-61.537,-82.028],[-57.746,-87.32],[-53.329,-95.361],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":62,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-5.75,0],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-66.954,-93.903],[-61.746,-95.57],[-53.412,-95.57],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":69,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-5.75,0],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-66.954,-93.903],[-61.746,-95.57],[-53.412,-95.57],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":77,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-5.024,2.798],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[1.558,-0.868],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-66.954,-93.903],[-61.683,-95.757],[-53.537,-97.195],[-47.094,-95.603]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":85,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-5.75,0],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-66.954,-93.903],[-61.746,-95.57],[-53.412,-95.57],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":93,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-5.024,2.798],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[1.558,-0.868],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-66.954,-93.903],[-61.683,-95.757],[-53.537,-97.195],[-47.094,-95.603]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":101,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-5.75,0],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-66.954,-93.903],[-61.746,-95.57],[-53.412,-95.57],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":109,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-5.024,2.798],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[1.558,-0.868],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-66.954,-93.903],[-61.683,-95.757],[-53.537,-97.195],[-47.094,-95.603]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":117,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-5.75,0],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-66.954,-93.903],[-61.746,-95.57],[-53.412,-95.57],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":134,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-0.977,0],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-64.329,-90.778],[-61.246,-95.577],[-53.412,-95.57],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":148,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-0.348,2.872],[-2.214,0],[-1.63,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[0.443,-3.651],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-62.708,-83.362],[-56.851,-95.853],[-52.579,-95.785],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":169,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-0.348,2.872],[-2.214,0],[-1.63,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[0.443,-3.651],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-61.583,-83.369],[-56.851,-95.853],[-52.579,-95.785],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":181,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-0.348,2.872],[-2.214,0],[-1.63,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[0.443,-3.651],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-61.583,-83.369],[-56.851,-95.853],[-52.579,-95.785],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":197,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-1.189,2.637],[-2.214,0],[-1.63,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[1.452,-3.222],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-63.912,-84.216],[-57.746,-95.828],[-52.579,-95.785],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":209,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-1.189,2.637],[-2.214,0],[-1.63,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[1.452,-3.222],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-63.912,-84.216],[-57.746,-95.828],[-52.579,-95.785],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.4,"y":0},"t":223,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-0.977,0],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-64.329,-90.778],[-61.246,-95.577],[-53.412,-95.57],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":233,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-5.75,0],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-66.954,-93.903],[-61.746,-95.57],[-53.412,-95.57],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":241,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-5.024,2.798],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[1.558,-0.868],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-66.954,-93.903],[-61.683,-95.757],[-53.537,-97.195],[-47.094,-95.603]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":249,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-5.75,0],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-66.954,-93.903],[-61.746,-95.57],[-53.412,-95.57],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":257,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-5.024,2.798],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[1.558,-0.868],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-66.954,-93.903],[-61.683,-95.757],[-53.537,-97.195],[-47.094,-95.603]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":265,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-5.75,0],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-66.954,-93.903],[-61.746,-95.57],[-53.412,-95.57],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":273,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-5.024,2.798],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[1.558,-0.868],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-66.954,-93.903],[-61.683,-95.757],[-53.537,-97.195],[-47.094,-95.603]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":281,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-5.75,0],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-66.954,-93.903],[-61.746,-95.57],[-53.412,-95.57],[-47.282,-95.541]],"c":true}]},{"t":293,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-0.977,0],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-64.329,-90.778],[-61.246,-95.577],[-53.412,-95.57],[-47.282,-95.541]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":358,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"mouth ref","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-34.319,-87.372,0],"ix":2,"l":2},"a":{"a":0,"k":[-34.319,-87.372,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":48,"s":[{"i":[[0,0],[-1.028,-0.339]],"o":[[0.405,1.004],[0,0]],"v":[[-35.467,-88.447],[-33.171,-86.296]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":62,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-41.884,-87.926],[-37.837,-88.109]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":69,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-41.884,-87.926],[-37.837,-88.109]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":77,"s":[{"i":[[0,0],[-0.912,1.359]],"o":[[0.405,0.863],[0,0]],"v":[[-41.884,-88.702],[-37.837,-88.859]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":85,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-41.884,-87.926],[-37.837,-88.109]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":93,"s":[{"i":[[0,0],[-0.912,1.359]],"o":[[0.405,0.863],[0,0]],"v":[[-41.884,-88.702],[-37.837,-88.859]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":101,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-41.884,-87.926],[-37.837,-88.109]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":109,"s":[{"i":[[0,0],[-0.912,1.359]],"o":[[0.405,0.863],[0,0]],"v":[[-41.884,-88.702],[-37.837,-88.859]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":117,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-41.884,-87.926],[-37.837,-88.109]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":134,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-41.884,-87.926],[-37.837,-88.109]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":148,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-36.384,-87.94],[-32.337,-88.122]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":181,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-36.384,-87.94],[-32.337,-88.122]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":197,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-37.759,-87.91],[-33.712,-88.092]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":209,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-37.759,-87.91],[-33.712,-88.092]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.4,"y":0},"t":223,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-41.884,-87.926],[-37.837,-88.109]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":233,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-41.884,-87.926],[-37.837,-88.109]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":241,"s":[{"i":[[0,0],[-0.912,1.359]],"o":[[0.405,0.863],[0,0]],"v":[[-41.884,-88.702],[-37.837,-88.859]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":249,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-41.884,-87.926],[-37.837,-88.109]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":257,"s":[{"i":[[0,0],[-0.912,1.359]],"o":[[0.405,0.863],[0,0]],"v":[[-41.884,-88.702],[-37.837,-88.859]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":265,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-41.884,-87.926],[-37.837,-88.109]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":273,"s":[{"i":[[0,0],[-0.912,1.359]],"o":[[0.405,0.863],[0,0]],"v":[[-41.884,-88.702],[-37.837,-88.859]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":281,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-41.884,-87.926],[-37.837,-88.109]],"c":false}]},{"t":293,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-41.884,-87.926],[-37.837,-88.109]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":358,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"head","parent":5,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":152,"s":[0]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":169,"s":[13.7]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":181,"s":[13.7]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":197,"s":[-10.3]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":209,"s":[-10.3]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":223,"s":[0]},{"t":293,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":48,"s":[-39.831,-90.23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.4,"y":0.4},"t":62,"s":[-41.081,-89.73,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":134,"s":[-41.081,-89.73,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.4,"y":0.4},"t":148,"s":[-39.831,-89.73,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":152,"s":[-39.831,-89.73,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.4,"y":0.4},"t":169,"s":[-34.831,-88.98,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":181,"s":[-34.831,-88.98,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.4,"y":0.4},"t":197,"s":[-36.081,-90.23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":209,"s":[-36.081,-90.23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.4,"y":0.4},"t":223,"s":[-41.081,-89.73,0],"to":[0,0,0],"ti":[0,0,0]},{"t":293,"s":[-41.081,-89.73,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-39.831,-90.23,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.357,-2.862],[2.862,-3.357],[3.357,2.862],[-2.862,3.357]],"o":[[3.357,2.862],[-2.862,3.357],[-3.357,-2.862],[2.862,-3.357]],"v":[[-34.648,-96.308],[-33.753,-85.047],[-45.014,-84.151],[-45.91,-95.412]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.121568627656,0.121568627656,0.121568627656,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":358,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"neck","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-41.665,-71.889,0],"ix":2,"l":2},"a":{"a":0,"k":[-41.665,-71.889,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":152,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-34.319,-76.58],[-36.637,-82.573]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":169,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-34.319,-76.58],[-34.637,-81.885]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":181,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-34.319,-76.58],[-34.637,-81.885]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":197,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-34.319,-76.58],[-34.262,-82.073]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":209,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-34.319,-76.58],[-34.262,-82.073]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0},"t":223,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-34.319,-76.58],[-36.637,-82.573]],"c":false}]},{"t":293,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-34.319,-76.58],[-36.637,-82.573]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":358,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"neck base","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-25.477,-48.56,0],"ix":2,"l":2},"a":{"a":0,"k":[-25.477,-48.56,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-12.386,-0.414],[0,0]],"o":[[0,0],[4.627,0.055]],"v":[[-50.677,-76.752],[-32.569,-76.597]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":358,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"torso","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.647],"y":[1.029]},"o":{"x":[0.69],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.598],"y":[0.761]},"o":{"x":[0.409],"y":[0.286]},"t":30,"s":[5]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.279],"y":[0.128]},"t":40,"s":[3.5]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.295],"y":[0]},"t":58,"s":[0]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":152,"s":[0]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":166,"s":[2.6]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":204,"s":[2.6]},{"t":220,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.647],"y":[1.029]},"o":{"x":[0.69],"y":[0]},"t":14,"s":[-37.244]},{"i":{"x":[0.505],"y":[0.403]},"o":{"x":[0.409],"y":[0.286]},"t":30,"s":[-11.844]},{"i":{"x":[0.398],"y":[1.002]},"o":{"x":[0.626],"y":[0.068]},"t":40,"s":[-13.744]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.295],"y":[1.815]},"t":58,"s":[-51.844]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":152,"s":[-51.762]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":166,"s":[-50.274]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":204,"s":[-50.274]},{"t":220,"s":[-51.762]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.652],"y":[1.074]},"o":{"x":[0.69],"y":[0]},"t":14,"s":[-38.283]},{"i":{"x":[0.636],"y":[0.286]},"o":{"x":[0.512],"y":[0.111]},"t":30,"s":[-41.533]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.186],"y":[-2.628]},"t":40,"s":[-39.533]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.295],"y":[0]},"t":58,"s":[-40.033]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":152,"s":[-40.033]},{"t":220,"s":[-40.033]}],"ix":4}},"a":{"a":0,"k":[-37.244,-38.283,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.392,1.882],[-0.003,0.014],[-0.054,1.477],[-0.518,2.462],[1.06,2.282]],"o":[[0,0],[1.922,0],[0.003,-0.014],[0.289,-1.449],[0.091,-2.514],[0.518,-2.462],[0,0]],"v":[[-53.445,-38.283],[-28.387,-38.283],[-24.335,-41.464],[-24.326,-41.508],[-24.179,-45.931],[-21.468,-57.034],[-21.804,-64.441]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":358,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"necklace","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-39.271,-60.851,0],"ix":2,"l":2},"a":{"a":0,"k":[-39.271,-60.851,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":14,"s":[{"i":[[0,-1.202],[1.202,0],[0,1.202],[-1.202,0]],"o":[[0,1.202],[-1.202,0],[0,-1.202],[1.202,0]],"v":[[-34.723,-47.081],[-36.899,-44.905],[-39.076,-47.081],[-36.899,-49.258]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.66,"y":0},"t":20,"s":[{"i":[[0.047,-1.201],[1.201,0.047],[-0.047,1.201],[-1.201,-0.047]],"o":[[-0.047,1.201],[-1.201,-0.047],[0.047,-1.201],[1.201,0.047]],"v":[[-35.893,-46.905],[-38.152,-44.814],[-40.243,-47.073],[-37.984,-49.164]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":31,"s":[{"i":[[-0.254,-1.175],[1.175,-0.254],[0.254,1.175],[-1.175,0.254]],"o":[[0.254,1.175],[-1.175,0.254],[-0.254,-1.175],[1.175,-0.254]],"v":[[-28.738,-49.025],[-30.406,-46.437],[-32.993,-48.105],[-31.325,-50.692]],"c":true}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":40,"s":[{"i":[[0.047,-1.201],[1.201,0.047],[-0.047,1.201],[-1.201,-0.047]],"o":[[-0.047,1.201],[-1.201,-0.047],[0.047,-1.201],[1.201,0.047]],"v":[[-35.893,-46.905],[-38.152,-44.814],[-40.243,-47.073],[-37.984,-49.164]],"c":true}]},{"t":46,"s":[{"i":[[0,-1.202],[1.202,0],[0,1.202],[-1.202,0]],"o":[[0,1.202],[-1.202,0],[0,-1.202],[1.202,0]],"v":[[-34.723,-47.081],[-36.899,-44.905],[-39.076,-47.081],[-36.899,-49.258]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":14,"s":[{"i":[[0,0],[-14.35,0],[0,0]],"o":[[0,0],[12.657,0],[0,0]],"v":[[-47.615,-76.797],[-36.899,-48.399],[-34.319,-76.58]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.66,"y":0},"t":20,"s":[{"i":[[0,0],[-14.339,-0.556],[0,0]],"o":[[0,0],[12.647,0.49],[0,0]],"v":[[-47.615,-76.797],[-38.017,-48.305],[-34.319,-76.58]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":31,"s":[{"i":[[0,0],[-14.026,3.032],[0,0]],"o":[[0,0],[12.371,-2.674],[0,0]],"v":[[-47.615,-76.797],[-31.144,-49.852],[-34.319,-76.58]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":40,"s":[{"i":[[0,0],[-14.339,-0.556],[0,0]],"o":[[0,0],[12.647,0.49],[0,0]],"v":[[-47.615,-76.797],[-38.017,-48.305],[-34.319,-76.58]],"c":false}]},{"t":46,"s":[{"i":[[0,0],[-14.35,0],[0,0]],"o":[[0,0],[12.657,0],[0,0]],"v":[[-47.601,-76.485],[-36.899,-48.399],[-34.319,-76.58]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.250980407,0.301960796118,0.392156869173,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":3,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":358,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"right arm","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":29,"s":[-14.9]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":51,"s":[0]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":55,"s":[0]},{"t":69,"s":[2.6]}],"ix":10},"p":{"a":0,"k":[-47.647,-76.613,0],"ix":2,"l":2},"a":{"a":0,"k":[-47.647,-76.613,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":12,"s":[{"i":[[0,0],[-0.603,-0.47],[-0.452,-0.039],[-1.913,0.936],[-1.46,1.551],[-0.364,0.544],[-0.426,1.122]],"o":[[-0.552,0.528],[0.357,0.279],[2.122,0.184],[1.913,-0.936],[0.448,-0.476],[0.668,-0.998],[0,0]],"v":[[-85.811,-3.751],[-85.709,-1.732],[-84.429,-1.336],[-78.243,-2.587],[-73.186,-6.435],[-71.944,-7.952],[-70.417,-11.205]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":26,"s":[{"i":[[0,0],[-0.109,-0.739],[-0.293,-0.333],[-1.986,-0.629],[-2.08,0.112],[-0.625,0.139],[-1.06,0.507]],"o":[[-0.747,0.001],[0.065,0.439],[1.378,1.562],[1.986,0.629],[0.639,-0.034],[1.146,-0.255],[0,0]],"v":[[-123.429,-12.438],[-124.72,-10.94],[-124.082,-9.795],[-118.858,-6.505],[-112.681,-5.815],[-110.778,-6.05],[-107.501,-7.322]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":32,"s":[{"i":[[0,0],[-0.109,-0.739],[-0.293,-0.333],[-1.986,-0.629],[-2.08,0.112],[-0.625,0.139],[-1.06,0.507]],"o":[[-0.747,0.001],[0.065,0.439],[1.378,1.562],[1.986,0.629],[0.639,-0.034],[1.146,-0.255],[0,0]],"v":[[-123.429,-12.438],[-124.72,-10.94],[-124.082,-9.795],[-118.858,-6.505],[-112.681,-5.815],[-110.778,-6.05],[-107.501,-7.322]],"c":false}]},{"t":51,"s":[{"i":[[0,0],[-0.603,-0.47],[-0.452,-0.039],[-1.913,0.936],[-1.46,1.551],[-0.364,0.544],[-0.426,1.122]],"o":[[-0.552,0.528],[0.357,0.279],[2.122,0.184],[1.913,-0.936],[0.448,-0.476],[0.668,-0.998],[0,0]],"v":[[-85.811,-3.751],[-85.709,-1.732],[-84.429,-1.336],[-78.243,-2.587],[-73.186,-6.435],[-71.944,-7.952],[-70.417,-11.205]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":12,"s":[{"i":[[0,0],[-1.324,-0.98],[0.247,-0.264],[1.633,-1.219],[0.082,-0.779],[-0.948,0.112],[-1.842,3.608]],"o":[[0.278,1.908],[0.216,0.16],[-1.403,1.501],[-0.573,0.427],[-0.137,1.299],[4.744,-0.56],[0,0]],"v":[[-80.497,-18.554],[-78.185,-13.675],[-80.162,-10.751],[-84.962,-7.022],[-86.484,-5.214],[-84.14,-3.887],[-73.934,-12.125]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":26,"s":[{"i":[[0,0],[-0.275,-1.588],[0.354,-0.02],[1.978,0.24],[0.584,-0.496],[-0.747,-0.561],[-3.74,1.311]],"o":[[-1.092,1.538],[0.045,0.259],[-2.007,0.115],[-0.694,-0.084],[-0.974,0.827],[3.736,2.806],[0,0]],"v":[[-109.674,-19.329],[-111.332,-14.314],[-114.705,-13.579],[-120.62,-14.18],[-122.919,-13.928],[-122.155,-11.406],[-109.369,-10.347]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":32,"s":[{"i":[[0,0],[-0.275,-1.588],[0.354,-0.02],[1.978,0.24],[0.584,-0.496],[-0.747,-0.561],[-3.74,1.311]],"o":[[-1.092,1.538],[0.045,0.259],[-2.007,0.115],[-0.694,-0.084],[-0.974,0.827],[3.736,2.806],[0,0]],"v":[[-109.674,-19.329],[-111.332,-14.314],[-114.705,-13.579],[-120.62,-14.18],[-122.919,-13.928],[-122.155,-11.406],[-109.369,-10.347]],"c":false}]},{"t":51,"s":[{"i":[[0,0],[-1.324,-0.98],[0.247,-0.264],[1.633,-1.219],[0.082,-0.779],[-0.948,0.112],[-1.842,3.608]],"o":[[0.278,1.908],[0.216,0.16],[-1.403,1.501],[-0.573,0.427],[-0.137,1.299],[4.744,-0.56],[0,0]],"v":[[-80.497,-18.554],[-78.185,-13.675],[-80.162,-10.751],[-84.962,-7.022],[-86.484,-5.214],[-84.14,-3.887],[-73.934,-12.125]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":12,"s":[{"i":[[0,0],[-0.803,-3.366],[0.258,-1.825],[5.279,-3.498],[1.518,-0.108],[0.553,1.455]],"o":[[2.279,2.069],[0.427,1.793],[-0.888,6.27],[-1.123,0.744],[-1.344,0.096],[0,0]],"v":[[-70.34,-30.514],[-65.476,-22.239],[-64.924,-15.526],[-73.329,-1.342],[-78.587,0.483],[-82.928,-1.298]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":26,"s":[{"i":[[0,0],[1.704,-2.924],[1.415,-1.117],[6.098,1.088],[1.147,0.948],[-0.591,1.403]],"o":[[0.216,3.003],[-0.908,1.557],[-4.862,3.839],[-1.297,-0.231],[-1.016,-0.839],[0,0]],"v":[[-94.411,-20.937],[-96.554,-11.796],[-100.695,-6.672],[-116.221,-2.306],[-121.174,-4.564],[-123.044,-8.755]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":32,"s":[{"i":[[0,0],[1.704,-2.924],[1.415,-1.117],[6.098,1.088],[1.147,0.948],[-0.591,1.403]],"o":[[0.216,3.003],[-0.908,1.557],[-4.862,3.839],[-1.297,-0.231],[-1.016,-0.839],[0,0]],"v":[[-94.411,-20.937],[-96.554,-11.796],[-100.695,-6.672],[-116.221,-2.306],[-121.174,-4.564],[-123.044,-8.755]],"c":false}]},{"t":51,"s":[{"i":[[0,0],[-0.803,-3.366],[0.258,-1.825],[5.279,-3.498],[1.518,-0.108],[0.553,1.455]],"o":[[2.279,2.069],[0.427,1.793],[-0.888,6.27],[-1.123,0.744],[-1.344,0.096],[0,0]],"v":[[-70.34,-30.514],[-65.476,-22.239],[-64.924,-15.526],[-73.329,-1.342],[-78.587,0.483],[-82.928,-1.298]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":12,"s":[{"i":[[0,0],[9.565,-3.696],[0,0],[4.308,-5.079],[-1.754,16.452],[-34.681,2.044]],"o":[[-7.627,2.556],[3.64,4.694],[0,0],[-7.197,1.148],[1.38,-12.947],[0,0]],"v":[[-53.087,-57.21],[-82.231,-47.166],[-69.922,-31.144],[-80.497,-18.554],[-104.773,-46.17],[-47.615,-76.797]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":26,"s":[{"i":[[0,0],[9.565,-3.696],[0,0],[6.478,-0.687],[-5.22,8.123],[-31.633,-6.402]],"o":[[-7.627,2.556],[-5.081,6.387],[0,0],[-1.896,-9.591],[7.749,-9.734],[0,0]],"v":[[-53.087,-57.21],[-82.231,-47.166],[-93.689,-21.101],[-109.674,-19.329],[-102.679,-52.684],[-47.615,-76.797]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":32,"s":[{"i":[[0,0],[9.565,-3.696],[0,0],[6.478,-0.687],[-5.22,8.123],[-31.633,-6.402]],"o":[[-7.627,2.556],[-5.081,6.387],[0,0],[-1.896,-9.591],[7.749,-9.734],[0,0]],"v":[[-53.087,-57.21],[-82.231,-47.166],[-93.689,-21.101],[-109.674,-19.329],[-102.679,-52.684],[-47.615,-76.797]],"c":false}]},{"t":51,"s":[{"i":[[0,0],[9.565,-3.696],[0,0],[4.308,-5.079],[-1.754,16.452],[-34.681,2.044]],"o":[[-7.627,2.556],[3.64,4.694],[0,0],[-7.197,1.148],[1.38,-12.947],[0,0]],"v":[[-53.087,-57.21],[-82.231,-47.166],[-69.922,-31.144],[-80.497,-18.554],[-104.773,-46.17],[-47.615,-76.797]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.121568627656,0.121568627656,0.121568627656,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":358,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"torso right","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-55.445,-47.081,0],"ix":2,"l":2},"a":{"a":0,"k":[-55.445,-47.081,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.244,-7.241]],"o":[[1.228,6.912],[0,0]],"v":[[-56.915,-55.939],[-53.975,-38.223]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":358,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"hair2","parent":12,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":48,"s":[-91.931,-82.48,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.167,"y":0.167},"t":62,"s":[-81.722,-64.98,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":134,"s":[-81.722,-64.98,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.4,"y":0.4},"t":148,"s":[-85.076,-70.728,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":181,"s":[-85.076,-70.728,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.4,"y":0.4},"t":197,"s":[-81.618,-67.477,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":209,"s":[-81.618,-67.477,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.4,"y":0.4},"t":223,"s":[-81.722,-64.98,0],"to":[0,0,0],"ti":[0,0,0]},{"t":293,"s":[-81.722,-64.98,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-91.931,-82.48,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-5.534],[-5.534,0],[0,5.534],[5.534,0]],"o":[[0,5.534],[5.534,0],[0,-5.534],[-5.534,0]],"v":[[-101.951,-82.48],[-91.931,-72.459],[-81.91,-82.48],[-91.931,-92.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":358,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"hair1","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":152,"s":[0]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":169,"s":[-12]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":181,"s":[-12]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":197,"s":[7.9]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":209,"s":[7.9]},{"t":223,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":69,"s":[-39.753,-99.33,0],"to":[0,0.188,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":77,"s":[-39.753,-98.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":85,"s":[-39.753,-99.33,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":93,"s":[-39.753,-98.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":101,"s":[-39.753,-99.33,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":109,"s":[-39.753,-98.205,0],"to":[0,0,0],"ti":[0,0.188,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.333,"y":0.333},"t":117,"s":[-39.753,-99.33,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":152,"s":[-39.753,-99.33,0],"to":[-0.399,-0.01,0],"ti":[0.399,0.01,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.4,"y":0.4},"t":169,"s":[-42.148,-99.389,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":181,"s":[-42.148,-99.389,0],"to":[0.63,0.03,0],"ti":[-0.63,-0.03,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.4,"y":0.4},"t":197,"s":[-38.369,-99.211,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":209,"s":[-38.369,-99.211,0],"to":[-0.231,-0.02,0],"ti":[0.231,0.02,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":223,"s":[-39.753,-99.33,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":233,"s":[-39.753,-99.33,0],"to":[0,0.188,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":241,"s":[-39.753,-98.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":249,"s":[-39.753,-99.33,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":257,"s":[-39.753,-98.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":265,"s":[-39.753,-99.33,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":273,"s":[-39.753,-98.205,0],"to":[0,0,0],"ti":[0,0.188,0]},{"t":281,"s":[-39.753,-99.33,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-39.753,-99.33,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":48,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.478,-0.443],[2.104,-0.737],[2.141,-0.401],[2.195,-0.452],[3.473,-3.467],[0.523,-2.194],[0.045,-0.26],[-2.892,-2.967],[-5.029,2.118],[-2.554,0.155],[-1.049,5.511],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.136,0.641],[-2.058,0.721],[-2.203,0.413],[-4.691,0.967],[-1.596,1.593],[-0.061,0.257],[-0.735,4.2],[0,0],[1.778,-0.749],[5.6,-0.341],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.999,-97.069],[-39.294,-99.193],[-39.29,-99.211],[-42.391,-99.275],[-47.08,-98.322],[-53.302,-95.867],[-59.637,-94.274],[-66.248,-93.058],[-79.205,-87.127],[-82.474,-81.324],[-82.634,-80.549],[-78.801,-69.233],[-70.075,-68.22],[-52.907,-76.944],[-41.626,-86.945],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":62,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.478,-0.443],[1.768,-1.358],[1.848,-1.086],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-1.049,5.511],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.136,0.641],[-1.711,1.315],[-1.993,1.171],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.34,-1.297],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.999,-97.069],[-39.294,-99.193],[-39.29,-99.211],[-42.391,-99.275],[-47.08,-98.322],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.376,-86.952],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":69,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.478,-0.443],[1.768,-1.358],[1.848,-1.086],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-1.049,5.511],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.136,0.641],[-1.711,1.315],[-1.993,1.171],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.34,-1.297],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.999,-97.069],[-39.294,-99.193],[-39.29,-99.211],[-42.391,-99.275],[-47.08,-98.322],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.376,-86.952],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":77,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.632,-0.615],[1.768,-1.358],[1.859,-1.068],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-0.861,4.639],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.087,0.787],[-1.711,1.315],[-1.928,1.108],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.378,-2.047],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.874,-98.132],[-39.169,-100.256],[-39.165,-100.274],[-42.079,-100.213],[-46.955,-98.885],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.626,-86.827],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":85,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.478,-0.443],[1.768,-1.358],[1.848,-1.086],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-1.049,5.511],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.136,0.641],[-1.711,1.315],[-1.993,1.171],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.34,-1.297],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.999,-97.069],[-39.294,-99.193],[-39.29,-99.211],[-42.391,-99.275],[-47.08,-98.322],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.376,-86.952],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":93,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.632,-0.615],[1.768,-1.358],[1.859,-1.068],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-0.861,4.639],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.087,0.787],[-1.711,1.315],[-1.928,1.108],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.378,-2.047],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.874,-98.132],[-39.169,-100.256],[-39.165,-100.274],[-42.079,-100.213],[-46.955,-98.885],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.626,-86.827],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":101,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.478,-0.443],[1.768,-1.358],[1.848,-1.086],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-1.049,5.511],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.136,0.641],[-1.711,1.315],[-1.993,1.171],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.34,-1.297],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.999,-97.069],[-39.294,-99.193],[-39.29,-99.211],[-42.391,-99.275],[-47.08,-98.322],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.376,-86.952],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":109,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.632,-0.615],[1.768,-1.358],[1.859,-1.068],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-0.861,4.639],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.087,0.787],[-1.711,1.315],[-1.928,1.108],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.378,-2.047],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.874,-98.132],[-39.169,-100.256],[-39.165,-100.274],[-42.079,-100.213],[-46.955,-98.885],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.626,-86.827],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":117,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.478,-0.443],[1.768,-1.358],[1.848,-1.086],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-1.049,5.511],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.136,0.641],[-1.711,1.315],[-1.993,1.171],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.34,-1.297],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.999,-97.069],[-39.294,-99.193],[-39.29,-99.211],[-42.391,-99.275],[-47.08,-98.322],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.376,-86.952],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":134,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.478,-0.443],[1.768,-1.358],[1.848,-1.086],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-1.049,5.511],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.136,0.641],[-1.711,1.315],[-1.993,1.171],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.34,-1.297],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.999,-97.069],[-39.294,-99.193],[-39.29,-99.211],[-42.391,-99.275],[-47.08,-98.322],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.376,-86.952],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":148,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.478,-0.443],[1.878,-1.154],[1.931,-0.949],[2.03,-0.837],[2.689,-3.56],[0.087,-1.894],[-0.026,-0.216],[-2.637,-1.122],[-5.173,1.475],[-2.526,0.376],[-1.049,5.511],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.136,0.641],[-1.825,1.12],[-2.024,0.995],[-4.338,1.788],[-1.235,1.636],[-0.01,0.222],[0.347,3.274],[0,0],[1.849,-0.526],[2.067,-0.983],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.999,-97.069],[-39.294,-99.193],[-39.29,-99.211],[-42.391,-99.275],[-47.08,-98.322],[-53.562,-95.244],[-60.336,-91.183],[-66.552,-88.654],[-76.478,-82.738],[-78.525,-77.325],[-78.449,-76.325],[-74.284,-69.685],[-63.33,-72.294],[-49.269,-76.95],[-46.394,-86.898],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":209,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.478,-0.443],[1.878,-1.154],[1.931,-0.949],[2.03,-0.837],[2.689,-3.56],[0.087,-1.894],[-0.026,-0.216],[-2.637,-1.122],[-5.173,1.475],[-2.526,0.376],[-1.049,5.511],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.136,0.641],[-1.825,1.12],[-2.024,0.995],[-4.338,1.788],[-1.235,1.636],[-0.01,0.222],[0.347,3.274],[0,0],[1.849,-0.526],[2.067,-0.983],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.999,-97.069],[-39.294,-99.193],[-39.29,-99.211],[-42.391,-99.275],[-47.08,-98.322],[-53.562,-95.244],[-60.336,-91.183],[-66.552,-88.654],[-76.478,-82.738],[-78.525,-77.325],[-78.449,-76.325],[-74.284,-69.685],[-63.33,-72.294],[-49.269,-76.95],[-46.394,-86.898],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.4,"y":0},"t":223,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.478,-0.443],[1.768,-1.358],[1.848,-1.086],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-1.049,5.511],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.136,0.641],[-1.711,1.315],[-1.993,1.171],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.34,-1.297],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.999,-97.069],[-39.294,-99.193],[-39.29,-99.211],[-42.391,-99.275],[-47.08,-98.322],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.376,-86.952],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":233,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.478,-0.443],[1.768,-1.358],[1.848,-1.086],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-1.049,5.511],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.136,0.641],[-1.711,1.315],[-1.993,1.171],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.34,-1.297],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.999,-97.069],[-39.294,-99.193],[-39.29,-99.211],[-42.391,-99.275],[-47.08,-98.322],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.376,-86.952],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":241,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.632,-0.615],[1.768,-1.358],[1.859,-1.068],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-0.861,4.639],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.087,0.787],[-1.711,1.315],[-1.928,1.108],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.378,-2.047],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.874,-98.132],[-39.169,-100.256],[-39.165,-100.274],[-42.079,-100.213],[-46.955,-98.885],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.626,-86.827],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":249,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.478,-0.443],[1.768,-1.358],[1.848,-1.086],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-1.049,5.511],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.136,0.641],[-1.711,1.315],[-1.993,1.171],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.34,-1.297],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.999,-97.069],[-39.294,-99.193],[-39.29,-99.211],[-42.391,-99.275],[-47.08,-98.322],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.376,-86.952],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":257,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.632,-0.615],[1.768,-1.358],[1.859,-1.068],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-0.861,4.639],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.087,0.787],[-1.711,1.315],[-1.928,1.108],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.378,-2.047],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.874,-98.132],[-39.169,-100.256],[-39.165,-100.274],[-42.079,-100.213],[-46.955,-98.885],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.626,-86.827],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":265,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.478,-0.443],[1.768,-1.358],[1.848,-1.086],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-1.049,5.511],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.136,0.641],[-1.711,1.315],[-1.993,1.171],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.34,-1.297],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.999,-97.069],[-39.294,-99.193],[-39.29,-99.211],[-42.391,-99.275],[-47.08,-98.322],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.376,-86.952],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":273,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.632,-0.615],[1.768,-1.358],[1.859,-1.068],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-0.861,4.639],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.087,0.787],[-1.711,1.315],[-1.928,1.108],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.378,-2.047],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.874,-98.132],[-39.169,-100.256],[-39.165,-100.274],[-42.079,-100.213],[-46.955,-98.885],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.626,-86.827],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":281,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.478,-0.443],[1.768,-1.358],[1.848,-1.086],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-1.049,5.511],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.136,0.641],[-1.711,1.315],[-1.993,1.171],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.34,-1.297],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.999,-97.069],[-39.294,-99.193],[-39.29,-99.211],[-42.391,-99.275],[-47.08,-98.322],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.376,-86.952],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"t":293,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.478,-0.443],[1.768,-1.358],[1.848,-1.086],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-1.049,5.511],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.136,0.641],[-1.711,1.315],[-1.993,1.171],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.34,-1.297],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.999,-97.069],[-39.294,-99.193],[-39.29,-99.211],[-42.391,-99.275],[-47.08,-98.322],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.376,-86.952],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":358,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Layer 4","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[6]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":40,"s":[6]},{"t":58,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.652,"y":0.926},"o":{"x":0.69,"y":0},"t":14,"s":[-53.445,-38.283,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.505,"y":0.403},"o":{"x":0.512,"y":0.57},"t":30,"s":[-29.47,-43.033,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.398,"y":0.998},"o":{"x":0.626,"y":0.107},"t":40,"s":[-30.97,-40.533,0],"to":[0,0,0],"ti":[0,0,0]},{"t":58,"s":[-67.97,-40.533,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-53.445,-38.283,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[-5.365,0],[0,0],[1.465,0.66],[0.599,0.223],[0.188,0.611],[-0.193,0.546],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[1.448,5.166],[0,0],[0.406,-1.555],[-0.583,-0.263],[-0.599,-0.223],[-0.17,-0.554],[0.894,-2.529],[0,0]],"v":[[-104.523,86.611],[-114.344,108.556],[-106.601,112.458],[-101.074,102.939],[-99.075,110.07],[-87.554,118.806],[-75.92,118.806],[-77.833,114.938],[-79.659,114.357],[-81.036,113.121],[-80.818,111.429],[-76.81,100.458]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0},"t":30,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[-5.446,-2.931],[0,0],[0.833,1.312],[1.346,1.393],[0.188,0.611],[-0.193,0.546],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[1.448,5.166],[0,0],[1.795,0.132],[-0.343,-0.54],[-0.444,-0.46],[-0.17,-0.554],[0.894,-2.529],[0,0]],"v":[[-104.523,86.611],[-114.344,108.556],[-106.601,112.458],[-101.074,102.939],[-99.075,110.07],[-87.866,119.306],[-76.857,122.868],[-76.083,119.313],[-78.721,115.982],[-81.036,113.121],[-80.818,111.429],[-76.81,100.458]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":40,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[-6.17,-0.426],[0,0],[1.299,0.852],[1.801,0.714],[0.423,0.479],[0.049,0.577],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[3.448,4.11],[0,0],[1.689,-0.619],[-0.535,-0.351],[-0.594,-0.236],[-0.383,-0.434],[-0.228,-2.673],[0,0]],"v":[[-96.283,99.875],[-95.721,124.487],[-87.057,124.851],[-85.944,113.901],[-81.184,119.575],[-67.166,123.371],[-55.667,122.081],[-56.426,118.523],[-60.203,116.575],[-63.49,114.922],[-63.99,113.29],[-65.309,100.457]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":58,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[-6.185,-0.036],[0,0],[1.351,0.768],[1.842,0.599],[0.452,0.452],[0.085,0.573],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[3.7,3.884],[0,0],[1.647,-0.725],[-0.556,-0.316],[-0.608,-0.198],[-0.41,-0.409],[-0.396,-2.653],[0,0]],"v":[[-85.902,96.957],[-84.291,120.945],[-75.622,120.762],[-75.202,109.763],[-70.094,115.125],[-55.863,118.03],[-44.468,116.016],[-45.451,112.513],[-49.343,110.808],[-52.728,109.365],[-53.329,107.768],[-54.932,96.198]],"c":false}]},{"t":152,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[-6.185,-0.036],[0,0],[1.351,0.768],[1.842,0.599],[0.452,0.452],[0.085,0.573],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[3.7,3.884],[0,0],[1.647,-0.725],[-0.556,-0.316],[-0.608,-0.198],[-0.41,-0.409],[-0.396,-2.653],[0,0]],"v":[[-85.902,96.957],[-84.291,120.945],[-75.622,120.762],[-75.202,109.763],[-70.094,115.125],[-55.863,118.03],[-44.468,116.016],[-45.451,112.513],[-49.343,110.808],[-52.728,109.365],[-53.329,107.768],[-54.932,96.198]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"t":44,"s":[100],"h":1},{"t":45,"s":[0],"h":1}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14,"s":[{"i":[[0,0],[1.791,-15.607],[1.027,-4.727],[5.07,-10.693],[3.561,-7.51]],"o":[[-1.152,15.668],[-0.551,4.806],[-2.513,11.564],[-3.561,7.51],[0,0]],"v":[[-35.91,-25.948],[-40.324,20.971],[-42.486,35.314],[-59.582,76.8],[-72.095,102.839]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0},"t":30,"s":[{"i":[[0,0],[1.791,-15.607],[1.027,-4.727],[5.07,-10.693],[3.561,-7.51]],"o":[[-1.152,15.668],[-0.551,4.806],[-2.513,11.564],[-3.561,7.51],[0,0]],"v":[[-35.91,-25.948],[-40.324,20.971],[-42.486,35.314],[-59.582,76.8],[-72.095,102.839]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":40,"s":[{"i":[[0,0],[1.791,-15.607],[1.027,-4.727],[2.418,-11.585],[1.616,-8.848]],"o":[[-2.845,15.314],[-0.551,4.806],[-2.513,11.564],[-1.603,7.682],[0,0]],"v":[[-38.37,-25.438],[-45.309,18.981],[-47.471,33.325],[-55.944,77.926],[-60.028,100.579]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":58,"s":[{"i":[[0,0],[1.791,-15.607],[0.511,-5.814],[1.059,-11.787],[1.175,-10.341]],"o":[[-1.152,15.668],[-0.551,4.806],[-1.035,11.789],[-0.923,10.275],[0,0]],"v":[[-39.66,-13.448],[-43.199,22.471],[-44.361,37.439],[-47.052,67.975],[-49.65,96.091]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":152,"s":[{"i":[[0,0],[1.791,-15.607],[0.511,-5.814],[1.059,-11.787],[1.175,-10.341]],"o":[[-1.152,15.668],[-0.551,4.806],[-1.035,11.789],[-0.923,10.275],[0,0]],"v":[[-39.66,-13.448],[-43.199,22.471],[-44.361,37.439],[-47.052,67.975],[-49.65,96.091]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":166,"s":[{"i":[[0,0],[1.897,-15.595],[0.55,-5.811],[1.139,-11.779],[1.175,-10.341]],"o":[[-1.259,15.659],[-0.584,4.802],[-1.116,11.781],[-0.993,10.268],[0,0]],"v":[[-38.916,-13.373],[-42.701,22.521],[-43.964,37.481],[-46.864,67.997],[-49.65,96.091]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":204,"s":[{"i":[[0,0],[1.897,-15.595],[0.55,-5.811],[1.139,-11.779],[1.175,-10.341]],"o":[[-1.259,15.659],[-0.584,4.802],[-1.116,11.781],[-0.993,10.268],[0,0]],"v":[[-38.916,-13.373],[-42.701,22.521],[-43.964,37.481],[-46.864,67.997],[-49.65,96.091]],"c":false}]},{"t":218,"s":[{"i":[[0,0],[1.791,-15.607],[0.511,-5.814],[1.059,-11.787],[1.175,-10.341]],"o":[[-1.152,15.668],[-0.551,4.806],[-1.035,11.789],[-0.923,10.275],[0,0]],"v":[[-39.66,-13.448],[-43.199,22.471],[-44.361,37.439],[-47.052,67.975],[-49.65,96.091]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14,"s":[{"i":[[0,0],[-9.915,-5.049]],"o":[[10.096,5.245],[0,0]],"v":[[-111.052,83.273],[-72.095,102.839]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0},"t":30,"s":[{"i":[[0,0],[-9.915,-5.049]],"o":[[10.096,5.245],[0,0]],"v":[[-111.052,83.273],[-72.095,102.839]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":40,"s":[{"i":[[0,0],[-11.123,-0.294]],"o":[[11.37,0.393],[0,0]],"v":[[-103.613,99.669],[-60.028,100.579]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[-11.123,-0.224]],"o":[[11.371,0.322],[0,0]],"v":[[-97.512,98.969],[-58.517,99.925]],"c":false}]},{"t":58,"s":[{"i":[[0,0],[-11.125,0.188]],"o":[[11.376,-0.099],[0,0]],"v":[[-95.984,97.138],[-49.65,96.091]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14,"s":[{"i":[[3.824,-3.215],[3.107,-5.36],[3.173,-7.127],[8.357,-14.655],[2.571,-2.986],[0.601,-10.018]],"o":[[-7.062,5.938],[-5.332,9.197],[-5.375,12.074],[-1.958,3.434],[-6.033,7.006],[0,0]],"v":[[-53.125,-38.25],[-67.168,-21.447],[-77.425,0.496],[-89.723,46.409],[-96.663,56.031],[-111.052,83.273]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0},"t":30,"s":[{"i":[[3.824,-3.215],[3.107,-5.36],[3.173,-7.127],[8.357,-14.655],[2.571,-2.986],[0.601,-10.018]],"o":[[-7.062,5.938],[-5.332,9.197],[-5.375,12.074],[-1.958,3.434],[-6.033,7.006],[0,0]],"v":[[-53.125,-38.25],[-67.168,-21.447],[-77.425,0.496],[-89.723,46.409],[-96.663,56.031],[-111.052,83.273]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":40,"s":[{"i":[[3.824,-3.215],[3.107,-5.36],[3.173,-7.127],[8.357,-14.655],[1.037,-3.802],[-1.016,-12.381]],"o":[[-7.062,5.938],[-5.332,9.197],[-5.375,12.074],[-1.958,3.434],[-2.434,8.92],[0,0]],"v":[[-53.125,-38.25],[-66.553,-22.769],[-76.81,-0.826],[-86.714,46.344],[-99.328,68.822],[-103.613,99.669]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[3.824,-3.215],[3.107,-5.36],[1.564,-7.625],[4.289,-16.168],[0.959,-3.817],[1.18,-11.367]],"o":[[-7.062,5.938],[-5.332,9.197],[-3.236,15.777],[-2.122,7.499],[-2.289,9.255],[0,0]],"v":[[-53.125,-38.25],[-66.078,-23.013],[-74.41,0.102],[-84.595,41.573],[-91.333,68.744],[-97.494,98.951]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":58,"s":[{"i":[[3.824,-3.215],[3.107,-5.36],[1.774,-7.597],[5.936,-15.26],[0.501,-3.909],[-1.366,-9.513]],"o":[[-7.062,5.938],[-5.332,9.197],[-3.3,14.129],[-3.877,9.966],[-1.437,11.219],[0,0]],"v":[[-53.125,-38.25],[-63.293,-24.447],[-72.3,6.621],[-83.848,37.034],[-87.788,65.281],[-95.859,97.013]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":152,"s":[{"i":[[3.824,-3.215],[3.107,-5.36],[1.774,-7.597],[5.936,-15.26],[0.501,-3.909],[-1.366,-9.513]],"o":[[-7.062,5.938],[-5.332,9.197],[-3.3,14.129],[-3.877,9.966],[-1.437,11.219],[0,0]],"v":[[-53.125,-38.25],[-63.293,-24.447],[-72.3,6.621],[-83.848,37.034],[-87.788,65.281],[-95.859,97.013]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":166,"s":[{"i":[[3.943,-3.188],[3.232,-5.348],[1.89,-7.607],[5.936,-15.26],[0.501,-3.909],[-1.366,-9.513]],"o":[[-7.283,5.888],[-5.545,9.177],[-3.515,14.147],[-3.877,9.966],[-1.437,11.219],[0,0]],"v":[[-51.918,-38.187],[-62.455,-24.437],[-71.976,6.654],[-83.848,37.034],[-87.788,65.281],[-95.859,97.013]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":204,"s":[{"i":[[3.943,-3.188],[3.232,-5.348],[1.89,-7.607],[5.936,-15.26],[0.501,-3.909],[-1.366,-9.513]],"o":[[-7.283,5.888],[-5.545,9.177],[-3.515,14.147],[-3.877,9.966],[-1.437,11.219],[0,0]],"v":[[-51.918,-38.187],[-62.455,-24.437],[-71.976,6.654],[-83.848,37.034],[-87.788,65.281],[-95.859,97.013]],"c":false}]},{"t":218,"s":[{"i":[[3.824,-3.215],[3.107,-5.36],[1.774,-7.597],[5.936,-15.26],[0.501,-3.909],[-1.366,-9.513]],"o":[[-7.062,5.938],[-5.332,9.197],[-3.3,14.129],[-3.877,9.966],[-1.437,11.219],[0,0]],"v":[[-53.125,-38.25],[-63.293,-24.447],[-72.3,6.621],[-83.848,37.034],[-87.788,65.281],[-95.859,97.013]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":358,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":" 8","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.383],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[-2.2]},{"t":58,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":45,"s":[-69.003,105.869,0],"to":[-0.208,0,0],"ti":[3.899,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.379,"y":0},"t":47,"s":[-70.503,106.994,0],"to":[-0.121,0,0],"ti":[0.255,0,0]},{"i":{"x":0.21,"y":1},"o":{"x":0.167,"y":0.167},"t":48,"s":[-78.571,108.119,0],"to":[-3.792,0,0],"ti":[0,0,0]},{"t":58,"s":[-93.25,107.869,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-84.25,105.744,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[0,0],[0.269,-1.808],[0.802,-0.37],[0.555,-0.933],[-0.018,-1.173],[-5.66,-0.006],[-2.778,6.398],[0,0],[0,0],[0,0],[0,0]],"o":[[-0.519,5.415],[-0.436,2.931],[-0.802,0.37],[-0.77,1.293],[0.9,0.004],[6.285,0.006],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-99.424,92.28],[-100.86,106.854],[-102.371,110.921],[-104.648,112.713],[-105.561,116.594],[-84.154,117.182],[-81.266,106.122],[-84.141,106.184],[-84.66,117.176],[-76.602,117.342],[-75.346,95.453]],"c":false}]},{"t":53,"s":[{"i":[[0,0],[0.369,-1.851],[1.097,-0.379],[0.76,-0.955],[-0.024,-1.201],[-6.282,-0.006],[-2.778,6.398],[0,0],[0,0],[0,0],[0,0]],"o":[[-0.546,6.093],[-0.598,3],[-1.097,0.379],[-1.054,1.324],[1.232,0.004],[6.975,0.006],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-94.052,92.759],[-95.951,106.838],[-99.961,111.016],[-103.079,112.85],[-104.329,116.824],[-90.063,116.84],[-73.999,106.312],[-73.999,106.312],[-73.999,116.827],[-66.132,116.833],[-64.827,92.794]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":45,"op":357,"st":50,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Layer 3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-15.04,39.857,0],"ix":2,"l":2},"a":{"a":0,"k":[-15.04,39.857,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.69,"y":0},"t":14,"s":[{"i":[[0,0],[-0.716,4.737],[-1.079,4.298],[1.07,4.194],[0.143,5.237]],"o":[[-1.084,-4.666],[0.662,-4.381],[1.054,-4.198],[-1.295,-5.076],[0,0]],"v":[[-41.808,94.965],[-43.267,82.478],[-39.362,67.384],[-39.386,54.532],[-43.649,39.469]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[0,0],[-0.783,4.7],[-1.153,4.321],[0.966,4.409],[0.002,5.293]],"o":[[-1.039,-4.656],[0.724,-4.348],[1.127,-4.221],[-1.161,-5.152],[0,0]],"v":[[-40.919,94.562],[-42.136,81.879],[-38.195,66.949],[-39.023,53.362],[-43.04,34.954]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[{"i":[[0,0],[-0.903,4.679],[-1.263,4.29],[0.88,4.427],[-0.133,5.292]],"o":[[-0.92,-4.681],[0.835,-4.328],[1.234,-4.191],[-1.029,-5.18],[0,0]],"v":[[-38.555,93.57],[-39.449,80.861],[-35.129,66.035],[-35.611,52.432],[-38.658,33.802]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":28,"s":[{"i":[[0,0],[-1.172,4.5],[-1.578,4.441],[0.385,5.578],[-3.336,6.624]],"o":[[-0.774,-4.609],[1.084,-4.162],[1.541,-4.338],[-0.408,-5.569],[0,0]],"v":[[-35.634,92.182],[-35.483,78.435],[-31.271,64.414],[-30.945,48.403],[-27.789,29.751]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":30,"s":[{"i":[[0,0],[-1.24,4.454],[-1.658,4.48],[0.259,5.87],[-0.954,5.675]],"o":[[-0.737,-4.59],[1.147,-4.12],[1.619,-4.376],[-0.25,-5.668],[0,0]],"v":[[-34.892,91.829],[-34.475,77.819],[-30.29,64.003],[-29.759,47.38],[-26.282,30.603]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":35,"s":[{"i":[[0,0],[-1.089,4.536],[-1.544,4.58],[0.441,5.559],[-0.702,5.751]],"o":[[-0.837,-4.612],[1.007,-4.196],[1.508,-4.474],[-0.489,-5.706],[0,0]],"v":[[-34.543,92.78],[-34.668,78.714],[-30.587,64.824],[-30.056,48.798],[-31.252,32.642]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":40,"s":[{"i":[[0,0],[-0.716,4.737],[-1.263,4.827],[0.889,4.791],[-0.083,5.938]],"o":[[-1.084,-4.666],[0.662,-4.381],[1.234,-4.715],[-1.076,-5.799],[0,0]],"v":[[-33.683,95.121],[-35.142,80.916],[-31.315,66.846],[-30.787,52.287],[-34.399,35.062]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[0,0],[-0.711,4.737],[-1.258,4.829],[0.894,4.79],[-0.076,5.938]],"o":[[-1.811,-4.441],[0.657,-4.382],[1.229,-4.717],[-1.082,-5.798],[0,0]],"v":[[-34.564,95.191],[-36.174,80.901],[-32.364,66.751],[-31.851,52.191],[-36.018,34.182]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":47,"s":[{"i":[[0,0],[-0.702,4.739],[-1.249,4.831],[0.903,4.789],[-0.065,5.938]],"o":[[-1.796,-3.796],[0.649,-4.383],[1.22,-4.719],[-1.093,-5.796],[0,0]],"v":[[-34.704,95.171],[-36.597,82.176],[-34.317,66.572],[-33.832,52.012],[-38.746,28.796]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":58,"s":[{"i":[[0,0],[1.898,9.128],[0.825,4.904],[1.704,5.653],[1.144,5.806]],"o":[[-2.594,-5.794],[-1.442,-6.935],[-1.109,-6.593],[-2.522,-6.122],[0,0]],"v":[[-41.156,94.512],[-45.648,76.747],[-48.266,58.343],[-53.329,43.347],[-57.955,24.76]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.4,"y":0},"t":70,"s":[{"i":[[0,0],[0.423,4.772],[-1.223,4.838],[1.181,4.728],[-0.033,5.938]],"o":[[-2.304,-4.557],[-0.381,-4.299],[1.194,-4.725],[-2.235,-8.948],[0,0]],"v":[[-52.071,94.307],[-55.494,81.299],[-53.235,65.636],[-54.015,49.073],[-58.324,27.324]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":152,"s":[{"i":[[0,0],[0.423,4.772],[-1.223,4.838],[1.181,4.728],[-0.033,5.938]],"o":[[-2.304,-4.557],[-0.381,-4.299],[1.194,-4.725],[-2.235,-8.948],[0,0]],"v":[[-52.071,94.307],[-55.494,81.299],[-53.235,65.636],[-54.015,49.073],[-58.324,27.324]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":166,"s":[{"i":[[0,0],[0.327,4.772],[-0.944,4.838],[1.181,4.728],[-0.033,5.938]],"o":[[-2.304,-4.557],[-0.294,-4.299],[0.922,-4.725],[-2.235,-8.948],[0,0]],"v":[[-51.946,94.307],[-55.206,81.299],[-52.338,65.636],[-53.14,49.823],[-57.824,24.574]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":204,"s":[{"i":[[0,0],[0.327,4.772],[-0.944,4.838],[1.181,4.728],[-0.033,5.938]],"o":[[-2.304,-4.557],[-0.294,-4.299],[0.922,-4.725],[-2.235,-8.948],[0,0]],"v":[[-51.946,94.307],[-55.206,81.299],[-52.338,65.636],[-53.14,49.823],[-57.824,24.574]],"c":false}]},{"t":218,"s":[{"i":[[0,0],[0.423,4.772],[-1.223,4.838],[1.181,4.728],[-0.033,5.938]],"o":[[-2.304,-4.557],[-0.381,-4.299],[1.194,-4.725],[-2.235,-8.948],[0,0]],"v":[[-52.071,94.307],[-55.494,81.299],[-53.235,65.636],[-54.015,49.073],[-58.324,27.324]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.514,"y":1},"o":{"x":0.839,"y":0},"t":14,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-25.552,-39.1],[6.377,94.902],[-41.808,94.908]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.66,"y":0},"t":30,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-0.24,-41.114],[8.252,95.022],[-34.888,91.774]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":40,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-2.177,-39.151],[8.252,95.059],[-33.683,95.064]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-5.651,-39.163],[7.686,95.128],[-34.522,95.134]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":47,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-12.122,-39.185],[6.632,95.147],[-34.584,95.113]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":58,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-39.671,-41.037],[-0.595,94.56],[-40.656,94.566]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.4,"y":0},"t":70,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-39.392,-41.088],[-7.011,94.244],[-52.071,94.25]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":152,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-39.392,-41.088],[-7.011,94.244],[-52.071,94.25]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":166,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-37.892,-40.463],[-7.011,94.244],[-51.939,94.25]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":204,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-37.892,-40.463],[-7.011,94.244],[-50.814,94.25]],"c":false}]},{"t":218,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-39.392,-41.088],[-7.011,94.244],[-52.071,94.25]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.69,"y":0},"t":14,"s":[{"i":[[0,0],[-0.535,-1.851],[-1.131,-0.379],[-0.846,-0.955],[-0.083,-1.201],[6.281,-0.006],[3.352,6.398],[0,0],[0,0],[0,0],[0,0]],"o":[[1.092,6.093],[0.867,3],[1.131,0.379],[1.172,1.324],[-1.232,0.004],[-6.974,0.006],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.623,94.901],[4.294,108.811],[8.679,112.989],[11.961,114.823],[13.568,118.797],[-0.697,118.813],[-17.705,108.285],[-17.705,108.285],[-16.762,118.8],[-24.628,118.806],[-28.576,94.931]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.66,"y":0},"t":30,"s":[{"i":[[0,0],[-0.423,-1.879],[-1.107,-0.446],[-0.787,-1.004],[-0.011,-1.204],[6.27,0.37],[2.513,6.771],[0,0],[0,0],[0,0],[0,0]],"o":[[0.002,6.666],[0.686,3.047],[1.107,0.446],[1.091,1.392],[-1.23,-0.07],[-6.962,-0.411],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.373,94.74],[3.626,108.575],[7.753,113.007],[10.92,115.035],[12.286,119.098],[-1.955,118.26],[-16.966,104.874],[-16.966,104.874],[-18.599,115.231],[-26.402,114.238],[-26.571,92.846]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":40,"s":[{"i":[[0,0],[-0.535,-1.851],[-1.131,-0.379],[-0.846,-0.955],[-0.083,-1.201],[6.281,-0.006],[3.352,6.398],[0,0],[0,0],[0,0],[0,0]],"o":[[0.002,6.88],[0.867,3],[1.131,0.379],[1.172,1.324],[-1.232,0.004],[-6.974,0.006],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.748,95.113],[2.544,108.867],[6.929,113.044],[10.211,114.879],[11.818,118.853],[-2.447,118.869],[-18.205,108.376],[-18.205,108.376],[-18.512,118.856],[-26.378,118.861],[-27.701,95.042]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":44,"s":[{"i":[[0,0],[-0.535,-1.851],[-1.131,-0.379],[-0.846,-0.955],[-0.083,-1.201],[6.281,-0.006],[3.352,6.398],[0,0],[0,0],[0,0],[0,0]],"o":[[0.002,6.88],[0.867,3],[1.131,0.379],[1.172,1.324],[-1.232,0.004],[-6.974,0.006],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.748,95.113],[2.544,108.867],[6.929,113.044],[10.211,114.879],[11.818,118.853],[-2.447,118.869],[-18.205,108.376],[-18.205,108.376],[-18.512,118.856],[-26.378,118.861],[-28.201,95.042]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":47,"s":[{"i":[[0,0],[-0.535,-1.851],[-1.131,-0.379],[-0.846,-0.955],[-0.083,-1.201],[6.281,-0.006],[3.352,6.398],[0,0],[0,0],[0,0],[0,0]],"o":[[0.002,6.88],[0.867,3],[1.131,0.379],[1.172,1.324],[-1.232,0.004],[-6.974,0.006],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.748,95.113],[2.544,108.867],[6.929,113.044],[10.211,114.879],[11.818,118.853],[-2.447,118.869],[-18.205,108.376],[-18.205,108.376],[-18.512,118.856],[-26.378,118.861],[-28.201,95.042]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":58,"s":[{"i":[[0,0],[-0.535,-1.851],[-1.131,-0.379],[-0.846,-0.955],[-0.083,-1.201],[6.281,-0.006],[3.352,6.398],[0,0],[0,0],[0,0],[0,0]],"o":[[0.002,6.88],[0.867,3],[1.131,0.379],[1.172,1.324],[-1.232,0.004],[-6.974,0.006],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-2.002,95.113],[-1.206,108.867],[3.179,113.044],[6.461,114.879],[8.068,118.853],[-6.197,118.869],[-21.955,108.376],[-21.955,108.376],[-22.262,118.856],[-30.128,118.861],[-33.201,95.042]],"c":false}]},{"t":70,"s":[{"i":[[0,0],[-0.535,-1.851],[-1.131,-0.379],[-0.846,-0.955],[-0.083,-1.201],[6.281,-0.006],[3.352,6.398],[0,0],[0,0],[0,0],[0,0]],"o":[[0.002,6.88],[0.867,3],[1.131,0.379],[1.172,1.324],[-1.232,0.004],[-6.974,0.006],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-11.765,94.243],[-10.969,108.934],[-6.584,113.112],[-3.302,114.947],[-1.695,118.92],[-15.96,118.937],[-31.719,108.444],[-31.719,108.444],[-32.025,118.923],[-39.891,118.929],[-42.965,94.172]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":358,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":" 7","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.929]},"o":{"x":[0.174],"y":[0.273]},"t":0,"s":[0]},{"i":{"x":[0.518],"y":[0.904]},"o":{"x":[0.467],"y":[-0.063]},"t":32,"s":[-45]},{"i":{"x":[0.515],"y":[0.956]},"o":{"x":[0.456],"y":[-0.025]},"t":68,"s":[16]},{"i":{"x":[0.01],"y":[1]},"o":{"x":[0.467],"y":[-0.069]},"t":95,"s":[-45]},{"i":{"x":[0.515],"y":[0.939]},"o":{"x":[0.174],"y":[0.236]},"t":124,"s":[0]},{"i":{"x":[0.518],"y":[0.904]},"o":{"x":[0.467],"y":[-0.063]},"t":168,"s":[-45]},{"i":{"x":[0.515],"y":[0.949]},"o":{"x":[0.456],"y":[-0.029]},"t":225,"s":[16]},{"i":{"x":[0.845],"y":[1.051]},"o":{"x":[0.467],"y":[-0.069]},"t":274.928,"s":[-45]},{"t":321,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[-191.387,-43.434,0],"to":[2.5,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[-176.387,-43.434,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":64,"s":[-191.387,-43.434,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":93,"s":[-176.387,-43.434,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":124,"s":[-191.387,-43.434,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":163,"s":[-176.387,-43.434,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":221,"s":[-191.387,-43.434,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":271.75,"s":[-176.387,-43.434,0],"to":[0,0,0],"ti":[2.5,0,0]},{"t":321,"s":[-191.387,-43.434,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-191.387,-43.434,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.895,4.463],[0,0],[-4.463,-1.895],[0,0],[1.895,-4.463],[0,0],[4.463,1.895],[0,0]],"o":[[0,0],[1.895,-4.463],[0,0],[4.463,1.895],[0,0],[-1.895,4.463],[0,0],[-4.463,-1.895]],"v":[[-208.928,-50.867],[-208.928,-50.867],[-197.415,-55.517],[-178.497,-47.515],[-173.846,-36.002],[-173.846,-36.002],[-185.36,-31.352],[-204.278,-39.353]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.360784322023,0.364705890417,0.376470595598,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":358,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Group 1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":124,"s":[-360]},{"t":321,"s":[-720]}],"ix":10},"p":{"a":0,"k":[181.759,-45.473,0],"ix":2,"l":2},"a":{"a":0,"k":[181.759,-45.473,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-4.648],[4.648,0],[0,4.648],[-4.648,0]],"o":[[0,4.648],[-4.648,0],[0,-4.648],[4.648,0]],"v":[[188.525,-47.623],[180.11,-39.208],[171.694,-47.623],[180.11,-56.039]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.250980407,0.301960796118,0.392156869173,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":358,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Group 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":31,"s":[-24]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":63,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":93,"s":[-24]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":124,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":174,"s":[-24]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":224,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":273,"s":[-24]},{"t":321,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[189.509,7.428,0],"to":[0.833,0.458,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":30,"s":[194.509,10.178,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":61,"s":[189.509,7.428,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":91,"s":[194.509,10.178,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":124,"s":[189.509,7.428,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":171,"s":[194.509,10.178,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":220,"s":[189.509,7.428,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":270,"s":[194.509,10.178,0],"to":[0,0,0],"ti":[0.833,0.458,0]},{"t":321,"s":[189.509,7.428,0]}],"ix":2,"l":2},"a":{"a":0,"k":[189.509,7.428,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.893,-3.251],[11.285,2.779],[0.492,11.051],[-3.653,-0.9]],"o":[[3.653,0.9],[-5.566,9.559],[-11.285,-2.779],[-0.167,-3.758],[0,0]],"v":[[209.413,1.566],[212.973,9.888],[184.741,21.845],[165.289,-1.854],[172.306,-7.571]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.360784322023,0.364705890417,0.376470595598,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":358,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"body cover","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[14.599,1.75,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":152,"s":[{"i":[[0.875,2.375],[0,0],[0,0],[0,0],[1.625,4.5],[-1.625,4.5]],"o":[[-0.875,-2.375],[0,0],[0,0],[0,0],[-1.625,-4.5],[1.625,-4.5]],"v":[[-37.375,-68.75],[-79.25,-67.25],[-59,62.75],[-16.5,64],[-38.625,-37.5],[-37.375,-54]],"c":true}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":166,"s":[{"i":[[0.875,2.375],[0,0],[0,0],[0,0],[1.625,4.5],[-1.625,4.5]],"o":[[-0.875,-2.375],[0,0],[0,0],[0,0],[-1.625,-4.5],[1.625,-4.5]],"v":[[-37.375,-68.75],[-79.25,-67.25],[-59,62.75],[-10.552,62.729],[-38.625,-37.5],[-37.375,-54]],"c":true}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":204,"s":[{"i":[[0.875,2.375],[0,0],[0,0],[0,0],[1.625,4.5],[-1.625,4.5]],"o":[[-0.875,-2.375],[0,0],[0,0],[0,0],[-1.625,-4.5],[1.625,-4.5]],"v":[[-37.375,-68.75],[-79.25,-67.25],[-59,62.75],[-10.552,62.729],[-38.625,-37.5],[-37.375,-54]],"c":true}]},{"t":218,"s":[{"i":[[0.875,2.375],[0,0],[0,0],[0,0],[1.625,4.5],[-1.625,4.5]],"o":[[-0.875,-2.375],[0,0],[0,0],[0,0],[-1.625,-4.5],[1.625,-4.5]],"v":[[-37.375,-68.75],[-79.25,-67.25],[-59,62.75],[-16.5,64],[-38.625,-37.5],[-37.375,-54]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.121568627656,0.121568627656,0.121568627656,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":358,"st":0,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"finger left","parent":23,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[-13]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[-26.4]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":60,"s":[-26.4]},{"t":76,"s":[-7.4]}],"ix":10},"p":{"a":0,"k":[30.047,-52.909,0],"ix":2,"l":2},"a":{"a":0,"k":[30.047,-52.909,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-3.751,5.292],[0.431,0.639],[0.779,-0.176],[2.473,-2.118]],"o":[[5.885,-2.607],[0.446,-0.629],[-0.432,-0.64],[-3.158,0.713],[0,0]],"v":[[30.047,-52.909],[43.409,-66.225],[43.871,-68.346],[41.599,-69.095],[33.684,-63.249]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":358,"st":0,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"hexa","parent":22,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[51.616,-52.909,0],"ix":2,"l":2},"a":{"a":0,"k":[51.616,-52.909,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.818,0.108],[0,0],[0.503,-0.654],[0,0],[-0.315,-0.763],[0,0],[-0.818,-0.108],[0,0],[-0.503,0.654],[0,0],[0.315,0.763],[0,0]],"o":[[0,0],[-0.818,-0.108],[0,0],[-0.503,0.654],[0,0],[0.315,0.763],[0,0],[0.818,0.108],[0,0],[0.503,-0.654],[0,0],[-0.315,-0.763]],"v":[[60.761,-66.702],[46.378,-68.607],[44.243,-67.725],[35.401,-56.222],[35.098,-53.932],[40.639,-40.523],[42.47,-39.116],[56.853,-37.21],[58.988,-38.092],[67.83,-49.595],[68.134,-51.885],[62.593,-65.294]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.988235294819,0.78823530674,0.203921571374,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":31,"st":0,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"left hand","parent":23,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[-13]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[-32]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":60,"s":[-32]},{"t":76,"s":[-22.8]}],"ix":10},"p":{"a":0,"k":[19.691,-62.984,0],"ix":2,"l":2},"a":{"a":0,"k":[19.691,-62.984,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[-2.436,-0.426],[-0.782,-1.829]],"o":[[2.222,-1.098],[1.935,0.339],[0,0]],"v":[[36.388,-74.129],[43.457,-75.929],[47.901,-71.956]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0},"t":20,"s":[{"i":[[0,0],[-2.436,-0.426],[-0.984,-1.709]],"o":[[2.222,-1.098],[1.935,0.339],[0,0]],"v":[[37.163,-72.201],[44.601,-73.246],[50.334,-69.631]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.66,"y":0},"t":22,"s":[{"i":[[0,0],[-2.436,-0.426],[-0.984,-1.709]],"o":[[2.222,-1.098],[1.935,0.339],[0,0]],"v":[[37.163,-72.201],[44.601,-73.246],[50.334,-69.631]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":30,"s":[{"i":[[0,0],[-2.347,-0.363],[-1.694,-0.76]],"o":[[2.141,-0.934],[1.864,0.288],[0,0]],"v":[[36.82,-71.551],[43.987,-72.44],[48.705,-71.356]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":32,"s":[{"i":[[0,0],[-1.913,1.218],[-1.582,0.933]],"o":[[1.853,-1.447],[1.656,-1.054],[0,0]],"v":[[35.926,-71.002],[41.345,-75.046],[45.465,-77.391]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":37,"s":[{"i":[[0,0],[-2.268,-0.015],[-1.835,-0.074]],"o":[[1.853,-1.447],[1.963,0.013],[0,0]],"v":[[35.926,-71.002],[43.038,-72.289],[47.71,-72.462]],"c":false}]},{"t":40,"s":[{"i":[[0,0],[-1.551,-1.155],[-0.882,-1.611]],"o":[[1.853,-1.447],[1.575,1.172],[0,0]],"v":[[35.926,-71.002],[41.742,-70.141],[44.91,-66.689]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":37,"s":[100]},{"t":38,"s":[0]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[-5.248,4.287],[-2.13,0.665],[-1.934,-1.125],[-0.324,-0.627],[0.111,-0.699]],"o":[[5.192,-5.654],[1.737,-1.419],[2.13,-0.665],[0.605,0.352],[0.324,0.627],[0,0]],"v":[[19.691,-62.984],[32.161,-75.058],[38.032,-78.25],[44.517,-77.807],[45.982,-76.405],[46.314,-74.344]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0},"t":20,"s":[{"i":[[0,0],[-5.8,3.504],[-1.936,0.168],[-2.136,-0.667],[-0.559,-0.431],[-0.624,-1.296]],"o":[[5.478,-5.345],[2.168,-1.31],[2.223,-0.193],[0.668,0.209],[1.252,0.966],[0,0]],"v":[[19.691,-62.984],[33.318,-72.909],[40.754,-75.135],[45.606,-74.465],[47.867,-73.214],[50.589,-70.066]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.66,"y":0},"t":22,"s":[{"i":[[0,0],[-5.8,3.504],[-1.936,0.168],[-2.136,-0.667],[-0.559,-0.431],[-0.624,-1.296]],"o":[[5.478,-5.345],[2.168,-1.31],[2.223,-0.193],[0.668,0.209],[1.252,0.966],[0,0]],"v":[[19.691,-62.984],[33.318,-72.909],[40.754,-75.135],[45.606,-74.465],[47.867,-73.214],[50.589,-70.066]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":30,"s":[{"i":[[0,0],[-5.589,2.98],[-1.866,0.143],[-1.853,-0.286],[-1.169,-0.525],[-1.035,-0.43]],"o":[[5.478,-5.345],[2.089,-1.114],[2.142,-0.164],[0.664,0.103],[1.948,0.551],[0,0]],"v":[[19.691,-62.984],[33.347,-71.975],[40.259,-73.69],[45.022,-73.259],[48.112,-72.533],[52.232,-71.165]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":32,"s":[{"i":[[0,0],[-5.589,2.98],[-1.528,0.898],[-1.657,0.877],[-1.251,0.277],[-1.087,0.273]],"o":[[5.478,-5.345],[2.089,-1.114],[1.853,-1.088],[0.594,-0.315],[1.891,-0.722],[0,0]],"v":[[19.691,-62.984],[33.347,-71.975],[37.296,-74.394],[41.375,-76.717],[44.287,-77.98],[47.962,-79.96]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":37,"s":[{"i":[[0,0],[-4.53,1.806],[-2.126,0.202],[-1.868,-0.162],[-1.608,-0.307],[-1.062,-0.36]],"o":[[5.478,-5.345],[2.199,-0.877],[2.139,-0.203],[0.67,0.058],[1.98,0.42],[0,0]],"v":[[19.691,-62.984],[33.347,-71.975],[39.043,-73.414],[43.781,-73.428],[48.037,-72.842],[51.509,-72.015]],"c":false}]},{"t":40,"s":[{"i":[[0,0],[-2.654,0.204],[-1.299,-0.532],[-0.802,-1.388],[-0.318,-1.311],[0.646,-1.254]],"o":[[5.478,-5.345],[1.778,-0.137],[1.913,0.783],[1.168,2.022],[0.1,1.972],[0,0]],"v":[[19.691,-62.984],[36.163,-70.356],[39.65,-70.135],[43.127,-67.345],[44.095,-63.67],[42.974,-60.228]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[-0.858,-0.51],[-1.118,-0.301],[-0.238,0.973],[0.466,0.516],[3.852,0.099],[2.652,-1.73]],"o":[[0.895,0.494],[0.889,0.528],[0.954,0.257],[0.166,-0.679],[-2.607,-2.881],[-3.151,-0.081],[0,0]],"v":[[45.842,-67.462],[48.41,-65.901],[51.353,-64.596],[53.865,-65.454],[53.071,-67.296],[43.415,-73.136],[36.388,-70.738]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[0,0],[-0.876,-0.517],[-1.098,-0.295],[-0.238,0.973],[0.466,0.516],[3.852,0.099],[2.652,-1.73]],"o":[[2.283,-2.077],[0.875,0.516],[0.954,0.257],[0.166,-0.679],[-2.607,-2.881],[-3.151,-0.081],[0,0]],"v":[[41.506,-66.826],[47.105,-66.87],[51.353,-64.596],[53.865,-65.454],[53.071,-67.296],[43.415,-73.136],[36.388,-70.738]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.66,"y":0},"t":22,"s":[{"i":[[0,0],[-0.876,-0.517],[-1.098,-0.295],[-0.238,0.973],[0.466,0.516],[3.852,0.099],[2.652,-1.73]],"o":[[2.283,-2.077],[0.875,0.516],[0.954,0.257],[0.166,-0.679],[-2.607,-2.881],[-3.151,-0.081],[0,0]],"v":[[41.506,-66.826],[47.105,-66.87],[51.353,-64.596],[53.865,-65.454],[53.071,-67.296],[43.415,-73.136],[36.388,-70.738]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":30,"s":[{"i":[[0,0],[-0.979,0.038],[-1.041,0.3],[0.32,0.804],[0.648,0.151],[3.711,0.085],[2.555,-1.472]],"o":[[2.283,-2.077],[0.978,-0.038],[0.905,-0.26],[-0.223,-0.561],[-3.621,-0.842],[-3.036,-0.069],[0,0]],"v":[[37.27,-64.561],[47.553,-67.889],[52.178,-68.243],[53.753,-70.021],[52.143,-70.965],[42.844,-72.346],[34.848,-70.555]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":32,"s":[{"i":[[0,0],[-0.584,0.787],[-0.656,0.862],[0.736,0.454],[0.609,-0.266],[3.027,-2.149],[2.555,-1.472]],"o":[[2.283,-2.077],[0.947,-1.274],[0.57,-0.749],[-0.514,-0.317],[-3.406,1.488],[-2.476,1.758],[0,0]],"v":[[37.27,-64.561],[46.612,-73.922],[49.665,-77.584],[49.866,-79.951],[48.011,-79.747],[40.173,-74.683],[34.848,-70.555]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":37,"s":[{"i":[[0,0],[-0.918,0.344],[-1.019,0.368],[0.372,0.78],[0.656,0.107],[3.709,-0.163],[2.555,-1.472]],"o":[[2.283,-2.077],[1.487,-0.557],[0.886,-0.32],[-0.26,-0.545],[-3.669,-0.598],[-3.034,0.134],[0,0]],"v":[[37.27,-64.561],[46.613,-67.964],[51.164,-69.385],[52.617,-71.264],[50.947,-72.098],[41.617,-72.096],[34.848,-70.555]],"c":false}]},{"t":40,"s":[{"i":[[0,0],[-0.584,-0.694],[1.189,-1.691],[-2.21,1.869],[-2.212,3.492],[1.82,2.49],[2.702,-0.054]],"o":[[0.457,-0.105],[0.387,1.664],[-1.377,1.958],[1.122,-0.949],[1.94,-3.063],[-1.233,-1.687],[0,0]],"v":[[36.202,-63.898],[38.443,-63.231],[33.948,-55.543],[37.716,-53.739],[42.762,-59.745],[42.807,-68.015],[36.684,-70.539]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":71,"st":0,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"left arm 2","parent":26,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.817],"y":[1.014]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[-17]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.602],"y":[0.096]},"t":24,"s":[43.2]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[12.5]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":46,"s":[0]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":60,"s":[0]},{"t":76,"s":[89.4]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":60,"s":[6.191,-49.734,0],"to":[2.183,2.986,0],"ti":[-2.183,-2.986,0]},{"t":76,"s":[19.291,-31.818,0]}],"ix":2,"l":2},"a":{"a":0,"k":[6.191,-49.734,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[-10.553,-7.794]],"o":[[0,0]],"v":[[6.277,-49.855]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":29,"s":[{"i":[[-10.553,-7.794]],"o":[[0,0]],"v":[[4.807,-48.203]],"c":false}]},{"t":60,"s":[{"i":[[-10.553,-7.794]],"o":[[0,0]],"v":[[4.807,-48.203]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[-2.438,-0.067],[-1.963,12.344],[5.082,5.232],[4.914,-4.8]],"o":[[13.177,0.363],[-4.63,-3.759],[-4.914,4.8],[0,0]],"v":[[4.384,-25.84],[30.047,-52.909],[19.691,-62.984],[6.277,-49.855]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":14,"s":[{"i":[[-2.249,-0.943],[-6.834,19.321],[5.082,5.232],[4.914,-4.8]],"o":[[12.255,5.141],[-4.63,-3.759],[-4.914,4.8],[0,0]],"v":[[-1.782,-26.869],[30.047,-52.909],[19.691,-62.984],[6.277,-49.855]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":24,"s":[{"i":[[-2.438,-0.025],[-6.834,19.321],[5.082,5.232],[4.914,-4.8]],"o":[[10.06,0.103],[-4.63,-3.759],[-4.914,4.8],[0,0]],"v":[[7.855,-25.27],[30.047,-52.909],[19.691,-62.984],[6.277,-49.855]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[-2.437,0.039],[-6.834,19.321],[5.082,5.232],[4.914,-4.8]],"o":[[10.345,-0.175],[-4.63,-3.759],[-4.914,4.8],[0,0]],"v":[[6.395,-24.92],[30.047,-52.909],[19.691,-62.984],[6.277,-49.855]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[{"i":[[-2.418,0.309],[-6.834,19.321],[5.082,5.232],[4.914,-4.8]],"o":[[12.505,-1.598],[-4.63,-3.759],[-4.914,4.8],[0,0]],"v":[[6.892,-24.324],[30.047,-52.909],[19.691,-62.984],[6.277,-49.855]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":29,"s":[{"i":[[-2.429,0.015],[-6.834,19.321],[5.082,5.232],[4.914,-4.8]],"o":[[12.878,-0.077],[-4.63,-3.759],[-4.914,4.8],[0,0]],"v":[[4.301,-24.007],[30.047,-52.909],[19.691,-62.984],[4.807,-48.203]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0},"t":32,"s":[{"i":[[-2.409,-0.38],[-6.834,19.321],[5.082,5.232],[4.914,-4.8]],"o":[[13.088,2.062],[-4.63,-3.759],[-4.914,4.8],[0,0]],"v":[[0.874,-25.547],[30.047,-52.909],[19.691,-62.984],[6.277,-49.855]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":46,"s":[{"i":[[-2.438,-0.067],[-1.963,12.344],[5.082,5.232],[4.914,-4.8]],"o":[[13.177,0.363],[-4.63,-3.759],[-4.914,4.8],[0,0]],"v":[[4.384,-25.84],[30.047,-52.909],[19.691,-62.984],[6.277,-49.855]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.4,"y":0},"t":60,"s":[{"i":[[-2.438,-0.067],[-1.963,12.344],[5.082,5.232],[4.914,-4.8]],"o":[[13.177,0.363],[-4.63,-3.759],[-4.914,4.8],[0,0]],"v":[[4.384,-25.84],[30.047,-52.909],[19.691,-62.984],[6.277,-49.855]],"c":false}]},{"t":76,"s":[{"i":[[-1.678,1.769],[-2.931,12.19],[5.082,5.232],[4.914,-4.8]],"o":[[8.229,-8.674],[-4.63,-3.759],[-4.914,4.8],[0,0]],"v":[[10.492,-23.815],[30.047,-52.909],[19.691,-62.984],[6.277,-49.855]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":71,"st":0,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":"Layer 8","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-9.544,-35.853,0],"ix":2,"l":2},"a":{"a":0,"k":[-10.531,-36.411,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":102,"s":[{"i":[[0,0],[-0.354,-2.572],[0,0]],"o":[[1.553,4.061],[0,0],[0,0]],"v":[[-24.785,-47.619],[-20.786,-31.236],[-26.8,-15.645]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":114,"s":[{"i":[[0,0],[-2.608,-2.03],[0,0]],"o":[[2.283,1.422],[0,0],[0,0]],"v":[[-22.795,-53.731],[-14.598,-49.016],[-23.691,-32.536]],"c":false}]},{"t":120,"s":[{"i":[[0,0],[-2.608,-2.03],[0,0]],"o":[[2.283,1.422],[0,0],[0,0]],"v":[[-22.795,-53.731],[-15.223,-48.141],[-24.691,-31.786]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":102,"s":[{"i":[[0,0],[-1.096,-1.141],[-1.522,0.762]],"o":[[0,0],[1.096,1.141],[0,0]],"v":[[-29.574,5.465],[-26.503,12.908],[-22.113,14.117]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":114,"s":[{"i":[[0,0],[-1.577,0.133],[-0.366,1.662]],"o":[[0,0],[1.577,-0.133],[0,0]],"v":[[-21.552,-1.257],[-13.835,1.043],[-10.132,-1.606]],"c":false}]},{"t":120,"s":[{"i":[[0,0],[-1.58,-0.086],[-0.592,1.595]],"o":[[0,0],[1.58,0.086],[0,0]],"v":[[-23.263,-2.183],[-15.938,1.16],[-11.905,-0.953]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":102,"s":[{"i":[[0,0],[-5.425,-4.366],[0.891,-8.821],[10.344,-12.303],[3.907,2.109]],"o":[[0,0],[11.875,9.557],[-0.916,9.067],[-3.906,-2.109],[0,0]],"v":[[-33.451,-77.183],[-20.015,-73.365],[-2.724,-36.251],[-14.152,-7.492],[-25.872,-13.819]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":114,"s":[{"i":[[0,0],[-6.245,-3.082],[-1.416,-8.752],[12.513,-10.088],[3.429,2.82]],"o":[[0,0],[13.413,6.619],[1.328,8.21],[-3.429,-2.82],[0,0]],"v":[[-33.451,-77.183],[-19.64,-74.303],[4.54,-50.069],[-12.219,-23.106],[-23.568,-32.44]],"c":false}]},{"t":120,"s":[{"i":[[0,0],[-5.998,-3.539],[-1.416,-8.752],[12.513,-10.088],[3.429,2.82]],"o":[[0,0],[13.127,7.744],[1.328,8.21],[-3.429,-2.82],[0,0]],"v":[[-33.451,-77.183],[-20.515,-74.053],[3.29,-49.569],[-13.219,-22.356],[-24.568,-31.69]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":102,"s":[{"i":[[0,0],[0.628,2.059],[0.62,2.632]],"o":[[-1.512,4.121],[0,0],[-0.62,-2.632]],"v":[[-17.753,14.36],[-24.079,10.045],[-25.784,2.505]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":114,"s":[{"i":[[0,0],[1.995,0.808],[2.436,1.175]],"o":[[2.25,3.77],[0,0],[-2.436,-1.175]],"v":[[-7.198,-4.84],[-14.533,-2.642],[-21.465,-6.065]],"c":false}]},{"t":120,"s":[{"i":[[0,0],[1.864,1.076],[2.25,1.5]],"o":[[1.708,4.044],[0,0],[-2.25,-1.5]],"v":[[-8.553,-3.751],[-16.121,-2.587],[-22.513,-6.933]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":102,"s":[{"i":[[0,0],[0.283,8.27],[-0.175,1.78],[-0.697,4.923]],"o":[[-1.644,4.68],[0,-5.573],[0.309,-3.152],[0,0]],"v":[[-21.372,3.671],[-16.14,11.39],[-15.68,1.96],[-15.021,-7.536]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":114,"s":[{"i":[[0,0],[6.603,4.987],[-0.662,1.662],[0.996,4.87]],"o":[[2.601,4.224],[-6.701,-3.264],[0.639,-1.605],[0,0]],"v":[[-17.782,-8.758],[-8.49,-7.964],[-15.501,-14.228],[-13.064,-23.316]],"c":false}]},{"t":120,"s":[{"i":[[0,0],[5.851,5.85],[-0.662,1.662],[0.996,4.87]],"o":[[1.993,4.543],[-6.186,-4.158],[0.639,-1.605],[0,0]],"v":[[-18.494,-9.092],[-9.401,-7.023],[-15.501,-14.228],[-14.064,-22.566]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":102,"op":400,"st":102,"bm":0},{"ddd":0,"ind":25,"ty":4,"nm":"Layer 6","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-55.735,-36.137,0],"ix":2,"l":2},"a":{"a":0,"k":[-56.46,-36.387,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":71,"s":[{"i":[[0,0],[4.827,-6.177]],"o":[[3.434,5.335],[0,0]],"v":[[-4.227,4.087],[-7.54,33.941]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":79,"s":[{"i":[[0,0],[5.926,-5.132]],"o":[[2.343,5.897],[0,0]],"v":[[-12.28,5.968],[-19.124,34.028]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":85,"s":[{"i":[[0,0],[5.759,-5.318]],"o":[[2.53,5.819],[0,0]],"v":[[-10.19,5.803],[-16.134,34.068]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":91,"s":[{"i":[[0,0],[5.797,-5.276]],"o":[[2.488,5.836],[0,0]],"v":[[-10.659,5.84],[-16.805,34.059]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":99,"s":[{"i":[[0,0],[5.759,-5.318]],"o":[[2.53,5.819],[0,0]],"v":[[-10.19,5.803],[-16.134,34.068]],"c":false}]},{"t":105,"s":[{"i":[[0,0],[7.82,0.553]],"o":[[-1.505,7.049],[0,0]],"v":[[-13.497,-21.924],[-22.036,-4.894]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":71,"s":[{"i":[[0,0],[-4.115,-2.407],[-0.666,-5.452],[-0.708,-6.79],[-1.059,-2.383],[-0.328,-7.542],[0,0]],"o":[[4.627,0.055],[4.741,2.774],[0.666,5.452],[0.27,2.594],[3.286,7.393],[0,0],[0,0]],"v":[[-34.319,-76.892],[-20.578,-73.99],[-13.434,-58.901],[-11.542,-35.085],[-8.286,-18.143],[-4.047,3.667],[-13.035,6.383]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":79,"s":[{"i":[[0,0],[-4.115,-2.407],[-0.666,-5.452],[-1.087,-7.704],[-0.872,-2.457],[3.857,-6.762],[0,0]],"o":[[4.627,0.055],[4.741,2.774],[0.666,5.452],[0.364,2.582],[2.639,7.435],[0,0],[0,0]],"v":[[-34.319,-76.877],[-20.578,-73.99],[-13.934,-58.901],[-12.591,-34.451],[-9.828,-17.224],[-12.022,5.589],[-19.21,5.928]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":85,"s":[{"i":[[0,0],[-4.115,-2.407],[-0.666,-5.452],[-1.333,-7.665],[-0.95,-2.428],[3.639,-6.881],[0,0]],"o":[[4.627,0.055],[4.741,2.774],[0.666,5.452],[0.447,2.569],[2.875,7.347],[0,0],[0,0]],"v":[[-34.319,-76.877],[-20.578,-73.99],[-13.934,-58.901],[-11.792,-34.585],[-8.481,-17.455],[-9.945,5.417],[-17.118,5.986]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":91,"s":[{"i":[[0,0],[-4.115,-2.407],[-0.666,-5.452],[-1.277,-7.674],[-0.933,-2.435],[3.688,-6.854],[0,0]],"o":[[4.627,0.055],[4.741,2.774],[0.666,5.452],[0.428,2.572],[2.822,7.366],[0,0],[0,0]],"v":[[-34.319,-76.877],[-20.578,-73.99],[-13.934,-58.901],[-11.972,-34.555],[-8.783,-17.403],[-10.412,5.456],[-17.588,5.973]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":99,"s":[{"i":[[0,0],[-4.115,-2.407],[-0.666,-5.452],[-1.333,-7.665],[-0.95,-2.428],[3.639,-6.881],[0,0]],"o":[[4.627,0.055],[4.741,2.774],[0.666,5.452],[0.447,2.569],[2.875,7.347],[0,0],[0,0]],"v":[[-34.319,-76.877],[-20.578,-73.99],[-13.934,-58.901],[-11.792,-34.585],[-8.481,-17.455],[-9.945,5.417],[-17.118,5.986]],"c":false}]},{"t":105,"s":[{"i":[[0,0],[-4.115,-2.407],[-4.037,-3.724],[-0.073,-8.921],[1.629,-2.64],[5.296,-3.74],[0,0]],"o":[[4.627,0.055],[4.741,2.774],[4.432,4.088],[0.041,4.96],[-4.144,6.713],[0,0],[0,0]],"v":[[-34.319,-76.877],[-20.578,-73.99],[-7.059,-64.651],[3.77,-46.147],[-0.381,-35.298],[-13.048,-22.01],[-24.125,-31.347]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":71,"op":102,"st":71,"bm":0},{"ddd":0,"ind":26,"ty":4,"nm":"left arm","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.746],"y":[0.982]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[8.1]},{"i":{"x":[0.727],"y":[0.856]},"o":{"x":[0.457],"y":[-0.104]},"t":30,"s":[-33.9]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[-29.6]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":46,"s":[0]},{"i":{"x":[0.524],"y":[1.027]},"o":{"x":[0.4],"y":[0]},"t":60,"s":[0]},{"i":{"x":[0.453],"y":[1]},"o":{"x":[0.43],"y":[0.558]},"t":76,"s":[43.2]},{"t":84,"s":[41.4]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":60,"s":[-25.227,-75.935,0],"to":[1.25,0.5,0],"ti":[-1.25,-0.5,0]},{"t":76,"s":[-17.727,-72.935,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-25.227,-75.935,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[-4.115,-2.407],[-10.553,-7.794]],"o":[[4.627,0.055],[11.353,6.642],[0,0]],"v":[[-34.319,-76.689],[-20.578,-73.99],[6.277,-49.855]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":18,"s":[{"i":[[0,0],[-4.214,-2.23],[-10.553,-7.794]],"o":[[4.67,-0.755],[11.625,6.153],[0,0]],"v":[[-34.176,-75.363],[-20.373,-73.765],[6.277,-49.855]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[0,0],[-3.905,-2.647],[-9.137,-8.126]],"o":[[4.538,1.406],[10.708,7.25],[0,0]],"v":[[-32.305,-79.013],[-19.248,-72.297],[5.816,-49.577]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[{"i":[[0,0],[-3.851,-2.719],[-8.892,-8.184]],"o":[[4.515,1.782],[10.549,7.441],[0,0]],"v":[[-31.992,-79.511],[-19.053,-72.042],[5.343,-49.941]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":29,"s":[{"i":[[0,0],[-3.69,-2.936],[-8.154,-8.357]],"o":[[4.446,2.908],[10.071,8.012],[0,0]],"v":[[-31.323,-80.583],[-18.466,-71.276],[4.305,-49.053]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":30,"s":[{"i":[[0,0],[-3.667,-2.967],[-9.593,-8.422]],"o":[[4.436,3.071],[10.002,8.095],[0,0]],"v":[[-31.228,-80.768],[-18.381,-71.166],[6.277,-49.855]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0},"t":32,"s":[{"i":[[0,0],[-3.667,-2.967],[-9.593,-8.422]],"o":[[4.389,2.674],[10.002,8.095],[0,0]],"v":[[-31.475,-80.228],[-18.381,-71.166],[5.778,-49.676]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":46,"s":[{"i":[[0,0],[-4.115,-2.407],[-10.553,-7.794]],"o":[[4.627,0.055],[11.353,6.642],[0,0]],"v":[[-34.324,-76.705],[-20.578,-73.99],[6.277,-49.855]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":60,"s":[{"i":[[0,0],[-4.115,-2.407],[-10.553,-7.794]],"o":[[4.627,0.055],[11.353,6.642],[0,0]],"v":[[-34.319,-76.658],[-20.578,-73.99],[6.277,-49.855]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":62,"s":[{"i":[[0,0],[-4.204,-2.452],[-10.958,-8.32]],"o":[[4.621,-0.121],[11.37,6.639],[0,0]],"v":[[-34.534,-76.51],[-20.522,-73.957],[6.806,-49.133]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":63,"s":[{"i":[[0,0],[-4.317,-2.509],[-11.472,-8.987]],"o":[[4.821,-0.75],[11.391,6.634],[0,0]],"v":[[-35.391,-76.195],[-20.673,-74.166],[7.556,-47.607]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[0,0],[-4.429,-2.566],[-11.985,-9.654]],"o":[[5.093,-1.105],[11.412,6.63],[0,0]],"v":[[-36.266,-75.941],[-20.824,-74.375],[8.704,-45.73]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":65,"s":[{"i":[[0,0],[-4.57,-2.573],[-9.876,-5.901]],"o":[[4.966,-1.346],[13.683,7.684],[0,0]],"v":[[-37.149,-75.605],[-20.899,-74.466],[10.86,-42.798]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":66,"s":[{"i":[[0,0],[-4.711,-2.58],[-7.767,-2.149]],"o":[[4.838,-1.586],[15.954,8.738],[0,0]],"v":[[-37.982,-74.993],[-20.974,-74.558],[13.016,-39.867]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":67,"s":[{"i":[[0,0],[-4.57,-3.056],[-6.792,-1.944]],"o":[[6.505,-2.454],[13.909,9.303],[0,0]],"v":[[-38.802,-74.031],[-20.495,-74.297],[14.662,-37.792]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":68,"s":[{"i":[[0,0],[-4.817,-3.042],[-9.864,-6.258]],"o":[[5.849,-2.715],[13.133,8.401],[0,0]],"v":[[-38.983,-73.029],[-20.46,-74.298],[15.798,-36.146]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":70,"s":[{"i":[[0,0],[-6.112,-3.559],[-16.01,-14.884]],"o":[[4.538,-3.238],[11.517,6.706],[0,0]],"v":[[-39.279,-70.827],[-20.221,-74.038],[17.284,-34.146]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":72,"s":[{"i":[[0,0],[-5.117,-2.939],[-17.667,-17.037]],"o":[[4.446,-3.795],[11.603,6.665],[0,0]],"v":[[-38.948,-69.066],[-20.363,-74.409],[18.26,-33.072]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":73,"s":[{"i":[[0,0],[-5.578,-3.16],[-18.495,-18.113]],"o":[[4.4,-4.073],[11.661,6.617],[0,0]],"v":[[-38.979,-68.457],[-20.137,-74.316],[18.428,-33.092]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":74,"s":[{"i":[[0,0],[-6.04,-3.381],[-19.324,-19.19]],"o":[[4.354,-4.352],[11.719,6.57],[0,0]],"v":[[-39.011,-67.848],[-19.985,-74.413],[18.658,-33.025]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":76,"s":[{"i":[[0,0],[-6.266,-3.496],[-20.351,-20.524]],"o":[[4.633,-4.946],[11.761,6.562],[0,0]],"v":[[-39.247,-67.494],[-20.016,-74.003],[18.99,-32.3]],"c":false}]},{"t":84,"s":[{"i":[[0,0],[-6.266,-3.496],[-20.351,-20.524]],"o":[[4.853,-4.779],[11.761,6.562],[0,0]],"v":[[-39.765,-67.703],[-19.787,-73.8],[19.081,-32.386]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[-8.323,-3.998],[-2.55,-0.015]],"o":[[6.481,6.343],[2.711,1.302],[13.005,0.078]],"v":[[-24.177,-45.464],[-3.164,-27.744],[4.751,-25.834]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[0,0],[-3.618,-2.448],[-5.499,-0.272]],"o":[[3.522,3.439],[3.171,2.519],[11.525,-0.559]],"v":[[-19.561,-41.08],[-10.481,-32.836],[5.467,-25.517]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[0,0],[-2.536,-2.091],[-6.177,-0.331]],"o":[[2.841,2.771],[3.277,2.799],[11.184,-0.705]],"v":[[-19.553,-41.018],[-12.165,-34.008],[5.632,-25.444]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[0,0],[-2.378,-2.039],[-4.817,-1.149]],"o":[[2.985,2.482],[3.292,2.839],[11.579,4.779]],"v":[[-19.605,-40.705],[-12.41,-34.178],[2.303,-26.101]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[0,0],[-2.378,-2.039],[-4.598,-0.986]],"o":[[2.985,2.482],[3.292,2.839],[11.579,4.779]],"v":[[-19.605,-40.705],[-12.41,-34.178],[1.987,-26.103]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":18,"s":[{"i":[[0,0],[-2.349,-2.03],[-4.314,-2.14]],"o":[[2.968,2.463],[3.295,2.847],[11.651,5.779]],"v":[[-20.204,-41.481],[-12.454,-34.209],[-0.868,-27.092]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[0,0],[-3.076,-2.72],[-3.634,-1.935]],"o":[[3.448,2.993],[3.179,2.696],[11.613,5.851]],"v":[[-22.769,-43.719],[-12.751,-34.217],[-3.45,-27.683]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[0,0],[-4.011,-3.608],[-2.758,-1.672]],"o":[[4.065,3.675],[3.03,2.502],[11.565,5.943]],"v":[[-26.067,-46.597],[-13.133,-34.226],[-6.075,-28.771]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[{"i":[[0,0],[-5.01,-4.557],[-1.823,-1.391]],"o":[[4.725,4.403],[2.871,2.295],[11.513,6.041]],"v":[[-29.594,-49.674],[-13.542,-34.236],[-8.772,-30.251]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[0,0],[-5.155,-4.796],[-1.883,-1.741]],"o":[[5.05,4.762],[2.217,2.096],[1.174,1.046]],"v":[[-31.046,-50.48],[-16.384,-36.769],[-10.917,-31.777]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[{"i":[[0,0],[-5.104,-4.684],[-3.308,-2.141]],"o":[[3.648,4.663],[3.339,3.085],[3.449,2.218]],"v":[[-33.089,-51.535],[-21.123,-38.449],[-10.582,-30.507]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":29,"s":[{"i":[[0,0],[-7.095,-5.236],[-2.558,-1.472]],"o":[[4.958,6.354],[2.606,1.98],[9.974,5.582]],"v":[[-36.411,-54.009],[-18.154,-35.168],[-9.441,-29.152]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":30,"s":[{"i":[[0,0],[-7.522,-5.355],[-2.398,-1.329]],"o":[[6.481,6.343],[2.448,1.743],[11.375,6.304]],"v":[[-37.124,-54.541],[-15.56,-33.48],[-7.771,-28.499]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":32,"s":[{"i":[[0,0],[-7.307,-5.645],[-4.842,-1.695]],"o":[[6.481,6.343],[4.005,3.094],[12.275,4.297]],"v":[[-36.245,-52.885],[-14.415,-33.128],[-2.281,-26.517]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[{"i":[[0,0],[-7.584,-5.196],[-4.218,-1.237]],"o":[[6.481,6.343],[3.653,2.606],[12.474,3.148]],"v":[[-32.958,-50.864],[-11.367,-31.522],[-0.382,-26.192]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[0,0],[-7.94,-4.619],[-3.415,-0.649]],"o":[[6.481,6.343],[3.2,1.979],[12.729,1.67]],"v":[[-28.733,-48.265],[-7.427,-29.526],[2.08,-25.842]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":46,"s":[{"i":[[0,0],[-8.323,-3.998],[-2.55,-0.015]],"o":[[6.481,6.343],[2.711,1.302],[13.005,0.078]],"v":[[-24.177,-45.464],[-3.164,-27.744],[4.751,-25.834]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":60,"s":[{"i":[[0,0],[-8.323,-3.998],[-2.55,-0.015]],"o":[[6.481,6.343],[2.711,1.302],[13.005,0.078]],"v":[[-24.177,-45.464],[-3.164,-27.744],[4.751,-25.834]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":61,"s":[{"i":[[0,0],[-8.035,-4.491],[-2.916,-0.054]],"o":[[6.481,6.343],[2.649,1.485],[13.002,0.213]],"v":[[-24.177,-45.464],[-5.197,-28.787],[4.303,-25.739]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":62,"s":[{"i":[[0,0],[-7.568,-5.29],[-3.508,-0.117]],"o":[[6.481,6.343],[2.547,1.781],[12.998,0.432]],"v":[[-24.177,-45.464],[-8.489,-30.476],[3.58,-25.177]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":63,"s":[{"i":[[0,0],[-7.337,-5.593],[-3.024,-0.171]],"o":[[6.21,6.599],[2.47,1.882],[12.976,0.79]],"v":[[-24.245,-45.447],[-9.2,-29.839],[2.12,-24.392]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":64,"s":[{"i":[[0,0],[-7.107,-5.895],[-2.54,-0.225]],"o":[[5.938,6.855],[2.392,1.984],[12.955,1.147]],"v":[[-24.312,-45.43],[-9.911,-29.201],[0.69,-23.108]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":65,"s":[{"i":[[0,0],[-6.943,-6.082],[-2.7,-0.674]],"o":[[5.748,7.01],[2.337,2.047],[12.53,2.949]],"v":[[-24.214,-45.515],[-10.206,-28.602],[-0.016,-21.906]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":66,"s":[{"i":[[0,0],[-6.779,-6.27],[-2.859,-1.122]],"o":[[5.559,7.165],[2.282,2.11],[12.106,4.751]],"v":[[-24.116,-45.6],[-10.611,-28.618],[-0.833,-21.32]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":67,"s":[{"i":[[0,0],[-6.546,-6.504],[-2.922,-1.171]],"o":[[5.296,7.355],[2.203,2.189],[12.065,4.833]],"v":[[-23.637,-46.238],[-9.979,-29.599],[-1.056,-21.143]],"c":false}]},{"t":68,"s":[{"i":[[0,0],[-6.313,-6.738],[-2.492,-0.541]],"o":[[5.033,7.544],[2.125,2.268],[12.709,2.76]],"v":[[-23.158,-46.877],[-10.902,-28.973],[-1.147,-21.6]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":71,"st":0,"bm":0},{"ddd":0,"ind":27,"ty":4,"nm":" 6","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":31,"s":[-0.151]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":44,"s":[99.849]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.447],"y":[0.05]},"t":52,"s":[-44.151]},{"t":61,"s":[-73.651]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":31,"s":[87.558]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":44,"s":[78.165]},{"i":{"x":[0.919],"y":[-0.443]},"o":{"x":[0.167],"y":[0]},"t":52,"s":[78.394]},{"t":61,"s":[81.608]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":31,"s":[-113.474]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.66],"y":[0]},"t":37,"s":[-129.635]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":44,"s":[-54.885]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":52,"s":[-140.688]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.66],"y":[0]},"t":53,"s":[-140.688]},{"t":61,"s":[-108.045]}],"ix":4}},"a":{"a":0,"k":[77.835,-112.754,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0.825],[0,0],[0.715,0.413],[0,0],[0.715,-0.413],[0,0],[0,-0.825],[0,0],[-0.715,-0.413],[0,0],[-0.715,0.413],[0,0]],"o":[[0,0],[0,-0.825],[0,0],[-0.715,-0.413],[0,0],[-0.715,0.413],[0,0],[0,0.825],[0,0],[0.715,0.413],[0,0],[0.715,-0.413]],"v":[[92.71,-105.499],[92.71,-120.008],[91.555,-122.008],[78.99,-129.263],[76.68,-129.263],[64.115,-122.008],[62.96,-120.008],[62.96,-105.499],[64.115,-103.499],[76.68,-96.244],[78.99,-96.244],[91.555,-103.499]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.61568627451,0.964705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":31,"op":62,"st":0,"bm":0},{"ddd":0,"ind":28,"ty":4,"nm":" 5","parent":37,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-8.267,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[50.735,-15.692,0],"to":[6.152,-1.383,0],"ti":[-3.379,1.573,0]},{"i":{"x":0.34,"y":1},"o":{"x":0.333,"y":0},"t":26,"s":[87.646,-23.988,0],"to":[3.379,-1.573,0],"ti":[0.372,7.788,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.66,"y":0},"t":44,"s":[71.006,-25.129,0],"to":[-0.372,-7.788,0],"ti":[-2.401,7.598,0]},{"t":55,"s":[85.414,-70.717,0]}],"ix":2,"l":2},"a":{"a":0,"k":[77.835,-77.267,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.722,7.328],[0,0],[-7.328,3.722],[0,0],[-3.722,-7.328],[0,0],[7.328,-3.722],[0,0]],"o":[[0,0],[-3.722,-7.328],[0,0],[7.328,-3.722],[0,0],[3.722,7.328],[0,0],[-7.328,3.722]],"v":[[64.459,-70.474],[64.459,-70.474],[70.988,-90.481],[71.204,-90.59],[91.211,-84.061],[91.211,-84.061],[84.681,-64.054],[84.465,-63.944]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.972549021244,0.509803950787,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":62,"st":0,"bm":0},{"ddd":0,"ind":29,"ty":4,"nm":" 4","parent":37,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[-326]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":46,"s":[-115]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":56,"s":[0]},{"t":61,"s":[24]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":0,"s":[40.299,16.694,0],"to":[5.102,-3.421,0],"ti":[-5.102,8.087,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.66,"y":0},"t":46,"s":[70.913,-3.83,0],"to":[5.102,-8.087,0],"ti":[0,4.667,0]},{"t":56,"s":[70.913,-31.83,0]}],"ix":2,"l":2},"a":{"a":0,"k":[77.32,-35.798,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.665,-1.528],[-0.581,-0.776],[0,0],[0.705,-2.679],[0.23,-1.529],[-5.535,0.02],[0.376,4.941],[0.368,2.246],[-1.221,2.134],[0,0],[-0.387,0.907],[0.213,2.205],[6.128,0.358],[-0.026,-7.219]],"o":[[0.392,0.9],[0,0],[1.393,2.395],[-0.391,1.484],[-0.803,5.349],[4.864,-0.018],[-0.174,-2.282],[-0.394,-2.405],[0,0],[0.576,-0.78],[0.798,-1.871],[-0.59,-6.11],[-7.319,-0.427],[0.006,1.768]],"v":[[65.772,-40.987],[67.239,-38.466],[68.813,-35.76],[69.886,-27.837],[68.763,-23.333],[77.44,-12.997],[86.192,-22.224],[84.708,-28.878],[85.902,-35.822],[87.456,-38.54],[88.905,-41.075],[89.85,-47.253],[78.076,-58.578],[64.729,-45.963]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.250980407,0.301960796118,0.392156869173,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":61,"st":0,"bm":0},{"ddd":0,"ind":30,"ty":4,"nm":" 3","parent":37,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.44],"y":[0.88]},"o":{"x":[0.575],"y":[-0.156]},"t":0,"s":[12]},{"i":{"x":[0.507],"y":[1.099]},"o":{"x":[0.557],"y":[-0.122]},"t":22,"s":[-8.592]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.709],"y":[-0.161]},"t":39,"s":[12]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[18.8]},{"t":57,"s":[-14]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.44,"y":0.88},"o":{"x":0.575,"y":0.156},"t":0,"s":[67.106,32.567,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.507,"y":0.901},"o":{"x":0.557,"y":0.122},"t":22,"s":[84.002,28.008,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.709,"y":0.088},"t":39,"s":[67.106,32.567,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":45,"s":[71.976,35.311,0],"to":[0,0,0],"ti":[0,0,0]},{"t":57,"s":[70.339,21.422,0]}],"ix":2,"l":2},"a":{"a":0,"k":[77.835,20.502,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.616,-1.616],[0,0],[1.616,1.616],[0,0],[-1.616,1.616],[0,0],[-1.616,-1.616],[0,0]],"o":[[0,0],[-1.616,1.616],[0,0],[-1.616,-1.616],[0,0],[1.616,-1.616],[0,0],[1.616,1.616]],"v":[[107.605,23.427],[80.761,50.272],[74.909,50.272],[48.064,23.427],[48.064,17.576],[74.909,-9.269],[80.761,-9.269],[107.605,17.576]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.35686275363,0.72549021244,0.454901963472,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":59,"st":0,"bm":0},{"ddd":0,"ind":31,"ty":4,"nm":" 15","parent":32,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[77.835,-95.935,0],"ix":2,"l":2},"a":{"a":0,"k":[77.835,-95.935,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":98,"s":[{"i":[[0,0],[0,0],[-0.139,-0.103],[0,0]],"o":[[0,0],[0.087,0.075],[0,0],[0,0]],"v":[[70.784,-114.454],[70.886,-114.403],[71.012,-114.314],[71.175,-114.215]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":103,"s":[{"i":[[0,0],[0,0],[-0.502,-0.017],[0,0]],"o":[[0,0],[0.366,0.364],[0,0],[0,0]],"v":[[70.784,-114.454],[76.151,-109.096],[76.28,-109.108],[76.825,-109.007]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104,"s":[{"i":[[0,0],[0,0],[-0.422,0.422],[0,0]],"o":[[0,0],[0.422,0.422],[0,0],[0,0]],"v":[[70.784,-114.454],[77.204,-108.035],[78.731,-108.035],[79.255,-108.419]],"c":false}]},{"t":112,"s":[{"i":[[0,0],[0,0],[-0.422,0.422],[0,0]],"o":[[0,0],[0.422,0.422],[0,0],[0,0]],"v":[[70.784,-114.454],[77.204,-108.035],[78.731,-108.035],[91.529,-120.775]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.121568627656,0.121568627656,0.121568627656,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":98,"op":323,"st":59,"bm":0},{"ddd":0,"ind":32,"ty":4,"nm":" 9","parent":34,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":59,"s":[-5.971]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.001],"y":[0]},"t":67.4,"s":[-2.322]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":76.374,"s":[-0.6]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":94.323,"s":[-3.152]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":112.271,"s":[-1.923]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":130.221,"s":[-2.515]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":148.169,"s":[-2.23]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":166.118,"s":[-2.367]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":184.066,"s":[-2.301]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":202.016,"s":[-2.333]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":219.964,"s":[-2.317]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":237.913,"s":[-2.325]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.5],"y":[0]},"t":255.861,"s":[-2.321]},{"t":273.810546875,"s":[-2.323]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":59,"s":[80.192,-103.391,0],"to":[-0.338,1.21,0],"ti":[0.309,-0.711,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":62,"s":[78.163,-96.131,0],"to":[-0.309,0.711,0],"ti":[-0.029,0.499,0]},{"t":66,"s":[78.337,-99.126,0]}],"ix":2,"l":2},"a":{"a":0,"k":[77.835,-95.935,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0.825],[0,0],[0.715,0.413],[0,0],[0.715,-0.413],[0,0],[0,-0.825],[0,0],[-0.715,-0.413],[0,0],[-0.715,0.413],[0,0]],"o":[[0,0],[0,-0.825],[0,0],[-0.715,-0.413],[0,0],[-0.715,0.413],[0,0],[0,0.825],[0,0],[0.715,0.413],[0,0],[0.715,-0.413]],"v":[[92.71,-105.499],[92.71,-120.008],[91.555,-122.008],[78.99,-129.263],[76.68,-129.263],[64.115,-122.008],[62.96,-120.008],[62.96,-105.499],[64.115,-103.499],[76.68,-96.244],[78.99,-96.244],[91.555,-103.499]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.396078431373,0.611764705882,0.956862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":61,"op":393,"st":6,"bm":0},{"ddd":0,"ind":33,"ty":4,"nm":" 17","parent":32,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0.471,"ix":10},"p":{"a":0,"k":[77.835,-95.935,0],"ix":2,"l":2},"a":{"a":0,"k":[77.835,-95.935,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":112,"s":[{"i":[[0,0],[0,0],[-0.422,0.422],[0,0]],"o":[[0,0],[0.422,0.422],[0,0],[0,0]],"v":[[70.784,-114.454],[77.204,-108.035],[78.731,-108.035],[91.308,-120.843]],"c":false}]},{"t":117,"s":[{"i":[[0,0],[0,0],[-0.422,0.422],[0,0]],"o":[[0,0],[0.422,0.422],[0,0],[0,0]],"v":[[70.784,-114.454],[77.204,-108.035],[78.731,-108.035],[95.027,-124.185]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.35686275363,0.72549021244,0.454901963472,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":112,"op":441,"st":59,"bm":0},{"ddd":0,"ind":34,"ty":4,"nm":" 12","parent":35,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":62,"s":[-32]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.001],"y":[0]},"t":70.4,"s":[1.037]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":79.374,"s":[16.63]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":97.323,"s":[-6.471]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":115.271,"s":[4.653]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":133.221,"s":[-0.704]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":151.169,"s":[1.875]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":169.118,"s":[0.633]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":187.066,"s":[1.231]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":205.016,"s":[0.943]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":222.964,"s":[1.082]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":240.913,"s":[1.015]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.5],"y":[0]},"t":258.861,"s":[1.047]},{"t":276.810546875,"s":[1.032]}],"ix":10},"p":{"a":0,"k":[76.074,-72.679,0],"ix":2,"l":2},"a":{"a":0,"k":[78.137,-72.824,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.722,7.328],[0,0],[-7.328,3.722],[0,0],[-3.722,-7.328],[0,0],[7.328,-3.722],[0,0]],"o":[[0,0],[-3.722,-7.328],[0,0],[7.328,-3.722],[0,0],[3.722,7.328],[0,0],[-7.328,3.722]],"v":[[64.459,-70.474],[64.459,-70.474],[70.988,-90.481],[71.204,-90.59],[91.211,-84.061],[91.211,-84.061],[84.681,-64.054],[84.465,-63.944]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.972549021244,0.509803950787,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":62,"op":393,"st":6,"bm":0},{"ddd":0,"ind":35,"ty":4,"nm":" 11","parent":36,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.212],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":61,"s":[38]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.001],"y":[0]},"t":69.4,"s":[0.61]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":78.374,"s":[-17.038]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":96.323,"s":[9.108]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":114.271,"s":[-3.482]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":132.221,"s":[2.58]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":150.169,"s":[-0.339]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":168.118,"s":[1.067]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":186.066,"s":[0.39]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":204.016,"s":[0.716]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":221.964,"s":[0.559]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":239.913,"s":[0.634]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.5],"y":[0]},"t":257.861,"s":[0.598]},{"t":275.810546875,"s":[0.615]}],"ix":10},"p":{"a":0,"k":[77.32,-12.997,0],"ix":2,"l":2},"a":{"a":0,"k":[77.32,-12.997,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.665,-1.528],[-0.581,-0.776],[0,0],[0.705,-2.679],[0.23,-1.529],[-5.535,0.02],[0.376,4.941],[0.368,2.246],[-1.221,2.134],[0,0],[-0.387,0.907],[0.213,2.205],[6.128,0.358],[-0.026,-7.219]],"o":[[0.392,0.9],[0,0],[1.393,2.395],[-0.391,1.484],[-0.803,5.349],[4.864,-0.018],[-0.174,-2.282],[-0.394,-2.405],[0,0],[0.576,-0.78],[0.798,-1.871],[-0.59,-6.11],[-7.319,-0.427],[0.006,1.768]],"v":[[65.772,-40.987],[67.239,-38.466],[68.813,-35.76],[69.886,-27.837],[68.763,-23.333],[77.44,-12.997],[86.192,-22.224],[84.708,-28.878],[85.902,-35.822],[87.456,-38.54],[88.905,-41.075],[89.85,-47.253],[78.076,-58.578],[64.729,-45.963]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.250980407,0.301960796118,0.392156869173,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":61,"op":393,"st":6,"bm":0},{"ddd":0,"ind":36,"ty":4,"nm":" 10","parent":37,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[-14]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.001],"y":[0]},"t":68.4,"s":[0.564]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":77.374,"s":[7.438]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":95.323,"s":[-2.746]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":113.271,"s":[2.158]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":131.221,"s":[-0.203]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":149.169,"s":[0.934]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":167.118,"s":[0.386]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":185.066,"s":[0.65]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":203.016,"s":[0.523]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":220.964,"s":[0.584]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":238.913,"s":[0.554]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.5],"y":[0]},"t":256.861,"s":[0.569]},{"t":274.810546875,"s":[0.562]}],"ix":10},"p":{"a":0,"k":[77.835,51.484,0],"ix":2,"l":2},"a":{"a":0,"k":[77.835,51.484,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.616,-1.616],[0,0],[1.616,1.616],[0,0],[-1.616,1.616],[0,0],[-1.616,-1.616],[0,0]],"o":[[0,0],[-1.616,1.616],[0,0],[-1.616,-1.616],[0,0],[1.616,-1.616],[0,0],[1.616,1.616]],"v":[[107.605,23.427],[80.761,50.272],[74.909,50.272],[48.064,23.427],[48.064,17.576],[74.909,-9.269],[80.761,-9.269],[107.605,17.576]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.35686275363,0.72549021244,0.454901963472,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":59,"op":393,"st":6,"bm":0},{"ddd":0,"ind":37,"ty":4,"nm":" 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.173],"y":[0.074]},"t":5,"s":[15.1]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":53,"s":[-4]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.001],"y":[0]},"t":61.4,"s":[0]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":70.374,"s":[1.888]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":88.323,"s":[-0.909]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":106.271,"s":[0.438]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":124.221,"s":[-0.211]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":142.169,"s":[0.102]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":160.118,"s":[-0.049]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":178.066,"s":[0.024]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":196.016,"s":[-0.011]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":213.964,"s":[0.005]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":231.913,"s":[-0.003]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.5],"y":[0]},"t":249.861,"s":[0.001]},{"t":267.810546875,"s":[-0.001]}],"ix":10},"p":{"a":0,"k":[78.022,91.237,0],"ix":2,"l":2},"a":{"a":0,"k":[78.022,91.237,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.749,0],[0,0],[-0.875,-1.515],[0,0],[-0.875,1.515],[0,0]],"o":[[0,0],[-1.749,0],[0,0],[0.875,1.515],[0,0],[0.875,-1.515]],"v":[[96.775,54],[58.895,54],[56.927,57.408],[75.867,90.213],[79.802,90.213],[98.742,57.408]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.988235294819,0.78823530674,0.203921571374,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":387,"st":0,"bm":0},{"ddd":0,"ind":38,"ty":4,"nm":"","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[77.835,106.525,0],"ix":2,"l":2},"a":{"a":0,"k":[77.835,106.525,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.002,6.768],[0,0],[-6.768,0.002],[0,0],[-0.002,-6.768],[0,0],[6.768,-0.002],[0,0]],"o":[[0,0],[-0.002,-6.768],[0,0],[6.768,-0.002],[0,0],[0.002,6.768],[0,0],[-6.768,0.002]],"v":[[51.245,106.555],[51.245,106.554],[63.495,94.295],[92.165,94.246],[104.424,106.496],[104.424,106.496],[92.174,118.755],[63.504,118.805]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.917647063732,0.262745112181,0.207843139768,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":387,"st":0,"bm":0},{"ddd":0,"ind":39,"ty":4,"nm":"ground","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,118.813,0],"ix":2,"l":2},"a":{"a":0,"k":[0,118.813,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-232.588,118.813],[232.588,118.813]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.250980407,0.301960796118,0.392156869173,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":383,"st":0,"bm":0},{"ddd":0,"ind":40,"ty":1,"nm":"Dark Gray Solid 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[173,140,0],"ix":2,"l":2},"a":{"a":0,"k":[173,140,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"sw":346,"sh":280,"sc":"#1f1f1f","ip":0,"op":382,"st":0,"bm":0},{"ddd":0,"ind":41,"ty":1,"nm":"Dark Blue Solid 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[173,140,0],"ix":2,"l":2},"a":{"a":0,"k":[173,140,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"sw":346,"sh":280,"sc":"#323336","ip":0,"op":382,"st":0,"bm":0},{"ddd":0,"ind":42,"ty":1,"nm":"Bkrnd","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[173,140,0],"ix":2,"l":2},"a":{"a":0,"k":[173,140,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"sw":346,"sh":280,"sc":"#ffffff","ip":0,"op":382,"st":0,"bm":0}],"markers":[{"tm":125,"cm":"1","dr":0},{"tm":321,"cm":"2","dr":0}]} \ No newline at end of file +{"v":"5.9.3","fr":30,"ip":0,"op":321,"w":346,"h":280,"nm":"12_You'reallset-NoLoop - 346x280","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Main Scale Null","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[173,140,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[70,70,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":382,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":" 16","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-39.648,-96.013,0],"ix":2,"l":2},"a":{"a":0,"k":[-54.248,-97.763,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":48,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-0.958,1.833],[-2.887,0.78],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[0.958,-1.833],[3.083,-0.833],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-61.537,-82.028],[-57.746,-87.32],[-53.329,-95.361],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":62,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-5.75,0],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-66.954,-93.903],[-61.746,-95.57],[-53.412,-95.57],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":69,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-5.75,0],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-66.954,-93.903],[-61.746,-95.57],[-53.412,-95.57],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":77,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-5.024,2.798],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[1.558,-0.868],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-66.954,-93.903],[-61.683,-95.757],[-53.537,-97.195],[-47.094,-95.603]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":85,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-5.75,0],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-66.954,-93.903],[-61.746,-95.57],[-53.412,-95.57],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":93,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-5.024,2.798],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[1.558,-0.868],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-66.954,-93.903],[-61.683,-95.757],[-53.537,-97.195],[-47.094,-95.603]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":101,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-5.75,0],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-66.954,-93.903],[-61.746,-95.57],[-53.412,-95.57],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":109,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-5.024,2.798],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[1.558,-0.868],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-66.954,-93.903],[-61.683,-95.757],[-53.537,-97.195],[-47.094,-95.603]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":117,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-5.75,0],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-66.954,-93.903],[-61.746,-95.57],[-53.412,-95.57],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":134,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-0.977,0],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-64.329,-90.778],[-61.246,-95.577],[-53.412,-95.57],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":148,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-0.348,2.872],[-2.214,0],[-1.63,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[0.443,-3.651],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-62.708,-83.362],[-56.851,-95.853],[-52.579,-95.785],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":169,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-0.348,2.872],[-2.214,0],[-1.63,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[0.443,-3.651],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-61.583,-83.369],[-56.851,-95.853],[-52.579,-95.785],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":181,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-0.348,2.872],[-2.214,0],[-1.63,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[0.443,-3.651],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-61.583,-83.369],[-56.851,-95.853],[-52.579,-95.785],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":197,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-1.189,2.637],[-2.214,0],[-1.63,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[1.452,-3.222],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-63.912,-84.216],[-57.746,-95.828],[-52.579,-95.785],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":209,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-1.189,2.637],[-2.214,0],[-1.63,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[1.452,-3.222],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-63.912,-84.216],[-57.746,-95.828],[-52.579,-95.785],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.4,"y":0},"t":223,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-0.977,0],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-64.329,-90.778],[-61.246,-95.577],[-53.412,-95.57],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":233,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-5.75,0],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-66.954,-93.903],[-61.746,-95.57],[-53.412,-95.57],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":241,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-5.024,2.798],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[1.558,-0.868],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-66.954,-93.903],[-61.683,-95.757],[-53.537,-97.195],[-47.094,-95.603]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":249,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-5.75,0],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-66.954,-93.903],[-61.746,-95.57],[-53.412,-95.57],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":257,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-5.024,2.798],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[1.558,-0.868],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-66.954,-93.903],[-61.683,-95.757],[-53.537,-97.195],[-47.094,-95.603]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":265,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-5.75,0],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-66.954,-93.903],[-61.746,-95.57],[-53.412,-95.57],[-47.282,-95.541]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":273,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-5.024,2.798],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[1.558,-0.868],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-66.954,-93.903],[-61.683,-95.757],[-53.537,-97.195],[-47.094,-95.603]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":281,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-5.75,0],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-66.954,-93.903],[-61.746,-95.57],[-53.412,-95.57],[-47.282,-95.541]],"c":true}]},{"t":293,"s":[{"i":[[0.654,0.645],[0.188,-0.29],[1.625,-4.125],[-2.167,1.917],[-0.977,0],[-4,0],[0,0]],"o":[[-3.755,-3.702],[0,0],[-1.733,4.399],[2.167,-1.917],[2.069,0],[3.194,0],[-0.44,-0.75]],"v":[[-49.157,-97.826],[-61.338,-98.463],[-66.246,-92.528],[-64.329,-90.778],[-61.246,-95.577],[-53.412,-95.57],[-47.282,-95.541]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":358,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"mouth ref","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-34.319,-87.372,0],"ix":2,"l":2},"a":{"a":0,"k":[-34.319,-87.372,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":48,"s":[{"i":[[0,0],[-1.028,-0.339]],"o":[[0.405,1.004],[0,0]],"v":[[-35.467,-88.447],[-33.171,-86.296]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":62,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-41.884,-87.926],[-37.837,-88.109]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":69,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-41.884,-87.926],[-37.837,-88.109]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":77,"s":[{"i":[[0,0],[-0.912,1.359]],"o":[[0.405,0.863],[0,0]],"v":[[-41.884,-88.702],[-37.837,-88.859]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":85,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-41.884,-87.926],[-37.837,-88.109]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":93,"s":[{"i":[[0,0],[-0.912,1.359]],"o":[[0.405,0.863],[0,0]],"v":[[-41.884,-88.702],[-37.837,-88.859]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":101,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-41.884,-87.926],[-37.837,-88.109]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":109,"s":[{"i":[[0,0],[-0.912,1.359]],"o":[[0.405,0.863],[0,0]],"v":[[-41.884,-88.702],[-37.837,-88.859]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":117,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-41.884,-87.926],[-37.837,-88.109]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":134,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-41.884,-87.926],[-37.837,-88.109]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":148,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-36.384,-87.94],[-32.337,-88.122]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":181,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-36.384,-87.94],[-32.337,-88.122]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":197,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-37.759,-87.91],[-33.712,-88.092]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":209,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-37.759,-87.91],[-33.712,-88.092]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.4,"y":0},"t":223,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-41.884,-87.926],[-37.837,-88.109]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":233,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-41.884,-87.926],[-37.837,-88.109]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":241,"s":[{"i":[[0,0],[-0.912,1.359]],"o":[[0.405,0.863],[0,0]],"v":[[-41.884,-88.702],[-37.837,-88.859]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":249,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-41.884,-87.926],[-37.837,-88.109]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":257,"s":[{"i":[[0,0],[-0.912,1.359]],"o":[[0.405,0.863],[0,0]],"v":[[-41.884,-88.702],[-37.837,-88.859]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":265,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-41.884,-87.926],[-37.837,-88.109]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":273,"s":[{"i":[[0,0],[-0.912,1.359]],"o":[[0.405,0.863],[0,0]],"v":[[-41.884,-88.702],[-37.837,-88.859]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":281,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-41.884,-87.926],[-37.837,-88.109]],"c":false}]},{"t":293,"s":[{"i":[[0,0],[-0.912,1.581]],"o":[[0.405,1.004],[0,0]],"v":[[-41.884,-87.926],[-37.837,-88.109]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":358,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"head","parent":5,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":152,"s":[0]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":169,"s":[13.7]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":181,"s":[13.7]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":197,"s":[-10.3]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":209,"s":[-10.3]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":223,"s":[0]},{"t":293,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":48,"s":[-39.831,-90.23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.4,"y":0.4},"t":62,"s":[-41.081,-89.73,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":134,"s":[-41.081,-89.73,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.4,"y":0.4},"t":148,"s":[-39.831,-89.73,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":152,"s":[-39.831,-89.73,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.4,"y":0.4},"t":169,"s":[-34.831,-88.98,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":181,"s":[-34.831,-88.98,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.4,"y":0.4},"t":197,"s":[-36.081,-90.23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":209,"s":[-36.081,-90.23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.4,"y":0.4},"t":223,"s":[-41.081,-89.73,0],"to":[0,0,0],"ti":[0,0,0]},{"t":293,"s":[-41.081,-89.73,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-39.831,-90.23,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.357,-2.862],[2.862,-3.357],[3.357,2.862],[-2.862,3.357]],"o":[[3.357,2.862],[-2.862,3.357],[-3.357,-2.862],[2.862,-3.357]],"v":[[-34.648,-96.308],[-33.753,-85.047],[-45.014,-84.151],[-45.91,-95.412]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.1254902035,0.129411771894,0.141176477075,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":358,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"neck","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-41.665,-71.889,0],"ix":2,"l":2},"a":{"a":0,"k":[-41.665,-71.889,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":152,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-34.319,-76.58],[-36.637,-82.573]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":169,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-34.319,-76.58],[-34.637,-81.885]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":181,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-34.319,-76.58],[-34.637,-81.885]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":197,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-34.319,-76.58],[-34.262,-82.073]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":209,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-34.319,-76.58],[-34.262,-82.073]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0},"t":223,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-34.319,-76.58],[-36.637,-82.573]],"c":false}]},{"t":293,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-34.319,-76.58],[-36.637,-82.573]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":358,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"neck base","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-25.477,-48.56,0],"ix":2,"l":2},"a":{"a":0,"k":[-25.477,-48.56,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-12.386,-0.414],[0,0]],"o":[[0,0],[4.627,0.055]],"v":[[-50.677,-76.752],[-32.569,-76.597]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":358,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"torso","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.647],"y":[1.029]},"o":{"x":[0.69],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.598],"y":[0.761]},"o":{"x":[0.409],"y":[0.286]},"t":30,"s":[5]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.279],"y":[0.128]},"t":40,"s":[3.5]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.295],"y":[0]},"t":58,"s":[0]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":152,"s":[0]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":166,"s":[2.6]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":204,"s":[2.6]},{"t":220,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.647],"y":[1.029]},"o":{"x":[0.69],"y":[0]},"t":14,"s":[-37.244]},{"i":{"x":[0.505],"y":[0.403]},"o":{"x":[0.409],"y":[0.286]},"t":30,"s":[-11.844]},{"i":{"x":[0.398],"y":[1.002]},"o":{"x":[0.626],"y":[0.068]},"t":40,"s":[-13.744]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.295],"y":[1.815]},"t":58,"s":[-51.844]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":152,"s":[-51.762]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":166,"s":[-50.274]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":204,"s":[-50.274]},{"t":220,"s":[-51.762]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.652],"y":[1.074]},"o":{"x":[0.69],"y":[0]},"t":14,"s":[-38.283]},{"i":{"x":[0.636],"y":[0.286]},"o":{"x":[0.512],"y":[0.111]},"t":30,"s":[-41.533]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.186],"y":[-2.628]},"t":40,"s":[-39.533]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.295],"y":[0]},"t":58,"s":[-40.033]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":152,"s":[-40.033]},{"t":220,"s":[-40.033]}],"ix":4}},"a":{"a":0,"k":[-37.244,-38.283,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.392,1.882],[-0.003,0.014],[-0.054,1.477],[-0.518,2.462],[1.06,2.282]],"o":[[0,0],[1.922,0],[0.003,-0.014],[0.289,-1.449],[0.091,-2.514],[0.518,-2.462],[0,0]],"v":[[-53.445,-38.283],[-28.387,-38.283],[-24.335,-41.464],[-24.326,-41.508],[-24.179,-45.931],[-21.468,-57.034],[-21.804,-64.441]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":358,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"necklace","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-39.271,-60.851,0],"ix":2,"l":2},"a":{"a":0,"k":[-39.271,-60.851,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":14,"s":[{"i":[[0,-1.202],[1.202,0],[0,1.202],[-1.202,0]],"o":[[0,1.202],[-1.202,0],[0,-1.202],[1.202,0]],"v":[[-34.723,-47.081],[-36.899,-44.905],[-39.076,-47.081],[-36.899,-49.258]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.66,"y":0},"t":20,"s":[{"i":[[0.047,-1.201],[1.201,0.047],[-0.047,1.201],[-1.201,-0.047]],"o":[[-0.047,1.201],[-1.201,-0.047],[0.047,-1.201],[1.201,0.047]],"v":[[-35.893,-46.905],[-38.152,-44.814],[-40.243,-47.073],[-37.984,-49.164]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":31,"s":[{"i":[[-0.254,-1.175],[1.175,-0.254],[0.254,1.175],[-1.175,0.254]],"o":[[0.254,1.175],[-1.175,0.254],[-0.254,-1.175],[1.175,-0.254]],"v":[[-28.738,-49.025],[-30.406,-46.437],[-32.993,-48.105],[-31.325,-50.692]],"c":true}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":40,"s":[{"i":[[0.047,-1.201],[1.201,0.047],[-0.047,1.201],[-1.201,-0.047]],"o":[[-0.047,1.201],[-1.201,-0.047],[0.047,-1.201],[1.201,0.047]],"v":[[-35.893,-46.905],[-38.152,-44.814],[-40.243,-47.073],[-37.984,-49.164]],"c":true}]},{"t":46,"s":[{"i":[[0,-1.202],[1.202,0],[0,1.202],[-1.202,0]],"o":[[0,1.202],[-1.202,0],[0,-1.202],[1.202,0]],"v":[[-34.723,-47.081],[-36.899,-44.905],[-39.076,-47.081],[-36.899,-49.258]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":14,"s":[{"i":[[0,0],[-14.35,0],[0,0]],"o":[[0,0],[12.657,0],[0,0]],"v":[[-47.615,-76.797],[-36.899,-48.399],[-34.319,-76.58]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.66,"y":0},"t":20,"s":[{"i":[[0,0],[-14.339,-0.556],[0,0]],"o":[[0,0],[12.647,0.49],[0,0]],"v":[[-47.615,-76.797],[-38.017,-48.305],[-34.319,-76.58]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":31,"s":[{"i":[[0,0],[-14.026,3.032],[0,0]],"o":[[0,0],[12.371,-2.674],[0,0]],"v":[[-47.615,-76.797],[-31.144,-49.852],[-34.319,-76.58]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":40,"s":[{"i":[[0,0],[-14.339,-0.556],[0,0]],"o":[[0,0],[12.647,0.49],[0,0]],"v":[[-47.615,-76.797],[-38.017,-48.305],[-34.319,-76.58]],"c":false}]},{"t":46,"s":[{"i":[[0,0],[-14.35,0],[0,0]],"o":[[0,0],[12.657,0],[0,0]],"v":[[-47.601,-76.485],[-36.899,-48.399],[-34.319,-76.58]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.250980407,0.301960796118,0.392156869173,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":3,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":358,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"right arm","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":29,"s":[-14.9]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":51,"s":[0]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":55,"s":[0]},{"t":69,"s":[2.6]}],"ix":10},"p":{"a":0,"k":[-47.647,-76.613,0],"ix":2,"l":2},"a":{"a":0,"k":[-47.647,-76.613,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":12,"s":[{"i":[[0,0],[-0.603,-0.47],[-0.452,-0.039],[-1.913,0.936],[-1.46,1.551],[-0.364,0.544],[-0.426,1.122]],"o":[[-0.552,0.528],[0.357,0.279],[2.122,0.184],[1.913,-0.936],[0.448,-0.476],[0.668,-0.998],[0,0]],"v":[[-85.811,-3.751],[-85.709,-1.732],[-84.429,-1.336],[-78.243,-2.587],[-73.186,-6.435],[-71.944,-7.952],[-70.417,-11.205]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":26,"s":[{"i":[[0,0],[-0.109,-0.739],[-0.293,-0.333],[-1.986,-0.629],[-2.08,0.112],[-0.625,0.139],[-1.06,0.507]],"o":[[-0.747,0.001],[0.065,0.439],[1.378,1.562],[1.986,0.629],[0.639,-0.034],[1.146,-0.255],[0,0]],"v":[[-123.429,-12.438],[-124.72,-10.94],[-124.082,-9.795],[-118.858,-6.505],[-112.681,-5.815],[-110.778,-6.05],[-107.501,-7.322]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":32,"s":[{"i":[[0,0],[-0.109,-0.739],[-0.293,-0.333],[-1.986,-0.629],[-2.08,0.112],[-0.625,0.139],[-1.06,0.507]],"o":[[-0.747,0.001],[0.065,0.439],[1.378,1.562],[1.986,0.629],[0.639,-0.034],[1.146,-0.255],[0,0]],"v":[[-123.429,-12.438],[-124.72,-10.94],[-124.082,-9.795],[-118.858,-6.505],[-112.681,-5.815],[-110.778,-6.05],[-107.501,-7.322]],"c":false}]},{"t":51,"s":[{"i":[[0,0],[-0.603,-0.47],[-0.452,-0.039],[-1.913,0.936],[-1.46,1.551],[-0.364,0.544],[-0.426,1.122]],"o":[[-0.552,0.528],[0.357,0.279],[2.122,0.184],[1.913,-0.936],[0.448,-0.476],[0.668,-0.998],[0,0]],"v":[[-85.811,-3.751],[-85.709,-1.732],[-84.429,-1.336],[-78.243,-2.587],[-73.186,-6.435],[-71.944,-7.952],[-70.417,-11.205]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":12,"s":[{"i":[[0,0],[-1.324,-0.98],[0.247,-0.264],[1.633,-1.219],[0.082,-0.779],[-0.948,0.112],[-1.842,3.608]],"o":[[0.278,1.908],[0.216,0.16],[-1.403,1.501],[-0.573,0.427],[-0.137,1.299],[4.744,-0.56],[0,0]],"v":[[-80.497,-18.554],[-78.185,-13.675],[-80.162,-10.751],[-84.962,-7.022],[-86.484,-5.214],[-84.14,-3.887],[-73.934,-12.125]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":26,"s":[{"i":[[0,0],[-0.275,-1.588],[0.354,-0.02],[1.978,0.24],[0.584,-0.496],[-0.747,-0.561],[-3.74,1.311]],"o":[[-1.092,1.538],[0.045,0.259],[-2.007,0.115],[-0.694,-0.084],[-0.974,0.827],[3.736,2.806],[0,0]],"v":[[-109.674,-19.329],[-111.332,-14.314],[-114.705,-13.579],[-120.62,-14.18],[-122.919,-13.928],[-122.155,-11.406],[-109.369,-10.347]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":32,"s":[{"i":[[0,0],[-0.275,-1.588],[0.354,-0.02],[1.978,0.24],[0.584,-0.496],[-0.747,-0.561],[-3.74,1.311]],"o":[[-1.092,1.538],[0.045,0.259],[-2.007,0.115],[-0.694,-0.084],[-0.974,0.827],[3.736,2.806],[0,0]],"v":[[-109.674,-19.329],[-111.332,-14.314],[-114.705,-13.579],[-120.62,-14.18],[-122.919,-13.928],[-122.155,-11.406],[-109.369,-10.347]],"c":false}]},{"t":51,"s":[{"i":[[0,0],[-1.324,-0.98],[0.247,-0.264],[1.633,-1.219],[0.082,-0.779],[-0.948,0.112],[-1.842,3.608]],"o":[[0.278,1.908],[0.216,0.16],[-1.403,1.501],[-0.573,0.427],[-0.137,1.299],[4.744,-0.56],[0,0]],"v":[[-80.497,-18.554],[-78.185,-13.675],[-80.162,-10.751],[-84.962,-7.022],[-86.484,-5.214],[-84.14,-3.887],[-73.934,-12.125]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":12,"s":[{"i":[[0,0],[-0.803,-3.366],[0.258,-1.825],[5.279,-3.498],[1.518,-0.108],[0.553,1.455]],"o":[[2.279,2.069],[0.427,1.793],[-0.888,6.27],[-1.123,0.744],[-1.344,0.096],[0,0]],"v":[[-70.34,-30.514],[-65.476,-22.239],[-64.924,-15.526],[-73.329,-1.342],[-78.587,0.483],[-82.928,-1.298]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":26,"s":[{"i":[[0,0],[1.704,-2.924],[1.415,-1.117],[6.098,1.088],[1.147,0.948],[-0.591,1.403]],"o":[[0.216,3.003],[-0.908,1.557],[-4.862,3.839],[-1.297,-0.231],[-1.016,-0.839],[0,0]],"v":[[-94.411,-20.937],[-96.554,-11.796],[-100.695,-6.672],[-116.221,-2.306],[-121.174,-4.564],[-123.044,-8.755]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":32,"s":[{"i":[[0,0],[1.704,-2.924],[1.415,-1.117],[6.098,1.088],[1.147,0.948],[-0.591,1.403]],"o":[[0.216,3.003],[-0.908,1.557],[-4.862,3.839],[-1.297,-0.231],[-1.016,-0.839],[0,0]],"v":[[-94.411,-20.937],[-96.554,-11.796],[-100.695,-6.672],[-116.221,-2.306],[-121.174,-4.564],[-123.044,-8.755]],"c":false}]},{"t":51,"s":[{"i":[[0,0],[-0.803,-3.366],[0.258,-1.825],[5.279,-3.498],[1.518,-0.108],[0.553,1.455]],"o":[[2.279,2.069],[0.427,1.793],[-0.888,6.27],[-1.123,0.744],[-1.344,0.096],[0,0]],"v":[[-70.34,-30.514],[-65.476,-22.239],[-64.924,-15.526],[-73.329,-1.342],[-78.587,0.483],[-82.928,-1.298]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":12,"s":[{"i":[[0,0],[9.565,-3.696],[0,0],[4.308,-5.079],[-1.754,16.452],[-34.681,2.044]],"o":[[-7.627,2.556],[3.64,4.694],[0,0],[-7.197,1.148],[1.38,-12.947],[0,0]],"v":[[-53.087,-57.21],[-82.231,-47.166],[-69.922,-31.144],[-80.497,-18.554],[-104.773,-46.17],[-47.615,-76.797]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":26,"s":[{"i":[[0,0],[9.565,-3.696],[0,0],[6.478,-0.687],[-5.22,8.123],[-31.633,-6.402]],"o":[[-7.627,2.556],[-5.081,6.387],[0,0],[-1.896,-9.591],[7.749,-9.734],[0,0]],"v":[[-53.087,-57.21],[-82.231,-47.166],[-93.689,-21.101],[-109.674,-19.329],[-102.679,-52.684],[-47.615,-76.797]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":32,"s":[{"i":[[0,0],[9.565,-3.696],[0,0],[6.478,-0.687],[-5.22,8.123],[-31.633,-6.402]],"o":[[-7.627,2.556],[-5.081,6.387],[0,0],[-1.896,-9.591],[7.749,-9.734],[0,0]],"v":[[-53.087,-57.21],[-82.231,-47.166],[-93.689,-21.101],[-109.674,-19.329],[-102.679,-52.684],[-47.615,-76.797]],"c":false}]},{"t":51,"s":[{"i":[[0,0],[9.565,-3.696],[0,0],[4.308,-5.079],[-1.754,16.452],[-34.681,2.044]],"o":[[-7.627,2.556],[3.64,4.694],[0,0],[-7.197,1.148],[1.38,-12.947],[0,0]],"v":[[-53.087,-57.21],[-82.231,-47.166],[-69.922,-31.144],[-80.497,-18.554],[-104.773,-46.17],[-47.615,-76.797]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.1254902035,0.129411771894,0.141176477075,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":358,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"torso right","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-55.445,-47.081,0],"ix":2,"l":2},"a":{"a":0,"k":[-55.445,-47.081,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.244,-7.241]],"o":[[1.228,6.912],[0,0]],"v":[[-56.915,-55.939],[-53.975,-38.223]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":358,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"hair2","parent":12,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":48,"s":[-91.931,-82.48,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.167,"y":0.167},"t":62,"s":[-81.722,-64.98,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":134,"s":[-81.722,-64.98,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.4,"y":0.4},"t":148,"s":[-85.076,-70.728,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":181,"s":[-85.076,-70.728,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.4,"y":0.4},"t":197,"s":[-81.618,-67.477,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":209,"s":[-81.618,-67.477,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.4,"y":0.4},"t":223,"s":[-81.722,-64.98,0],"to":[0,0,0],"ti":[0,0,0]},{"t":293,"s":[-81.722,-64.98,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-91.931,-82.48,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-5.534],[-5.534,0],[0,5.534],[5.534,0]],"o":[[0,5.534],[5.534,0],[0,-5.534],[-5.534,0]],"v":[[-101.951,-82.48],[-91.931,-72.459],[-81.91,-82.48],[-91.931,-92.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":358,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"hair1","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":152,"s":[0]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":169,"s":[-12]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":181,"s":[-12]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":197,"s":[7.9]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":209,"s":[7.9]},{"t":223,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":69,"s":[-39.753,-99.33,0],"to":[0,0.188,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":77,"s":[-39.753,-98.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":85,"s":[-39.753,-99.33,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":93,"s":[-39.753,-98.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":101,"s":[-39.753,-99.33,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":109,"s":[-39.753,-98.205,0],"to":[0,0,0],"ti":[0,0.188,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.333,"y":0.333},"t":117,"s":[-39.753,-99.33,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":152,"s":[-39.753,-99.33,0],"to":[-0.399,-0.01,0],"ti":[0.399,0.01,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.4,"y":0.4},"t":169,"s":[-42.148,-99.389,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":181,"s":[-42.148,-99.389,0],"to":[0.63,0.03,0],"ti":[-0.63,-0.03,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.4,"y":0.4},"t":197,"s":[-38.369,-99.211,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":209,"s":[-38.369,-99.211,0],"to":[-0.231,-0.02,0],"ti":[0.231,0.02,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":223,"s":[-39.753,-99.33,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":233,"s":[-39.753,-99.33,0],"to":[0,0.188,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":241,"s":[-39.753,-98.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":249,"s":[-39.753,-99.33,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":257,"s":[-39.753,-98.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":265,"s":[-39.753,-99.33,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":273,"s":[-39.753,-98.205,0],"to":[0,0,0],"ti":[0,0.188,0]},{"t":281,"s":[-39.753,-99.33,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-39.753,-99.33,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":48,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.478,-0.443],[2.104,-0.737],[2.141,-0.401],[2.195,-0.452],[3.473,-3.467],[0.523,-2.194],[0.045,-0.26],[-2.892,-2.967],[-5.029,2.118],[-2.554,0.155],[-1.049,5.511],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.136,0.641],[-2.058,0.721],[-2.203,0.413],[-4.691,0.967],[-1.596,1.593],[-0.061,0.257],[-0.735,4.2],[0,0],[1.778,-0.749],[5.6,-0.341],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.999,-97.069],[-39.294,-99.193],[-39.29,-99.211],[-42.391,-99.275],[-47.08,-98.322],[-53.302,-95.867],[-59.637,-94.274],[-66.248,-93.058],[-79.205,-87.127],[-82.474,-81.324],[-82.634,-80.549],[-78.801,-69.233],[-70.075,-68.22],[-52.907,-76.944],[-41.626,-86.945],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":62,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.478,-0.443],[1.768,-1.358],[1.848,-1.086],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-1.049,5.511],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.136,0.641],[-1.711,1.315],[-1.993,1.171],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.34,-1.297],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.999,-97.069],[-39.294,-99.193],[-39.29,-99.211],[-42.391,-99.275],[-47.08,-98.322],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.376,-86.952],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":69,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.478,-0.443],[1.768,-1.358],[1.848,-1.086],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-1.049,5.511],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.136,0.641],[-1.711,1.315],[-1.993,1.171],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.34,-1.297],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.999,-97.069],[-39.294,-99.193],[-39.29,-99.211],[-42.391,-99.275],[-47.08,-98.322],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.376,-86.952],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":77,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.632,-0.615],[1.768,-1.358],[1.859,-1.068],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-0.861,4.639],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.087,0.787],[-1.711,1.315],[-1.928,1.108],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.378,-2.047],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.874,-98.132],[-39.169,-100.256],[-39.165,-100.274],[-42.079,-100.213],[-46.955,-98.885],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.626,-86.827],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":85,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.478,-0.443],[1.768,-1.358],[1.848,-1.086],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-1.049,5.511],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.136,0.641],[-1.711,1.315],[-1.993,1.171],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.34,-1.297],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.999,-97.069],[-39.294,-99.193],[-39.29,-99.211],[-42.391,-99.275],[-47.08,-98.322],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.376,-86.952],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":93,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.632,-0.615],[1.768,-1.358],[1.859,-1.068],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-0.861,4.639],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.087,0.787],[-1.711,1.315],[-1.928,1.108],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.378,-2.047],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.874,-98.132],[-39.169,-100.256],[-39.165,-100.274],[-42.079,-100.213],[-46.955,-98.885],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.626,-86.827],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":101,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.478,-0.443],[1.768,-1.358],[1.848,-1.086],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-1.049,5.511],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.136,0.641],[-1.711,1.315],[-1.993,1.171],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.34,-1.297],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.999,-97.069],[-39.294,-99.193],[-39.29,-99.211],[-42.391,-99.275],[-47.08,-98.322],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.376,-86.952],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":109,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.632,-0.615],[1.768,-1.358],[1.859,-1.068],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-0.861,4.639],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.087,0.787],[-1.711,1.315],[-1.928,1.108],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.378,-2.047],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.874,-98.132],[-39.169,-100.256],[-39.165,-100.274],[-42.079,-100.213],[-46.955,-98.885],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.626,-86.827],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":117,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.478,-0.443],[1.768,-1.358],[1.848,-1.086],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-1.049,5.511],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.136,0.641],[-1.711,1.315],[-1.993,1.171],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.34,-1.297],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.999,-97.069],[-39.294,-99.193],[-39.29,-99.211],[-42.391,-99.275],[-47.08,-98.322],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.376,-86.952],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":134,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.478,-0.443],[1.768,-1.358],[1.848,-1.086],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-1.049,5.511],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.136,0.641],[-1.711,1.315],[-1.993,1.171],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.34,-1.297],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.999,-97.069],[-39.294,-99.193],[-39.29,-99.211],[-42.391,-99.275],[-47.08,-98.322],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.376,-86.952],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":148,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.478,-0.443],[1.878,-1.154],[1.931,-0.949],[2.03,-0.837],[2.689,-3.56],[0.087,-1.894],[-0.026,-0.216],[-2.637,-1.122],[-5.173,1.475],[-2.526,0.376],[-1.049,5.511],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.136,0.641],[-1.825,1.12],[-2.024,0.995],[-4.338,1.788],[-1.235,1.636],[-0.01,0.222],[0.347,3.274],[0,0],[1.849,-0.526],[2.067,-0.983],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.999,-97.069],[-39.294,-99.193],[-39.29,-99.211],[-42.391,-99.275],[-47.08,-98.322],[-53.562,-95.244],[-60.336,-91.183],[-66.552,-88.654],[-76.478,-82.738],[-78.525,-77.325],[-78.449,-76.325],[-74.284,-69.685],[-63.33,-72.294],[-49.269,-76.95],[-46.394,-86.898],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":209,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.478,-0.443],[1.878,-1.154],[1.931,-0.949],[2.03,-0.837],[2.689,-3.56],[0.087,-1.894],[-0.026,-0.216],[-2.637,-1.122],[-5.173,1.475],[-2.526,0.376],[-1.049,5.511],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.136,0.641],[-1.825,1.12],[-2.024,0.995],[-4.338,1.788],[-1.235,1.636],[-0.01,0.222],[0.347,3.274],[0,0],[1.849,-0.526],[2.067,-0.983],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.999,-97.069],[-39.294,-99.193],[-39.29,-99.211],[-42.391,-99.275],[-47.08,-98.322],[-53.562,-95.244],[-60.336,-91.183],[-66.552,-88.654],[-76.478,-82.738],[-78.525,-77.325],[-78.449,-76.325],[-74.284,-69.685],[-63.33,-72.294],[-49.269,-76.95],[-46.394,-86.898],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.4,"y":0},"t":223,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.478,-0.443],[1.768,-1.358],[1.848,-1.086],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-1.049,5.511],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.136,0.641],[-1.711,1.315],[-1.993,1.171],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.34,-1.297],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.999,-97.069],[-39.294,-99.193],[-39.29,-99.211],[-42.391,-99.275],[-47.08,-98.322],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.376,-86.952],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":233,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.478,-0.443],[1.768,-1.358],[1.848,-1.086],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-1.049,5.511],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.136,0.641],[-1.711,1.315],[-1.993,1.171],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.34,-1.297],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.999,-97.069],[-39.294,-99.193],[-39.29,-99.211],[-42.391,-99.275],[-47.08,-98.322],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.376,-86.952],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":241,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.632,-0.615],[1.768,-1.358],[1.859,-1.068],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-0.861,4.639],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.087,0.787],[-1.711,1.315],[-1.928,1.108],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.378,-2.047],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.874,-98.132],[-39.169,-100.256],[-39.165,-100.274],[-42.079,-100.213],[-46.955,-98.885],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.626,-86.827],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":249,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.478,-0.443],[1.768,-1.358],[1.848,-1.086],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-1.049,5.511],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.136,0.641],[-1.711,1.315],[-1.993,1.171],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.34,-1.297],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.999,-97.069],[-39.294,-99.193],[-39.29,-99.211],[-42.391,-99.275],[-47.08,-98.322],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.376,-86.952],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":257,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.632,-0.615],[1.768,-1.358],[1.859,-1.068],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-0.861,4.639],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.087,0.787],[-1.711,1.315],[-1.928,1.108],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.378,-2.047],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.874,-98.132],[-39.169,-100.256],[-39.165,-100.274],[-42.079,-100.213],[-46.955,-98.885],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.626,-86.827],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":265,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.478,-0.443],[1.768,-1.358],[1.848,-1.086],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-1.049,5.511],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.136,0.641],[-1.711,1.315],[-1.993,1.171],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.34,-1.297],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.999,-97.069],[-39.294,-99.193],[-39.29,-99.211],[-42.391,-99.275],[-47.08,-98.322],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.376,-86.952],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":273,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.632,-0.615],[1.768,-1.358],[1.859,-1.068],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-0.861,4.639],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.087,0.787],[-1.711,1.315],[-1.928,1.108],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.378,-2.047],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.874,-98.132],[-39.169,-100.256],[-39.165,-100.274],[-42.079,-100.213],[-46.955,-98.885],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.626,-86.827],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":281,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.478,-0.443],[1.768,-1.358],[1.848,-1.086],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-1.049,5.511],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.136,0.641],[-1.711,1.315],[-1.993,1.171],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.34,-1.297],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.999,-97.069],[-39.294,-99.193],[-39.29,-99.211],[-42.391,-99.275],[-47.08,-98.322],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.376,-86.952],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]},{"t":293,"s":[{"i":[[0.156,0.31],[0.917,0.782],[1.942,0.112],[0,0],[0.769,-0.043],[1.478,-0.443],[1.768,-1.358],[1.848,-1.086],[1.949,-1.024],[2.305,-3.605],[-0.126,-1.748],[-0.061,-0.195],[-2.513,-0.22],[-5.243,1.161],[-2.512,0.485],[-1.049,5.511],[0,0],[-2.149,0],[0,0],[-0.182,0.296]],"o":[[-0.538,-1.067],[-1.506,-1.284],[0,0],[-1.151,-0.105],[-1.543,0.086],[-2.136,0.641],[-1.711,1.315],[-1.993,1.171],[-4.165,2.189],[-1.059,1.656],[0.015,0.204],[0.877,2.822],[0,0],[1.884,-0.417],[0.34,-1.297],[0,0],[0.402,-2.111],[0,0],[0.347,0],[0.182,-0.296]],"v":[[-31.807,-94.283],[-33.999,-97.069],[-39.294,-99.193],[-39.29,-99.211],[-42.391,-99.275],[-47.08,-98.322],[-53.689,-94.94],[-60.678,-89.671],[-66.701,-86.5],[-75.144,-80.592],[-76.595,-75.369],[-76.402,-74.259],[-72.075,-69.905],[-60.032,-74.286],[-47.49,-76.953],[-45.376,-86.952],[-41.198,-89.194],[-36.801,-92.833],[-32.7,-92.833],[-31.848,-93.308]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":358,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Layer 4","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[6]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":40,"s":[6]},{"t":58,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.652,"y":0.926},"o":{"x":0.69,"y":0},"t":14,"s":[-53.445,-38.283,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.505,"y":0.403},"o":{"x":0.512,"y":0.57},"t":30,"s":[-29.47,-43.033,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.398,"y":0.998},"o":{"x":0.626,"y":0.107},"t":40,"s":[-30.97,-40.533,0],"to":[0,0,0],"ti":[0,0,0]},{"t":58,"s":[-67.97,-40.533,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-53.445,-38.283,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[-5.365,0],[0,0],[1.465,0.66],[0.599,0.223],[0.188,0.611],[-0.193,0.546],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[1.448,5.166],[0,0],[0.406,-1.555],[-0.583,-0.263],[-0.599,-0.223],[-0.17,-0.554],[0.894,-2.529],[0,0]],"v":[[-104.523,86.611],[-114.344,108.556],[-106.601,112.458],[-101.074,102.939],[-99.075,110.07],[-87.554,118.806],[-75.92,118.806],[-77.833,114.938],[-79.659,114.357],[-81.036,113.121],[-80.818,111.429],[-76.81,100.458]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0},"t":30,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[-5.446,-2.931],[0,0],[0.833,1.312],[1.346,1.393],[0.188,0.611],[-0.193,0.546],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[1.448,5.166],[0,0],[1.795,0.132],[-0.343,-0.54],[-0.444,-0.46],[-0.17,-0.554],[0.894,-2.529],[0,0]],"v":[[-104.523,86.611],[-114.344,108.556],[-106.601,112.458],[-101.074,102.939],[-99.075,110.07],[-87.866,119.306],[-76.857,122.868],[-76.083,119.313],[-78.721,115.982],[-81.036,113.121],[-80.818,111.429],[-76.81,100.458]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":40,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[-6.17,-0.426],[0,0],[1.299,0.852],[1.801,0.714],[0.423,0.479],[0.049,0.577],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[3.448,4.11],[0,0],[1.689,-0.619],[-0.535,-0.351],[-0.594,-0.236],[-0.383,-0.434],[-0.228,-2.673],[0,0]],"v":[[-96.283,99.875],[-95.721,124.487],[-87.057,124.851],[-85.944,113.901],[-81.184,119.575],[-67.166,123.371],[-55.667,122.081],[-56.426,118.523],[-60.203,116.575],[-63.49,114.922],[-63.99,113.29],[-65.309,100.457]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":58,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[-6.185,-0.036],[0,0],[1.351,0.768],[1.842,0.599],[0.452,0.452],[0.085,0.573],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[3.7,3.884],[0,0],[1.647,-0.725],[-0.556,-0.316],[-0.608,-0.198],[-0.41,-0.409],[-0.396,-2.653],[0,0]],"v":[[-85.902,96.957],[-84.291,120.945],[-75.622,120.762],[-75.202,109.763],[-70.094,115.125],[-55.863,118.03],[-44.468,116.016],[-45.451,112.513],[-49.343,110.808],[-52.728,109.365],[-53.329,107.768],[-54.932,96.198]],"c":false}]},{"t":152,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[-6.185,-0.036],[0,0],[1.351,0.768],[1.842,0.599],[0.452,0.452],[0.085,0.573],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[3.7,3.884],[0,0],[1.647,-0.725],[-0.556,-0.316],[-0.608,-0.198],[-0.41,-0.409],[-0.396,-2.653],[0,0]],"v":[[-85.902,96.957],[-84.291,120.945],[-75.622,120.762],[-75.202,109.763],[-70.094,115.125],[-55.863,118.03],[-44.468,116.016],[-45.451,112.513],[-49.343,110.808],[-52.728,109.365],[-53.329,107.768],[-54.932,96.198]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"t":44,"s":[100],"h":1},{"t":45,"s":[0],"h":1}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14,"s":[{"i":[[0,0],[1.791,-15.607],[1.027,-4.727],[5.07,-10.693],[3.561,-7.51]],"o":[[-1.152,15.668],[-0.551,4.806],[-2.513,11.564],[-3.561,7.51],[0,0]],"v":[[-35.91,-25.948],[-40.324,20.971],[-42.486,35.314],[-59.582,76.8],[-72.095,102.839]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0},"t":30,"s":[{"i":[[0,0],[1.791,-15.607],[1.027,-4.727],[5.07,-10.693],[3.561,-7.51]],"o":[[-1.152,15.668],[-0.551,4.806],[-2.513,11.564],[-3.561,7.51],[0,0]],"v":[[-35.91,-25.948],[-40.324,20.971],[-42.486,35.314],[-59.582,76.8],[-72.095,102.839]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":40,"s":[{"i":[[0,0],[1.791,-15.607],[1.027,-4.727],[2.418,-11.585],[1.616,-8.848]],"o":[[-2.845,15.314],[-0.551,4.806],[-2.513,11.564],[-1.603,7.682],[0,0]],"v":[[-38.37,-25.438],[-45.309,18.981],[-47.471,33.325],[-55.944,77.926],[-60.028,100.579]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":58,"s":[{"i":[[0,0],[1.791,-15.607],[0.511,-5.814],[1.059,-11.787],[1.175,-10.341]],"o":[[-1.152,15.668],[-0.551,4.806],[-1.035,11.789],[-0.923,10.275],[0,0]],"v":[[-39.66,-13.448],[-43.199,22.471],[-44.361,37.439],[-47.052,67.975],[-49.65,96.091]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":152,"s":[{"i":[[0,0],[1.791,-15.607],[0.511,-5.814],[1.059,-11.787],[1.175,-10.341]],"o":[[-1.152,15.668],[-0.551,4.806],[-1.035,11.789],[-0.923,10.275],[0,0]],"v":[[-39.66,-13.448],[-43.199,22.471],[-44.361,37.439],[-47.052,67.975],[-49.65,96.091]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":166,"s":[{"i":[[0,0],[1.897,-15.595],[0.55,-5.811],[1.139,-11.779],[1.175,-10.341]],"o":[[-1.259,15.659],[-0.584,4.802],[-1.116,11.781],[-0.993,10.268],[0,0]],"v":[[-38.916,-13.373],[-42.701,22.521],[-43.964,37.481],[-46.864,67.997],[-49.65,96.091]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":204,"s":[{"i":[[0,0],[1.897,-15.595],[0.55,-5.811],[1.139,-11.779],[1.175,-10.341]],"o":[[-1.259,15.659],[-0.584,4.802],[-1.116,11.781],[-0.993,10.268],[0,0]],"v":[[-38.916,-13.373],[-42.701,22.521],[-43.964,37.481],[-46.864,67.997],[-49.65,96.091]],"c":false}]},{"t":218,"s":[{"i":[[0,0],[1.791,-15.607],[0.511,-5.814],[1.059,-11.787],[1.175,-10.341]],"o":[[-1.152,15.668],[-0.551,4.806],[-1.035,11.789],[-0.923,10.275],[0,0]],"v":[[-39.66,-13.448],[-43.199,22.471],[-44.361,37.439],[-47.052,67.975],[-49.65,96.091]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14,"s":[{"i":[[0,0],[-9.915,-5.049]],"o":[[10.096,5.245],[0,0]],"v":[[-111.052,83.273],[-72.095,102.839]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0},"t":30,"s":[{"i":[[0,0],[-9.915,-5.049]],"o":[[10.096,5.245],[0,0]],"v":[[-111.052,83.273],[-72.095,102.839]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":40,"s":[{"i":[[0,0],[-11.123,-0.294]],"o":[[11.37,0.393],[0,0]],"v":[[-103.613,99.669],[-60.028,100.579]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[-11.123,-0.224]],"o":[[11.371,0.322],[0,0]],"v":[[-97.512,98.969],[-58.517,99.925]],"c":false}]},{"t":58,"s":[{"i":[[0,0],[-11.125,0.188]],"o":[[11.376,-0.099],[0,0]],"v":[[-95.984,97.138],[-49.65,96.091]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14,"s":[{"i":[[3.824,-3.215],[3.107,-5.36],[3.173,-7.127],[8.357,-14.655],[2.571,-2.986],[0.601,-10.018]],"o":[[-7.062,5.938],[-5.332,9.197],[-5.375,12.074],[-1.958,3.434],[-6.033,7.006],[0,0]],"v":[[-53.125,-38.25],[-67.168,-21.447],[-77.425,0.496],[-89.723,46.409],[-96.663,56.031],[-111.052,83.273]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0},"t":30,"s":[{"i":[[3.824,-3.215],[3.107,-5.36],[3.173,-7.127],[8.357,-14.655],[2.571,-2.986],[0.601,-10.018]],"o":[[-7.062,5.938],[-5.332,9.197],[-5.375,12.074],[-1.958,3.434],[-6.033,7.006],[0,0]],"v":[[-53.125,-38.25],[-67.168,-21.447],[-77.425,0.496],[-89.723,46.409],[-96.663,56.031],[-111.052,83.273]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":40,"s":[{"i":[[3.824,-3.215],[3.107,-5.36],[3.173,-7.127],[8.357,-14.655],[1.037,-3.802],[-1.016,-12.381]],"o":[[-7.062,5.938],[-5.332,9.197],[-5.375,12.074],[-1.958,3.434],[-2.434,8.92],[0,0]],"v":[[-53.125,-38.25],[-66.553,-22.769],[-76.81,-0.826],[-86.714,46.344],[-99.328,68.822],[-103.613,99.669]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[3.824,-3.215],[3.107,-5.36],[1.564,-7.625],[4.289,-16.168],[0.959,-3.817],[1.18,-11.367]],"o":[[-7.062,5.938],[-5.332,9.197],[-3.236,15.777],[-2.122,7.499],[-2.289,9.255],[0,0]],"v":[[-53.125,-38.25],[-66.078,-23.013],[-74.41,0.102],[-84.595,41.573],[-91.333,68.744],[-97.494,98.951]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":58,"s":[{"i":[[3.824,-3.215],[3.107,-5.36],[1.774,-7.597],[5.936,-15.26],[0.501,-3.909],[-1.366,-9.513]],"o":[[-7.062,5.938],[-5.332,9.197],[-3.3,14.129],[-3.877,9.966],[-1.437,11.219],[0,0]],"v":[[-53.125,-38.25],[-63.293,-24.447],[-72.3,6.621],[-83.848,37.034],[-87.788,65.281],[-95.859,97.013]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":152,"s":[{"i":[[3.824,-3.215],[3.107,-5.36],[1.774,-7.597],[5.936,-15.26],[0.501,-3.909],[-1.366,-9.513]],"o":[[-7.062,5.938],[-5.332,9.197],[-3.3,14.129],[-3.877,9.966],[-1.437,11.219],[0,0]],"v":[[-53.125,-38.25],[-63.293,-24.447],[-72.3,6.621],[-83.848,37.034],[-87.788,65.281],[-95.859,97.013]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":166,"s":[{"i":[[3.943,-3.188],[3.232,-5.348],[1.89,-7.607],[5.936,-15.26],[0.501,-3.909],[-1.366,-9.513]],"o":[[-7.283,5.888],[-5.545,9.177],[-3.515,14.147],[-3.877,9.966],[-1.437,11.219],[0,0]],"v":[[-51.918,-38.187],[-62.455,-24.437],[-71.976,6.654],[-83.848,37.034],[-87.788,65.281],[-95.859,97.013]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":204,"s":[{"i":[[3.943,-3.188],[3.232,-5.348],[1.89,-7.607],[5.936,-15.26],[0.501,-3.909],[-1.366,-9.513]],"o":[[-7.283,5.888],[-5.545,9.177],[-3.515,14.147],[-3.877,9.966],[-1.437,11.219],[0,0]],"v":[[-51.918,-38.187],[-62.455,-24.437],[-71.976,6.654],[-83.848,37.034],[-87.788,65.281],[-95.859,97.013]],"c":false}]},{"t":218,"s":[{"i":[[3.824,-3.215],[3.107,-5.36],[1.774,-7.597],[5.936,-15.26],[0.501,-3.909],[-1.366,-9.513]],"o":[[-7.062,5.938],[-5.332,9.197],[-3.3,14.129],[-3.877,9.966],[-1.437,11.219],[0,0]],"v":[[-53.125,-38.25],[-63.293,-24.447],[-72.3,6.621],[-83.848,37.034],[-87.788,65.281],[-95.859,97.013]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":358,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":" 8","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.383],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[-2.2]},{"t":58,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":45,"s":[-69.003,105.869,0],"to":[-0.208,0,0],"ti":[3.899,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.379,"y":0},"t":47,"s":[-70.503,106.994,0],"to":[-0.121,0,0],"ti":[0.255,0,0]},{"i":{"x":0.21,"y":1},"o":{"x":0.167,"y":0.167},"t":48,"s":[-78.571,108.119,0],"to":[-3.792,0,0],"ti":[0,0,0]},{"t":58,"s":[-93.25,107.869,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-84.25,105.744,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[0,0],[0.269,-1.808],[0.802,-0.37],[0.555,-0.933],[-0.018,-1.173],[-5.66,-0.006],[-2.778,6.398],[0,0],[0,0],[0,0],[0,0]],"o":[[-0.519,5.415],[-0.436,2.931],[-0.802,0.37],[-0.77,1.293],[0.9,0.004],[6.285,0.006],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-99.424,92.28],[-100.86,106.854],[-102.371,110.921],[-104.648,112.713],[-105.561,116.594],[-84.154,117.182],[-81.266,106.122],[-84.141,106.184],[-84.66,117.176],[-76.602,117.342],[-75.346,95.453]],"c":false}]},{"t":53,"s":[{"i":[[0,0],[0.369,-1.851],[1.097,-0.379],[0.76,-0.955],[-0.024,-1.201],[-6.282,-0.006],[-2.778,6.398],[0,0],[0,0],[0,0],[0,0]],"o":[[-0.546,6.093],[-0.598,3],[-1.097,0.379],[-1.054,1.324],[1.232,0.004],[6.975,0.006],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-94.052,92.759],[-95.951,106.838],[-99.961,111.016],[-103.079,112.85],[-104.329,116.824],[-90.063,116.84],[-73.999,106.312],[-73.999,106.312],[-73.999,116.827],[-66.132,116.833],[-64.827,92.794]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":45,"op":357,"st":50,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Layer 3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-15.04,39.857,0],"ix":2,"l":2},"a":{"a":0,"k":[-15.04,39.857,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.69,"y":0},"t":14,"s":[{"i":[[0,0],[-0.716,4.737],[-1.079,4.298],[1.07,4.194],[0.143,5.237]],"o":[[-1.084,-4.666],[0.662,-4.381],[1.054,-4.198],[-1.295,-5.076],[0,0]],"v":[[-41.808,94.965],[-43.267,82.478],[-39.362,67.384],[-39.386,54.532],[-43.649,39.469]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[0,0],[-0.783,4.7],[-1.153,4.321],[0.966,4.409],[0.002,5.293]],"o":[[-1.039,-4.656],[0.724,-4.348],[1.127,-4.221],[-1.161,-5.152],[0,0]],"v":[[-40.919,94.562],[-42.136,81.879],[-38.195,66.949],[-39.023,53.362],[-43.04,34.954]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[{"i":[[0,0],[-0.903,4.679],[-1.263,4.29],[0.88,4.427],[-0.133,5.292]],"o":[[-0.92,-4.681],[0.835,-4.328],[1.234,-4.191],[-1.029,-5.18],[0,0]],"v":[[-38.555,93.57],[-39.449,80.861],[-35.129,66.035],[-35.611,52.432],[-38.658,33.802]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":28,"s":[{"i":[[0,0],[-1.172,4.5],[-1.578,4.441],[0.385,5.578],[-3.336,6.624]],"o":[[-0.774,-4.609],[1.084,-4.162],[1.541,-4.338],[-0.408,-5.569],[0,0]],"v":[[-35.634,92.182],[-35.483,78.435],[-31.271,64.414],[-30.945,48.403],[-27.789,29.751]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":30,"s":[{"i":[[0,0],[-1.24,4.454],[-1.658,4.48],[0.259,5.87],[-0.954,5.675]],"o":[[-0.737,-4.59],[1.147,-4.12],[1.619,-4.376],[-0.25,-5.668],[0,0]],"v":[[-34.892,91.829],[-34.475,77.819],[-30.29,64.003],[-29.759,47.38],[-26.282,30.603]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":35,"s":[{"i":[[0,0],[-1.089,4.536],[-1.544,4.58],[0.441,5.559],[-0.702,5.751]],"o":[[-0.837,-4.612],[1.007,-4.196],[1.508,-4.474],[-0.489,-5.706],[0,0]],"v":[[-34.543,92.78],[-34.668,78.714],[-30.587,64.824],[-30.056,48.798],[-31.252,32.642]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":40,"s":[{"i":[[0,0],[-0.716,4.737],[-1.263,4.827],[0.889,4.791],[-0.083,5.938]],"o":[[-1.084,-4.666],[0.662,-4.381],[1.234,-4.715],[-1.076,-5.799],[0,0]],"v":[[-33.683,95.121],[-35.142,80.916],[-31.315,66.846],[-30.787,52.287],[-34.399,35.062]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[0,0],[-0.711,4.737],[-1.258,4.829],[0.894,4.79],[-0.076,5.938]],"o":[[-1.811,-4.441],[0.657,-4.382],[1.229,-4.717],[-1.082,-5.798],[0,0]],"v":[[-34.564,95.191],[-36.174,80.901],[-32.364,66.751],[-31.851,52.191],[-36.018,34.182]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":47,"s":[{"i":[[0,0],[-0.702,4.739],[-1.249,4.831],[0.903,4.789],[-0.065,5.938]],"o":[[-1.796,-3.796],[0.649,-4.383],[1.22,-4.719],[-1.093,-5.796],[0,0]],"v":[[-34.704,95.171],[-36.597,82.176],[-34.317,66.572],[-33.832,52.012],[-38.746,28.796]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":58,"s":[{"i":[[0,0],[1.898,9.128],[0.825,4.904],[1.704,5.653],[1.144,5.806]],"o":[[-2.594,-5.794],[-1.442,-6.935],[-1.109,-6.593],[-2.522,-6.122],[0,0]],"v":[[-41.156,94.512],[-45.648,76.747],[-48.266,58.343],[-53.329,43.347],[-57.955,24.76]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.4,"y":0},"t":70,"s":[{"i":[[0,0],[0.423,4.772],[-1.223,4.838],[1.181,4.728],[-0.033,5.938]],"o":[[-2.304,-4.557],[-0.381,-4.299],[1.194,-4.725],[-2.235,-8.948],[0,0]],"v":[[-52.071,94.307],[-55.494,81.299],[-53.235,65.636],[-54.015,49.073],[-58.324,27.324]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":152,"s":[{"i":[[0,0],[0.423,4.772],[-1.223,4.838],[1.181,4.728],[-0.033,5.938]],"o":[[-2.304,-4.557],[-0.381,-4.299],[1.194,-4.725],[-2.235,-8.948],[0,0]],"v":[[-52.071,94.307],[-55.494,81.299],[-53.235,65.636],[-54.015,49.073],[-58.324,27.324]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":166,"s":[{"i":[[0,0],[0.327,4.772],[-0.944,4.838],[1.181,4.728],[-0.033,5.938]],"o":[[-2.304,-4.557],[-0.294,-4.299],[0.922,-4.725],[-2.235,-8.948],[0,0]],"v":[[-51.946,94.307],[-55.206,81.299],[-52.338,65.636],[-53.14,49.823],[-57.824,24.574]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":204,"s":[{"i":[[0,0],[0.327,4.772],[-0.944,4.838],[1.181,4.728],[-0.033,5.938]],"o":[[-2.304,-4.557],[-0.294,-4.299],[0.922,-4.725],[-2.235,-8.948],[0,0]],"v":[[-51.946,94.307],[-55.206,81.299],[-52.338,65.636],[-53.14,49.823],[-57.824,24.574]],"c":false}]},{"t":218,"s":[{"i":[[0,0],[0.423,4.772],[-1.223,4.838],[1.181,4.728],[-0.033,5.938]],"o":[[-2.304,-4.557],[-0.381,-4.299],[1.194,-4.725],[-2.235,-8.948],[0,0]],"v":[[-52.071,94.307],[-55.494,81.299],[-53.235,65.636],[-54.015,49.073],[-58.324,27.324]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.514,"y":1},"o":{"x":0.839,"y":0},"t":14,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-25.552,-39.1],[6.377,94.902],[-41.808,94.908]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.66,"y":0},"t":30,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-0.24,-41.114],[8.252,95.022],[-34.888,91.774]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":40,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-2.177,-39.151],[8.252,95.059],[-33.683,95.064]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-5.651,-39.163],[7.686,95.128],[-34.522,95.134]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":47,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-12.122,-39.185],[6.632,95.147],[-34.584,95.113]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":58,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-39.671,-41.037],[-0.595,94.56],[-40.656,94.566]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.4,"y":0},"t":70,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-39.392,-41.088],[-7.011,94.244],[-52.071,94.25]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":152,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-39.392,-41.088],[-7.011,94.244],[-52.071,94.25]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":166,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-37.892,-40.463],[-7.011,94.244],[-51.939,94.25]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":204,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-37.892,-40.463],[-7.011,94.244],[-50.814,94.25]],"c":false}]},{"t":218,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-39.392,-41.088],[-7.011,94.244],[-52.071,94.25]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.69,"y":0},"t":14,"s":[{"i":[[0,0],[-0.535,-1.851],[-1.131,-0.379],[-0.846,-0.955],[-0.083,-1.201],[6.281,-0.006],[3.352,6.398],[0,0],[0,0],[0,0],[0,0]],"o":[[1.092,6.093],[0.867,3],[1.131,0.379],[1.172,1.324],[-1.232,0.004],[-6.974,0.006],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.623,94.901],[4.294,108.811],[8.679,112.989],[11.961,114.823],[13.568,118.797],[-0.697,118.813],[-17.705,108.285],[-17.705,108.285],[-16.762,118.8],[-24.628,118.806],[-28.576,94.931]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.66,"y":0},"t":30,"s":[{"i":[[0,0],[-0.423,-1.879],[-1.107,-0.446],[-0.787,-1.004],[-0.011,-1.204],[6.27,0.37],[2.513,6.771],[0,0],[0,0],[0,0],[0,0]],"o":[[0.002,6.666],[0.686,3.047],[1.107,0.446],[1.091,1.392],[-1.23,-0.07],[-6.962,-0.411],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.373,94.74],[3.626,108.575],[7.753,113.007],[10.92,115.035],[12.286,119.098],[-1.955,118.26],[-16.966,104.874],[-16.966,104.874],[-18.599,115.231],[-26.402,114.238],[-26.571,92.846]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":40,"s":[{"i":[[0,0],[-0.535,-1.851],[-1.131,-0.379],[-0.846,-0.955],[-0.083,-1.201],[6.281,-0.006],[3.352,6.398],[0,0],[0,0],[0,0],[0,0]],"o":[[0.002,6.88],[0.867,3],[1.131,0.379],[1.172,1.324],[-1.232,0.004],[-6.974,0.006],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.748,95.113],[2.544,108.867],[6.929,113.044],[10.211,114.879],[11.818,118.853],[-2.447,118.869],[-18.205,108.376],[-18.205,108.376],[-18.512,118.856],[-26.378,118.861],[-27.701,95.042]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":44,"s":[{"i":[[0,0],[-0.535,-1.851],[-1.131,-0.379],[-0.846,-0.955],[-0.083,-1.201],[6.281,-0.006],[3.352,6.398],[0,0],[0,0],[0,0],[0,0]],"o":[[0.002,6.88],[0.867,3],[1.131,0.379],[1.172,1.324],[-1.232,0.004],[-6.974,0.006],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.748,95.113],[2.544,108.867],[6.929,113.044],[10.211,114.879],[11.818,118.853],[-2.447,118.869],[-18.205,108.376],[-18.205,108.376],[-18.512,118.856],[-26.378,118.861],[-28.201,95.042]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":47,"s":[{"i":[[0,0],[-0.535,-1.851],[-1.131,-0.379],[-0.846,-0.955],[-0.083,-1.201],[6.281,-0.006],[3.352,6.398],[0,0],[0,0],[0,0],[0,0]],"o":[[0.002,6.88],[0.867,3],[1.131,0.379],[1.172,1.324],[-1.232,0.004],[-6.974,0.006],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.748,95.113],[2.544,108.867],[6.929,113.044],[10.211,114.879],[11.818,118.853],[-2.447,118.869],[-18.205,108.376],[-18.205,108.376],[-18.512,118.856],[-26.378,118.861],[-28.201,95.042]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":58,"s":[{"i":[[0,0],[-0.535,-1.851],[-1.131,-0.379],[-0.846,-0.955],[-0.083,-1.201],[6.281,-0.006],[3.352,6.398],[0,0],[0,0],[0,0],[0,0]],"o":[[0.002,6.88],[0.867,3],[1.131,0.379],[1.172,1.324],[-1.232,0.004],[-6.974,0.006],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-2.002,95.113],[-1.206,108.867],[3.179,113.044],[6.461,114.879],[8.068,118.853],[-6.197,118.869],[-21.955,108.376],[-21.955,108.376],[-22.262,118.856],[-30.128,118.861],[-33.201,95.042]],"c":false}]},{"t":70,"s":[{"i":[[0,0],[-0.535,-1.851],[-1.131,-0.379],[-0.846,-0.955],[-0.083,-1.201],[6.281,-0.006],[3.352,6.398],[0,0],[0,0],[0,0],[0,0]],"o":[[0.002,6.88],[0.867,3],[1.131,0.379],[1.172,1.324],[-1.232,0.004],[-6.974,0.006],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-11.765,94.243],[-10.969,108.934],[-6.584,113.112],[-3.302,114.947],[-1.695,118.92],[-15.96,118.937],[-31.719,108.444],[-31.719,108.444],[-32.025,118.923],[-39.891,118.929],[-42.965,94.172]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":358,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":" 7","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.929]},"o":{"x":[0.174],"y":[0.273]},"t":0,"s":[0]},{"i":{"x":[0.518],"y":[0.904]},"o":{"x":[0.467],"y":[-0.063]},"t":32,"s":[-45]},{"i":{"x":[0.515],"y":[0.956]},"o":{"x":[0.456],"y":[-0.025]},"t":68,"s":[16]},{"i":{"x":[0.01],"y":[1]},"o":{"x":[0.467],"y":[-0.069]},"t":95,"s":[-45]},{"i":{"x":[0.515],"y":[0.939]},"o":{"x":[0.174],"y":[0.236]},"t":124,"s":[0]},{"i":{"x":[0.518],"y":[0.904]},"o":{"x":[0.467],"y":[-0.063]},"t":168,"s":[-45]},{"i":{"x":[0.515],"y":[0.949]},"o":{"x":[0.456],"y":[-0.029]},"t":225,"s":[16]},{"i":{"x":[0.845],"y":[1.051]},"o":{"x":[0.467],"y":[-0.069]},"t":274.928,"s":[-45]},{"t":321,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[-191.387,-43.434,0],"to":[2.5,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[-176.387,-43.434,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":64,"s":[-191.387,-43.434,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":93,"s":[-176.387,-43.434,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":124,"s":[-191.387,-43.434,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":163,"s":[-176.387,-43.434,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":221,"s":[-191.387,-43.434,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":271.75,"s":[-176.387,-43.434,0],"to":[0,0,0],"ti":[2.5,0,0]},{"t":321,"s":[-191.387,-43.434,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-191.387,-43.434,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.895,4.463],[0,0],[-4.463,-1.895],[0,0],[1.895,-4.463],[0,0],[4.463,1.895],[0,0]],"o":[[0,0],[1.895,-4.463],[0,0],[4.463,1.895],[0,0],[-1.895,4.463],[0,0],[-4.463,-1.895]],"v":[[-208.928,-50.867],[-208.928,-50.867],[-197.415,-55.517],[-178.497,-47.515],[-173.846,-36.002],[-173.846,-36.002],[-185.36,-31.352],[-204.278,-39.353]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.360784322023,0.364705890417,0.376470595598,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":358,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Group 1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":124,"s":[-360]},{"t":321,"s":[-720]}],"ix":10},"p":{"a":0,"k":[181.759,-45.473,0],"ix":2,"l":2},"a":{"a":0,"k":[181.759,-45.473,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-4.648],[4.648,0],[0,4.648],[-4.648,0]],"o":[[0,4.648],[-4.648,0],[0,-4.648],[4.648,0]],"v":[[188.525,-47.623],[180.11,-39.208],[171.694,-47.623],[180.11,-56.039]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.250980407,0.301960796118,0.392156869173,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":358,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Group 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":31,"s":[-24]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":63,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":93,"s":[-24]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":124,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":174,"s":[-24]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":224,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":273,"s":[-24]},{"t":321,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[189.509,7.428,0],"to":[0.833,0.458,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":30,"s":[194.509,10.178,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":61,"s":[189.509,7.428,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":91,"s":[194.509,10.178,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":124,"s":[189.509,7.428,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":171,"s":[194.509,10.178,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":220,"s":[189.509,7.428,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":270,"s":[194.509,10.178,0],"to":[0,0,0],"ti":[0.833,0.458,0]},{"t":321,"s":[189.509,7.428,0]}],"ix":2,"l":2},"a":{"a":0,"k":[189.509,7.428,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.893,-3.251],[11.285,2.779],[0.492,11.051],[-3.653,-0.9]],"o":[[3.653,0.9],[-5.566,9.559],[-11.285,-2.779],[-0.167,-3.758],[0,0]],"v":[[209.413,1.566],[212.973,9.888],[184.741,21.845],[165.289,-1.854],[172.306,-7.571]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.360784322023,0.364705890417,0.376470595598,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":358,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"body cover","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[14.599,1.75,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":152,"s":[{"i":[[0.875,2.375],[0,0],[0,0],[0,0],[1.625,4.5],[-1.625,4.5]],"o":[[-0.875,-2.375],[0,0],[0,0],[0,0],[-1.625,-4.5],[1.625,-4.5]],"v":[[-37.375,-68.75],[-79.25,-67.25],[-59,62.75],[-16.5,64],[-38.625,-37.5],[-37.375,-54]],"c":true}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":166,"s":[{"i":[[0.875,2.375],[0,0],[0,0],[0,0],[1.625,4.5],[-1.625,4.5]],"o":[[-0.875,-2.375],[0,0],[0,0],[0,0],[-1.625,-4.5],[1.625,-4.5]],"v":[[-37.375,-68.75],[-79.25,-67.25],[-59,62.75],[-10.552,62.729],[-38.625,-37.5],[-37.375,-54]],"c":true}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":204,"s":[{"i":[[0.875,2.375],[0,0],[0,0],[0,0],[1.625,4.5],[-1.625,4.5]],"o":[[-0.875,-2.375],[0,0],[0,0],[0,0],[-1.625,-4.5],[1.625,-4.5]],"v":[[-37.375,-68.75],[-79.25,-67.25],[-59,62.75],[-10.552,62.729],[-38.625,-37.5],[-37.375,-54]],"c":true}]},{"t":218,"s":[{"i":[[0.875,2.375],[0,0],[0,0],[0,0],[1.625,4.5],[-1.625,4.5]],"o":[[-0.875,-2.375],[0,0],[0,0],[0,0],[-1.625,-4.5],[1.625,-4.5]],"v":[[-37.375,-68.75],[-79.25,-67.25],[-59,62.75],[-16.5,64],[-38.625,-37.5],[-37.375,-54]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.1254902035,0.129411771894,0.141176477075,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":358,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"finger left","parent":23,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[-13]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[-26.4]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":60,"s":[-26.4]},{"t":76,"s":[-7.4]}],"ix":10},"p":{"a":0,"k":[30.047,-52.909,0],"ix":2,"l":2},"a":{"a":0,"k":[30.047,-52.909,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-3.751,5.292],[0.431,0.639],[0.779,-0.176],[2.473,-2.118]],"o":[[5.885,-2.607],[0.446,-0.629],[-0.432,-0.64],[-3.158,0.713],[0,0]],"v":[[30.047,-52.909],[43.409,-66.225],[43.871,-68.346],[41.599,-69.095],[33.684,-63.249]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":358,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"hexa","parent":22,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[51.616,-52.909,0],"ix":2,"l":2},"a":{"a":0,"k":[51.616,-52.909,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.818,0.108],[0,0],[0.503,-0.654],[0,0],[-0.315,-0.763],[0,0],[-0.818,-0.108],[0,0],[-0.503,0.654],[0,0],[0.315,0.763],[0,0]],"o":[[0,0],[-0.818,-0.108],[0,0],[-0.503,0.654],[0,0],[0.315,0.763],[0,0],[0.818,0.108],[0,0],[0.503,-0.654],[0,0],[-0.315,-0.763]],"v":[[60.761,-66.702],[46.378,-68.607],[44.243,-67.725],[35.401,-56.222],[35.098,-53.932],[40.639,-40.523],[42.47,-39.116],[56.853,-37.21],[58.988,-38.092],[67.83,-49.595],[68.134,-51.885],[62.593,-65.294]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.988235294819,0.78823530674,0.203921571374,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":31,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"left hand","parent":23,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[-13]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[-32]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":60,"s":[-32]},{"t":76,"s":[-22.8]}],"ix":10},"p":{"a":0,"k":[19.691,-62.984,0],"ix":2,"l":2},"a":{"a":0,"k":[19.691,-62.984,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[-2.436,-0.426],[-0.782,-1.829]],"o":[[2.222,-1.098],[1.935,0.339],[0,0]],"v":[[36.388,-74.129],[43.457,-75.929],[47.901,-71.956]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0},"t":20,"s":[{"i":[[0,0],[-2.436,-0.426],[-0.984,-1.709]],"o":[[2.222,-1.098],[1.935,0.339],[0,0]],"v":[[37.163,-72.201],[44.601,-73.246],[50.334,-69.631]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.66,"y":0},"t":22,"s":[{"i":[[0,0],[-2.436,-0.426],[-0.984,-1.709]],"o":[[2.222,-1.098],[1.935,0.339],[0,0]],"v":[[37.163,-72.201],[44.601,-73.246],[50.334,-69.631]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":30,"s":[{"i":[[0,0],[-2.347,-0.363],[-1.694,-0.76]],"o":[[2.141,-0.934],[1.864,0.288],[0,0]],"v":[[36.82,-71.551],[43.987,-72.44],[48.705,-71.356]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":32,"s":[{"i":[[0,0],[-1.913,1.218],[-1.582,0.933]],"o":[[1.853,-1.447],[1.656,-1.054],[0,0]],"v":[[35.926,-71.002],[41.345,-75.046],[45.465,-77.391]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":37,"s":[{"i":[[0,0],[-2.268,-0.015],[-1.835,-0.074]],"o":[[1.853,-1.447],[1.963,0.013],[0,0]],"v":[[35.926,-71.002],[43.038,-72.289],[47.71,-72.462]],"c":false}]},{"t":40,"s":[{"i":[[0,0],[-1.551,-1.155],[-0.882,-1.611]],"o":[[1.853,-1.447],[1.575,1.172],[0,0]],"v":[[35.926,-71.002],[41.742,-70.141],[44.91,-66.689]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":37,"s":[100]},{"t":38,"s":[0]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[-5.248,4.287],[-2.13,0.665],[-1.934,-1.125],[-0.324,-0.627],[0.111,-0.699]],"o":[[5.192,-5.654],[1.737,-1.419],[2.13,-0.665],[0.605,0.352],[0.324,0.627],[0,0]],"v":[[19.691,-62.984],[32.161,-75.058],[38.032,-78.25],[44.517,-77.807],[45.982,-76.405],[46.314,-74.344]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0},"t":20,"s":[{"i":[[0,0],[-5.8,3.504],[-1.936,0.168],[-2.136,-0.667],[-0.559,-0.431],[-0.624,-1.296]],"o":[[5.478,-5.345],[2.168,-1.31],[2.223,-0.193],[0.668,0.209],[1.252,0.966],[0,0]],"v":[[19.691,-62.984],[33.318,-72.909],[40.754,-75.135],[45.606,-74.465],[47.867,-73.214],[50.589,-70.066]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.66,"y":0},"t":22,"s":[{"i":[[0,0],[-5.8,3.504],[-1.936,0.168],[-2.136,-0.667],[-0.559,-0.431],[-0.624,-1.296]],"o":[[5.478,-5.345],[2.168,-1.31],[2.223,-0.193],[0.668,0.209],[1.252,0.966],[0,0]],"v":[[19.691,-62.984],[33.318,-72.909],[40.754,-75.135],[45.606,-74.465],[47.867,-73.214],[50.589,-70.066]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":30,"s":[{"i":[[0,0],[-5.589,2.98],[-1.866,0.143],[-1.853,-0.286],[-1.169,-0.525],[-1.035,-0.43]],"o":[[5.478,-5.345],[2.089,-1.114],[2.142,-0.164],[0.664,0.103],[1.948,0.551],[0,0]],"v":[[19.691,-62.984],[33.347,-71.975],[40.259,-73.69],[45.022,-73.259],[48.112,-72.533],[52.232,-71.165]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":32,"s":[{"i":[[0,0],[-5.589,2.98],[-1.528,0.898],[-1.657,0.877],[-1.251,0.277],[-1.087,0.273]],"o":[[5.478,-5.345],[2.089,-1.114],[1.853,-1.088],[0.594,-0.315],[1.891,-0.722],[0,0]],"v":[[19.691,-62.984],[33.347,-71.975],[37.296,-74.394],[41.375,-76.717],[44.287,-77.98],[47.962,-79.96]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":37,"s":[{"i":[[0,0],[-4.53,1.806],[-2.126,0.202],[-1.868,-0.162],[-1.608,-0.307],[-1.062,-0.36]],"o":[[5.478,-5.345],[2.199,-0.877],[2.139,-0.203],[0.67,0.058],[1.98,0.42],[0,0]],"v":[[19.691,-62.984],[33.347,-71.975],[39.043,-73.414],[43.781,-73.428],[48.037,-72.842],[51.509,-72.015]],"c":false}]},{"t":40,"s":[{"i":[[0,0],[-2.654,0.204],[-1.299,-0.532],[-0.802,-1.388],[-0.318,-1.311],[0.646,-1.254]],"o":[[5.478,-5.345],[1.778,-0.137],[1.913,0.783],[1.168,2.022],[0.1,1.972],[0,0]],"v":[[19.691,-62.984],[36.163,-70.356],[39.65,-70.135],[43.127,-67.345],[44.095,-63.67],[42.974,-60.228]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[-0.858,-0.51],[-1.118,-0.301],[-0.238,0.973],[0.466,0.516],[3.852,0.099],[2.652,-1.73]],"o":[[0.895,0.494],[0.889,0.528],[0.954,0.257],[0.166,-0.679],[-2.607,-2.881],[-3.151,-0.081],[0,0]],"v":[[45.842,-67.462],[48.41,-65.901],[51.353,-64.596],[53.865,-65.454],[53.071,-67.296],[43.415,-73.136],[36.388,-70.738]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[0,0],[-0.876,-0.517],[-1.098,-0.295],[-0.238,0.973],[0.466,0.516],[3.852,0.099],[2.652,-1.73]],"o":[[2.283,-2.077],[0.875,0.516],[0.954,0.257],[0.166,-0.679],[-2.607,-2.881],[-3.151,-0.081],[0,0]],"v":[[41.506,-66.826],[47.105,-66.87],[51.353,-64.596],[53.865,-65.454],[53.071,-67.296],[43.415,-73.136],[36.388,-70.738]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.66,"y":0},"t":22,"s":[{"i":[[0,0],[-0.876,-0.517],[-1.098,-0.295],[-0.238,0.973],[0.466,0.516],[3.852,0.099],[2.652,-1.73]],"o":[[2.283,-2.077],[0.875,0.516],[0.954,0.257],[0.166,-0.679],[-2.607,-2.881],[-3.151,-0.081],[0,0]],"v":[[41.506,-66.826],[47.105,-66.87],[51.353,-64.596],[53.865,-65.454],[53.071,-67.296],[43.415,-73.136],[36.388,-70.738]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":30,"s":[{"i":[[0,0],[-0.979,0.038],[-1.041,0.3],[0.32,0.804],[0.648,0.151],[3.711,0.085],[2.555,-1.472]],"o":[[2.283,-2.077],[0.978,-0.038],[0.905,-0.26],[-0.223,-0.561],[-3.621,-0.842],[-3.036,-0.069],[0,0]],"v":[[37.27,-64.561],[47.553,-67.889],[52.178,-68.243],[53.753,-70.021],[52.143,-70.965],[42.844,-72.346],[34.848,-70.555]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":32,"s":[{"i":[[0,0],[-0.584,0.787],[-0.656,0.862],[0.736,0.454],[0.609,-0.266],[3.027,-2.149],[2.555,-1.472]],"o":[[2.283,-2.077],[0.947,-1.274],[0.57,-0.749],[-0.514,-0.317],[-3.406,1.488],[-2.476,1.758],[0,0]],"v":[[37.27,-64.561],[46.612,-73.922],[49.665,-77.584],[49.866,-79.951],[48.011,-79.747],[40.173,-74.683],[34.848,-70.555]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":37,"s":[{"i":[[0,0],[-0.918,0.344],[-1.019,0.368],[0.372,0.78],[0.656,0.107],[3.709,-0.163],[2.555,-1.472]],"o":[[2.283,-2.077],[1.487,-0.557],[0.886,-0.32],[-0.26,-0.545],[-3.669,-0.598],[-3.034,0.134],[0,0]],"v":[[37.27,-64.561],[46.613,-67.964],[51.164,-69.385],[52.617,-71.264],[50.947,-72.098],[41.617,-72.096],[34.848,-70.555]],"c":false}]},{"t":40,"s":[{"i":[[0,0],[-0.584,-0.694],[1.189,-1.691],[-2.21,1.869],[-2.212,3.492],[1.82,2.49],[2.702,-0.054]],"o":[[0.457,-0.105],[0.387,1.664],[-1.377,1.958],[1.122,-0.949],[1.94,-3.063],[-1.233,-1.687],[0,0]],"v":[[36.202,-63.898],[38.443,-63.231],[33.948,-55.543],[37.716,-53.739],[42.762,-59.745],[42.807,-68.015],[36.684,-70.539]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":71,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"left arm 2","parent":26,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.817],"y":[1.014]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[-17]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.602],"y":[0.096]},"t":24,"s":[43.2]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[12.5]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":46,"s":[0]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":60,"s":[0]},{"t":76,"s":[89.4]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":60,"s":[6.191,-49.734,0],"to":[2.183,2.986,0],"ti":[-2.183,-2.986,0]},{"t":76,"s":[19.291,-31.818,0]}],"ix":2,"l":2},"a":{"a":0,"k":[6.191,-49.734,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[-10.553,-7.794]],"o":[[0,0]],"v":[[6.277,-49.855]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":29,"s":[{"i":[[-10.553,-7.794]],"o":[[0,0]],"v":[[4.807,-48.203]],"c":false}]},{"t":60,"s":[{"i":[[-10.553,-7.794]],"o":[[0,0]],"v":[[4.807,-48.203]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[-2.438,-0.067],[-1.963,12.344],[5.082,5.232],[4.914,-4.8]],"o":[[13.177,0.363],[-4.63,-3.759],[-4.914,4.8],[0,0]],"v":[[4.384,-25.84],[30.047,-52.909],[19.691,-62.984],[6.277,-49.855]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":14,"s":[{"i":[[-2.249,-0.943],[-6.834,19.321],[5.082,5.232],[4.914,-4.8]],"o":[[12.255,5.141],[-4.63,-3.759],[-4.914,4.8],[0,0]],"v":[[-1.782,-26.869],[30.047,-52.909],[19.691,-62.984],[6.277,-49.855]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":24,"s":[{"i":[[-2.438,-0.025],[-6.834,19.321],[5.082,5.232],[4.914,-4.8]],"o":[[10.06,0.103],[-4.63,-3.759],[-4.914,4.8],[0,0]],"v":[[7.855,-25.27],[30.047,-52.909],[19.691,-62.984],[6.277,-49.855]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[-2.437,0.039],[-6.834,19.321],[5.082,5.232],[4.914,-4.8]],"o":[[10.345,-0.175],[-4.63,-3.759],[-4.914,4.8],[0,0]],"v":[[6.395,-24.92],[30.047,-52.909],[19.691,-62.984],[6.277,-49.855]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[{"i":[[-2.418,0.309],[-6.834,19.321],[5.082,5.232],[4.914,-4.8]],"o":[[12.505,-1.598],[-4.63,-3.759],[-4.914,4.8],[0,0]],"v":[[6.892,-24.324],[30.047,-52.909],[19.691,-62.984],[6.277,-49.855]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":29,"s":[{"i":[[-2.429,0.015],[-6.834,19.321],[5.082,5.232],[4.914,-4.8]],"o":[[12.878,-0.077],[-4.63,-3.759],[-4.914,4.8],[0,0]],"v":[[4.301,-24.007],[30.047,-52.909],[19.691,-62.984],[4.807,-48.203]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0},"t":32,"s":[{"i":[[-2.409,-0.38],[-6.834,19.321],[5.082,5.232],[4.914,-4.8]],"o":[[13.088,2.062],[-4.63,-3.759],[-4.914,4.8],[0,0]],"v":[[0.874,-25.547],[30.047,-52.909],[19.691,-62.984],[6.277,-49.855]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":46,"s":[{"i":[[-2.438,-0.067],[-1.963,12.344],[5.082,5.232],[4.914,-4.8]],"o":[[13.177,0.363],[-4.63,-3.759],[-4.914,4.8],[0,0]],"v":[[4.384,-25.84],[30.047,-52.909],[19.691,-62.984],[6.277,-49.855]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.4,"y":0},"t":60,"s":[{"i":[[-2.438,-0.067],[-1.963,12.344],[5.082,5.232],[4.914,-4.8]],"o":[[13.177,0.363],[-4.63,-3.759],[-4.914,4.8],[0,0]],"v":[[4.384,-25.84],[30.047,-52.909],[19.691,-62.984],[6.277,-49.855]],"c":false}]},{"t":76,"s":[{"i":[[-1.678,1.769],[-2.931,12.19],[5.082,5.232],[4.914,-4.8]],"o":[[8.229,-8.674],[-4.63,-3.759],[-4.914,4.8],[0,0]],"v":[[10.492,-23.815],[30.047,-52.909],[19.691,-62.984],[6.277,-49.855]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":71,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":"Layer 8","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-9.544,-35.853,0],"ix":2,"l":2},"a":{"a":0,"k":[-10.531,-36.411,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":102,"s":[{"i":[[0,0],[-0.354,-2.572],[0,0]],"o":[[1.553,4.061],[0,0],[0,0]],"v":[[-24.785,-47.619],[-20.786,-31.236],[-26.8,-15.645]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":114,"s":[{"i":[[0,0],[-2.608,-2.03],[0,0]],"o":[[2.283,1.422],[0,0],[0,0]],"v":[[-22.795,-53.731],[-14.598,-49.016],[-23.691,-32.536]],"c":false}]},{"t":120,"s":[{"i":[[0,0],[-2.608,-2.03],[0,0]],"o":[[2.283,1.422],[0,0],[0,0]],"v":[[-22.795,-53.731],[-15.223,-48.141],[-24.691,-31.786]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":102,"s":[{"i":[[0,0],[-1.096,-1.141],[-1.522,0.762]],"o":[[0,0],[1.096,1.141],[0,0]],"v":[[-29.574,5.465],[-26.503,12.908],[-22.113,14.117]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":114,"s":[{"i":[[0,0],[-1.577,0.133],[-0.366,1.662]],"o":[[0,0],[1.577,-0.133],[0,0]],"v":[[-21.552,-1.257],[-13.835,1.043],[-10.132,-1.606]],"c":false}]},{"t":120,"s":[{"i":[[0,0],[-1.58,-0.086],[-0.592,1.595]],"o":[[0,0],[1.58,0.086],[0,0]],"v":[[-23.263,-2.183],[-15.938,1.16],[-11.905,-0.953]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":102,"s":[{"i":[[0,0],[-5.425,-4.366],[0.891,-8.821],[10.344,-12.303],[3.907,2.109]],"o":[[0,0],[11.875,9.557],[-0.916,9.067],[-3.906,-2.109],[0,0]],"v":[[-33.451,-77.183],[-20.015,-73.365],[-2.724,-36.251],[-14.152,-7.492],[-25.872,-13.819]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":114,"s":[{"i":[[0,0],[-6.245,-3.082],[-1.416,-8.752],[12.513,-10.088],[3.429,2.82]],"o":[[0,0],[13.413,6.619],[1.328,8.21],[-3.429,-2.82],[0,0]],"v":[[-33.451,-77.183],[-19.64,-74.303],[4.54,-50.069],[-12.219,-23.106],[-23.568,-32.44]],"c":false}]},{"t":120,"s":[{"i":[[0,0],[-5.998,-3.539],[-1.416,-8.752],[12.513,-10.088],[3.429,2.82]],"o":[[0,0],[13.127,7.744],[1.328,8.21],[-3.429,-2.82],[0,0]],"v":[[-33.451,-77.183],[-20.515,-74.053],[3.29,-49.569],[-13.219,-22.356],[-24.568,-31.69]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":102,"s":[{"i":[[0,0],[0.628,2.059],[0.62,2.632]],"o":[[-1.512,4.121],[0,0],[-0.62,-2.632]],"v":[[-17.753,14.36],[-24.079,10.045],[-25.784,2.505]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":114,"s":[{"i":[[0,0],[1.995,0.808],[2.436,1.175]],"o":[[2.25,3.77],[0,0],[-2.436,-1.175]],"v":[[-7.198,-4.84],[-14.533,-2.642],[-21.465,-6.065]],"c":false}]},{"t":120,"s":[{"i":[[0,0],[1.864,1.076],[2.25,1.5]],"o":[[1.708,4.044],[0,0],[-2.25,-1.5]],"v":[[-8.553,-3.751],[-16.121,-2.587],[-22.513,-6.933]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":102,"s":[{"i":[[0,0],[0.283,8.27],[-0.175,1.78],[-0.697,4.923]],"o":[[-1.644,4.68],[0,-5.573],[0.309,-3.152],[0,0]],"v":[[-21.372,3.671],[-16.14,11.39],[-15.68,1.96],[-15.021,-7.536]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":114,"s":[{"i":[[0,0],[6.603,4.987],[-0.662,1.662],[0.996,4.87]],"o":[[2.601,4.224],[-6.701,-3.264],[0.639,-1.605],[0,0]],"v":[[-17.782,-8.758],[-8.49,-7.964],[-15.501,-14.228],[-13.064,-23.316]],"c":false}]},{"t":120,"s":[{"i":[[0,0],[5.851,5.85],[-0.662,1.662],[0.996,4.87]],"o":[[1.993,4.543],[-6.186,-4.158],[0.639,-1.605],[0,0]],"v":[[-18.494,-9.092],[-9.401,-7.023],[-15.501,-14.228],[-14.064,-22.566]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":102,"op":400,"st":102,"ct":1,"bm":0},{"ddd":0,"ind":25,"ty":4,"nm":"Layer 6","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-55.735,-36.137,0],"ix":2,"l":2},"a":{"a":0,"k":[-56.46,-36.387,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":71,"s":[{"i":[[0,0],[4.827,-6.177]],"o":[[3.434,5.335],[0,0]],"v":[[-4.227,4.087],[-7.54,33.941]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":79,"s":[{"i":[[0,0],[5.926,-5.132]],"o":[[2.343,5.897],[0,0]],"v":[[-12.28,5.968],[-19.124,34.028]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":85,"s":[{"i":[[0,0],[5.759,-5.318]],"o":[[2.53,5.819],[0,0]],"v":[[-10.19,5.803],[-16.134,34.068]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":91,"s":[{"i":[[0,0],[5.797,-5.276]],"o":[[2.488,5.836],[0,0]],"v":[[-10.659,5.84],[-16.805,34.059]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":99,"s":[{"i":[[0,0],[5.759,-5.318]],"o":[[2.53,5.819],[0,0]],"v":[[-10.19,5.803],[-16.134,34.068]],"c":false}]},{"t":105,"s":[{"i":[[0,0],[7.82,0.553]],"o":[[-1.505,7.049],[0,0]],"v":[[-13.497,-21.924],[-22.036,-4.894]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":71,"s":[{"i":[[0,0],[-4.115,-2.407],[-0.666,-5.452],[-0.708,-6.79],[-1.059,-2.383],[-0.328,-7.542],[0,0]],"o":[[4.627,0.055],[4.741,2.774],[0.666,5.452],[0.27,2.594],[3.286,7.393],[0,0],[0,0]],"v":[[-34.319,-76.892],[-20.578,-73.99],[-13.434,-58.901],[-11.542,-35.085],[-8.286,-18.143],[-4.047,3.667],[-13.035,6.383]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":79,"s":[{"i":[[0,0],[-4.115,-2.407],[-0.666,-5.452],[-1.087,-7.704],[-0.872,-2.457],[3.857,-6.762],[0,0]],"o":[[4.627,0.055],[4.741,2.774],[0.666,5.452],[0.364,2.582],[2.639,7.435],[0,0],[0,0]],"v":[[-34.319,-76.877],[-20.578,-73.99],[-13.934,-58.901],[-12.591,-34.451],[-9.828,-17.224],[-12.022,5.589],[-19.21,5.928]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":85,"s":[{"i":[[0,0],[-4.115,-2.407],[-0.666,-5.452],[-1.333,-7.665],[-0.95,-2.428],[3.639,-6.881],[0,0]],"o":[[4.627,0.055],[4.741,2.774],[0.666,5.452],[0.447,2.569],[2.875,7.347],[0,0],[0,0]],"v":[[-34.319,-76.877],[-20.578,-73.99],[-13.934,-58.901],[-11.792,-34.585],[-8.481,-17.455],[-9.945,5.417],[-17.118,5.986]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":91,"s":[{"i":[[0,0],[-4.115,-2.407],[-0.666,-5.452],[-1.277,-7.674],[-0.933,-2.435],[3.688,-6.854],[0,0]],"o":[[4.627,0.055],[4.741,2.774],[0.666,5.452],[0.428,2.572],[2.822,7.366],[0,0],[0,0]],"v":[[-34.319,-76.877],[-20.578,-73.99],[-13.934,-58.901],[-11.972,-34.555],[-8.783,-17.403],[-10.412,5.456],[-17.588,5.973]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":99,"s":[{"i":[[0,0],[-4.115,-2.407],[-0.666,-5.452],[-1.333,-7.665],[-0.95,-2.428],[3.639,-6.881],[0,0]],"o":[[4.627,0.055],[4.741,2.774],[0.666,5.452],[0.447,2.569],[2.875,7.347],[0,0],[0,0]],"v":[[-34.319,-76.877],[-20.578,-73.99],[-13.934,-58.901],[-11.792,-34.585],[-8.481,-17.455],[-9.945,5.417],[-17.118,5.986]],"c":false}]},{"t":105,"s":[{"i":[[0,0],[-4.115,-2.407],[-4.037,-3.724],[-0.073,-8.921],[1.629,-2.64],[5.296,-3.74],[0,0]],"o":[[4.627,0.055],[4.741,2.774],[4.432,4.088],[0.041,4.96],[-4.144,6.713],[0,0],[0,0]],"v":[[-34.319,-76.877],[-20.578,-73.99],[-7.059,-64.651],[3.77,-46.147],[-0.381,-35.298],[-13.048,-22.01],[-24.125,-31.347]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":71,"op":102,"st":71,"ct":1,"bm":0},{"ddd":0,"ind":26,"ty":4,"nm":"left arm","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.746],"y":[0.982]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[8.1]},{"i":{"x":[0.727],"y":[0.856]},"o":{"x":[0.457],"y":[-0.104]},"t":30,"s":[-33.9]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[-29.6]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":46,"s":[0]},{"i":{"x":[0.524],"y":[1.027]},"o":{"x":[0.4],"y":[0]},"t":60,"s":[0]},{"i":{"x":[0.453],"y":[1]},"o":{"x":[0.43],"y":[0.558]},"t":76,"s":[43.2]},{"t":84,"s":[41.4]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":60,"s":[-25.227,-75.935,0],"to":[1.25,0.5,0],"ti":[-1.25,-0.5,0]},{"t":76,"s":[-17.727,-72.935,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-25.227,-75.935,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[-4.115,-2.407],[-10.553,-7.794]],"o":[[4.627,0.055],[11.353,6.642],[0,0]],"v":[[-34.319,-76.689],[-20.578,-73.99],[6.277,-49.855]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":18,"s":[{"i":[[0,0],[-4.214,-2.23],[-10.553,-7.794]],"o":[[4.67,-0.755],[11.625,6.153],[0,0]],"v":[[-34.176,-75.363],[-20.373,-73.765],[6.277,-49.855]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[0,0],[-3.905,-2.647],[-9.137,-8.126]],"o":[[4.538,1.406],[10.708,7.25],[0,0]],"v":[[-32.305,-79.013],[-19.248,-72.297],[5.816,-49.577]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[{"i":[[0,0],[-3.851,-2.719],[-8.892,-8.184]],"o":[[4.515,1.782],[10.549,7.441],[0,0]],"v":[[-31.992,-79.511],[-19.053,-72.042],[5.343,-49.941]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":29,"s":[{"i":[[0,0],[-3.69,-2.936],[-8.154,-8.357]],"o":[[4.446,2.908],[10.071,8.012],[0,0]],"v":[[-31.323,-80.583],[-18.466,-71.276],[4.305,-49.053]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":30,"s":[{"i":[[0,0],[-3.667,-2.967],[-9.593,-8.422]],"o":[[4.436,3.071],[10.002,8.095],[0,0]],"v":[[-31.228,-80.768],[-18.381,-71.166],[6.277,-49.855]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0},"t":32,"s":[{"i":[[0,0],[-3.667,-2.967],[-9.593,-8.422]],"o":[[4.389,2.674],[10.002,8.095],[0,0]],"v":[[-31.475,-80.228],[-18.381,-71.166],[5.778,-49.676]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":46,"s":[{"i":[[0,0],[-4.115,-2.407],[-10.553,-7.794]],"o":[[4.627,0.055],[11.353,6.642],[0,0]],"v":[[-34.324,-76.705],[-20.578,-73.99],[6.277,-49.855]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":60,"s":[{"i":[[0,0],[-4.115,-2.407],[-10.553,-7.794]],"o":[[4.627,0.055],[11.353,6.642],[0,0]],"v":[[-34.319,-76.658],[-20.578,-73.99],[6.277,-49.855]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":62,"s":[{"i":[[0,0],[-4.204,-2.452],[-10.958,-8.32]],"o":[[4.621,-0.121],[11.37,6.639],[0,0]],"v":[[-34.534,-76.51],[-20.522,-73.957],[6.806,-49.133]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":63,"s":[{"i":[[0,0],[-4.317,-2.509],[-11.472,-8.987]],"o":[[4.821,-0.75],[11.391,6.634],[0,0]],"v":[[-35.391,-76.195],[-20.673,-74.166],[7.556,-47.607]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[0,0],[-4.429,-2.566],[-11.985,-9.654]],"o":[[5.093,-1.105],[11.412,6.63],[0,0]],"v":[[-36.266,-75.941],[-20.824,-74.375],[8.704,-45.73]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":65,"s":[{"i":[[0,0],[-4.57,-2.573],[-9.876,-5.901]],"o":[[4.966,-1.346],[13.683,7.684],[0,0]],"v":[[-37.149,-75.605],[-20.899,-74.466],[10.86,-42.798]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":66,"s":[{"i":[[0,0],[-4.711,-2.58],[-7.767,-2.149]],"o":[[4.838,-1.586],[15.954,8.738],[0,0]],"v":[[-37.982,-74.993],[-20.974,-74.558],[13.016,-39.867]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":67,"s":[{"i":[[0,0],[-4.57,-3.056],[-6.792,-1.944]],"o":[[6.505,-2.454],[13.909,9.303],[0,0]],"v":[[-38.802,-74.031],[-20.495,-74.297],[14.662,-37.792]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":68,"s":[{"i":[[0,0],[-4.817,-3.042],[-9.864,-6.258]],"o":[[5.849,-2.715],[13.133,8.401],[0,0]],"v":[[-38.983,-73.029],[-20.46,-74.298],[15.798,-36.146]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":70,"s":[{"i":[[0,0],[-6.112,-3.559],[-16.01,-14.884]],"o":[[4.538,-3.238],[11.517,6.706],[0,0]],"v":[[-39.279,-70.827],[-20.221,-74.038],[17.284,-34.146]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":72,"s":[{"i":[[0,0],[-5.117,-2.939],[-17.667,-17.037]],"o":[[4.446,-3.795],[11.603,6.665],[0,0]],"v":[[-38.948,-69.066],[-20.363,-74.409],[18.26,-33.072]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":73,"s":[{"i":[[0,0],[-5.578,-3.16],[-18.495,-18.113]],"o":[[4.4,-4.073],[11.661,6.617],[0,0]],"v":[[-38.979,-68.457],[-20.137,-74.316],[18.428,-33.092]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":74,"s":[{"i":[[0,0],[-6.04,-3.381],[-19.324,-19.19]],"o":[[4.354,-4.352],[11.719,6.57],[0,0]],"v":[[-39.011,-67.848],[-19.985,-74.413],[18.658,-33.025]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":76,"s":[{"i":[[0,0],[-6.266,-3.496],[-20.351,-20.524]],"o":[[4.633,-4.946],[11.761,6.562],[0,0]],"v":[[-39.247,-67.494],[-20.016,-74.003],[18.99,-32.3]],"c":false}]},{"t":84,"s":[{"i":[[0,0],[-6.266,-3.496],[-20.351,-20.524]],"o":[[4.853,-4.779],[11.761,6.562],[0,0]],"v":[[-39.765,-67.703],[-19.787,-73.8],[19.081,-32.386]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[-8.323,-3.998],[-2.55,-0.015]],"o":[[6.481,6.343],[2.711,1.302],[13.005,0.078]],"v":[[-24.177,-45.464],[-3.164,-27.744],[4.751,-25.834]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[0,0],[-3.618,-2.448],[-5.499,-0.272]],"o":[[3.522,3.439],[3.171,2.519],[11.525,-0.559]],"v":[[-19.561,-41.08],[-10.481,-32.836],[5.467,-25.517]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[0,0],[-2.536,-2.091],[-6.177,-0.331]],"o":[[2.841,2.771],[3.277,2.799],[11.184,-0.705]],"v":[[-19.553,-41.018],[-12.165,-34.008],[5.632,-25.444]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[0,0],[-2.378,-2.039],[-4.817,-1.149]],"o":[[2.985,2.482],[3.292,2.839],[11.579,4.779]],"v":[[-19.605,-40.705],[-12.41,-34.178],[2.303,-26.101]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[0,0],[-2.378,-2.039],[-4.598,-0.986]],"o":[[2.985,2.482],[3.292,2.839],[11.579,4.779]],"v":[[-19.605,-40.705],[-12.41,-34.178],[1.987,-26.103]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":18,"s":[{"i":[[0,0],[-2.349,-2.03],[-4.314,-2.14]],"o":[[2.968,2.463],[3.295,2.847],[11.651,5.779]],"v":[[-20.204,-41.481],[-12.454,-34.209],[-0.868,-27.092]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[0,0],[-3.076,-2.72],[-3.634,-1.935]],"o":[[3.448,2.993],[3.179,2.696],[11.613,5.851]],"v":[[-22.769,-43.719],[-12.751,-34.217],[-3.45,-27.683]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[0,0],[-4.011,-3.608],[-2.758,-1.672]],"o":[[4.065,3.675],[3.03,2.502],[11.565,5.943]],"v":[[-26.067,-46.597],[-13.133,-34.226],[-6.075,-28.771]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[{"i":[[0,0],[-5.01,-4.557],[-1.823,-1.391]],"o":[[4.725,4.403],[2.871,2.295],[11.513,6.041]],"v":[[-29.594,-49.674],[-13.542,-34.236],[-8.772,-30.251]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[0,0],[-5.155,-4.796],[-1.883,-1.741]],"o":[[5.05,4.762],[2.217,2.096],[1.174,1.046]],"v":[[-31.046,-50.48],[-16.384,-36.769],[-10.917,-31.777]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[{"i":[[0,0],[-5.104,-4.684],[-3.308,-2.141]],"o":[[3.648,4.663],[3.339,3.085],[3.449,2.218]],"v":[[-33.089,-51.535],[-21.123,-38.449],[-10.582,-30.507]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":29,"s":[{"i":[[0,0],[-7.095,-5.236],[-2.558,-1.472]],"o":[[4.958,6.354],[2.606,1.98],[9.974,5.582]],"v":[[-36.411,-54.009],[-18.154,-35.168],[-9.441,-29.152]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":30,"s":[{"i":[[0,0],[-7.522,-5.355],[-2.398,-1.329]],"o":[[6.481,6.343],[2.448,1.743],[11.375,6.304]],"v":[[-37.124,-54.541],[-15.56,-33.48],[-7.771,-28.499]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":32,"s":[{"i":[[0,0],[-7.307,-5.645],[-4.842,-1.695]],"o":[[6.481,6.343],[4.005,3.094],[12.275,4.297]],"v":[[-36.245,-52.885],[-14.415,-33.128],[-2.281,-26.517]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[{"i":[[0,0],[-7.584,-5.196],[-4.218,-1.237]],"o":[[6.481,6.343],[3.653,2.606],[12.474,3.148]],"v":[[-32.958,-50.864],[-11.367,-31.522],[-0.382,-26.192]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[0,0],[-7.94,-4.619],[-3.415,-0.649]],"o":[[6.481,6.343],[3.2,1.979],[12.729,1.67]],"v":[[-28.733,-48.265],[-7.427,-29.526],[2.08,-25.842]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":46,"s":[{"i":[[0,0],[-8.323,-3.998],[-2.55,-0.015]],"o":[[6.481,6.343],[2.711,1.302],[13.005,0.078]],"v":[[-24.177,-45.464],[-3.164,-27.744],[4.751,-25.834]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":60,"s":[{"i":[[0,0],[-8.323,-3.998],[-2.55,-0.015]],"o":[[6.481,6.343],[2.711,1.302],[13.005,0.078]],"v":[[-24.177,-45.464],[-3.164,-27.744],[4.751,-25.834]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":61,"s":[{"i":[[0,0],[-8.035,-4.491],[-2.916,-0.054]],"o":[[6.481,6.343],[2.649,1.485],[13.002,0.213]],"v":[[-24.177,-45.464],[-5.197,-28.787],[4.303,-25.739]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":62,"s":[{"i":[[0,0],[-7.568,-5.29],[-3.508,-0.117]],"o":[[6.481,6.343],[2.547,1.781],[12.998,0.432]],"v":[[-24.177,-45.464],[-8.489,-30.476],[3.58,-25.177]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":63,"s":[{"i":[[0,0],[-7.337,-5.593],[-3.024,-0.171]],"o":[[6.21,6.599],[2.47,1.882],[12.976,0.79]],"v":[[-24.245,-45.447],[-9.2,-29.839],[2.12,-24.392]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":64,"s":[{"i":[[0,0],[-7.107,-5.895],[-2.54,-0.225]],"o":[[5.938,6.855],[2.392,1.984],[12.955,1.147]],"v":[[-24.312,-45.43],[-9.911,-29.201],[0.69,-23.108]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":65,"s":[{"i":[[0,0],[-6.943,-6.082],[-2.7,-0.674]],"o":[[5.748,7.01],[2.337,2.047],[12.53,2.949]],"v":[[-24.214,-45.515],[-10.206,-28.602],[-0.016,-21.906]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":66,"s":[{"i":[[0,0],[-6.779,-6.27],[-2.859,-1.122]],"o":[[5.559,7.165],[2.282,2.11],[12.106,4.751]],"v":[[-24.116,-45.6],[-10.611,-28.618],[-0.833,-21.32]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":67,"s":[{"i":[[0,0],[-6.546,-6.504],[-2.922,-1.171]],"o":[[5.296,7.355],[2.203,2.189],[12.065,4.833]],"v":[[-23.637,-46.238],[-9.979,-29.599],[-1.056,-21.143]],"c":false}]},{"t":68,"s":[{"i":[[0,0],[-6.313,-6.738],[-2.492,-0.541]],"o":[[5.033,7.544],[2.125,2.268],[12.709,2.76]],"v":[[-23.158,-46.877],[-10.902,-28.973],[-1.147,-21.6]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":71,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":27,"ty":4,"nm":" 6","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":31,"s":[-0.151]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":44,"s":[99.849]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.447],"y":[0.05]},"t":52,"s":[-44.151]},{"t":61,"s":[-73.651]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":31,"s":[87.558]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":44,"s":[78.165]},{"i":{"x":[0.919],"y":[-0.443]},"o":{"x":[0.167],"y":[0]},"t":52,"s":[78.394]},{"t":61,"s":[81.608]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":31,"s":[-113.474]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.66],"y":[0]},"t":37,"s":[-129.635]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":44,"s":[-54.885]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":52,"s":[-140.688]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.66],"y":[0]},"t":53,"s":[-140.688]},{"t":61,"s":[-108.045]}],"ix":4}},"a":{"a":0,"k":[77.835,-112.754,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0.825],[0,0],[0.715,0.413],[0,0],[0.715,-0.413],[0,0],[0,-0.825],[0,0],[-0.715,-0.413],[0,0],[-0.715,0.413],[0,0]],"o":[[0,0],[0,-0.825],[0,0],[-0.715,-0.413],[0,0],[-0.715,0.413],[0,0],[0,0.825],[0,0],[0.715,0.413],[0,0],[0.715,-0.413]],"v":[[92.71,-105.499],[92.71,-120.008],[91.555,-122.008],[78.99,-129.263],[76.68,-129.263],[64.115,-122.008],[62.96,-120.008],[62.96,-105.499],[64.115,-103.499],[76.68,-96.244],[78.99,-96.244],[91.555,-103.499]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":31,"op":62,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":28,"ty":4,"nm":" 5","parent":37,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-8.267,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[50.735,-15.692,0],"to":[6.152,-1.383,0],"ti":[-3.379,1.573,0]},{"i":{"x":0.34,"y":1},"o":{"x":0.333,"y":0},"t":26,"s":[87.646,-23.988,0],"to":[3.379,-1.573,0],"ti":[0.372,7.788,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.66,"y":0},"t":44,"s":[71.006,-25.129,0],"to":[-0.372,-7.788,0],"ti":[-2.401,7.598,0]},{"t":55,"s":[85.414,-70.717,0]}],"ix":2,"l":2},"a":{"a":0,"k":[77.835,-77.267,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.722,7.328],[0,0],[-7.328,3.722],[0,0],[-3.722,-7.328],[0,0],[7.328,-3.722],[0,0]],"o":[[0,0],[-3.722,-7.328],[0,0],[7.328,-3.722],[0,0],[3.722,7.328],[0,0],[-7.328,3.722]],"v":[[64.459,-70.474],[64.459,-70.474],[70.988,-90.481],[71.204,-90.59],[91.211,-84.061],[91.211,-84.061],[84.681,-64.054],[84.465,-63.944]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.972549021244,0.509803950787,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":62,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":29,"ty":4,"nm":" 4","parent":37,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[-326]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":46,"s":[-115]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":56,"s":[0]},{"t":61,"s":[24]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":0,"s":[40.299,16.694,0],"to":[5.102,-3.421,0],"ti":[-5.102,8.087,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.66,"y":0},"t":46,"s":[70.913,-3.83,0],"to":[5.102,-8.087,0],"ti":[0,4.667,0]},{"t":56,"s":[70.913,-31.83,0]}],"ix":2,"l":2},"a":{"a":0,"k":[77.32,-35.798,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.665,-1.528],[-0.581,-0.776],[0,0],[0.705,-2.679],[0.23,-1.529],[-5.535,0.02],[0.376,4.941],[0.368,2.246],[-1.221,2.134],[0,0],[-0.387,0.907],[0.213,2.205],[6.128,0.358],[-0.026,-7.219]],"o":[[0.392,0.9],[0,0],[1.393,2.395],[-0.391,1.484],[-0.803,5.349],[4.864,-0.018],[-0.174,-2.282],[-0.394,-2.405],[0,0],[0.576,-0.78],[0.798,-1.871],[-0.59,-6.11],[-7.319,-0.427],[0.006,1.768]],"v":[[65.772,-40.987],[67.239,-38.466],[68.813,-35.76],[69.886,-27.837],[68.763,-23.333],[77.44,-12.997],[86.192,-22.224],[84.708,-28.878],[85.902,-35.822],[87.456,-38.54],[88.905,-41.075],[89.85,-47.253],[78.076,-58.578],[64.729,-45.963]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.250980407,0.301960796118,0.392156869173,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":61,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":30,"ty":4,"nm":" 3","parent":37,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.44],"y":[0.88]},"o":{"x":[0.575],"y":[-0.156]},"t":0,"s":[12]},{"i":{"x":[0.507],"y":[1.099]},"o":{"x":[0.557],"y":[-0.122]},"t":22,"s":[-8.592]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.709],"y":[-0.161]},"t":39,"s":[12]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[18.8]},{"t":57,"s":[-14]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.44,"y":0.88},"o":{"x":0.575,"y":0.156},"t":0,"s":[67.106,32.567,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.507,"y":0.901},"o":{"x":0.557,"y":0.122},"t":22,"s":[84.002,28.008,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.709,"y":0.088},"t":39,"s":[67.106,32.567,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":45,"s":[71.976,35.311,0],"to":[0,0,0],"ti":[0,0,0]},{"t":57,"s":[70.339,21.422,0]}],"ix":2,"l":2},"a":{"a":0,"k":[77.835,20.502,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.616,-1.616],[0,0],[1.616,1.616],[0,0],[-1.616,1.616],[0,0],[-1.616,-1.616],[0,0]],"o":[[0,0],[-1.616,1.616],[0,0],[-1.616,-1.616],[0,0],[1.616,-1.616],[0,0],[1.616,1.616]],"v":[[107.605,23.427],[80.761,50.272],[74.909,50.272],[48.064,23.427],[48.064,17.576],[74.909,-9.269],[80.761,-9.269],[107.605,17.576]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.35686275363,0.72549021244,0.454901963472,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":59,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":31,"ty":4,"nm":" 15","parent":32,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[77.835,-95.935,0],"ix":2,"l":2},"a":{"a":0,"k":[77.835,-95.935,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":98,"s":[{"i":[[0,0],[0,0],[-0.139,-0.103],[0,0]],"o":[[0,0],[0.087,0.075],[0,0],[0,0]],"v":[[70.784,-114.454],[70.886,-114.403],[71.012,-114.314],[71.175,-114.215]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":103,"s":[{"i":[[0,0],[0,0],[-0.502,-0.017],[0,0]],"o":[[0,0],[0.366,0.364],[0,0],[0,0]],"v":[[70.784,-114.454],[76.151,-109.096],[76.28,-109.108],[76.825,-109.007]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104,"s":[{"i":[[0,0],[0,0],[-0.422,0.422],[0,0]],"o":[[0,0],[0.422,0.422],[0,0],[0,0]],"v":[[70.784,-114.454],[77.204,-108.035],[78.731,-108.035],[79.255,-108.419]],"c":false}]},{"t":112,"s":[{"i":[[0,0],[0,0],[-0.422,0.422],[0,0]],"o":[[0,0],[0.422,0.422],[0,0],[0,0]],"v":[[70.784,-114.454],[77.204,-108.035],[78.731,-108.035],[91.529,-120.775]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.1254902035,0.129411771894,0.141176477075,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":98,"op":323,"st":59,"ct":1,"bm":0},{"ddd":0,"ind":32,"ty":4,"nm":" 9","parent":34,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":59,"s":[-5.971]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.001],"y":[0]},"t":67.4,"s":[-2.322]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":76.374,"s":[-0.6]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":94.323,"s":[-3.152]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":112.271,"s":[-1.923]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":130.221,"s":[-2.515]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":148.169,"s":[-2.23]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":166.118,"s":[-2.367]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":184.066,"s":[-2.301]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":202.016,"s":[-2.333]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":219.964,"s":[-2.317]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":237.913,"s":[-2.325]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.5],"y":[0]},"t":255.861,"s":[-2.321]},{"t":273.810546875,"s":[-2.323]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":59,"s":[80.192,-103.391,0],"to":[-0.338,1.21,0],"ti":[0.309,-0.711,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":62,"s":[78.163,-96.131,0],"to":[-0.309,0.711,0],"ti":[-0.029,0.499,0]},{"t":66,"s":[78.337,-99.126,0]}],"ix":2,"l":2},"a":{"a":0,"k":[77.835,-95.935,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0.825],[0,0],[0.715,0.413],[0,0],[0.715,-0.413],[0,0],[0,-0.825],[0,0],[-0.715,-0.413],[0,0],[-0.715,0.413],[0,0]],"o":[[0,0],[0,-0.825],[0,0],[-0.715,-0.413],[0,0],[-0.715,0.413],[0,0],[0,0.825],[0,0],[0.715,0.413],[0,0],[0.715,-0.413]],"v":[[92.71,-105.499],[92.71,-120.008],[91.555,-122.008],[78.99,-129.263],[76.68,-129.263],[64.115,-122.008],[62.96,-120.008],[62.96,-105.499],[64.115,-103.499],[76.68,-96.244],[78.99,-96.244],[91.555,-103.499]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":61,"op":393,"st":6,"ct":1,"bm":0},{"ddd":0,"ind":33,"ty":4,"nm":" 17","parent":32,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0.471,"ix":10},"p":{"a":0,"k":[77.835,-95.935,0],"ix":2,"l":2},"a":{"a":0,"k":[77.835,-95.935,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":112,"s":[{"i":[[0,0],[0,0],[-0.422,0.422],[0,0]],"o":[[0,0],[0.422,0.422],[0,0],[0,0]],"v":[[70.784,-114.454],[77.204,-108.035],[78.731,-108.035],[91.308,-120.843]],"c":false}]},{"t":117,"s":[{"i":[[0,0],[0,0],[-0.422,0.422],[0,0]],"o":[[0,0],[0.422,0.422],[0,0],[0,0]],"v":[[70.784,-114.454],[77.204,-108.035],[78.731,-108.035],[95.027,-124.185]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.35686275363,0.72549021244,0.454901963472,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":112,"op":441,"st":59,"ct":1,"bm":0},{"ddd":0,"ind":34,"ty":4,"nm":" 12","parent":35,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":62,"s":[-32]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.001],"y":[0]},"t":70.4,"s":[1.037]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":79.374,"s":[16.63]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":97.323,"s":[-6.471]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":115.271,"s":[4.653]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":133.221,"s":[-0.704]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":151.169,"s":[1.875]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":169.118,"s":[0.633]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":187.066,"s":[1.231]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":205.016,"s":[0.943]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":222.964,"s":[1.082]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":240.913,"s":[1.015]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.5],"y":[0]},"t":258.861,"s":[1.047]},{"t":276.810546875,"s":[1.032]}],"ix":10},"p":{"a":0,"k":[76.074,-72.679,0],"ix":2,"l":2},"a":{"a":0,"k":[78.137,-72.824,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.722,7.328],[0,0],[-7.328,3.722],[0,0],[-3.722,-7.328],[0,0],[7.328,-3.722],[0,0]],"o":[[0,0],[-3.722,-7.328],[0,0],[7.328,-3.722],[0,0],[3.722,7.328],[0,0],[-7.328,3.722]],"v":[[64.459,-70.474],[64.459,-70.474],[70.988,-90.481],[71.204,-90.59],[91.211,-84.061],[91.211,-84.061],[84.681,-64.054],[84.465,-63.944]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.972549021244,0.509803950787,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":62,"op":393,"st":6,"ct":1,"bm":0},{"ddd":0,"ind":35,"ty":4,"nm":" 11","parent":36,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.212],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":61,"s":[38]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.001],"y":[0]},"t":69.4,"s":[0.61]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":78.374,"s":[-17.038]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":96.323,"s":[9.108]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":114.271,"s":[-3.482]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":132.221,"s":[2.58]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":150.169,"s":[-0.339]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":168.118,"s":[1.067]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":186.066,"s":[0.39]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":204.016,"s":[0.716]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":221.964,"s":[0.559]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":239.913,"s":[0.634]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.5],"y":[0]},"t":257.861,"s":[0.598]},{"t":275.810546875,"s":[0.615]}],"ix":10},"p":{"a":0,"k":[77.32,-12.997,0],"ix":2,"l":2},"a":{"a":0,"k":[77.32,-12.997,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.665,-1.528],[-0.581,-0.776],[0,0],[0.705,-2.679],[0.23,-1.529],[-5.535,0.02],[0.376,4.941],[0.368,2.246],[-1.221,2.134],[0,0],[-0.387,0.907],[0.213,2.205],[6.128,0.358],[-0.026,-7.219]],"o":[[0.392,0.9],[0,0],[1.393,2.395],[-0.391,1.484],[-0.803,5.349],[4.864,-0.018],[-0.174,-2.282],[-0.394,-2.405],[0,0],[0.576,-0.78],[0.798,-1.871],[-0.59,-6.11],[-7.319,-0.427],[0.006,1.768]],"v":[[65.772,-40.987],[67.239,-38.466],[68.813,-35.76],[69.886,-27.837],[68.763,-23.333],[77.44,-12.997],[86.192,-22.224],[84.708,-28.878],[85.902,-35.822],[87.456,-38.54],[88.905,-41.075],[89.85,-47.253],[78.076,-58.578],[64.729,-45.963]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.250980407,0.301960796118,0.392156869173,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":61,"op":393,"st":6,"ct":1,"bm":0},{"ddd":0,"ind":36,"ty":4,"nm":" 10","parent":37,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[-14]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.001],"y":[0]},"t":68.4,"s":[0.564]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":77.374,"s":[7.438]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":95.323,"s":[-2.746]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":113.271,"s":[2.158]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":131.221,"s":[-0.203]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":149.169,"s":[0.934]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":167.118,"s":[0.386]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":185.066,"s":[0.65]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":203.016,"s":[0.523]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":220.964,"s":[0.584]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":238.913,"s":[0.554]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.5],"y":[0]},"t":256.861,"s":[0.569]},{"t":274.810546875,"s":[0.562]}],"ix":10},"p":{"a":0,"k":[77.835,51.484,0],"ix":2,"l":2},"a":{"a":0,"k":[77.835,51.484,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.616,-1.616],[0,0],[1.616,1.616],[0,0],[-1.616,1.616],[0,0],[-1.616,-1.616],[0,0]],"o":[[0,0],[-1.616,1.616],[0,0],[-1.616,-1.616],[0,0],[1.616,-1.616],[0,0],[1.616,1.616]],"v":[[107.605,23.427],[80.761,50.272],[74.909,50.272],[48.064,23.427],[48.064,17.576],[74.909,-9.269],[80.761,-9.269],[107.605,17.576]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.35686275363,0.72549021244,0.454901963472,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":59,"op":393,"st":6,"ct":1,"bm":0},{"ddd":0,"ind":37,"ty":4,"nm":" 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.173],"y":[0.074]},"t":5,"s":[15.1]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":53,"s":[-4]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.001],"y":[0]},"t":61.4,"s":[0]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":70.374,"s":[1.888]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":88.323,"s":[-0.909]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":106.271,"s":[0.438]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":124.221,"s":[-0.211]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":142.169,"s":[0.102]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":160.118,"s":[-0.049]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":178.066,"s":[0.024]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":196.016,"s":[-0.011]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":213.964,"s":[0.005]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":231.913,"s":[-0.003]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.5],"y":[0]},"t":249.861,"s":[0.001]},{"t":267.810546875,"s":[-0.001]}],"ix":10},"p":{"a":0,"k":[78.022,91.237,0],"ix":2,"l":2},"a":{"a":0,"k":[78.022,91.237,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.749,0],[0,0],[-0.875,-1.515],[0,0],[-0.875,1.515],[0,0]],"o":[[0,0],[-1.749,0],[0,0],[0.875,1.515],[0,0],[0.875,-1.515]],"v":[[96.775,54],[58.895,54],[56.927,57.408],[75.867,90.213],[79.802,90.213],[98.742,57.408]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.988235294819,0.78823530674,0.203921571374,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":387,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":38,"ty":4,"nm":"","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[77.835,106.525,0],"ix":2,"l":2},"a":{"a":0,"k":[77.835,106.525,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.002,6.768],[0,0],[-6.768,0.002],[0,0],[-0.002,-6.768],[0,0],[6.768,-0.002],[0,0]],"o":[[0,0],[-0.002,-6.768],[0,0],[6.768,-0.002],[0,0],[0.002,6.768],[0,0],[-6.768,0.002]],"v":[[51.245,106.555],[51.245,106.554],[63.495,94.295],[92.165,94.246],[104.424,106.496],[104.424,106.496],[92.174,118.755],[63.504,118.805]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.917647063732,0.262745112181,0.207843139768,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":387,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":39,"ty":4,"nm":"ground","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,118.813,0],"ix":2,"l":2},"a":{"a":0,"k":[0,118.813,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-232.588,118.813],[232.588,118.813]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.250980407,0.301960796118,0.392156869173,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":383,"st":0,"ct":1,"bm":0}],"markers":[{"tm":125,"cm":"1","dr":0},{"tm":321,"cm":"2","dr":0}]} \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/login/components/dialogs/oobe_adaptive_dialog.js b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_adaptive_dialog.js index f01b62e0..11669465 100644 --- a/chrome/browser/resources/chromeos/login/components/dialogs/oobe_adaptive_dialog.js +++ b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_adaptive_dialog.js
@@ -275,5 +275,5 @@ /** @private */ onReadMoreClick_() { this.maybeUpgradeReadMoreState_(true /* read_more_clicked */); - } + }, });
diff --git a/chrome/browser/resources/chromeos/login/components/dialogs/oobe_content_dialog.js b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_content_dialog.js index e0ad9531..5b32a834 100644 --- a/chrome/browser/resources/chromeos/login/components/dialogs/oobe_content_dialog.js +++ b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_content_dialog.js
@@ -53,5 +53,5 @@ if (this.noLazy) { this.shadowRoot.querySelector('#lazy').get(); } - } + }, });
diff --git a/chrome/browser/resources/chromeos/login/components/display_manager_types.js b/chrome/browser/resources/chromeos/login/components/display_manager_types.js index 9384843a..62e9de4 100644 --- a/chrome/browser/resources/chromeos/login/components/display_manager_types.js +++ b/chrome/browser/resources/chromeos/login/components/display_manager_types.js
@@ -16,7 +16,7 @@ OOBE: 'oobe', LOGIN: 'login', APP_LAUNCH_SPLASH: 'app-launch-splash', - GAIA_SIGNIN: 'gaia-signin' + GAIA_SIGNIN: 'gaia-signin', }; /**
diff --git a/chrome/browser/resources/chromeos/login/components/gaia_dialog.js b/chrome/browser/resources/chromeos/login/components/gaia_dialog.js index 5f3d674..eeabed2 100644 --- a/chrome/browser/resources/chromeos/login/components/gaia_dialog.js +++ b/chrome/browser/resources/chromeos/login/components/gaia_dialog.js
@@ -176,7 +176,7 @@ */ isPopUpOverlayVisible_: { type: Boolean, - computed: 'showOverlay_(navigationEnabled, isSamlSsoVisible)' + computed: 'showOverlay_(navigationEnabled, isSamlSsoVisible)', }, /** @@ -193,7 +193,7 @@ type: Boolean, computed: 'isSamlBackButtonHidden(isDefaultSsoProvider, isClosable,' + 'flagRedirectToDefaultIdPEnabled_)', - } + }, }; }
diff --git a/chrome/browser/resources/chromeos/login/components/gaia_input_form.js b/chrome/browser/resources/chromeos/login/components/gaia_input_form.js index 599151d..fa420d59 100644 --- a/chrome/browser/resources/chromeos/login/components/gaia_input_form.js +++ b/chrome/browser/resources/chromeos/login/components/gaia_input_form.js
@@ -38,7 +38,7 @@ buttonText: { type: String, value: '', - } + }, }; }
diff --git a/chrome/browser/resources/chromeos/login/components/network_select_login.js b/chrome/browser/resources/chromeos/login/components/network_select_login.js index 67c96cfd..c9d6eea 100644 --- a/chrome/browser/resources/chromeos/login/components/network_select_login.js +++ b/chrome/browser/resources/chromeos/login/components/network_select_login.js
@@ -56,7 +56,7 @@ */ showTechnologyBadge_: { type: Boolean, - } + }, }; }
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_a11y_option.js b/chrome/browser/resources/chromeos/login/components/oobe_a11y_option.js index 5aec1ac..36a2e63 100644 --- a/chrome/browser/resources/chromeos/login/components/oobe_a11y_option.js +++ b/chrome/browser/resources/chromeos/login/components/oobe_a11y_option.js
@@ -36,7 +36,7 @@ */ labelForAria: { type: String, - } + }, }; }
diff --git a/chrome/browser/resources/chromeos/login/components/web_view_loader.js b/chrome/browser/resources/chromeos/login/components/web_view_loader.js index d002758..b1b549b 100644 --- a/chrome/browser/resources/chromeos/login/components/web_view_loader.js +++ b/chrome/browser/resources/chromeos/login/components/web_view_loader.js
@@ -17,7 +17,7 @@ ' e.textContent=el.textContent + "(" + el.href + ")";' + ' }' + ' el.parentNode.replaceChild(e,el);' + - '}' + '}', }; const WEB_VIEW_FONTS_CSS = { @@ -27,7 +27,7 @@ line-height: 20px !important;} body h2 { font-size: 15px !important; - line-height: 22px !important;}` + line-height: 22px !important;}`, }; /**
diff --git a/chrome/browser/resources/chromeos/login/debug/debug.js b/chrome/browser/resources/chromeos/login/debug/debug.js index d28106b..c21a0281 100644 --- a/chrome/browser/resources/chromeos/login/debug/debug.js +++ b/chrome/browser/resources/chromeos/login/debug/debug.js
@@ -310,7 +310,7 @@ screen.setError( 'ChromeOS was unable to connect to Public Wifi. ' + 'Please select another network or try again.'); - } + }, }, ], }, @@ -488,7 +488,7 @@ screen.setErrorState(2); // offline screen.allowGuestSignin(true); screen.allowOfflineLogin(true); - } + }, }, ], }, @@ -596,7 +596,7 @@ helpLinkText: 'Learn more', }, }, - ] + ], }, { id: 'smart-privacy-protection', @@ -796,7 +796,7 @@ trigger: (screen) => { const error = 'Some error text'; screen.showErrorDialog(error); - } + }, }, ], }, @@ -905,7 +905,7 @@ screen.setArcTransition(3); screen.setManagementEntity('example.com'); screen.setUIStep('progress'); - } + }, }, { id: 'add-management-unknown-admin', @@ -913,21 +913,21 @@ screen.setArcTransition(3); screen.setManagementEntity(''); screen.setUIStep('progress'); - } + }, }, { id: 'error-supervision', trigger: (screen) => { screen.setArcTransition(1); screen.setUIStep('error'); - } + }, }, { id: 'error-management', trigger: (screen) => { screen.setArcTransition(3); screen.setUIStep('error'); - } + }, }, ], }, @@ -940,7 +940,7 @@ id: 'skip-revealed', trigger: (screen) => { screen.showSkipButton(); - } + }, }], }, { @@ -991,8 +991,8 @@ isChildAccount: false, isArcRestricted: true, }, - } - ] + }, + ], }, { id: 'consolidated-consent', @@ -1137,7 +1137,7 @@ }, }, - ] + ], }, { id: 'guest-tos', @@ -1186,7 +1186,7 @@ crosEulaUrl: 'https://www.google.com/intl/en/chrome/terms/', }, }, - ] + ], }, { id: 'hw-data-collection', @@ -1235,23 +1235,23 @@ id: 'clear-error', trigger: (screen) => { (screen.$).pinKeyboard.hideProblem_(); - } + }, }, { id: 'error-warning', trigger: (screen) => { (screen.$).pinKeyboard.showProblem_( MessageType.TOO_WEAK, ProblemType.WARNING); - } + }, }, { id: 'error-error', trigger: (screen) => { (screen.$).pinKeyboard.showProblem_( MessageType.TOO_LONG, ProblemType.ERROR); - } - } - ] + }, + }, + ], }, { id: 'arc-tos', @@ -1692,7 +1692,7 @@ () => { this.debuggerButton_.setAttribute('hidden', true); }, - BUTTON_COMMAND_DELAY + BUTTON_COMMAND_DELAY, ]; } @@ -1701,7 +1701,7 @@ () => { this.debuggerButton_.removeAttribute('hidden'); }, - BUTTON_COMMAND_DELAY + BUTTON_COMMAND_DELAY, ]; } @@ -1712,7 +1712,7 @@ () => { this.triggerScreenState(screenId, stateId); }, - SCREEN_LOADING_DELAY + SCREEN_LOADING_DELAY, ]; } @@ -1724,7 +1724,7 @@ console.info('Making screenshot for ' + id); chrome.send('debug.captureScreenshot', [id]); }, - SCREENSHOT_CAPTURE_DELAY + SCREENSHOT_CAPTURE_DELAY, ]; }
diff --git a/chrome/browser/resources/chromeos/login/screens/common/arc_terms_of_service.js b/chrome/browser/resources/chromeos/login/screens/common/arc_terms_of_service.js index 997d69f..bd45ce0 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/arc_terms_of_service.js +++ b/chrome/browser/resources/chromeos/login/screens/common/arc_terms_of_service.js
@@ -355,7 +355,7 @@ matches: [this.getTermsOfServiceHostNameForMatchPattern_() + '/*'], css: {files: ['playstore.css']}, js: {files: ['playstore.js']}, - run_at: 'document_end' + run_at: 'document_end', }]); var overlayUrl = this.$.arcTosOverlayWebview; @@ -363,7 +363,7 @@ name: 'postProcess', matches: ['https://support.google.com/*'], css: {files: ['overlay.css']}, - run_at: 'document_end' + run_at: 'document_end', }]); } @@ -479,7 +479,7 @@ name: 'preProcess', matches: [this.getTermsOfServiceHostNameForMatchPattern_() + '/*'], js: {code: scriptSetParameters}, - run_at: 'document_start' + run_at: 'document_start', }]); // Try to use currently loaded document first. @@ -529,7 +529,7 @@ matches: [this.getTermsOfServiceHostNameForMatchPattern_() + '/*'], css: {files: ['playstore.css']}, js: {files: ['playstore.js']}, - run_at: 'document_end' + run_at: 'document_end', }]); } @@ -554,8 +554,10 @@ this.enableButtons_(false); chrome.send('arcTermsOfServiceAccept', [ - this.backupRestore, this.locationService, this.reviewSettings, - this.tosContent_ + this.backupRestore, + this.locationService, + this.reviewSettings, + this.tosContent_, ]); }
diff --git a/chrome/browser/resources/chromeos/login/screens/common/assistant_optin.js b/chrome/browser/resources/chromeos/login/screens/common/assistant_optin.js index 11b45d6..3cfe154 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/assistant_optin.js +++ b/chrome/browser/resources/chromeos/login/screens/common/assistant_optin.js
@@ -28,8 +28,11 @@ get EXTERNAL_API() { return [ - 'reloadContent', 'addSettingZippy', 'showNextScreen', - 'onVoiceMatchUpdate', 'onValuePropUpdate' + 'reloadContent', + 'addSettingZippy', + 'showNextScreen', + 'onVoiceMatchUpdate', + 'onValuePropUpdate', ]; }
diff --git a/chrome/browser/resources/chromeos/login/screens/common/consolidated_consent.js b/chrome/browser/resources/chromeos/login/screens/common/consolidated_consent.js index 5ca00c5..ea6130a 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/consolidated_consent.js +++ b/chrome/browser/resources/chromeos/login/screens/common/consolidated_consent.js
@@ -272,7 +272,7 @@ name: 'preProcess', matches: [this.getArcTosHostNameForMatchPattern_() + '/*'], js: {code: scriptSetParameters}, - run_at: 'document_start' + run_at: 'document_start', }]); webview.addContentScripts([{ @@ -280,14 +280,14 @@ matches: [this.getArcTosHostNameForMatchPattern_() + '/*'], css: {files: ['playstore.css']}, js: {files: ['playstore.js']}, - run_at: 'document_end' + run_at: 'document_end', }]); this.$.arcTosOverlayWebview.addContentScripts([{ name: 'postProcess', matches: ['https://support.google.com/*'], css: {files: ['overlay.css']}, - run_at: 'document_end' + run_at: 'document_end', }]); webview.addEventListener('newwindow', (event) => { @@ -648,8 +648,10 @@ onAcceptClick_() { chrome.send('ToSAccept', [ - this.usageChecked, this.backupChecked, this.locationChecked, - this.arcTosContent_ + this.usageChecked, + this.backupChecked, + this.locationChecked, + this.arcTosContent_, ]); } @@ -690,7 +692,7 @@ matches: [this.getArcTosHostNameForMatchPattern_() + '/*'], css: {files: ['playstore.css']}, js: {files: ['playstore.js']}, - run_at: 'document_end' + run_at: 'document_end', }]); } }
diff --git a/chrome/browser/resources/chromeos/login/screens/common/error_message.js b/chrome/browser/resources/chromeos/login/screens/common/error_message.js index 11fc43f..e44439d 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/error_message.js +++ b/chrome/browser/resources/chromeos/login/screens/common/error_message.js
@@ -330,8 +330,8 @@ 'autoEnrollmentOfflineMessageBody', { substitutions: [ loadTimeData.getString('deviceType'), - '<b>' + this.currentNetworkName_ + '</b>' - ] + '<b>' + this.currentNetworkName_ + '</b>', + ], }, 'auto-enrollment-learn-more'); this.shadowRoot.querySelector('#auto-enrollment-learn-more').onclick =
diff --git a/chrome/browser/resources/chromeos/login/screens/common/family_link_notice.js b/chrome/browser/resources/chromeos/login/screens/common/family_link_notice.js index af535dd..6220e561 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/family_link_notice.js +++ b/chrome/browser/resources/chromeos/login/screens/common/family_link_notice.js
@@ -70,7 +70,7 @@ return [ 'setDisplayEmail', 'setDomain', - 'setIsNewGaiaAccount' + 'setIsNewGaiaAccount', ]; }
diff --git a/chrome/browser/resources/chromeos/login/screens/common/fingerprint_setup.js b/chrome/browser/resources/chromeos/login/screens/common/fingerprint_setup.js index 629117ef..bff6685 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/fingerprint_setup.js +++ b/chrome/browser/resources/chromeos/login/screens/common/fingerprint_setup.js
@@ -99,7 +99,7 @@ */ isChildAccount_: { type: Boolean, - } + }, }; }
diff --git a/chrome/browser/resources/chromeos/login/screens/common/gaia_signin.js b/chrome/browser/resources/chromeos/login/screens/common/gaia_signin.js index 206ce2c..3759124 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/gaia_signin.js +++ b/chrome/browser/resources/chromeos/login/screens/common/gaia_signin.js
@@ -221,7 +221,7 @@ isFirstSigninStep_: { type: Boolean, computed: 'isFirstSigninStep(uiStep, canGaiaGoBack_, isSaml_)', - observer: 'onIsFirstSigninStepChanged' + observer: 'onIsFirstSigninStepChanged', }, /*
diff --git a/chrome/browser/resources/chromeos/login/screens/common/gesture_navigation.js b/chrome/browser/resources/chromeos/login/screens/common/gesture_navigation.js index 60a8261..90f4b94 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/gesture_navigation.js +++ b/chrome/browser/resources/chromeos/login/screens/common/gesture_navigation.js
@@ -12,7 +12,7 @@ INTRO: 'gestureIntro', HOME: 'gestureHome', OVERVIEW: 'gestureOverview', - BACK: 'gestureBack' + BACK: 'gestureBack', }; /**
diff --git a/chrome/browser/resources/chromeos/login/screens/common/marketing_opt_in.js b/chrome/browser/resources/chromeos/login/screens/common/marketing_opt_in.js index 90dca5a..761b24a9 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/marketing_opt_in.js +++ b/chrome/browser/resources/chromeos/login/screens/common/marketing_opt_in.js
@@ -208,7 +208,7 @@ */ onA11yNavButtonsSettingChanged_() { chrome.send('login.MarketingOptInScreen.setA11yNavigationButtonsEnabled', [ - this.$.a11yNavButtonToggle.checked + this.$.a11yNavButtonToggle.checked, ]); }
diff --git a/chrome/browser/resources/chromeos/login/screens/common/offline_ad_login.js b/chrome/browser/resources/chromeos/login/screens/common/offline_ad_login.js index 7a733e9e..728bf94a 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/offline_ad_login.js +++ b/chrome/browser/resources/chromeos/login/screens/common/offline_ad_login.js
@@ -125,7 +125,7 @@ errorState: { type: Number, value: ActiveDirectoryErrorState.NONE, - observer: 'errorStateObserver_' + observer: 'errorStateObserver_', }, /** * Whether machine name input should be invalid. @@ -133,7 +133,7 @@ machineNameInvalid: { type: Boolean, value: false, - observer: 'machineNameInvalidObserver_' + observer: 'machineNameInvalidObserver_', }, /** * Whether username input should be invalid. @@ -146,7 +146,7 @@ authPasswordInvalid: { type: Boolean, value: false, - observer: 'authPasswordInvalidObserver_' + observer: 'authPasswordInvalidObserver_', }, /** * Whether unlock password input should be invalid. @@ -154,7 +154,7 @@ unlockPasswordInvalid: { type: Boolean, value: false, - observer: 'unlockPasswordInvalidObserver_' + observer: 'unlockPasswordInvalidObserver_', }, /**
diff --git a/chrome/browser/resources/chromeos/login/screens/common/oobe_eula.js b/chrome/browser/resources/chromeos/login/screens/common/oobe_eula.js index d6f30d4..e7e78f1 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/oobe_eula.js +++ b/chrome/browser/resources/chromeos/login/screens/common/oobe_eula.js
@@ -20,7 +20,7 @@ ' e.textContent=el.textContent + "(" + el.href + ")";' + ' }' + ' el.parentNode.replaceChild(e,el);' + - '}' + '}', }; const EULA_FONTS_CSS = { @@ -30,7 +30,7 @@ line-height: 20px !important;} body h2 { font-size: 15px !important; - line-height: 22px !important;}` + line-height: 22px !important;}`, }; /** @@ -317,7 +317,7 @@ */ backButtonHidden_: { type: Boolean, - } + }, }; } @@ -334,8 +334,10 @@ get EXTERNAL_API() { return [ - 'setUsageStats', 'showAdditionalTosDialog', 'showSecuritySettingsDialog', - 'setTpmDesc' + 'setUsageStats', + 'showAdditionalTosDialog', + 'showSecuritySettingsDialog', + 'setTpmDesc', ]; }
diff --git a/chrome/browser/resources/chromeos/login/screens/common/oobe_reset.js b/chrome/browser/resources/chromeos/login/screens/common/oobe_reset.js index d222481..e56056f 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/oobe_reset.js +++ b/chrome/browser/resources/chromeos/login/screens/common/oobe_reset.js
@@ -27,20 +27,22 @@ /** @type {Map<number, Object<string,string>>} */ const POWERWASH_MODE_DETAILS = new Map([ [ - POWERWASH_MODE.POWERWASH_WITH_ROLLBACK, { + POWERWASH_MODE.POWERWASH_WITH_ROLLBACK, + { subtitleText: 'resetPowerwashRollbackWarningDetails', dialogTitle: 'confirmRollbackTitle', dialogContent: 'confirmRollbackMessage', buttonTextKey: 'resetButtonPowerwashAndRollback', - } + }, ], [ - POWERWASH_MODE.POWERWASH_ONLY, { + POWERWASH_MODE.POWERWASH_ONLY, + { subtitleText: 'resetPowerwashWarningDetails', dialogTitle: 'confirmPowerwashTitle', dialogContent: 'confirmPowerwashMessage', buttonTextKey: 'resetButtonPowerwash', - } + }, ], ]); @@ -138,13 +140,13 @@ // The subtitle to be shown while the screen is in POWERWASH_PROPOSAL powerwashStateSubtitle_: { type: String, - computed: 'getPowerwashStateSubtitle_(locale, powerwashMode_)' + computed: 'getPowerwashStateSubtitle_(locale, powerwashMode_)', }, // The text shown on the powerwash button. (depends on powerwash mode) powerwashButtonTextKey_: { type: String, - computed: 'getPowerwashButtonTextKey_(locale, powerwashMode_)' + computed: 'getPowerwashButtonTextKey_(locale, powerwashMode_)', }, // Whether the powerwash button is disabled.
diff --git a/chrome/browser/resources/chromeos/login/screens/common/os_install.js b/chrome/browser/resources/chromeos/login/screens/common/os_install.js index 3ef772c..e6838f21 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/os_install.js +++ b/chrome/browser/resources/chromeos/login/screens/common/os_install.js
@@ -25,8 +25,10 @@ */ const OsInstallScreenElementBase = Polymer.mixinBehaviors( [ - OobeI18nBehavior, OobeDialogHostBehavior, LoginScreenBehavior, - MultiStepBehavior + OobeI18nBehavior, + OobeDialogHostBehavior, + LoginScreenBehavior, + MultiStepBehavior, ], Polymer.Element);
diff --git a/chrome/browser/resources/chromeos/login/screens/common/pin_setup.js b/chrome/browser/resources/chromeos/login/screens/common/pin_setup.js index e77cb60..c3404938 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/pin_setup.js +++ b/chrome/browser/resources/chromeos/login/screens/common/pin_setup.js
@@ -79,7 +79,7 @@ type: Object, value() { return settings.recordLockScreenProgress; - } + }, }, /**
diff --git a/chrome/browser/resources/chromeos/login/screens/common/saml_confirm_password.js b/chrome/browser/resources/chromeos/login/screens/common/saml_confirm_password.js index 3668084..14ad12e 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/saml_confirm_password.js +++ b/chrome/browser/resources/chromeos/login/screens/common/saml_confirm_password.js
@@ -53,7 +53,7 @@ isManualInput: { type: Boolean, value: false, - } + }, }; }
diff --git a/chrome/browser/resources/chromeos/login/screens/common/signin_fatal_error.js b/chrome/browser/resources/chromeos/login/screens/common/signin_fatal_error.js index 2ce31e5b..090d37f 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/signin_fatal_error.js +++ b/chrome/browser/resources/chromeos/login/screens/common/signin_fatal_error.js
@@ -43,7 +43,7 @@ */ errorSubtitle_: { type: String, - computed: 'computeSubtitle_(locale, errorState_, params_)' + computed: 'computeSubtitle_(locale, errorState_, params_)', }, /**
diff --git a/chrome/browser/resources/chromeos/login/screens/common/smart_privacy_protection.js b/chrome/browser/resources/chromeos/login/screens/common/smart_privacy_protection.js index 43721ab..3300de0 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/smart_privacy_protection.js +++ b/chrome/browser/resources/chromeos/login/screens/common/smart_privacy_protection.js
@@ -64,7 +64,7 @@ // TODO(dkuzmin): change the default value once appropriate capability // is available on C++ side. value: true, - } + }, }; }
diff --git a/chrome/browser/resources/chromeos/login/screens/common/sync_consent.js b/chrome/browser/resources/chromeos/login/screens/common/sync_consent.js index 1a18a9e..ea30107 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/sync_consent.js +++ b/chrome/browser/resources/chromeos/login/screens/common/sync_consent.js
@@ -71,7 +71,7 @@ optInButtonTextKey_: { type: String, computed: 'getOptInButtonTextKey_(isMinorMode_)', - } + }, }; } @@ -156,9 +156,11 @@ onSettingsSaveAndContinue_(e, opted_in) { assert(e.composedPath()); chrome.send('login.SyncConsentScreen.continue', [ - opted_in, this.$.reviewSettingsBox.checked, this.getConsentDescription_(), + opted_in, + this.$.reviewSettingsBox.checked, + this.getConsentDescription_(), this.getConsentConfirmation_( - /** @type {!Array<!HTMLElement>} */ (e.composedPath())) + /** @type {!Array<!HTMLElement>} */ (e.composedPath())), ]); }
diff --git a/chrome/browser/resources/chromeos/login/screens/common/theme_selection.js b/chrome/browser/resources/chromeos/login/screens/common/theme_selection.js index 740ddc12..34607a26 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/theme_selection.js +++ b/chrome/browser/resources/chromeos/login/screens/common/theme_selection.js
@@ -61,7 +61,7 @@ isInTabletMode_: { type: Boolean, value: false, - } + }, }; } @@ -88,6 +88,10 @@ this.selectedTheme = 'auto'; } + onBeforeShow(data) { + this.selectedTheme = 'selectedTheme' in data && data.selectedTheme; + } + getOobeUIInitialState() { return OOBE_UI_STATE.THEME_SELECTION; }
diff --git a/chrome/browser/resources/chromeos/login/screens/common/user_creation.js b/chrome/browser/resources/chromeos/login/screens/common/user_creation.js index 735b848175..65bf4fed 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/user_creation.js +++ b/chrome/browser/resources/chromeos/login/screens/common/user_creation.js
@@ -13,7 +13,9 @@ */ const UserCreationScreenElementBase = Polymer.mixinBehaviors( [ - OobeI18nBehavior, LoginScreenBehavior, MultiStepBehavior + OobeI18nBehavior, + LoginScreenBehavior, + MultiStepBehavior, ], Polymer.Element);
diff --git a/chrome/browser/resources/chromeos/login/screens/login/lacros_data_migration.js b/chrome/browser/resources/chromeos/login/screens/login/lacros_data_migration.js index 889c27c..9f27d8d 100644 --- a/chrome/browser/resources/chromeos/login/screens/login/lacros_data_migration.js +++ b/chrome/browser/resources/chromeos/login/screens/login/lacros_data_migration.js
@@ -16,8 +16,10 @@ */ const LacrosDataMigrationScreenElementBase = Polymer.mixinBehaviors( [ - OobeDialogHostBehavior, OobeI18nBehavior, LoginScreenBehavior, - MultiStepBehavior + OobeDialogHostBehavior, + OobeI18nBehavior, + LoginScreenBehavior, + MultiStepBehavior, ], Polymer.Element); @@ -44,7 +46,7 @@ canSkip_: {type: Boolean}, lowBatteryStatus_: {type: Boolean}, requiredSizeStr_: {type: String}, - showGotoFiles_: {type: Boolean} + showGotoFiles_: {type: Boolean}, }; } @@ -61,8 +63,10 @@ get EXTERNAL_API() { return [ - 'setProgressValue', 'showSkipButton', 'setLowBatteryStatus', - 'setFailureStatus' + 'setProgressValue', + 'showSkipButton', + 'setLowBatteryStatus', + 'setFailureStatus', ]; }
diff --git a/chrome/browser/resources/chromeos/login/screens/login/management_transition.js b/chrome/browser/resources/chromeos/login/screens/login/management_transition.js index 5401d64..2846f524 100644 --- a/chrome/browser/resources/chromeos/login/screens/login/management_transition.js +++ b/chrome/browser/resources/chromeos/login/screens/login/management_transition.js
@@ -54,7 +54,7 @@ * String that represents management entity for the user. Can be domain or * admin name. */ - managementEntity_: String + managementEntity_: String, }; }
diff --git a/chrome/browser/resources/chromeos/login/screens/login/update_required_card.js b/chrome/browser/resources/chromeos/login/screens/login/update_required_card.js index 81c0391..3589fdfd 100644 --- a/chrome/browser/resources/chromeos/login/screens/login/update_required_card.js +++ b/chrome/browser/resources/chromeos/login/screens/login/update_required_card.js
@@ -21,7 +21,7 @@ UPDATE_COMPLETED_NEED_REBOOT: 'update-completed-need-reboot', UPDATE_ERROR: 'update-error', EOL_REACHED: 'eol', - UPDATE_NO_NETWORK: 'update-no-network' + UPDATE_NO_NETWORK: 'update-no-network', }; /**
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/demo_setup.js b/chrome/browser/resources/chromeos/login/screens/oobe/demo_setup.js index 4d24c2aa..0c15c570 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/demo_setup.js +++ b/chrome/browser/resources/chromeos/login/screens/oobe/demo_setup.js
@@ -27,8 +27,10 @@ */ const DemoSetupScreenBase = Polymer.mixinBehaviors( [ - OobeI18nBehavior, OobeDialogHostBehavior, LoginScreenBehavior, - MultiStepBehavior + OobeI18nBehavior, + OobeDialogHostBehavior, + LoginScreenBehavior, + MultiStepBehavior, ], Polymer.Element); @@ -50,7 +52,7 @@ value() { return /** @type {!Object} */ ( loadTimeData.getValue('demoSetupSteps')); - } + }, }, /** Which step index is currently running in Demo Mode setup. */
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/enterprise_enrollment.js b/chrome/browser/resources/chromeos/login/screens/oobe/enterprise_enrollment.js index 3bbaab8f1..8a56585 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/enterprise_enrollment.js +++ b/chrome/browser/resources/chromeos/login/screens/oobe/enterprise_enrollment.js
@@ -171,9 +171,13 @@ get EXTERNAL_API() { return [ - 'doReload', 'setAdJoinConfiguration', 'setAdJoinParams', - 'setEnterpriseDomainInfo', 'showAttributePromptStep', 'showError', - 'showStep' + 'doReload', + 'setAdJoinConfiguration', + 'setAdJoinParams', + 'setEnterpriseDomainInfo', + 'showAttributePromptStep', + 'showError', + 'showStep', ]; } @@ -221,8 +225,11 @@ this.$['step-ad-join'].disabled = true; this.$['step-ad-join'].loading = true; chrome.send('oauthEnrollAdCompleteLogin', [ - e.detail.machine_name, e.detail.distinguished_name, - e.detail.encryption_types, e.detail.username, e.detail.password + e.detail.machine_name, + e.detail.distinguished_name, + e.detail.encryption_types, + e.detail.username, + e.detail.password, ]); }); @@ -261,7 +268,7 @@ name: 'injectedTabHandler', matches: ['http://*/*', 'https://*/*'], js: {code: KEYBOARD_UTILS_FOR_INJECTION}, - run_at: 'document_start' + run_at: 'document_start', }]); }
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/quick_start.js b/chrome/browser/resources/chromeos/login/screens/oobe/quick_start.js index 8eff2203..b6cacd82 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/quick_start.js +++ b/chrome/browser/resources/chromeos/login/screens/oobe/quick_start.js
@@ -43,7 +43,7 @@ type: Object, // Should be in sync with the C++ enum (ash::quick_start::Shape). value: {CIRCLE: 0, DIAMOND: 1, TRIANGLE: 2, SQUARE: 3}, - readOnly: true + readOnly: true, }, }; }
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/update.js b/chrome/browser/resources/chromeos/login/screens/oobe/update.js index a93391c8..3069081 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/update.js +++ b/chrome/browser/resources/chromeos/login/screens/oobe/update.js
@@ -17,7 +17,21 @@ // Thresholds which are used to determine when update status announcement should // take place. Last element is not reachable to simplify implementation. const PERCENT_THRESHOLDS = [ - 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 95, 98, 99, 100, UNREACHABLE_PERCENT + 0, + 10, + 20, + 30, + 40, + 50, + 60, + 70, + 80, + 90, + 95, + 98, + 99, + 100, + UNREACHABLE_PERCENT, ]; /** @@ -143,7 +157,7 @@ isOptOutEnabled: { type: Boolean, value: false, - } + }, }; }
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/welcome.js b/chrome/browser/resources/chromeos/login/screens/oobe/welcome.js index e07e0ef..8eb6eb5 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/welcome.js +++ b/chrome/browser/resources/chromeos/login/screens/oobe/welcome.js
@@ -750,7 +750,7 @@ // Set a timeout that gives the ChromeVox hint in the default locale. const ttsOptions = /** @type {!chrome.tts.TtsOptions} */ ({ lang: DEFAULT_CHROMEVOX_HINT_LOCALE, - extensionId: DEFAULT_CHROMEVOX_HINT_VOICE_EXTENSION_ID + extensionId: DEFAULT_CHROMEVOX_HINT_VOICE_EXTENSION_ID, }); this.defaultChromeVoxHintTimeoutId_ = window.setTimeout( () => this.giveChromeVoxHint_(
diff --git a/chrome/browser/resources/chromeos/login/security_token_pin_browsertest.js b/chrome/browser/resources/chromeos/login/security_token_pin_browsertest.js index c28547f..2cdcbbd 100644 --- a/chrome/browser/resources/chromeos/login/security_token_pin_browsertest.js +++ b/chrome/browser/resources/chromeos/login/security_token_pin_browsertest.js
@@ -43,7 +43,7 @@ enableUserInput: true, hasError: false, formattedError: '', - formattedAttemptsLeft: '' + formattedAttemptsLeft: '', }; let securityTokenPin; @@ -116,7 +116,7 @@ enableUserInput: true, hasError: true, formattedError: '', - formattedAttemptsLeft: '' + formattedAttemptsLeft: '', }; // The user enters some value. No new 'completed' event is triggered so far. @@ -182,7 +182,7 @@ enableUserInput: true, hasError: true, formattedError: '', - formattedAttemptsLeft: '' + formattedAttemptsLeft: '', }; assertFalse(inputField.disabled); @@ -194,7 +194,7 @@ enableUserInput: false, hasError: true, formattedError: '', - formattedAttemptsLeft: '' + formattedAttemptsLeft: '', }; assertTrue(inputField.disabled); }); @@ -212,7 +212,7 @@ enableUserInput: true, hasError: true, formattedError: '', - formattedAttemptsLeft: '' + formattedAttemptsLeft: '', }; assertEquals(pinInput.value, ''); assertEquals(inputField.value, ''); @@ -234,7 +234,7 @@ enableUserInput: false, hasError: true, formattedError: '', - formattedAttemptsLeft: '' + formattedAttemptsLeft: '', }; assertEquals(pinInput.value, ''); assertEquals(inputField.value, ''); @@ -319,7 +319,7 @@ enableUserInput: true, hasError: true, formattedError: '', - formattedAttemptsLeft: '' + formattedAttemptsLeft: '', }; assertEquals(getErrorContainerVisibility(), 'visible'); assertTrue(pinInput.hasAttribute('invalid')); @@ -336,7 +336,7 @@ enableUserInput: true, hasError: true, formattedError: 'Invalid PIN.', - formattedAttemptsLeft: '' + formattedAttemptsLeft: '', }; assertEquals(errorElement.textContent, 'Invalid PIN.'); }); @@ -347,7 +347,7 @@ enableUserInput: false, hasError: true, formattedError: 'Maximum allowed attempts exceeded.', - formattedAttemptsLeft: '' + formattedAttemptsLeft: '', }; assertEquals( errorElement.textContent, 'Maximum allowed attempts exceeded.'); @@ -359,7 +359,7 @@ enableUserInput: true, hasError: false, formattedError: '', - formattedAttemptsLeft: '3 attempts left' + formattedAttemptsLeft: '3 attempts left', }; assertEquals(errorElement.textContent, '3 attempts left'); }); @@ -407,7 +407,7 @@ enableUserInput: true, hasError: true, formattedError: '', - formattedAttemptsLeft: '' + formattedAttemptsLeft: '', }; // The PIN keyboard is shown again, replacing the animation UI. assertFalse(pinKeyboardContainer.hidden); @@ -436,7 +436,7 @@ enableUserInput: true, hasError: true, formattedError: '', - formattedAttemptsLeft: '' + formattedAttemptsLeft: '', }; // The PIN keyboard is shown again, replacing the animation UI. assertFalse(pinKeyboardContainer.hidden);
diff --git a/chrome/browser/resources/chromeos/multidevice_internals/browser_tabs_model_form.js b/chrome/browser/resources/chromeos/multidevice_internals/browser_tabs_model_form.js index c0c83ee..9ec2e8b7 100644 --- a/chrome/browser/resources/chromeos/multidevice_internals/browser_tabs_model_form.js +++ b/chrome/browser/resources/chromeos/multidevice_internals/browser_tabs_model_form.js
@@ -79,7 +79,7 @@ const syncDisabledBrowserTabsModel = { isTabSyncEnabled: false, browserTabOneMetadata: null, - browserTabTwoMetadata: null + browserTabTwoMetadata: null, }; this.browserProxy_.setBrowserTabs(syncDisabledBrowserTabsModel); return; @@ -88,7 +88,7 @@ const browserTabsModel = { isTabSyncEnabled: this.isTabSyncEnabled_, browserTabOneMetadata: this.browserTabOneMetadata_, - browserTabTwoMetadata: this.browserTabTwoMetadata_ + browserTabTwoMetadata: this.browserTabTwoMetadata_, }; this.browserProxy_.setBrowserTabs(browserTabsModel); },
diff --git a/chrome/browser/resources/chromeos/multidevice_internals/phone_status_model_form.js b/chrome/browser/resources/chromeos/multidevice_internals/phone_status_model_form.js index 28fd9586..857d275b 100644 --- a/chrome/browser/resources/chromeos/multidevice_internals/phone_status_model_form.js +++ b/chrome/browser/resources/chromeos/multidevice_internals/phone_status_model_form.js
@@ -20,7 +20,7 @@ const mobileStatusToStringMap = new Map([ [MobileStatus.NO_SIM, 'No SIM'], [MobileStatus.SIM_BUT_NO_RECEPTION, 'SIM but no reception'], - [MobileStatus.SIM_WITH_RECEPTION, 'SIM with reception'] + [MobileStatus.SIM_WITH_RECEPTION, 'SIM with reception'], ]); /**
diff --git a/chrome/browser/resources/chromeos/multidevice_internals/phonehub_tab.js b/chrome/browser/resources/chromeos/multidevice_internals/phonehub_tab.js index 1b07f1ab..dfb5bb7 100644 --- a/chrome/browser/resources/chromeos/multidevice_internals/phonehub_tab.js +++ b/chrome/browser/resources/chromeos/multidevice_internals/phonehub_tab.js
@@ -29,11 +29,11 @@ [FeatureStatus.NOT_ELIGIBLE_FOR_FEATURE, 'Not eligible for feature'], [ FeatureStatus.ELIGIBLE_PHONE_BUT_NOT_SETUP, - 'Eligible for phone but not setup' + 'Eligible for phone but not setup', ], [ FeatureStatus.PHONE_SELECTED_AND_PENDING_SETUP, - 'Phone selected and pending setup' + 'Phone selected and pending setup', ], [FeatureStatus.DISABLED, 'Disabled'], [FeatureStatus.UNAVAILABLE_BLUETOOTH_OFF, 'Unavailable bluetooth off'], @@ -63,14 +63,14 @@ shouldEnableFakePhoneHubManager_: { type: Boolean, value: false, - observer: 'onShouldEnableFakePhoneHubManagerChanged_' + observer: 'onShouldEnableFakePhoneHubManagerChanged_', }, /** @private */ shouldShowOnboardingFlow_: { type: Boolean, value: false, - observer: 'onShouldShowOnboardingFlowChanged_' + observer: 'onShouldShowOnboardingFlowChanged_', }, /**
diff --git a/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.js b/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.js index 4662356..7dc56664 100644 --- a/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.js +++ b/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.js
@@ -127,8 +127,9 @@ } chrome.send('metricsHandler:recordInHistogram', [ - 'MultiDevice.PostOOBESetupFlow.PageShown', pageNameValue, - PageNameValue.MAX_VALUE + 'MultiDevice.PostOOBESetupFlow.PageShown', + pageNameValue, + PageNameValue.MAX_VALUE, ]); }, @@ -169,5 +170,5 @@ } return this.i18n(text); - } + }, });
diff --git a/chrome/browser/resources/chromeos/network_ui/network_logs_ui.js b/chrome/browser/resources/chromeos/network_ui/network_logs_ui.js index a683d118..ee3afb6 100644 --- a/chrome/browser/resources/chromeos/network_ui/network_logs_ui.js +++ b/chrome/browser/resources/chromeos/network_ui/network_logs_ui.js
@@ -78,7 +78,7 @@ shillDebugging_: { type: String, value: 'unknown', - } + }, }, observers: ['onShillDebuggingChanged_(shillDebugging_)'],
diff --git a/chrome/browser/resources/chromeos/network_ui/network_state_ui.js b/chrome/browser/resources/chromeos/network_ui/network_state_ui.js index 48b5c6ef..b1d7d47 100644 --- a/chrome/browser/resources/chromeos/network_ui/network_state_ui.js +++ b/chrome/browser/resources/chromeos/network_ui/network_state_ui.js
@@ -34,10 +34,18 @@ * @const */ NETWORK_STATE_FIELDS: [ - 'guid', 'name', 'type', 'connectionState', 'connectable', 'errorState', - 'wifi.security', ['cellular.networkTechnology', 'EAP.EAP'], - 'cellular.activationState', 'cellular.roaming', 'wifi.frequency', - 'wifi.signalStrength' + 'guid', + 'name', + 'type', + 'connectionState', + 'connectable', + 'errorState', + 'wifi.security', + ['cellular.networkTechnology', 'EAP.EAP'], + 'cellular.activationState', + 'cellular.roaming', + 'wifi.frequency', + 'wifi.signalStrength', ], /** @const */
diff --git a/chrome/browser/resources/chromeos/network_ui/network_ui.js b/chrome/browser/resources/chromeos/network_ui/network_ui.js index 2fa5a04..a27ed72 100644 --- a/chrome/browser/resources/chromeos/network_ui/network_ui.js +++ b/chrome/browser/resources/chromeos/network_ui/network_ui.js
@@ -78,7 +78,7 @@ value() { return loadTimeData.valueExists('isGuestModeActive') && loadTimeData.getBoolean('isGuestModeActive'); - } + }, }, }, @@ -98,7 +98,7 @@ { customItemName: 'addWiFiListItemName', polymerIcon: 'cr:add', - customData: 'WiFi' + customData: 'WiFi', }, ];
diff --git a/chrome/browser/resources/chromeos/notification_tester/form_constants.js b/chrome/browser/resources/chromeos/notification_tester/form_constants.js index 74e45f9..63fb2a5 100644 --- a/chrome/browser/resources/chromeos/notification_tester/form_constants.js +++ b/chrome/browser/resources/chromeos/notification_tester/form_constants.js
@@ -55,53 +55,53 @@ TITLE_OPTIONS: [ { displayText: 'Short Sentence (Left-to-Right)', - value: 'Notification Title' + value: 'Notification Title', }, {displayText: 'Short Sentence (Right-to-Left)', value: 'כותרת הודעה'}, { displayText: 'Long Sentence (Left-to-Right)', value: - 'Hamburgers: the cornerstone of any nutritious breakfast. Ch-cheeseburgers' + 'Hamburgers: the cornerstone of any nutritious breakfast. Ch-cheeseburgers', }, { displayText: 'Long Sentence (Right-to-Left)', - value: 'המבורגרים: אבן הפינה של כל ארוחת בוקר מזינה. ציזבורגר' + value: 'המבורגרים: אבן הפינה של כל ארוחת בוקר מזינה. ציזבורגר', }, { displayText: 'Repetitive Characters (Left-to-Right)', - value: 'sshhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh' + value: 'sshhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh', }, { displayText: 'Repetitive Characters (Right-to-Left)', - value: 'שששששששששששששששששששששששששששששששששששששששששששששששששששש' + value: 'שששששששששששששששששששששששששששששששששששששששששששששששששששש', }, {displayText: 'Empty', value: ''}, ], MESSAGE_OPTIONS: [ { displayText: 'One Sentence (Left-to-Right)', - value: 'Notification content' + value: 'Notification content', }, {displayText: 'One Sentence (Right-to-Left)', value: 'תוכן הודעה'}, { displayText: 'Multiple Sentences (Left-to-Right)', value: - 'This is the notification\'s message.It may be able to stretch over multiple lines, or become visible when the notification is expanded by the user, depending on the notification center that\'s being used.' + 'This is the notification\'s message.It may be able to stretch over multiple lines, or become visible when the notification is expanded by the user, depending on the notification center that\'s being used.', }, { displayText: 'Multiple Sentences (Right-to-Left)', value: - 'זהו המסר של ההודעה. זה עשוי להיות מסוגל למתוח על קווים מרובים, או להיות גלוי, כאשר ההודעה מורחבת על ידי המשתמש, בהתאם להודעה שהמרכז נמצא בשימוש' + 'זהו המסר של ההודעה. זה עשוי להיות מסוגל למתוח על קווים מרובים, או להיות גלוי, כאשר ההודעה מורחבת על ידי המשתמש, בהתאם להודעה שהמרכז נמצא בשימוש', }, { displayText: 'Repetitive Characters (Left-to-Right)', value: - 'sshhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh' + 'sshhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh', }, { displayText: 'Repetitive Characters (Right-to-Left)', value: - 'ששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששש' + 'ששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששששש', }, {displayText: 'Unicode Emojis', value: '🌇😃🍈😆🍜🍻😋⛅⛳😚ඞ'}, {displayText: 'Empty', value: ''}, @@ -122,11 +122,11 @@ {displayText: 'No Image', value: 'none'}, { displayText: 'Google Logo (PNG, 180 x 68)', - value: 'google_logo_small_png' + value: 'google_logo_small_png', }, { displayText: 'Chromium Logo (PNG, 192 x 192)', - value: 'chromium_logo_large_png' + value: 'chromium_logo_large_png', }, ], URL_OPTIONS: [ @@ -137,18 +137,18 @@ SOURCE_OPTIONS: [ { displayText: 'Short Sentence (Left-to-Right)', - value: 'Sample Display Source' + value: 'Sample Display Source', }, {displayText: 'Short Sentence (Right-to-Left)', value: 'مصدر عرض العينة'}, { displayText: 'Long Sentence (Left-to-Right)', value: - 'Hamburgers: the cornerstone of any nutritious breakfast. Ch-cheeseburgers' + 'Hamburgers: the cornerstone of any nutritious breakfast. Ch-cheeseburgers', }, { displayText: 'Long Sentence (Right-to-Left)', value: - 'مصدر عرض العينةمصدر عرض العينةمصدر عرض العينةمصدر عرض العينةمصدر عرض العينةمصدر عرض العينة' + 'مصدر عرض العينةمصدر عرض العينةمصدر عرض العينةمصدر عرض العينةمصدر عرض العينةمصدر عرض العينة', }, {displayText: 'Empty', value: ''}, @@ -157,16 +157,16 @@ {displayText: 'Simple', value: NotificationType.NOTIFICATION_TYPE_SIMPLE}, { displayText: 'Base Format', - value: NotificationType.NOTIFICATION_TYPE_BASE_FORMAT + value: NotificationType.NOTIFICATION_TYPE_BASE_FORMAT, }, {displayText: 'Image', value: NotificationType.NOTIFICATION_TYPE_IMAGE}, { displayText: 'Multiple', - value: NotificationType.NOTIFICATION_TYPE_MULTIPLE + value: NotificationType.NOTIFICATION_TYPE_MULTIPLE, }, { displayText: 'Progress', - value: NotificationType.NOTIFICATION_TYPE_PROGRESS + value: NotificationType.NOTIFICATION_TYPE_PROGRESS, }, ], PRIORITY_OPTIONS: [ @@ -183,19 +183,19 @@ { displayText: 'Long Sentence (Left-to-Right)', value: - 'Hamburgers: the cornerstone of any nutritious breakfast. Ch-cheeseburgers' + 'Hamburgers: the cornerstone of any nutritious breakfast. Ch-cheeseburgers', }, { displayText: 'Long Sentence (Right-to-Left)', - value: 'המבורגרים: אבן הפינה של כל ארוחת בוקר מזינה. ציזבורגר' + value: 'המבורגרים: אבן הפינה של כל ארוחת בוקר מזינה. ציזבורגר', }, { displayText: 'Repetitive Characters (Left-to-Right)', - value: 'sshhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh' + value: 'sshhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh', }, { displayText: 'Repetitive Characters (Right-to-Left)', - value: 'שששששששששששששששששששששששששששששששששששששששששששששששששששש' + value: 'שששששששששששששששששששששששששששששששששששששששששששששששששששש', }, {displayText: 'Unicode Emojis', value: '🌇😃🍈😆🍜🍻😋⛅⛳😚ඞ'}, {displayText: 'Empty', value: ''}, @@ -205,5 +205,5 @@ {displayText: 'Group A', value: 'group_a'}, {displayText: 'Group B', value: 'group_b'}, {displayText: 'Group C', value: 'group_c'}, - ] + ], }; \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/parent_access/parent_access_ui.js b/chrome/browser/resources/chromeos/parent_access/parent_access_ui.js index 74f771e8..f1a129dc 100644 --- a/chrome/browser/resources/chromeos/parent_access/parent_access_ui.js +++ b/chrome/browser/resources/chromeos/parent_access/parent_access_ui.js
@@ -115,7 +115,7 @@ const parentAccessResult = await Promise.race([ this.server.whenParentAccessResult(), - this.server.whenInitializationError() + this.server.whenInitializationError(), ]); // Notify ParentAccessUIHandler that we received a result.
diff --git a/chrome/browser/resources/chromeos/password_change/lock_screen_network.js b/chrome/browser/resources/chromeos/password_change/lock_screen_network.js index daf7916..4cbe169 100644 --- a/chrome/browser/resources/chromeos/password_change/lock_screen_network.js +++ b/chrome/browser/resources/chromeos/password_change/lock_screen_network.js
@@ -32,7 +32,7 @@ { customItemName: 'addWiFiListItemName', polymerIcon: 'cr:add', - customData: 'WiFi' + customData: 'WiFi', }, ]; },
diff --git a/chrome/browser/resources/chromeos/password_change/lock_screen_reauth.js b/chrome/browser/resources/chromeos/password_change/lock_screen_reauth.js index 8450d11..aaf58a8 100644 --- a/chrome/browser/resources/chromeos/password_change/lock_screen_reauth.js +++ b/chrome/browser/resources/chromeos/password_change/lock_screen_reauth.js
@@ -228,9 +228,13 @@ onAuthCompletedMessage_(e) { const credentials = e.detail; chrome.send('completeAuthentication', [ - credentials.gaiaId, credentials.email, credentials.password, - credentials.scrapedSAMLPasswords, credentials.usingSAML, - credentials.services, credentials.passwordAttributes + credentials.gaiaId, + credentials.email, + credentials.password, + credentials.scrapedSAMLPasswords, + credentials.usingSAML, + credentials.services, + credentials.passwordAttributes, ]); },
diff --git a/chrome/browser/resources/chromeos/power.js b/chrome/browser/resources/chromeos/power.js index 83382c2e..d43d5617 100644 --- a/chrome/browser/resources/chromeos/power.js +++ b/chrome/browser/resources/chromeos/power.js
@@ -19,7 +19,7 @@ CROSTINI: 2, ARC: 3, CHROME: 4, - SYSTEM: 5 + SYSTEM: 5, }; const devicePixelRatio = window.devicePixelRatio; @@ -407,8 +407,17 @@ var offlineText = loadTimeData.getString('offlineText'); var plotColors = [ - 'Red', 'Blue', 'Green', 'Gold', 'CadetBlue', 'LightCoral', 'LightSlateGray', - 'Peru', 'DarkRed', 'LawnGreen', 'Tan' + 'Red', + 'Blue', + 'Green', + 'Gold', + 'CadetBlue', + 'LightCoral', + 'LightSlateGray', + 'Peru', + 'DarkRed', + 'LawnGreen', + 'Tan', ]; /** @@ -566,7 +575,7 @@ var chargePlot = [{ name: loadTimeData.getString('batteryChargePercentageHeader'), color: 'Blue', - data: [] + data: [], }]; var dischargeRateTimeData = []; var dischargeRateAbsTime = []; @@ -574,18 +583,18 @@ { name: loadTimeData.getString('dischargeRateLegendText'), color: 'Red', - data: [] + data: [], }, { name: loadTimeData.getString('movingAverageLegendText'), color: 'Green', - data: [] + data: [], }, { name: loadTimeData.getString('binnedAverageLegendText'), color: 'Blue', - data: [] - } + data: [], + }, ]; var minDischargeRate = 1000; // A high unrealistic number to begin with. var maxDischargeRate = -1000; // A low unrealistic number to begin with. @@ -638,7 +647,7 @@ var canvases = addCanvases( [ loadTimeData.getString('batteryChargePercentageHeader'), - loadTimeData.getString('batteryDischargeRateHeader') + loadTimeData.getString('batteryDischargeRateHeader'), ], plotsDiv);
diff --git a/chrome/browser/resources/chromeos/set_time_dialog/set_time_dialog.js b/chrome/browser/resources/chromeos/set_time_dialog/set_time_dialog.js index 6b13d0cb..a595cec 100644 --- a/chrome/browser/resources/chromeos/set_time_dialog/set_time_dialog.js +++ b/chrome/browser/resources/chromeos/set_time_dialog/set_time_dialog.js
@@ -54,7 +54,7 @@ localDate.setMinutes(date.getMinutes() - date.getTimezoneOffset()); return { date: localDate.toISOString().slice(0, 10), - time: localDate.toISOString().slice(11, 16) + time: localDate.toISOString().slice(11, 16), }; }
diff --git a/chrome/browser/resources/chromeos/sys_internals/constants.js b/chrome/browser/resources/chromeos/sys_internals/constants.js index 01af237..d378d00 100644 --- a/chrome/browser/resources/chromeos/sys_internals/constants.js +++ b/chrome/browser/resources/chromeos/sys_internals/constants.js
@@ -27,8 +27,14 @@ export const INFO_PAGE_PRECISION = 2; export const /** !Array<string> */ CPU_COLOR_SET = [ - '#2fa2ff', '#ff93e2', '#a170d0', '#fe6c6c', '#2561a4', '#15b979', '#fda941', - '#79dbcd' + '#2fa2ff', + '#ff93e2', + '#a170d0', + '#fe6c6c', + '#2561a4', + '#15b979', + '#fda941', + '#79dbcd', ]; export const /** !Array<string> */ MEMORY_COLOR_SET =
diff --git a/chrome/browser/resources/chromeos/sys_internals/line_chart/constants.js b/chrome/browser/resources/chromeos/sys_internals/line_chart/constants.js index 968f4fd..23bfb58 100644 --- a/chrome/browser/resources/chromeos/sys_internals/line_chart/constants.js +++ b/chrome/browser/resources/chromeos/sys_internals/line_chart/constants.js
@@ -150,5 +150,5 @@ */ export const UnitLabelAlign = { LEFT: 0, - RIGHT: 1 + RIGHT: 1, };
diff --git a/chrome/browser/resources/commander/option.ts b/chrome/browser/resources/commander/option.ts index 8e94d45b..595c8efb 100644 --- a/chrome/browser/resources/commander/option.ts +++ b/chrome/browser/resources/commander/option.ts
@@ -47,7 +47,7 @@ if (start !== 0) { result.push({ text: this.model.title.substring(firstNonmatch, start), - isMatch: false + isMatch: false, }); } result.push(
diff --git a/chrome/browser/resources/connectors_internals/connectors_tabs.ts b/chrome/browser/resources/connectors_internals/connectors_tabs.ts index 1e3fc1f..7c52d35 100644 --- a/chrome/browser/resources/connectors_internals/connectors_tabs.ts +++ b/chrome/browser/resources/connectors_internals/connectors_tabs.ts
@@ -28,7 +28,7 @@ const connectorTabs: ConnectorTab[] = [{ title: 'Zero Trust', directive: ZeroTrustConnectorElement.is, - isEnabled: loadTimeData.getBoolean('zeroTrustConnectorEnabled') + isEnabled: loadTimeData.getBoolean('zeroTrustConnectorEnabled'), }]; export class ConnectorsTabsElement extends CustomElement {
diff --git a/chrome/browser/resources/connectors_internals/zero_trust_connector.ts b/chrome/browser/resources/connectors_internals/zero_trust_connector.ts index fe96080..d69c2b4 100644 --- a/chrome/browser/resources/connectors_internals/zero_trust_connector.ts +++ b/chrome/browser/resources/connectors_internals/zero_trust_connector.ts
@@ -10,13 +10,13 @@ const TrustLevelStringMap = { [KeyTrustLevel.UNSPECIFIED]: 'Unspecified', [KeyTrustLevel.HW]: 'HW', - [KeyTrustLevel.OS]: 'OS' + [KeyTrustLevel.OS]: 'OS', }; const KeyTypeStringMap = { [KeyType.UNKNOWN]: 'Unknown', [KeyType.RSA]: 'RSA', - [KeyType.EC]: 'EC' + [KeyType.EC]: 'EC', }; export class ZeroTrustConnectorElement extends CustomElement {
diff --git a/chrome/browser/resources/cryptotoken/b64.js b/chrome/browser/resources/cryptotoken/b64.js index d7176af..dd8290c 100644 --- a/chrome/browser/resources/cryptotoken/b64.js +++ b/chrome/browser/resources/cryptotoken/b64.js
@@ -71,7 +71,7 @@ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 0, 0, 0, 0, 64, 0, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 0, 0, 0, 0, 0 + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 0, 0, 0, 0, 0, ]; function B64_decode(string) {
diff --git a/chrome/browser/resources/cryptotoken/enroller.js b/chrome/browser/resources/cryptotoken/enroller.js index e48f655..e4e12ae 100644 --- a/chrome/browser/resources/cryptotoken/enroller.js +++ b/chrome/browser/resources/cryptotoken/enroller.js
@@ -193,13 +193,12 @@ // expects to be able to parse out a valid ECDSA signature and so one is // provided. b.addBytes(new Uint8Array([ - 0x00, 0x30, 0x45, 0x02, 0x21, 0x00, 0xc1, 0xa3, 0xa6, 0x8e, 0x2f, - 0x16, 0xa7, 0x21, 0x46, 0x27, 0x05, 0x7f, 0x62, 0xbb, 0x72, 0x8c, - 0x9e, 0x03, 0xe7, 0xa1, 0xba, 0x62, 0xd0, 0x46, 0x52, 0x4e, 0x45, - 0x6d, 0x2c, 0x2f, 0x3f, 0x73, 0x02, 0x20, 0x0b, 0x5f, 0x78, 0xe5, - 0x11, 0xaa, 0x18, 0x12, 0x9f, 0x6f, 0x23, 0x6d, 0x92, 0x13, 0x22, - 0x7d, 0x92, 0xb4, 0xe6, 0x7e, 0xdf, 0x53, 0xe8, 0x16, 0xdf, 0xb0, - 0x5d, 0x9d, 0xc8, 0xb9, 0x0f, 0xde + 0x00, 0x30, 0x45, 0x02, 0x21, 0x00, 0xc1, 0xa3, 0xa6, 0x8e, 0x2f, 0x16, + 0xa7, 0x21, 0x46, 0x27, 0x05, 0x7f, 0x62, 0xbb, 0x72, 0x8c, 0x9e, 0x03, + 0xe7, 0xa1, 0xba, 0x62, 0xd0, 0x46, 0x52, 0x4e, 0x45, 0x6d, 0x2c, 0x2f, + 0x3f, 0x73, 0x02, 0x20, 0x0b, 0x5f, 0x78, 0xe5, 0x11, 0xaa, 0x18, 0x12, + 0x9f, 0x6f, 0x23, 0x6d, 0x92, 0x13, 0x22, 0x7d, 0x92, 0xb4, 0xe6, 0x7e, + 0xdf, 0x53, 0xe8, 0x16, 0xdf, 0xb0, 0x5d, 0x9d, 0xc8, 0xb9, 0x0f, 0xde, ])); }); }); @@ -809,7 +808,7 @@ type: 'enroll_helper_request', enrollChallenges: encodedEnrollChallenges, signData: encodedSignChallenges, - logMsgUrl: this.logMsgUrl_ + logMsgUrl: this.logMsgUrl_, }; if (!this.timer_.expired()) { request.timeout = this.timer_.millisecondsUntilExpired() / 1000.0; @@ -903,7 +902,7 @@ tabId: this.sender_.tabId, frameId: this.sender_.frameId, origin: this.sender_.origin, - appId: appId + appId: appId, }, (result) => { if (!result) {
diff --git a/chrome/browser/resources/cryptotoken/errorcodes.js b/chrome/browser/resources/cryptotoken/errorcodes.js index 3733ab8..728ce00 100644 --- a/chrome/browser/resources/cryptotoken/errorcodes.js +++ b/chrome/browser/resources/cryptotoken/errorcodes.js
@@ -18,7 +18,7 @@ 'BAD_REQUEST': 2, 'CONFIGURATION_UNSUPPORTED': 3, 'DEVICE_INELIGIBLE': 4, - 'TIMEOUT': 5 + 'TIMEOUT': 5, }; /**
diff --git a/chrome/browser/resources/cryptotoken/messagetypes.js b/chrome/browser/resources/cryptotoken/messagetypes.js index 214f714..b8dd0ad 100644 --- a/chrome/browser/resources/cryptotoken/messagetypes.js +++ b/chrome/browser/resources/cryptotoken/messagetypes.js
@@ -18,5 +18,5 @@ U2F_REGISTER_RESPONSE: 'u2f_register_response', U2F_SIGN_RESPONSE: 'u2f_sign_response', U2F_GET_API_VERSION_REQUEST: 'u2f_get_api_version_request', - U2F_GET_API_VERSION_RESPONSE: 'u2f_get_api_version_response' + U2F_GET_API_VERSION_RESPONSE: 'u2f_get_api_version_response', };
diff --git a/chrome/browser/resources/cryptotoken/sha256.js b/chrome/browser/resources/cryptotoken/sha256.js index 92b83c9..a9f9309 100644 --- a/chrome/browser/resources/cryptotoken/sha256.js +++ b/chrome/browser/resources/cryptotoken/sha256.js
@@ -27,7 +27,7 @@ 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, - 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2, ]; this._pad[0] = 0x80; @@ -41,8 +41,14 @@ /** Reset the hasher */ SHA256.prototype.reset = function() { this._chain = [ - 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, - 0x1f83d9ab, 0x5be0cd19 + 0x6a09e667, + 0xbb67ae85, + 0x3c6ef372, + 0xa54ff53a, + 0x510e527f, + 0x9b05688c, + 0x1f83d9ab, + 0x5be0cd19, ]; this._inbuf = 0;
diff --git a/chrome/browser/resources/cryptotoken/signer.js b/chrome/browser/resources/cryptotoken/signer.js index 948f1d7..c7661cc 100644 --- a/chrome/browser/resources/cryptotoken/signer.js +++ b/chrome/browser/resources/cryptotoken/signer.js
@@ -375,7 +375,7 @@ if (!appIds || !appIds.length) { var error = { errorCode: ErrorCodes.BAD_REQUEST, - errorMessage: 'missing appId' + errorMessage: 'missing appId', }; this.notifyError_(error); return; @@ -515,7 +515,7 @@ tabId: this.sender_.tabId, frameId: this.sender_.frameId, origin: this.sender_.origin, - appId: appid + appId: appid, }, (result) => { if (!result) {
diff --git a/chrome/browser/resources/cryptotoken/webrequest.js b/chrome/browser/resources/cryptotoken/webrequest.js index 8b55cb4..c78425f 100644 --- a/chrome/browser/resources/cryptotoken/webrequest.js +++ b/chrome/browser/resources/cryptotoken/webrequest.js
@@ -213,7 +213,7 @@ default: var reportedError = { errorCode: ErrorCodes.OTHER_ERROR, - errorMessage: 'device status code: ' + code.toString(16) + errorMessage: 'device status code: ' + code.toString(16), }; return reportedError; } @@ -270,7 +270,7 @@ var browserData = { 'typ': type, 'challenge': serverChallenge, - 'origin': origin + 'origin': origin, }; return JSON.stringify(browserData); } @@ -355,7 +355,7 @@ 'challengeHash': challengeHash, 'appIdHash': B64_encode(sha256HashOfString(appId)), 'keyHandle': keyHandle, - 'version': (challenge['version'] || 'U2F_V1') + 'version': (challenge['version'] || 'U2F_V1'), }; encodedSignChallenges.push(encodedChallenge); } @@ -375,7 +375,7 @@ 'type': 'sign_helper_request', 'signData': challenges, 'timeout': opt_timeoutSeconds || 0, - 'timeoutSeconds': opt_timeoutSeconds || 0 + 'timeoutSeconds': opt_timeoutSeconds || 0, }; if (opt_logMsgUrl !== undefined) { request.logMsgUrl = opt_logMsgUrl;
diff --git a/chrome/browser/resources/discards/graph_doc.ts b/chrome/browser/resources/discards/graph_doc.ts index 11758c0..7ced0253 100644 --- a/chrome/browser/resources/discards/graph_doc.ts +++ b/chrome/browser/resources/discards/graph_doc.ts
@@ -407,7 +407,8 @@ override get linkTargets() { // Only link to the page if there isn't a parent frame. return [ - this.frame.parentFrameId || this.frame.pageId, this.frame.processId + this.frame.parentFrameId || this.frame.pageId, + this.frame.processId, ]; } } @@ -470,7 +471,8 @@ override allowedYRange(graphHeight: number): [number, number] { return [ - graphHeight - kWorkerNodesYRange, graphHeight - kProcessNodesYRange + graphHeight - kWorkerNodesYRange, + graphHeight - kProcessNodesYRange, ]; } @@ -481,8 +483,10 @@ override get linkTargets() { // Link the process, in addition to all the client and child workers. return [ - this.worker.processId, ...this.worker.clientFrameIds, - ...this.worker.clientWorkerIds, ...this.worker.childWorkerIds + this.worker.processId, + ...this.worker.clientFrameIds, + ...this.worker.clientWorkerIds, + ...this.worker.childWorkerIds, ]; } }
diff --git a/chrome/browser/resources/extensions/activity_log/activity_log.ts b/chrome/browser/resources/extensions/activity_log/activity_log.ts index dfaa4e7..7969595f 100644 --- a/chrome/browser/resources/extensions/activity_log/activity_log.ts +++ b/chrome/browser/resources/extensions/activity_log/activity_log.ts
@@ -88,7 +88,7 @@ loadTimeData.getString('activityLogHistoryTabHeading'), loadTimeData.getString('activityLogStreamTabHeading'), ]), - } + }, }; }
diff --git a/chrome/browser/resources/extensions/activity_log/activity_log_history_item.ts b/chrome/browser/resources/extensions/activity_log/activity_log_history_item.ts index 07cca01..5e9fb39 100644 --- a/chrome/browser/resources/extensions/activity_log/activity_log_history_item.ts +++ b/chrome/browser/resources/extensions/activity_log/activity_log_history_item.ts
@@ -83,7 +83,7 @@ this.dispatchEvent(new CustomEvent('delete-activity-log-item', { bubbles: true, composed: true, - detail: Array.from(this.data.activityIds.values()) + detail: Array.from(this.data.activityIds.values()), })); }
diff --git a/chrome/browser/resources/extensions/drop_overlay.ts b/chrome/browser/resources/extensions/drop_overlay.ts index f699ec1a..71fbbd6 100644 --- a/chrome/browser/resources/extensions/drop_overlay.ts +++ b/chrome/browser/resources/extensions/drop_overlay.ts
@@ -27,7 +27,7 @@ dragEnabled: { type: Boolean, observer: 'dragEnabledChanged_', - } + }, }; }
diff --git a/chrome/browser/resources/extensions/item_list.ts b/chrome/browser/resources/extensions/item_list.ts index 2533ee62..c8943c3 100644 --- a/chrome/browser/resources/extensions/item_list.ts +++ b/chrome/browser/resources/extensions/item_list.ts
@@ -138,7 +138,7 @@ this.i18n('searchResultsSingular', this.filter) : this.i18n( 'searchResultsPlural', total.toString(), this.filter)), - } + }, })); }, 0); }
diff --git a/chrome/browser/resources/extensions/manager.ts b/chrome/browser/resources/extensions/manager.ts index 946cfa76..6334e81 100644 --- a/chrome/browser/resources/extensions/manager.ts +++ b/chrome/browser/resources/extensions/manager.ts
@@ -587,7 +587,8 @@ assert(newPage.extensionId); this.showOptionsDialog_ = true; setTimeout(() => { - this.shadowRoot!.querySelector('extensions-options-dialog')!.show(data! + this.shadowRoot!.querySelector('extensions-options-dialog')!.show( + data!, ); }, 0); }
diff --git a/chrome/browser/resources/extensions/service.ts b/chrome/browser/resources/extensions/service.ts index 92f189c..ae7ab650 100644 --- a/chrome/browser/resources/extensions/service.ts +++ b/chrome/browser/resources/extensions/service.ts
@@ -376,7 +376,7 @@ chrome.activityLogPrivate.getExtensionActivities( { activityType: chrome.activityLogPrivate.ExtensionActivityFilter.ANY, - extensionId: extensionId + extensionId: extensionId, }, resolve); }); @@ -402,8 +402,8 @@ { activityType: anyType, extensionId: extensionId, - argUrl: `%${searchTerm}%` - } + argUrl: `%${searchTerm}%`, + }, ]; const promises:
diff --git a/chrome/browser/resources/extensions/shortcut_input.ts b/chrome/browser/resources/extensions/shortcut_input.ts index 51e2398..315015e 100644 --- a/chrome/browser/resources/extensions/shortcut_input.ts +++ b/chrome/browser/resources/extensions/shortcut_input.ts
@@ -239,7 +239,7 @@ composed: true, detail: { text: this.i18n('shortcutSet', this.computeText_()), - } + }, })); this.commitPending_();
diff --git a/chrome/browser/resources/extensions/site_settings_mixin.ts b/chrome/browser/resources/extensions/site_settings_mixin.ts index 94fc523d..27e77d9 100644 --- a/chrome/browser/resources/extensions/site_settings_mixin.ts +++ b/chrome/browser/resources/extensions/site_settings_mixin.ts
@@ -67,7 +67,7 @@ private onUserSiteSettingsChanged_({ permittedSites, - restrictedSites + restrictedSites, }: chrome.developerPrivate.UserSiteSettings) { this.permittedSites = permittedSites; this.restrictedSites = restrictedSites;
diff --git a/chrome/browser/resources/feedback_webui/js/feedback.ts b/chrome/browser/resources/feedback_webui/js/feedback.ts index 3a875ad..820a7f64 100644 --- a/chrome/browser/resources/feedback_webui/js/feedback.ts +++ b/chrome/browser/resources/feedback_webui/js/feedback.ts
@@ -146,9 +146,10 @@ * Regular expression to check for cellular-related keywords. */ const cellularRegEx: RegExp = buildWordMatcher([ - '2G', '3G', '4G', '5G', 'LTE', 'UMTS', 'SIM', 'eSIM', - 'mmWave', 'mobile', 'APN', 'IMEI', 'IMSI', 'eUICC', 'carrier', 'T.Mobile', - 'TMO', 'Verizon', 'VZW', 'AT&T', 'MVNO', 'pin.lock', 'cellular' + '2G', '3G', '4G', '5G', 'LTE', 'UMTS', + 'SIM', 'eSIM', 'mmWave', 'mobile', 'APN', 'IMEI', + 'IMSI', 'eUICC', 'carrier', 'T.Mobile', 'TMO', 'Verizon', + 'VZW', 'AT&T', 'MVNO', 'pin.lock', 'cellular', ]); /**
diff --git a/chrome/browser/resources/feedback_webui/js/take_screenshot.ts b/chrome/browser/resources/feedback_webui/js/take_screenshot.ts index d68ca297..b6a4d9f 100644 --- a/chrome/browser/resources/feedback_webui/js/take_screenshot.ts +++ b/chrome/browser/resources/feedback_webui/js/take_screenshot.ts
@@ -44,8 +44,8 @@ { video: { mandatory: - {chromeMediaSource: 'screen', maxWidth: 4096, maxHeight: 2560} - } + {chromeMediaSource: 'screen', maxWidth: 4096, maxHeight: 2560}, + }, }, function(stream) { if (stream) {
diff --git a/chrome/browser/resources/gaia_auth_host/authenticator.js b/chrome/browser/resources/gaia_auth_host/authenticator.js index 5303663cb..1d4753f 100644 --- a/chrome/browser/resources/gaia_auth_host/authenticator.js +++ b/chrome/browser/resources/gaia_auth_host/authenticator.js
@@ -223,8 +223,8 @@ 'isDeviceOwner', // True if the user is device owner. 'doSamlRedirect', // True if the authentication is done via external IdP. 'rart', // Encrypted reauth request token. - 'enableAzureADIntegration' // True if features specific to Azure AD are - // enabled + 'enableAzureADIntegration', // True if features specific to Azure AD are + // enabled ]; // Timeout in ms to wait for the message from Gaia indicating end of the flow. @@ -360,7 +360,7 @@ if (this.email_ && this.gaiaId_ && this.sessionIndex_) { this.maybeCompleteAuth_(); } - } + }, }; /** @@ -1215,7 +1215,7 @@ servicesProvided: this.servicesProvided_, passwordAttributes: passwordAttributes, syncTrustedVaultKeys: this.syncTrustedVaultKeys_ || {}, - } + }, })); this.resetStates(); this.authCompletedFired_ = true;
diff --git a/chrome/browser/resources/gaia_auth_host/channel.js b/chrome/browser/resources/gaia_auth_host/channel.js index c1c395eb..8bbf0d23 100644 --- a/chrome/browser/resources/gaia_auth_host/channel.js +++ b/chrome/browser/resources/gaia_auth_host/channel.js
@@ -72,7 +72,7 @@ this.send({ name: Channel.INTERNAL_REQUEST_MESSAGE, requestId: requestId, - payload: msg + payload: msg, }); }, @@ -101,7 +101,7 @@ this.send({ name: Channel.INTERNAL_REPLY_MESSAGE, requestId: msg.requestId, - result: result + result: result, }); } else if (name === Channel.INTERNAL_REPLY_MESSAGE) { const callback = this.internalRequestCallbacks_[msg.requestId]; @@ -112,7 +112,7 @@ } else { this.invokeMessageCallbacks_(msg); } - } + }, }; /**
diff --git a/chrome/browser/resources/gaia_auth_host/password_change_authenticator.js b/chrome/browser/resources/gaia_auth_host/password_change_authenticator.js index c73420848..a1043738 100644 --- a/chrome/browser/resources/gaia_auth_host/password_change_authenticator.js +++ b/chrome/browser/resources/gaia_auth_host/password_change_authenticator.js
@@ -209,7 +209,7 @@ matches: ['*://*.okta.com/*'], js: {code: oktaInjectedJs}, all_frames: true, - run_at: 'document_start' + run_at: 'document_start', }]); // Connect to the script running in Okta web pages once it loads. @@ -313,7 +313,7 @@ detail: { old_passwords: passwordsOnce, new_passwords: passwordsTwice, - } + }, })); this.resetStates(); } @@ -336,7 +336,7 @@ const message = { name: 'detectPasswordChangeSuccess', url: details.url, - redirectUrl: details.redirectUrl + redirectUrl: details.redirectUrl, }; sendMessage_(extensionId, message, (passwordChangeSuccess) => { // SAML change password extension will be used to detect the password
diff --git a/chrome/browser/resources/gaia_auth_host/post_message_channel.js b/chrome/browser/resources/gaia_auth_host/post_message_channel.js index 7c31171..1621659d 100644 --- a/chrome/browser/resources/gaia_auth_host/post_message_channel.js +++ b/chrome/browser/resources/gaia_auth_host/post_message_channel.js
@@ -24,7 +24,7 @@ 'chrome://oobe', 'chrome://chrome-signin', 'chrome://password-change', - 'chrome://lock-reauth' + 'chrome://lock-reauth', ]; /** @const */ @@ -66,7 +66,7 @@ for (let i = 0; i < this.listeners_.length; ++i) { this.listeners_[i].call(undefined, e); } - } + }, }; /** @@ -198,7 +198,7 @@ this.postToUpperWindow({ type: CHANNEL_CONNECT_MESSAGE, channelId: port.channelId, - channelName: port.name + channelName: port.name, }); return port; }, @@ -268,7 +268,7 @@ } this.deferredUpperWindowPorts_ = []; } - } + }, }; /** @@ -323,7 +323,7 @@ handleWindowMessage(e) { this.onMessage.dispatch(e.data.payload); - } + }, }; /**
diff --git a/chrome/browser/resources/gaia_auth_host/saml_handler.js b/chrome/browser/resources/gaia_auth_host/saml_handler.js index 0795987b..a6424a5 100644 --- a/chrome/browser/resources/gaia_auth_host/saml_handler.js +++ b/chrome/browser/resources/gaia_auth_host/saml_handler.js
@@ -313,7 +313,7 @@ matches: ['http://*/*', 'https://*/*'], js: {files: [injectedJs]}, all_frames: true, - run_at: 'document_start' + run_at: 'document_start', }]); PostMessageChannel.runAsDaemon(this.onConnected_.bind(this)); @@ -644,8 +644,8 @@ detail: { url: details.url, challenge: this.verifiedAccessChallenge_, - callback: this.continueDelayedRedirect_.bind(this, details.url) - } + callback: this.continueDelayedRedirect_.bind(this, details.url), + }, })); this.verifiedAccessChallenge_ = null; @@ -690,7 +690,7 @@ details.requestHeaders.push({ 'name': SAML_VERIFIED_ACCESS_RESPONSE_HEADER, - 'value': this.verifiedAccessChallengeResponse_ + 'value': this.verifiedAccessChallengeResponse_, }); this.verifiedAccessChallengeResponse_ = null; @@ -772,8 +772,8 @@ response: { result: 'initialized', version: this.apiVersion_, - keyTypes: API_KEY_TYPES - } + keyTypes: API_KEY_TYPES, + }, }); }
diff --git a/chrome/browser/resources/gaia_auth_host/saml_injected.js b/chrome/browser/resources/gaia_auth_host/saml_injected.js index ac61f27..eacf3ff 100644 --- a/chrome/browser/resources/gaia_auth_host/saml_injected.js +++ b/chrome/browser/resources/gaia_auth_host/saml_injected.js
@@ -53,7 +53,7 @@ // Forward API responses to the SAML page. window.postMessage( {type: 'gaia_saml_api_reply', response: msg.response}, '/'); - } + }, }; /** @@ -176,7 +176,7 @@ */ onPasswordChanged_(index, fieldId) { this.maybeSendUpdatedPassword(index, fieldId); - } + }, }; function onGetSAMLFlag(channel, isSAMLPage) {
diff --git a/chrome/browser/resources/gaia_auth_host/scroll_helper_injected.js b/chrome/browser/resources/gaia_auth_host/scroll_helper_injected.js index c952e206..7e30a82 100644 --- a/chrome/browser/resources/gaia_auth_host/scroll_helper_injected.js +++ b/chrome/browser/resources/gaia_auth_host/scroll_helper_injected.js
@@ -38,7 +38,7 @@ this.channel_.send({ name: 'scrollInfo', scrollTop: window.scrollY, - scrollHeight: document.body.scrollHeight + scrollHeight: document.body.scrollHeight, }); }, };
diff --git a/chrome/browser/resources/gaia_auth_host/webview_event_manager.js b/chrome/browser/resources/gaia_auth_host/webview_event_manager.js index 0aa53b3..4edc3d4 100644 --- a/chrome/browser/resources/gaia_auth_host/webview_event_manager.js +++ b/chrome/browser/resources/gaia_auth_host/webview_event_manager.js
@@ -55,7 +55,7 @@ this.unbindWebviewCleanupFunctions_[i](); } this.unbindWebviewCleanupFunctions_ = []; - } + }, }; /**
diff --git a/chrome/browser/resources/hangout_services/thunk.js b/chrome/browser/resources/hangout_services/thunk.js index 2e03156..d437dc9 100644 --- a/chrome/browser/resources/hangout_services/thunk.js +++ b/chrome/browser/resources/hangout_services/thunk.js
@@ -297,7 +297,7 @@ 'tabNetworkUsage': tabProcess.network, 'tabPrivateMemory': tabProcess.privateMemory, 'tabJsMemoryAllocated': tabProcess.jsMemoryAllocated, - 'tabJsMemoryUsed': tabProcess.jsMemoryUsed + 'tabJsMemoryUsed': tabProcess.jsMemoryUsed, }); }
diff --git a/chrome/browser/resources/history/app.ts b/chrome/browser/resources/history/app.ts index bb65665..ffceb4b 100644 --- a/chrome/browser/resources/history/app.ts +++ b/chrome/browser/resources/history/app.ts
@@ -219,7 +219,7 @@ value: () => { return [ loadTimeData.getString('historyListTabLabel'), - loadTimeData.getString('historyClustersTabLabel') + loadTimeData.getString('historyClustersTabLabel'), ]; }, },
diff --git a/chrome/browser/resources/history/browser_service.ts b/chrome/browser/resources/history/browser_service.ts index b6020192..26e2f09 100644 --- a/chrome/browser/resources/history/browser_service.ts +++ b/chrome/browser/resources/history/browser_service.ts
@@ -65,8 +65,14 @@ openForeignSessionTab( sessionTag: string, windowId: number, tabId: number, e: MouseEvent) { chrome.send('openForeignSession', [ - sessionTag, String(windowId), String(tabId), e.button || 0, e.altKey, - e.ctrlKey, e.metaKey, e.shiftKey + sessionTag, + String(windowId), + String(tabId), + e.button || 0, + e.altKey, + e.ctrlKey, + e.metaKey, + e.shiftKey, ]); }
diff --git a/chrome/browser/resources/history/history_list.ts b/chrome/browser/resources/history/history_list.ts index cc2d12165..037bab6 100644 --- a/chrome/browser/resources/history/history_list.ts +++ b/chrome/browser/resources/history/history_list.ts
@@ -330,7 +330,7 @@ removed: [item], addedCount: 0, object: this.historyData_, - type: 'splice' + type: 'splice', }); }); this.notifySplices('historyData_', splices);
diff --git a/chrome/browser/resources/identity_scope_approval_dialog/scope_approval_dialog.js b/chrome/browser/resources/identity_scope_approval_dialog/scope_approval_dialog.js index c0c67900..ca69b15 100644 --- a/chrome/browser/resources/identity_scope_approval_dialog/scope_approval_dialog.js +++ b/chrome/browser/resources/identity_scope_approval_dialog/scope_approval_dialog.js
@@ -25,7 +25,7 @@ name: 'injectRule', matches: ['https://accounts.google.com/*'], js: {files: ['inject.js']}, - run_at: 'document_start' + run_at: 'document_start', }]); // Request a customized view from GAIA.
diff --git a/chrome/browser/resources/invalidations/about_invalidations.js b/chrome/browser/resources/invalidations/about_invalidations.js index 099e35c..ade82e7e 100644 --- a/chrome/browser/resources/invalidations/about_invalidations.js +++ b/chrome/browser/resources/invalidations/about_invalidations.js
@@ -122,7 +122,7 @@ time: '', version: '', payload: '', - type: 'content' + type: 'content', }; } // Refresh the type to be a content because it might have been
diff --git a/chrome/browser/resources/management/management_ui.ts b/chrome/browser/resources/management/management_ui.ts index 14cec01..72552642 100644 --- a/chrome/browser/resources/management/management_ui.ts +++ b/chrome/browser/resources/management/management_ui.ts
@@ -165,7 +165,7 @@ const reportingInfoMap = reportingInfo.reduce((info, response) => { info[response.reportingType] = info[response.reportingType] || { icon: this.getIconForReportingType_(response.reportingType), - messageIds: [] + messageIds: [], }; info[response.reportingType].messageIds.push(response.messageId); return info;
diff --git a/chrome/browser/resources/media/webrtc_logs.ts b/chrome/browser/resources/media/webrtc_logs.ts index cd42088e..7e5f938 100644 --- a/chrome/browser/resources/media/webrtc_logs.ts +++ b/chrome/browser/resources/media/webrtc_logs.ts
@@ -87,15 +87,24 @@ const commentLines = [ 'Chrome Version: ' + version, // TODO(tbreisacher): fill in the OS automatically? - 'Operating System: e.g., "Windows 7", "Mac OSX 10.6"', '', - 'URL (if applicable) where the problem occurred:', '', - 'Can you reproduce this problem?', '', + 'Operating System: e.g., "Windows 7", "Mac OSX 10.6"', + '', + 'URL (if applicable) where the problem occurred:', + '', + 'Can you reproduce this problem?', + '', 'What steps will reproduce this problem? (or if it\'s not ' + 'reproducible, what were you doing just before the problem)?', - '', '1.', '2.', '3.', '', + '', + '1.', + '2.', + '3.', + '', '*Please note that issues filed with no information filled in ' + 'above will be marked as WontFix*', - '', '****DO NOT CHANGE BELOW THIS LINE****', 'report_id:' + id + '', + '****DO NOT CHANGE BELOW THIS LINE****', + 'report_id:' + id, ]; const params = { template: 'Defect report from user',
diff --git a/chrome/browser/resources/media_router/cast_feedback/cast_feedback_ui.ts b/chrome/browser/resources/media_router/cast_feedback/cast_feedback_ui.ts index 4276096..98bc4343 100644 --- a/chrome/browser/resources/media_router/cast_feedback/cast_feedback_ui.ts +++ b/chrome/browser/resources/media_router/cast_feedback/cast_feedback_ui.ts
@@ -136,14 +136,14 @@ type: String, value() { return loadTimeData.getString('logData'); - } + }, }, categoryTag_: { type: String, value() { return loadTimeData.getString('categoryTag'); - } + }, }, projectedContentUrl_: String, @@ -358,7 +358,7 @@ { key: 'feedbackUserCtlConsent', value: String(!!this.allowContactByEmail_), - } + }, ]; return data; }
diff --git a/chrome/browser/resources/memory_internals/memory_internals.ts b/chrome/browser/resources/memory_internals/memory_internals.ts index 89993984..efb4795a 100644 --- a/chrome/browser/resources/memory_internals/memory_internals.ts +++ b/chrome/browser/resources/memory_internals/memory_internals.ts
@@ -58,7 +58,9 @@ // Heading. addListRow(table, 'th', [ - null, document.createTextNode('Process ID'), document.createTextNode('Name') + null, + document.createTextNode('Process ID'), + document.createTextNode('Name'), ]); for (const proc of processes) {
diff --git a/chrome/browser/resources/nearby_internals/types.js b/chrome/browser/resources/nearby_internals/types.js index b7bf6f9..cb785b93 100644 --- a/chrome/browser/resources/nearby_internals/types.js +++ b/chrome/browser/resources/nearby_internals/types.js
@@ -36,7 +36,7 @@ CERTIFICATE: 0, CONTACT: 1, DEVICE: 2, - DEVICE_STATE: 3 + DEVICE_STATE: 3, }; /** @@ -47,7 +47,7 @@ */ export const Direction = { REQUEST: 0, - RESPONSE: 1 + RESPONSE: 1, }; /** @@ -115,7 +115,7 @@ */ export const ShareTargetDiscoveryChange = { DISCOVERED: 0, - LOST: 1 + LOST: 1, }; /**
diff --git a/chrome/browser/resources/nearby_share/BUILD.gn b/chrome/browser/resources/nearby_share/BUILD.gn index 8a806443..acfc4e3 100644 --- a/chrome/browser/resources/nearby_share/BUILD.gn +++ b/chrome/browser/resources/nearby_share/BUILD.gn
@@ -6,7 +6,7 @@ import("//third_party/closure_compiler/compile_js.gni") import("//tools/grit/grit_rule.gni") import("//tools/grit/preprocess_if_expr.gni") -import("//tools/polymer/html_to_js.gni") +import("//tools/polymer/html_to_wrapper.gni") import("//ui/webui/resources/tools/generate_grd.gni") assert(is_chromeos_ash, "Nearby Share is CrOS only") @@ -64,25 +64,44 @@ ] } +web_component_files = [ + "app.js", + "nearby_confirmation_page.js", + "nearby_discovery_page.js", +] + +# Files that are passed as input to html_to_wrapper(). +html_files = [] +foreach(f, web_component_files) { + html_files += [ string_replace(f, ".js", ".html") ] +} + +# Files that are generated by html_to_wrapper(). +html_wrapper_files = [] +foreach(f, html_files) { + html_wrapper_files += [ f + ".js" ] +} + +non_web_component_files = [ "discovery_manager.js" ] + +html_to_wrapper("html_wrapper_files") { + in_files = html_files + use_js = true +} + preprocess_if_expr("preprocess_src") { out_folder = "$target_gen_dir/$preprocess_folder" out_manifest = "$target_gen_dir/$preprocess_src_manifest" - in_files = [ - "nearby_share_dialog.html", - "discovery_manager.js", - ] + in_files = web_component_files + non_web_component_files + + [ "nearby_share_dialog.html" ] } preprocess_if_expr("preprocess_gen") { - deps = [ ":web_components" ] + deps = [ ":html_wrapper_files" ] in_folder = target_gen_dir out_folder = "$target_gen_dir/$preprocess_folder" out_manifest = "$target_gen_dir/$preprocess_gen_manifest" - in_files = [ - "app.js", - "nearby_confirmation_page.js", - "nearby_discovery_page.js", - ] + in_files = html_wrapper_files } generate_grd("build_mojo_grdp") { @@ -181,11 +200,3 @@ "//ui/webui/resources/js:assert.m", ] } - -html_to_js("web_components") { - js_files = [ - "app.js", - "nearby_confirmation_page.js", - "nearby_discovery_page.js", - ] -}
diff --git a/chrome/browser/resources/nearby_share/app.js b/chrome/browser/resources/nearby_share/app.js index 59e9a648..8434ab17 100644 --- a/chrome/browser/resources/nearby_share/app.js +++ b/chrome/browser/resources/nearby_share/app.js
@@ -11,6 +11,7 @@ import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {getTemplate} from './app.html.js'; import {NearbyShareSettingsBehavior, NearbyShareSettingsBehaviorInterface} from './shared/nearby_share_settings_behavior.js'; import {CloseReason} from './shared/types.js'; @@ -44,7 +45,7 @@ } static get template() { - return html`{__html_template__}`; + return getTemplate(); } static get properties() {
diff --git a/chrome/browser/resources/nearby_share/nearby_confirmation_page.js b/chrome/browser/resources/nearby_share/nearby_confirmation_page.js index c62b221d..a49d5c8 100644 --- a/chrome/browser/resources/nearby_share/nearby_confirmation_page.js +++ b/chrome/browser/resources/nearby_share/nearby_confirmation_page.js
@@ -27,6 +27,7 @@ import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getDiscoveryManager} from './discovery_manager.js'; +import {getTemplate} from './nearby_confirmation_page.html.js'; import {CloseReason} from './shared/types.js'; /** @implements {nearbyShare.mojom.TransferUpdateListenerInterface} */ @@ -84,7 +85,7 @@ } static get template() { - return html`{__html_template__}`; + return getTemplate(); } static get properties() { @@ -109,7 +110,7 @@ transferUpdateListener: { type: Object, value: null, - observer: 'onTransferUpdateListenerChanged_' + observer: 'onTransferUpdateListenerChanged_', }, /**
diff --git a/chrome/browser/resources/nearby_share/nearby_discovery_page.js b/chrome/browser/resources/nearby_share/nearby_discovery_page.js index 32777f59..4a38e19 100644 --- a/chrome/browser/resources/nearby_share/nearby_discovery_page.js +++ b/chrome/browser/resources/nearby_share/nearby_discovery_page.js
@@ -27,6 +27,7 @@ import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getDiscoveryManager, observeDiscoveryManager} from './discovery_manager.js'; +import {getTemplate} from './nearby_discovery_page.html.js'; /** * Converts an unguessable token to a string. @@ -73,7 +74,7 @@ } static get template() { - return html`{__html_template__}`; + return getTemplate(); } static get properties() {
diff --git a/chrome/browser/resources/nearby_share/shared/nearby_metrics_logger.js b/chrome/browser/resources/nearby_share/shared/nearby_metrics_logger.js index 19a8b38..1889d66d 100644 --- a/chrome/browser/resources/nearby_share/shared/nearby_metrics_logger.js +++ b/chrome/browser/resources/nearby_share/shared/nearby_metrics_logger.js
@@ -95,7 +95,8 @@ chrome.send('metricsHandler:recordInHistogram', [ NearbyShareOnboardingEntryPointHistogramName, - nearbyShareOnboardingEntryPoint, NearbyShareOnboardingEntryPoint.MAX + nearbyShareOnboardingEntryPoint, + NearbyShareOnboardingEntryPoint.MAX, ]); // Set time at which onboarding was initiated to track duration. onboardingInitiatedTimestamp = window.performance.now(); @@ -124,12 +125,13 @@ chrome.send('metricsHandler:recordInHistogram', [ NearbyShareOnboardingEntryPointHistogramName, - nearbyShareOnboardingEntryPoint, NearbyShareOnboardingEntryPoint.MAX + nearbyShareOnboardingEntryPoint, + NearbyShareOnboardingEntryPoint.MAX, ]); chrome.send('metricsHandler:recordSparseHistogram', [ NearbyShareOnboardingFlowEventHistogramName, - NearbyShareOnboardingFlowEvent.ONBOARDING_SHOWN + NearbyShareOnboardingFlowEvent.ONBOARDING_SHOWN, ]); // Set time at which onboarding was initiated to track duration. @@ -166,8 +168,9 @@ return; } chrome.send('metricsHandler:recordInHistogram', [ - NearbyShareOnboardingResultHistogramName, nearbyShareOnboardingFinalState, - NearbyShareOnboardingFinalState.MAX + NearbyShareOnboardingResultHistogramName, + nearbyShareOnboardingFinalState, + NearbyShareOnboardingFinalState.MAX, ]); onboardingInitiatedTimestamp = null; } @@ -184,13 +187,14 @@ return; } chrome.send('metricsHandler:recordInHistogram', [ - NearbyShareOnboardingResultHistogramName, nearbyShareOnboardingFinalState, - NearbyShareOnboardingFinalState.MAX + NearbyShareOnboardingResultHistogramName, + nearbyShareOnboardingFinalState, + NearbyShareOnboardingFinalState.MAX, ]); chrome.send('metricsHandler:recordSparseHistogram', [ NearbyShareOnboardingFlowEventHistogramName, - getOnboardingCancelledFlowEvent_(nearbyShareOnboardingFinalState) + getOnboardingCancelledFlowEvent_(nearbyShareOnboardingFinalState), ]); onboardingInitiatedTimestamp = null; } @@ -225,12 +229,12 @@ chrome.send('metricsHandler:recordInHistogram', [ NearbyShareOnboardingResultHistogramName, NearbyShareOnboardingFinalState.COMPLETE, - NearbyShareOnboardingFinalState.MAX + NearbyShareOnboardingFinalState.MAX, ]); chrome.send('metricsHandler:recordMediumTime', [ NearbyShareOnboardingDurationHistogramName, - window.performance.now() - onboardingInitiatedTimestamp + window.performance.now() - onboardingInitiatedTimestamp, ]); onboardingInitiatedTimestamp = null; @@ -251,18 +255,19 @@ chrome.send('metricsHandler:recordSparseHistogram', [ NearbyShareOnboardingFlowEventHistogramName, - getOnboardingCompleteFlowEvent_(nearbyShareOnboardingFinalState, visibility) + getOnboardingCompleteFlowEvent_( + nearbyShareOnboardingFinalState, visibility), ]); chrome.send('metricsHandler:recordInHistogram', [ NearbyShareOnboardingResultHistogramName, NearbyShareOnboardingFinalState.COMPLETE, - NearbyShareOnboardingFinalState.MAX + NearbyShareOnboardingFinalState.MAX, ]); chrome.send('metricsHandler:recordMediumTime', [ NearbyShareOnboardingDurationHistogramName, - window.performance.now() - onboardingInitiatedTimestamp + window.performance.now() - onboardingInitiatedTimestamp, ]); onboardingInitiatedTimestamp = null; @@ -321,7 +326,7 @@ processOnePageOnboardingVisibilityButtonOnInitialPageClickedMetrics() { chrome.send('metricsHandler:recordSparseHistogram', [ NearbyShareOnboardingFlowEventHistogramName, - NearbyShareOnboardingFlowEvent.VISIBILITY_CLICKED_ON_INITIAL_PAGE + NearbyShareOnboardingFlowEvent.VISIBILITY_CLICKED_ON_INITIAL_PAGE, ]); } @@ -331,7 +336,7 @@ export function processOnePageOnboardingVisibilityPageShownMetrics() { chrome.send('metricsHandler:recordSparseHistogram', [ NearbyShareOnboardingFlowEventHistogramName, - NearbyShareOnboardingFlowEvent.DEVICE_VISIBILITY_PAGE_SHOWN + NearbyShareOnboardingFlowEvent.DEVICE_VISIBILITY_PAGE_SHOWN, ]); } @@ -342,6 +347,6 @@ export function processOnePageOnboardingManageContactsMetrics() { chrome.send('metricsHandler:recordSparseHistogram', [ NearbyShareOnboardingFlowEventHistogramName, - NearbyShareOnboardingFlowEvent.MANAGE_CONTACTS_SELECTED + NearbyShareOnboardingFlowEvent.MANAGE_CONTACTS_SELECTED, ]); }
diff --git a/chrome/browser/resources/net_internals/main.js b/chrome/browser/resources/net_internals/main.js index 294bd6f..0f9406b 100644 --- a/chrome/browser/resources/net_internals/main.js +++ b/chrome/browser/resources/net_internals/main.js
@@ -110,9 +110,18 @@ // Redirect deleted pages to #events page, which contains instructions // about migrating to using net-export and the external netlog_viewer. if ([ - '#capture', '#import', '#export', '#timeline', '#alt-svc', '#http2', - '#quic', '#reporting', '#httpCache', '#modules', '#bandwidth', - '#prerender' + '#capture', + '#import', + '#export', + '#timeline', + '#alt-svc', + '#http2', + '#quic', + '#reporting', + '#httpCache', + '#modules', + '#bandwidth', + '#prerender', ].includes(parsed.tabHash)) { parsed.tabHash = EventsView.TAB_HASH; }
diff --git a/chrome/browser/resources/network_speech_synthesis/tts_extension.js b/chrome/browser/resources/network_speech_synthesis/tts_extension.js index 088a7ad..f9901d8 100644 --- a/chrome/browser/resources/network_speech_synthesis/tts_extension.js +++ b/chrome/browser/resources/network_speech_synthesis/tts_extension.js
@@ -82,7 +82,7 @@ for (let i = 0; i < voices.length; i++) { this.voiceNameToLangAndGender_[voices[i].voice_name] = { lang: voices[i].lang, - gender: voices[i].gender + gender: voices[i].gender, }; } @@ -133,7 +133,7 @@ this.currentUtterance_ = { utterance: utterance, options: options, - callback: callback + callback: callback, }; let lang = options.lang; @@ -207,7 +207,7 @@ this.audioElement_.pause(); this.currentUtterance_.callback({ 'type': 'end', - 'charIndex': this.currentUtterance_.utterance.length + 'charIndex': this.currentUtterance_.utterance.length, }); } this.currentUtterance_ = null; @@ -251,7 +251,7 @@ if (this.currentUtterance_) { this.audioElement_.play(); } - } + }, };
diff --git a/chrome/browser/resources/new_tab_page/customize_modules.ts b/chrome/browser/resources/new_tab_page/customize_modules.ts index 489c9c2c..6080b0b 100644 --- a/chrome/browser/resources/new_tab_page/customize_modules.ts +++ b/chrome/browser/resources/new_tab_page/customize_modules.ts
@@ -85,7 +85,7 @@ discountToggleEligible_: { type: Boolean, value: false, - } + }, }; }
diff --git a/chrome/browser/resources/new_tab_page/modules/cart/discount_consent_card.ts b/chrome/browser/resources/new_tab_page/modules/cart/discount_consent_card.ts index 05a3a8c6..73f9ec10 100644 --- a/chrome/browser/resources/new_tab_page/modules/cart/discount_consent_card.ts +++ b/chrome/browser/resources/new_tab_page/modules/cart/discount_consent_card.ts
@@ -80,21 +80,21 @@ currentStep: {type: Number, value: 0}, steps_: { type: Array, - computed: 'computeSteps_(showCloseButton_, stepOneContent_)' + computed: 'computeSteps_(showCloseButton_, stepOneContent_)', }, colorConsentContainer_: { type: Boolean, computed: 'computeColorConsentContainer_(currentStep)', - reflectToAttribute: true + reflectToAttribute: true, }, showCloseButton_: { type: Boolean, value: () => loadTimeData.getBoolean( - 'modulesCartDiscountInlineCardShowCloseButton') + 'modulesCartDiscountInlineCardShowCloseButton'), }, stepOneContent_: {type: String, computed: 'computeStepOneContent_(merchants)'}, - showDiscountConsentDialog_: {type: Boolean, value: false} + showDiscountConsentDialog_: {type: Boolean, value: false}, }; } @@ -155,7 +155,7 @@ this.showDiscountConsentDialog_ = true; } }, - } + }, }); if (this.getTotalStep_() === 1) { @@ -171,7 +171,7 @@ this.dispatchEvent( new CustomEvent('discount-consent-accepted', {composed: true})); }, - } + }, }; if (showCloseButton) { step2.hasOneButton = true; @@ -182,7 +182,7 @@ onClickHandler: () => { this.dispatchEvent( new CustomEvent('discount-consent-rejected', {composed: true})); - } + }, }; } steps.push(step2);
diff --git a/chrome/browser/resources/new_tab_page/modules/cart/module.ts b/chrome/browser/resources/new_tab_page/modules/cart/module.ts index d7a5f26..bca1deb 100644 --- a/chrome/browser/resources/new_tab_page/modules/cart/module.ts +++ b/chrome/browser/resources/new_tab_page/modules/cart/module.ts
@@ -87,7 +87,7 @@ type: Boolean, value: () => loadTimeData.getInteger('modulesCartDiscountConsentVariation') > - DiscountConsentVariation.STRING_CHANGE + DiscountConsentVariation.STRING_CHANGE, }, firstThreeCartItems_: {type: Array, computed: 'computeFirstThreeCartItems_(cartItems)'}, @@ -96,7 +96,7 @@ discountConsentVisible: { type: Boolean, reflectToAttribute: true, - } + }, }; }
diff --git a/chrome/browser/resources/new_tab_page/modules/module_descriptor.ts b/chrome/browser/resources/new_tab_page/modules/module_descriptor.ts index 9daeb69..d0a5b6a 100644 --- a/chrome/browser/resources/new_tab_page/modules/module_descriptor.ts +++ b/chrome/browser/resources/new_tab_page/modules/module_descriptor.ts
@@ -56,11 +56,12 @@ async initialize(timeout: number): Promise<HTMLElement|null> { const loadStartTime = WindowProxy.getInstance().now(); const element = await Promise.race([ - this.initializeCallback_(), new Promise<null>(resolve => { + this.initializeCallback_(), + new Promise<null>(resolve => { WindowProxy.getInstance().setTimeout(() => { resolve(null); }, timeout); - }) + }), ]); if (!element) { return null;
diff --git a/chrome/browser/resources/new_tab_page/modules/modules.ts b/chrome/browser/resources/new_tab_page/modules/modules.ts index a03be5fe..9b9f916 100644 --- a/chrome/browser/resources/new_tab_page/modules/modules.ts +++ b/chrome/browser/resources/new_tab_page/modules/modules.ts
@@ -541,7 +541,7 @@ ...this.shadowRoot!.querySelectorAll<HTMLElement>( '.module-container:not([hidden])'), ...this.shadowRoot!.querySelectorAll<HTMLElement>( - '.module-container[hidden]') + '.module-container[hidden]'), ]; const dragIndex = moduleContainers.indexOf(dragElement.parentElement!); const dropIndex =
diff --git a/chrome/browser/resources/new_tab_page/modules/photos/module.ts b/chrome/browser/resources/new_tab_page/modules/photos/module.ts index 7300067..4e1b5324 100644 --- a/chrome/browser/resources/new_tab_page/modules/photos/module.ts +++ b/chrome/browser/resources/new_tab_page/modules/photos/module.ts
@@ -68,14 +68,14 @@ value: () => { return `chrome://new-tab-page/modules/photos/images/img0${ loadTimeData.getString('photosModuleCustomArtWork')}_240x236.svg`; - } + }, }, customArtworkIndex_: { type: String, value: () => { return loadTimeData.getString('photosModuleCustomArtWork'); - } + }, }, // If true, the artwork shown in opt-in screen will be one single svg @@ -85,7 +85,7 @@ value: () => { return loadTimeData.getString('photosModuleCustomArtWork') !== '' && !loadTimeData.getBoolean('photosModuleSplitSvgCustomArtWork'); - } + }, }, // If true, the artwork shown in opt-in screen will be a composite image @@ -100,7 +100,7 @@ (loadTimeData.getString('photosModuleCustomArtWork') === '1' || loadTimeData.getString('photosModuleCustomArtWork') === '2' || loadTimeData.getString('photosModuleCustomArtWork') === '3'); - } + }, }, showSoftOptOutButton: Boolean,
diff --git a/chrome/browser/resources/new_tab_page/realbox/realbox.ts b/chrome/browser/resources/new_tab_page/realbox/realbox.ts index 135d937..1d23e614 100644 --- a/chrome/browser/resources/new_tab_page/realbox/realbox.ts +++ b/chrome/browser/resources/new_tab_page/realbox/realbox.ts
@@ -298,7 +298,7 @@ this.updateInput_({ text: decodeString16(this.selectedMatch_!.fillIntoEdit), inline: '', - moveCursorToEnd: true + moveCursorToEnd: true, }); } else { this.$.matches.unselect(); @@ -317,17 +317,17 @@ if (variant === 0) { this.updateStyles({ '--search-box-bg': skColorToRgba(assert(this.theme.bg)), - '--search-box-bg-hovered': skColorToRgba(assert(this.theme.bgHovered)) + '--search-box-bg-hovered': skColorToRgba(assert(this.theme.bgHovered)), }); } else if (variant === 1) { this.updateStyles({ '--search-box-bg': skColorToRgba(assert(this.theme.ntpBg)), - '--search-box-bg-hovered': skColorToRgba(assert(this.theme.bgHovered)) + '--search-box-bg-hovered': skColorToRgba(assert(this.theme.bgHovered)), }); } else if (variant === 2) { this.updateStyles({ '--search-box-bg': skColorToRgba(assert(this.theme.ntpBg)), - '--search-box-bg-hovered': skColorToRgba(assert(this.theme.resultsBg)) + '--search-box-bg-hovered': skColorToRgba(assert(this.theme.resultsBg)), }); } @@ -622,7 +622,7 @@ this.updateInput_({ text: decodeString16(this.selectedMatch_!.fillIntoEdit), inline: '', - moveCursorToEnd: true + moveCursorToEnd: true, }); }
diff --git a/chrome/browser/resources/new_tab_page_instant/most_visited_title.ts b/chrome/browser/resources/new_tab_page_instant/most_visited_title.ts index 7f6f2a7..c48cf56 100644 --- a/chrome/browser/resources/new_tab_page_instant/most_visited_title.ts +++ b/chrome/browser/resources/new_tab_page_instant/most_visited_title.ts
@@ -229,7 +229,7 @@ const styles: MostVisitedStyles = { color: getTextColor(params, isTitle), // Handles 'c' in params. fontFamily: '', - fontSize: 11 + fontSize: 11, }; if ('f' in params && /^[-0-9a-zA-Z ,]+$/.test(params.f!)) { styles.fontFamily = params.f!;
diff --git a/chrome/browser/resources/ntp4/apps_page.js b/chrome/browser/resources/ntp4/apps_page.js index efa9e12..e8eb93b 100644 --- a/chrome/browser/resources/ntp4/apps_page.js +++ b/chrome/browser/resources/ntp4/apps_page.js
@@ -34,7 +34,7 @@ OTHER_APPS_PANE: 1, MOST_VISITED_PANE: 2, // Deprecated. BOOKMARKS_PANE: 3, // Deprecated. - OUTSIDE_NTP: 4 + OUTSIDE_NTP: 4, }; const DRAG_SOURCE_LIMIT = DRAG_SOURCE.OUTSIDE_NTP + 1; @@ -42,7 +42,7 @@ const RUN_ON_OS_LOGIN_MODE = { NOT_RUN: 'run_on_os_login_mode_not_run', WINDOWED: 'run_on_os_login_mode_windowed', - MINIMIZED: 'run_on_os_login_mode_minimized' + MINIMIZED: 'run_on_os_login_mode_minimized', }; // The fraction of the app tile size that the icon uses. @@ -154,8 +154,10 @@ forAllLaunchTypes_(f) { // Order matters: index matches launchType id. const launchTypes = [ - this.launchPinnedTab_, this.launchRegularTab_, this.launchFullscreen_, - this.launchNewWindow_ + this.launchPinnedTab_, + this.launchRegularTab_, + this.launchFullscreen_, + this.launchNewWindow_, ]; for (let i = 0; i < launchTypes.length; ++i) { @@ -297,7 +299,7 @@ } chrome.send('runOnOsLogin', [app.appData.id, mode]); - } + }, }; /** @@ -498,8 +500,14 @@ } chrome.send('launchApp', [ - this.appId, APP_LAUNCH.NTP_APPS_MAXIMIZED, 'chrome-ntp-icon', e.button, - e.altKey, e.ctrlKey, e.metaKey, e.shiftKey + this.appId, + APP_LAUNCH.NTP_APPS_MAXIMIZED, + 'chrome-ntp-icon', + e.button, + e.altKey, + e.ctrlKey, + e.metaKey, + e.shiftKey, ]); // Don't allow the click to trigger a link or anything @@ -518,8 +526,14 @@ e.stopPropagation(); } else if (e.key === 'Enter') { chrome.send('launchApp', [ - this.appId, APP_LAUNCH.NTP_APPS_MAXIMIZED, '', 0, e.altKey, e.ctrlKey, - e.metaKey, e.shiftKey + this.appId, + APP_LAUNCH.NTP_APPS_MAXIMIZED, + '', + 0, + e.altKey, + e.ctrlKey, + e.metaKey, + e.shiftKey, ]); e.preventDefault(); e.stopPropagation();
diff --git a/chrome/browser/resources/ntp4/dot_list.js b/chrome/browser/resources/ntp4/dot_list.js index 8078573f6..2a9feb2 100644 --- a/chrome/browser/resources/ntp4/dot_list.js +++ b/chrome/browser/resources/ntp4/dot_list.js
@@ -74,5 +74,5 @@ e.stopPropagation(); e.preventDefault(); - } + }, };
diff --git a/chrome/browser/resources/ntp4/new_tab.js b/chrome/browser/resources/ntp4/new_tab.js index 430376bc..83d0cc3 100644 --- a/chrome/browser/resources/ntp4/new_tab.js +++ b/chrome/browser/resources/ntp4/new_tab.js
@@ -69,7 +69,7 @@ // TODO(dbeam): NewTabView is now the only extender of PageListView; these // classes should be merged. NewTabView.prototype = { - __proto__: PageListView.prototype + __proto__: PageListView.prototype, }; /**
diff --git a/chrome/browser/resources/ntp4/touch_handler.js b/chrome/browser/resources/ntp4/touch_handler.js index 74ccc7c..03eb6b7 100644 --- a/chrome/browser/resources/ntp4/touch_handler.js +++ b/chrome/browser/resources/ntp4/touch_handler.js
@@ -123,7 +123,7 @@ // Fired whenever the element is tapped in a short time and no dragging is // detected. - TAP: 'touchHandler:tap' + TAP: 'touchHandler:tap', }; @@ -187,7 +187,7 @@ * drag delta. * @type {number|undefined} */ - dragDeltaY: undefined + dragDeltaY: undefined, }; /** @@ -392,7 +392,7 @@ identifier: 0, clientX: e.clientX, clientY: e.clientY, - target: e.target + target: e.target, }; e.touches = []; e.targetTouches = []; @@ -873,5 +873,5 @@ this.element_.dispatchEvent(event); return event.enableDrag; - } + }, };
diff --git a/chrome/browser/resources/omnibox/omnibox.js b/chrome/browser/resources/omnibox/omnibox.js index 9ce05e4..e1eca82 100644 --- a/chrome/browser/resources/omnibox/omnibox.js +++ b/chrome/browser/resources/omnibox/omnibox.js
@@ -279,7 +279,7 @@ variationInfo, pathInfo, appVersion: navigator.appVersion, - batchExports + batchExports, }; ExportDelegate.download_(batchData, fileName); } @@ -295,23 +295,23 @@ this.processBatch( processBatchData.batchQueryInputs, processBatchData.batchName); } else { - const expected = { - batchMode: 'combined', - batchName: 'name for this batch of queries', - batchQueryInputs: [{ - inputText: 'example input text', - cursorPosition: 18, - resetAutocompleteController: false, - cursorLock: false, - zeroSuggest: false, - preventInlineAutocomplete: false, - preferKeyword: false, - currentUrl: '', - pageClassification: '4' - }], - }; - console.error(`Invalid batch specifier data. Expected format: \n${ - JSON.stringify(expected, null, 2)}`); + const expected = { + batchMode: 'combined', + batchName: 'name for this batch of queries', + batchQueryInputs: [{ + inputText: 'example input text', + cursorPosition: 18, + resetAutocompleteController: false, + cursorLock: false, + zeroSuggest: false, + preventInlineAutocomplete: false, + preferKeyword: false, + currentUrl: '', + pageClassification: '4', + }], + }; + console.error(`Invalid batch specifier data. Expected format: \n${ + JSON.stringify(expected, null, 2)}`); } } @@ -396,7 +396,7 @@ const EXPECTED_FORMAT = { queryInputs: {}, displayInputs: {}, - responsesHistory: [[{combinedResults: [], resultsByProvider: []}]] + responsesHistory: [[{combinedResults: [], resultsByProvider: []}]], }; const INVALID_MESSAGE = `Invalid import format; expected \n${ JSON.stringify(EXPECTED_FORMAT, null, 2)};\n`;
diff --git a/chrome/browser/resources/omnibox/omnibox_output.js b/chrome/browser/resources/omnibox/omnibox_output.js index fd9a9460..d6572d7 100644 --- a/chrome/browser/resources/omnibox/omnibox_output.js +++ b/chrome/browser/resources/omnibox/omnibox_output.js
@@ -1045,8 +1045,12 @@ 'blue.\nMATCH classifications are styled bold.\nDIM ' + 'classifications are styled with a gray background.', [ - 'image', 'contents', 'description', 'answer', 'contentsClass', - 'descriptionClass' + 'image', + 'contents', + 'description', + 'answer', + 'contentsClass', + 'descriptionClass', ], OutputAnswerProperty), new Column( @@ -1128,7 +1132,7 @@ new Column( ['Additional Info'], '', 'additionalInfo', true, 'Additional Info\nProvider-specific information about the result.', - ['additionalInfo'], OutputAdditionalInfoProperty) + ['additionalInfo'], OutputAdditionalInfoProperty), ]; /** @type {!Column} */
diff --git a/chrome/browser/resources/pdf/browser_api.ts b/chrome/browser/resources/pdf/browser_api.ts index 1da48d6..55ad359 100644 --- a/chrome/browser/resources/pdf/browser_api.ts +++ b/chrome/browser/resources/pdf/browser_api.ts
@@ -200,7 +200,7 @@ chrome.tabs.setZoomSettings( streamInfo.tabId, { mode: chrome.tabs.ZoomSettingsMode.MANUAL, - scope: chrome.tabs.ZoomSettingsScope.PER_TAB + scope: chrome.tabs.ZoomSettingsScope.PER_TAB, }, resolve); }));
diff --git a/chrome/browser/resources/pdf/controller.ts b/chrome/browser/resources/pdf/controller.ts index 5eb37b7..bd5956e0 100644 --- a/chrome/browser/resources/pdf/controller.ts +++ b/chrome/browser/resources/pdf/controller.ts
@@ -194,7 +194,7 @@ layoutOptions: layoutOptions, xOffset: position.x, yOffset: position.y, - pinchPhase: pinchPhase + pinchPhase: pinchPhase, }); } } @@ -222,7 +222,7 @@ pinchX: pinchCenter.x, pinchY: pinchCenter.y, pinchVectorX: pinchVector.x, - pinchVectorY: pinchVector.y + pinchVectorY: pinchVector.y, }); } @@ -304,7 +304,7 @@ pageCount: (printPreviewParams.modifiable ? printPreviewParams.pageNumbers.length : - 0) + 0), }); }
diff --git a/chrome/browser/resources/pdf/elements/viewer-page-indicator.ts b/chrome/browser/resources/pdf/elements/viewer-page-indicator.ts index 4224cc3c..0fd466d 100644 --- a/chrome/browser/resources/pdf/elements/viewer-page-indicator.ts +++ b/chrome/browser/resources/pdf/elements/viewer-page-indicator.ts
@@ -25,7 +25,7 @@ index: {type: Number, observer: 'indexChanged'}, - pageLabels: {type: Array, value: null, observer: 'pageLabelsChanged'} + pageLabels: {type: Array, value: null, observer: 'pageLabelsChanged'}, }; }
diff --git a/chrome/browser/resources/pdf/elements/viewer-thumbnail.ts b/chrome/browser/resources/pdf/elements/viewer-thumbnail.ts index 15253673..68a69f5 100644 --- a/chrome/browser/resources/pdf/elements/viewer-thumbnail.ts +++ b/chrome/browser/resources/pdf/elements/viewer-thumbnail.ts
@@ -178,7 +178,7 @@ this.dispatchEvent(new CustomEvent('change-page', { detail: {page: this.pageNumber - 1, origin: ChangePageOrigin.THUMBNAIL}, bubbles: true, - composed: true + composed: true, })); }
diff --git a/chrome/browser/resources/pdf/gesture_detector.ts b/chrome/browser/resources/pdf/gesture_detector.ts index afb0a5b..6585961 100644 --- a/chrome/browser/resources/pdf/gesture_detector.ts +++ b/chrome/browser/resources/pdf/gesture_detector.ts
@@ -129,7 +129,7 @@ // TODO(dhoss): Handle case where `scaleRatio` is null? direction: scaleRatio! > 1.0 ? 'in' : 'out', startScaleRatio: startScaleRatio, - center: center(event) + center: center(event), }); this.lastEvent_ = event; @@ -248,6 +248,6 @@ const touch2 = event.touches[1]; return { x: (touch1.clientX + touch2.clientX) / 2, - y: (touch1.clientY + touch2.clientY) / 2 + y: (touch1.clientY + touch2.clientY) / 2, }; }
diff --git a/chrome/browser/resources/pdf/main.ts b/chrome/browser/resources/pdf/main.ts index b5ac4936..47e0346 100644 --- a/chrome/browser/resources/pdf/main.ts +++ b/chrome/browser/resources/pdf/main.ts
@@ -43,7 +43,7 @@ chrome.contentSettings.javascript.get( { 'primaryUrl': browserApi.getStreamInfo().originalUrl, - 'secondaryUrl': window.location.origin + 'secondaryUrl': window.location.origin, }, (result) => { browserApi.getStreamInfo().javascript = result.setting;
diff --git a/chrome/browser/resources/pdf/metrics.ts b/chrome/browser/resources/pdf/metrics.ts index e1c67793..7e04401 100644 --- a/chrome/browser/resources/pdf/metrics.ts +++ b/chrome/browser/resources/pdf/metrics.ts
@@ -31,7 +31,7 @@ 'type': chrome.metricsPrivate.MetricTypeType.HISTOGRAM_LOG, 'min': 1, 'max': UserAction.NUMBER_OF_ACTIONS, - 'buckets': UserAction.NUMBER_OF_ACTIONS + 1 + 'buckets': UserAction.NUMBER_OF_ACTIONS + 1, }; } chrome.metricsPrivate.recordValue(actionsMetric, action);
diff --git a/chrome/browser/resources/pdf/open_pdf_params_parser.ts b/chrome/browser/resources/pdf/open_pdf_params_parser.ts index 9626a4da..32b8949 100644 --- a/chrome/browser/resources/pdf/open_pdf_params_parser.ts +++ b/chrome/browser/resources/pdf/open_pdf_params_parser.ts
@@ -76,7 +76,7 @@ // Handle #zoom=scale,left,top. const position = { x: parseFloat(paramValueSplit[1]), - y: parseFloat(paramValueSplit[2]) + y: parseFloat(paramValueSplit[2]), }; return {'position': position, 'zoom': zoomFactor}; }
diff --git a/chrome/browser/resources/pdf/pdf_scripting_api.ts b/chrome/browser/resources/pdf/pdf_scripting_api.ts index 930ba3ed..4eba81d 100644 --- a/chrome/browser/resources/pdf/pdf_scripting_api.ts +++ b/chrome/browser/resources/pdf/pdf_scripting_api.ts
@@ -60,7 +60,7 @@ shiftKey: event.shiftKey, ctrlKey: event.ctrlKey, altKey: event.altKey, - metaKey: event.metaKey + metaKey: event.metaKey, }; } @@ -209,7 +209,7 @@ url: url, grayscale: grayscale, pageNumbers: pageNumbers, - modifiable: modifiable + modifiable: modifiable, }); }
diff --git a/chrome/browser/resources/pdf/pdf_viewer.ts b/chrome/browser/resources/pdf/pdf_viewer.ts index a22dd8209..96d6028 100644 --- a/chrome/browser/resources/pdf/pdf_viewer.ts +++ b/chrome/browser/resources/pdf/pdf_viewer.ts
@@ -993,7 +993,7 @@ { type: 'saveFile', accepts: [{description: '*.pdf', extensions: ['pdf']}], - suggestedName: fileName + suggestedName: fileName, }, (entry?: FileSystemFileEntry) => { if (chrome.runtime.lastError) {
diff --git a/chrome/browser/resources/pdf/pdf_viewer_base.ts b/chrome/browser/resources/pdf/pdf_viewer_base.ts index d4b29b8..cfd0ed9 100644 --- a/chrome/browser/resources/pdf/pdf_viewer_base.ts +++ b/chrome/browser/resources/pdf/pdf_viewer_base.ts
@@ -120,7 +120,7 @@ const attributesForLoading: chrome.mimeHandlerPrivate.PdfPluginAttributes = { backgroundColor: this.getBackgroundColor(), - allowJavascript: javascript === 'allow' + allowJavascript: javascript === 'allow', }; if (chrome.mimeHandlerPrivate && chrome.mimeHandlerPrivate.setPdfPluginAttributes) { @@ -291,7 +291,7 @@ pageY: visiblePageDimensions.y, pageWidth: visiblePageDimensions.width, viewportWidth: size.width, - viewportHeight: size.height + viewportHeight: size.height, }); }
diff --git a/chrome/browser/resources/pdf/viewport.ts b/chrome/browser/resources/pdf/viewport.ts index cc57f7c8..215dfcef 100644 --- a/chrome/browser/resources/pdf/viewport.ts +++ b/chrome/browser/resources/pdf/viewport.ts
@@ -317,7 +317,7 @@ } return { width: Math.round(this.documentDimensions_.width * zoom), - height: Math.round(this.documentDimensions_.height * zoom) + height: Math.round(this.documentDimensions_.height * zoom), }; } @@ -325,7 +325,7 @@ getDocumentDimensions(): Size { return { width: this.documentDimensions_!.width, - height: this.documentDimensions_!.height + height: this.documentDimensions_!.height, }; } @@ -352,7 +352,7 @@ x: this.position.x / zoom, y: this.position.y / zoom, width: this.size.width / zoom, - height: this.size.height / zoom + height: this.size.height / zoom, }; } @@ -370,7 +370,7 @@ return { horizontal: zoomedDimensions.width > this.window_.offsetWidth, - vertical: zoomedDimensions.height > this.window_.offsetHeight + vertical: zoomedDimensions.height > this.window_.offsetHeight, }; } @@ -525,7 +525,7 @@ let zoom = this.getZoom(); const currentScrollPos = { x: this.position.x / zoom, - y: this.position.y / zoom + y: this.position.y / zoom, }; this.internalZoom_ = newZoom; @@ -559,7 +559,7 @@ const zoom = this.getZoom(); const currentScrollPos = { x: this.position.x - delta.x * zoom, - y: this.position.y - delta.y * zoom + y: this.position.y - delta.y * zoom, }; this.contentSizeChanged_(); @@ -578,7 +578,7 @@ const zoom = this.getZoom(); return { x: (pluginPoint.x + this.position.x) / zoom, - y: (pluginPoint.y + this.position.y) / zoom + y: (pluginPoint.y + this.position.y) / zoom, }; } @@ -599,7 +599,7 @@ const oldZoom = oldBrowserZoom * this.internalZoom_; const currentScrollPos = { x: this.position.x / oldZoom, - y: this.position.y / oldZoom + y: this.position.y / oldZoom, }; this.contentSizeChanged_(); const newZoom = this.getZoom(); @@ -1248,7 +1248,7 @@ x: x * zoom + spaceOnLeft - this.scrollContent_.scrollLeft, y: insetDimensions.y * zoom - this.scrollContent_.scrollTop, width: insetDimensions.width * zoom, - height: insetDimensions.height * zoom + height: insetDimensions.height * zoom, }; } @@ -1381,7 +1381,7 @@ if (!needsScrollbars.horizontal) { this.pinchCenter_ = { x: this.window_.offsetWidth / 2, - y: this.window_.offsetHeight / 2 + y: this.window_.offsetHeight / 2, }; } else if (this.keepContentCentered_) { this.oldCenterInContent_ = this.pluginToContent_(this.pinchCenter_);
diff --git a/chrome/browser/resources/print_preview/data/destination_store.ts b/chrome/browser/resources/print_preview/data/destination_store.ts index 960234d..676b87f 100644 --- a/chrome/browser/resources/print_preview/data/destination_store.ts +++ b/chrome/browser/resources/print_preview/data/destination_store.ts
@@ -243,7 +243,8 @@ this.destinationSearchStatus_ = new Map([ [ - PrinterType.EXTENSION_PRINTER, DestinationStorePrinterSearchStatus.START + PrinterType.EXTENSION_PRINTER, + DestinationStorePrinterSearchStatus.START, ], [PrinterType.LOCAL_PRINTER, DestinationStorePrinterSearchStatus.START], ]);
diff --git a/chrome/browser/resources/print_preview/data/measurement_system.ts b/chrome/browser/resources/print_preview/data/measurement_system.ts index 1b04497a..00e036f9 100644 --- a/chrome/browser/resources/print_preview/data/measurement_system.ts +++ b/chrome/browser/resources/print_preview/data/measurement_system.ts
@@ -98,15 +98,16 @@ const measurementSystemPrefs: Map<MeasurementSystemUnitType, MeasurementSystemPrefs> = new Map([ [ - MeasurementSystemUnitType.METRIC, { + MeasurementSystemUnitType.METRIC, + { precision: 0.5, decimalPlaces: 1, ptsPerUnit: 72.0 / 25.4, - unitSymbol: 'mm' - } + unitSymbol: 'mm', + }, ], [ MeasurementSystemUnitType.IMPERIAL, - {precision: 0.01, decimalPlaces: 2, ptsPerUnit: 72.0, unitSymbol: '"'} - ] + {precision: 0.01, decimalPlaces: 2, ptsPerUnit: 72.0, unitSymbol: '"'}, + ], ]);
diff --git a/chrome/browser/resources/print_preview/data/model.ts b/chrome/browser/resources/print_preview/data/model.ts index 0d8a680..2aa730f7 100644 --- a/chrome/browser/resources/print_preview/data/model.ts +++ b/chrome/browser/resources/print_preview/data/model.ts
@@ -541,7 +541,7 @@ type: Number, value: 0, notify: true, - } + }, }; } @@ -1651,7 +1651,7 @@ width_microns: mediaValue.width_microns, height_microns: mediaValue.height_microns, is_continuous_feed: mediaValue.is_continuous_feed, - vendor_id: mediaValue.vendor_id + vendor_id: mediaValue.vendor_id, }; } if (!this.settings.layout.available) { @@ -1667,7 +1667,7 @@ } } else { cjt.print.page_orientation = { - type: this.settings.layout.value ? 'LANDSCAPE' : 'PORTRAIT' + type: this.settings.layout.value ? 'LANDSCAPE' : 'PORTRAIT', }; } if (this.settings.dpi.available) { @@ -1675,7 +1675,7 @@ cjt.print.dpi = { horizontal_dpi: dpiValue.horizontal_dpi, vertical_dpi: dpiValue.vertical_dpi, - vendor_id: dpiValue.vendor_id + vendor_id: dpiValue.vendor_id, }; } if (this.settings.vendorItems.available) {
diff --git a/chrome/browser/resources/print_preview/data/print_server_store.ts b/chrome/browser/resources/print_preview/data/print_server_store.ts index 6902e17..0e69b245 100644 --- a/chrome/browser/resources/print_preview/data/print_server_store.ts +++ b/chrome/browser/resources/print_preview/data/print_server_store.ts
@@ -79,7 +79,7 @@ this.updatePrintServersConfig_(printServersConfig); const eventData = { printServerNames: Array.from(this.printServersByName_.keys()), - isSingleServerFetchingMode: this.isSingleServerFetchingMode_ + isSingleServerFetchingMode: this.isSingleServerFetchingMode_, }; this.dispatchEvent(new CustomEvent( PrintServerStoreEventType.PRINT_SERVERS_CHANGED, {detail: eventData}));
diff --git a/chrome/browser/resources/print_preview/ui/destination_dialog_cros.ts b/chrome/browser/resources/print_preview/ui/destination_dialog_cros.ts index d6876bb..92d3ef7 100644 --- a/chrome/browser/resources/print_preview/ui/destination_dialog_cros.ts +++ b/chrome/browser/resources/print_preview/ui/destination_dialog_cros.ts
@@ -111,7 +111,7 @@ loadingAnyDestinations_: { type: Boolean, computed: 'computeLoadingDestinations_(' + - 'loadingDestinations_, loadingServerPrinters_)' + 'loadingDestinations_, loadingServerPrinters_)', }, }; }
diff --git a/chrome/browser/resources/print_preview/ui/input_mixin.ts b/chrome/browser/resources/print_preview/ui/input_mixin.ts index 62dcd04..04c96d97 100644 --- a/chrome/browser/resources/print_preview/ui/input_mixin.ts +++ b/chrome/browser/resources/print_preview/ui/input_mixin.ts
@@ -28,7 +28,7 @@ lastValue_: { type: String, value: '', - } + }, }; }
diff --git a/chrome/browser/resources/print_preview/ui/margin_control_container.ts b/chrome/browser/resources/print_preview/ui/margin_control_container.ts index deb07f3..028a2e5 100644 --- a/chrome/browser/resources/print_preview/ui/margin_control_container.ts +++ b/chrome/browser/resources/print_preview/ui/margin_control_container.ts
@@ -22,7 +22,7 @@ [CustomMarginsOrientation.TOP, 'marginTop'], [CustomMarginsOrientation.RIGHT, 'marginRight'], [CustomMarginsOrientation.BOTTOM, 'marginBottom'], - [CustomMarginsOrientation.LEFT, 'marginLeft'] + [CustomMarginsOrientation.LEFT, 'marginLeft'], ]); export type MarginObject = {
diff --git a/chrome/browser/resources/print_preview/ui/margins_settings.ts b/chrome/browser/resources/print_preview/ui/margins_settings.ts index 223a42b..fb2386c 100644 --- a/chrome/browser/resources/print_preview/ui/margins_settings.ts +++ b/chrome/browser/resources/print_preview/ui/margins_settings.ts
@@ -46,7 +46,7 @@ marginsTypeEnum_: { type: Object, value: MarginsType, - } + }, }; } @@ -55,7 +55,7 @@ 'onMarginsSettingChange_(settings.margins.value)', 'onMediaSizeOrLayoutChange_(' + 'settings.mediaSize.value, settings.layout.value)', - 'onPagesPerSheetSettingChange_(settings.pagesPerSheet.value)' + 'onPagesPerSheetSettingChange_(settings.pagesPerSheet.value)', ]; }
diff --git a/chrome/browser/resources/print_preview/ui/sidebar.ts b/chrome/browser/resources/print_preview/ui/sidebar.ts index 51d06642..17ceb06 100644 --- a/chrome/browser/resources/print_preview/ui/sidebar.ts +++ b/chrome/browser/resources/print_preview/ui/sidebar.ts
@@ -197,8 +197,19 @@ // Destination settings is always available. See if the total number of // available sections exceeds the maximum number to show. return [ - 'pages', 'copies', 'layout', 'color', 'mediaSize', 'margins', 'color', - 'pagesPerSheet', 'scaling', 'dpi', 'duplex', 'otherOptions', 'vendorItems' + 'pages', + 'copies', + 'layout', + 'color', + 'mediaSize', + 'margins', + 'color', + 'pagesPerSheet', + 'scaling', + 'dpi', + 'duplex', + 'otherOptions', + 'vendorItems', ].reduce((count, setting) => { return this.getSetting(setting).available ? count + 1 : count; }, 1) > MAX_SECTIONS_TO_SHOW;
diff --git a/chrome/browser/resources/sandbox_internals/sandbox_internals_win.ts b/chrome/browser/resources/sandbox_internals/sandbox_internals_win.ts index db836ac..ddad94ba 100644 --- a/chrome/browser/resources/sandbox_internals/sandbox_internals_win.ts +++ b/chrome/browser/resources/sandbox_internals/sandbox_internals_win.ts
@@ -477,8 +477,12 @@ if (policy) { // Text-only items. const entries = [ - String(pid), type, name, sandbox, policy.lockdownLevel, - policy.desiredIntegrityLevel + String(pid), + type, + name, + sandbox, + policy.lockdownLevel, + policy.desiredIntegrityLevel, ].map(makeTextEntry); entries.push(makeMitigationEntry(policy.platformMitigations)); entries.push(makeComponentFilterEntry(policy)); @@ -499,8 +503,15 @@ // Titles. addRow([ - 'Process', 'Type', 'Name', 'Sandbox', 'Lockdown', 'Integrity', - 'Mitigations', 'Component Filter', 'Lowbox/AppContainer' + 'Process', + 'Type', + 'Name', + 'Sandbox', + 'Lockdown', + 'Integrity', + 'Mitigations', + 'Component Filter', + 'Lowbox/AppContainer', ].map(makeTextEntry)); // Browser Processes. @@ -508,7 +519,11 @@ const pid = process.processId; const name = process.name || process.metricsName; addRowForProcess( - pid, process.processType, name, process.sandboxType, policies.get(pid)! + pid, + process.processType, + name, + process.sandboxType, + policies.get(pid)!, ); }
diff --git a/chrome/browser/resources/settings/a11y_page/a11y_page.ts b/chrome/browser/resources/settings/a11y_page/a11y_page.ts index ae0a5d9..27bca158 100644 --- a/chrome/browser/resources/settings/a11y_page/a11y_page.ts +++ b/chrome/browser/resources/settings/a11y_page/a11y_page.ts
@@ -83,7 +83,7 @@ type: Boolean, value: function() { return loadTimeData.getBoolean('showFocusHighlightOption'); - } + }, }, // </if>
diff --git a/chrome/browser/resources/settings/a11y_page/captions_subpage.ts b/chrome/browser/resources/settings/a11y_page/captions_subpage.ts index 9fa8f63b..5b0d047 100644 --- a/chrome/browser/resources/settings/a11y_page/captions_subpage.ts +++ b/chrome/browser/resources/settings/a11y_page/captions_subpage.ts
@@ -51,15 +51,15 @@ return [ { value: 100, // Default - name: loadTimeData.getString('captionsOpacityOpaque') + name: loadTimeData.getString('captionsOpacityOpaque'), }, { value: 50, - name: loadTimeData.getString('captionsOpacitySemiTransparent') + name: loadTimeData.getString('captionsOpacitySemiTransparent'), }, { value: 0, - name: loadTimeData.getString('captionsOpacityTransparent') + name: loadTimeData.getString('captionsOpacityTransparent'), }, ]; }, @@ -76,35 +76,35 @@ {value: '', name: loadTimeData.getString('captionsDefaultSetting')}, { value: '0,0,0', - name: loadTimeData.getString('captionsColorBlack') + name: loadTimeData.getString('captionsColorBlack'), }, { value: '255,255,255', - name: loadTimeData.getString('captionsColorWhite') + name: loadTimeData.getString('captionsColorWhite'), }, { value: '255,0,0', - name: loadTimeData.getString('captionsColorRed') + name: loadTimeData.getString('captionsColorRed'), }, { value: '0,255,0', - name: loadTimeData.getString('captionsColorGreen') + name: loadTimeData.getString('captionsColorGreen'), }, { value: '0,0,255', - name: loadTimeData.getString('captionsColorBlue') + name: loadTimeData.getString('captionsColorBlue'), }, { value: '255,255,0', - name: loadTimeData.getString('captionsColorYellow') + name: loadTimeData.getString('captionsColorYellow'), }, { value: '0,255,255', - name: loadTimeData.getString('captionsColorCyan') + name: loadTimeData.getString('captionsColorCyan'), }, { value: '255,0,255', - name: loadTimeData.getString('captionsColorMagenta') + name: loadTimeData.getString('captionsColorMagenta'), }, ]; }, @@ -125,15 +125,15 @@ return [ { value: 100, // Default - name: loadTimeData.getString('captionsOpacityOpaque') + name: loadTimeData.getString('captionsOpacityOpaque'), }, { value: 50, - name: loadTimeData.getString('captionsOpacitySemiTransparent') + name: loadTimeData.getString('captionsOpacitySemiTransparent'), }, { value: 10, - name: loadTimeData.getString('captionsOpacityTransparent') + name: loadTimeData.getString('captionsOpacityTransparent'), }, ]; }, @@ -150,20 +150,20 @@ {value: '', name: loadTimeData.getString('captionsTextShadowNone')}, { value: '-2px -2px 4px rgba(0, 0, 0, 0.5)', - name: loadTimeData.getString('captionsTextShadowRaised') + name: loadTimeData.getString('captionsTextShadowRaised'), }, { value: '2px 2px 4px rgba(0, 0, 0, 0.5)', - name: loadTimeData.getString('captionsTextShadowDepressed') + name: loadTimeData.getString('captionsTextShadowDepressed'), }, { value: '-1px 0px 0px black, ' + '0px -1px 0px black, 1px 0px 0px black, 0px 1px 0px black', - name: loadTimeData.getString('captionsTextShadowUniform') + name: loadTimeData.getString('captionsTextShadowUniform'), }, { value: '0px 0px 2px rgba(0, 0, 0, 0.5), 2px 2px 2px black', - name: loadTimeData.getString('captionsTextShadowDropShadow') + name: loadTimeData.getString('captionsTextShadowDropShadow'), }, ]; }, @@ -181,7 +181,7 @@ {value: '50%', name: loadTimeData.getString('small')}, { value: '', - name: loadTimeData.getString('medium') + name: loadTimeData.getString('medium'), }, // Default = 100% {value: '150%', name: loadTimeData.getString('large')}, {value: '200%', name: loadTimeData.getString('veryLarge')},
diff --git a/chrome/browser/resources/settings/a11y_page/live_caption_section.ts b/chrome/browser/resources/settings/a11y_page/live_caption_section.ts index 4fd340d..096084a8 100644 --- a/chrome/browser/resources/settings/a11y_page/live_caption_section.ts +++ b/chrome/browser/resources/settings/a11y_page/live_caption_section.ts
@@ -61,7 +61,7 @@ type: Boolean, value: function() { return loadTimeData.getBoolean('enableLiveCaptionMultiLanguage'); - } + }, }, /**
diff --git a/chrome/browser/resources/settings/about_page/about_page.ts b/chrome/browser/resources/settings/about_page/about_page.ts index 59638383..abfc284 100644 --- a/chrome/browser/resources/settings/about_page/about_page.ts +++ b/chrome/browser/resources/settings/about_page/about_page.ts
@@ -59,7 +59,7 @@ message: '', progress: 0, rollback: false, - status: UpdateStatus.DISABLED + status: UpdateStatus.DISABLED, }, },
diff --git a/chrome/browser/resources/settings/appearance_page/appearance_page.ts b/chrome/browser/resources/settings/appearance_page/appearance_page.ts index 065f3e0..56f3cd9 100644 --- a/chrome/browser/resources/settings/appearance_page/appearance_page.ts +++ b/chrome/browser/resources/settings/appearance_page/appearance_page.ts
@@ -161,7 +161,7 @@ type: Boolean, value() { return loadTimeData.getBoolean('showSidePanelOptions'); - } + }, }, showManagedThemeDialog_: Boolean,
diff --git a/chrome/browser/resources/settings/autofill_page/address_edit_dialog.ts b/chrome/browser/resources/settings/autofill_page/address_edit_dialog.ts index ec4720c9..f05dcc09 100644 --- a/chrome/browser/resources/settings/autofill_page/address_edit_dialog.ts +++ b/chrome/browser/resources/settings/autofill_page/address_edit_dialog.ts
@@ -77,8 +77,8 @@ type: Boolean, value() { return loadTimeData.getBoolean('showHonorific'); - } - } + }, + }, }; }
diff --git a/chrome/browser/resources/settings/autofill_page/autofill_page.ts b/chrome/browser/resources/settings/autofill_page/autofill_page.ts index 87d0ae42..e80758fb 100644 --- a/chrome/browser/resources/settings/autofill_page/autofill_page.ts +++ b/chrome/browser/resources/settings/autofill_page/autofill_page.ts
@@ -71,7 +71,7 @@ type: Boolean, value() { return loadTimeData.getBoolean('enablePasswordViewPage'); - } + }, }, // The credential is only used to pass the credential from password-view
diff --git a/chrome/browser/resources/settings/autofill_page/credit_card_edit_dialog.ts b/chrome/browser/resources/settings/autofill_page/credit_card_edit_dialog.ts index 2907cc8..0856ec2 100644 --- a/chrome/browser/resources/settings/autofill_page/credit_card_edit_dialog.ts +++ b/chrome/browser/resources/settings/autofill_page/credit_card_edit_dialog.ts
@@ -82,7 +82,18 @@ monthList_: { type: Array, value: [ - '01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12' + '01', + '02', + '03', + '04', + '05', + '06', + '07', + '08', + '09', + '10', + '11', + '12', ], },
diff --git a/chrome/browser/resources/settings/autofill_page/credit_card_list_entry.ts b/chrome/browser/resources/settings/autofill_page/credit_card_list_entry.ts index db0ae52..450a816 100644 --- a/chrome/browser/resources/settings/autofill_page/credit_card_list_entry.ts +++ b/chrome/browser/resources/settings/autofill_page/credit_card_list_entry.ts
@@ -63,7 +63,7 @@ detail: { creditCard: this.creditCard, anchorElement: this.shadowRoot!.querySelector('#creditCardMenu'), - } + }, })); }
diff --git a/chrome/browser/resources/settings/autofill_page/password_check.ts b/chrome/browser/resources/settings/autofill_page/password_check.ts index 23750c1..e4e499a 100644 --- a/chrome/browser/resources/settings/autofill_page/password_check.ts +++ b/chrome/browser/resources/settings/autofill_page/password_check.ts
@@ -160,7 +160,7 @@ showMutedPasswordsSection_: { type: Boolean, - computed: 'computeShowMutedLeakedCredentials_(mutedPasswords)' + computed: 'computeShowMutedLeakedCredentials_(mutedPasswords)', }, showNoCompromisedPasswordsLabel_: {
diff --git a/chrome/browser/resources/settings/autofill_page/password_check_list_item.ts b/chrome/browser/resources/settings/autofill_page/password_check_list_item.ts index 49b86e6..a660b17 100644 --- a/chrome/browser/resources/settings/autofill_page/password_check_list_item.ts +++ b/chrome/browser/resources/settings/autofill_page/password_check_list_item.ts
@@ -83,8 +83,8 @@ value() { return loadTimeData.getBoolean( 'showDismissCompromisedPasswordOption'); - } - } + }, + }, }; }
diff --git a/chrome/browser/resources/settings/autofill_page/password_check_mixin.ts b/chrome/browser/resources/settings/autofill_page/password_check_mixin.ts index c58a15d..8ab361191 100644 --- a/chrome/browser/resources/settings/autofill_page/password_check_mixin.ts +++ b/chrome/browser/resources/settings/autofill_page/password_check_mixin.ts
@@ -87,8 +87,8 @@ value() { return loadTimeData.getBoolean( 'showDismissCompromisedPasswordOption'); - } - } + }, + }, }; }
diff --git a/chrome/browser/resources/settings/autofill_page/password_edit_dialog.ts b/chrome/browser/resources/settings/autofill_page/password_edit_dialog.ts index 985bd9a..00e2187 100644 --- a/chrome/browser/resources/settings/autofill_page/password_edit_dialog.ts +++ b/chrome/browser/resources/settings/autofill_page/password_edit_dialog.ts
@@ -256,7 +256,7 @@ type: Boolean, value() { return loadTimeData.getBoolean('enablePasswordNotes'); - } + }, }, /* If true, change event will be dispatched. */ @@ -264,7 +264,7 @@ type: Boolean, value() { return loadTimeData.getBoolean('enablePasswordViewPage'); - } + }, }, }; } @@ -500,7 +500,7 @@ username: this.username_, password: this.password_, note: this.note_, - useAccountStore: useAccountStore + useAccountStore: useAccountStore, }) .finally(() => { this.close();
diff --git a/chrome/browser/resources/settings/autofill_page/password_view.html b/chrome/browser/resources/settings/autofill_page/password_view.html index 6995a5b..e425e6c 100644 --- a/chrome/browser/resources/settings/autofill_page/password_view.html +++ b/chrome/browser/resources/settings/autofill_page/password_view.html
@@ -38,7 +38,6 @@ --cr-input-background-color: transparent; --cr-input-padding-start: 0; --cr-input-readonly-opacity: 1; - --cr-input-underline-display: none; } settings-textarea.empty-note {
diff --git a/chrome/browser/resources/settings/autofill_page/passwords_device_section.ts b/chrome/browser/resources/settings/autofill_page/passwords_device_section.ts index ec166e05..4a1291b 100644 --- a/chrome/browser/resources/settings/autofill_page/passwords_device_section.ts +++ b/chrome/browser/resources/settings/autofill_page/passwords_device_section.ts
@@ -207,7 +207,7 @@ static get observers() { return [ - 'maybeRedirectToPasswordsPage_(isUserAllowedToAccessPage_, currentRoute_)' + 'maybeRedirectToPasswordsPage_(isUserAllowedToAccessPage_, currentRoute_)', ]; }
diff --git a/chrome/browser/resources/settings/autofill_page/passwords_export_dialog.ts b/chrome/browser/resources/settings/autofill_page/passwords_export_dialog.ts index b109f8a..ab924e8 100644 --- a/chrome/browser/resources/settings/autofill_page/passwords_export_dialog.ts +++ b/chrome/browser/resources/settings/autofill_page/passwords_export_dialog.ts
@@ -69,7 +69,7 @@ showErrorDialog_: Boolean, // <if expr="chromeos_ash or chromeos_lacros"> - tokenRequestManager: Object + tokenRequestManager: Object, // </if> }; }
diff --git a/chrome/browser/resources/settings/autofill_page/passwords_list_handler.ts b/chrome/browser/resources/settings/autofill_page/passwords_list_handler.ts index 11ccac73..bcf472f 100644 --- a/chrome/browser/resources/settings/autofill_page/passwords_list_handler.ts +++ b/chrome/browser/resources/settings/autofill_page/passwords_list_handler.ts
@@ -120,7 +120,7 @@ type: Boolean, value() { return loadTimeData.getBoolean('enableSendPasswords'); - } + }, }, /**
diff --git a/chrome/browser/resources/settings/autofill_page/passwords_section.ts b/chrome/browser/resources/settings/autofill_page/passwords_section.ts index 67c19e2..2911c9b 100644 --- a/chrome/browser/resources/settings/autofill_page/passwords_section.ts +++ b/chrome/browser/resources/settings/autofill_page/passwords_section.ts
@@ -253,7 +253,7 @@ value() { return loadTimeData.getBoolean( 'enableAutomaticPasswordChangeInSettings'); - } + }, }, isPasswordViewPageEnabled_: { @@ -276,7 +276,7 @@ value() { return loadTimeData.valueExists('showImportPasswords') && loadTimeData.getBoolean('showImportPasswords'); - } + }, }, /** An array of blocked sites to display. */
diff --git a/chrome/browser/resources/settings/chrome_cleanup_page/chrome_cleanup_page.ts b/chrome/browser/resources/settings/chrome_cleanup_page/chrome_cleanup_page.ts index 765d095..c0383f16 100644 --- a/chrome/browser/resources/settings/chrome_cleanup_page/chrome_cleanup_page.ts +++ b/chrome/browser/resources/settings/chrome_cleanup_page/chrome_cleanup_page.ts
@@ -621,79 +621,88 @@ return new Map([ [ - ChromeCleanerCardState.CLEANUP_OFFERED, { + ChromeCleanerCardState.CLEANUP_OFFERED, + { title: this.i18n('chromeCleanupTitleRemove'), explanation: this.i18n('chromeCleanupExplanationRemove'), actionButton: actionButtons.REMOVE, flags: ChromeCleanupCardFlags.SHOW_LOGS_PERMISSIONS | ChromeCleanupCardFlags.SHOW_ITEMS_TO_REMOVE, - } + }, ], [ - ChromeCleanerCardState.CLEANING, { + ChromeCleanerCardState.CLEANING, + { title: this.i18n('chromeCleanupTitleRemoving'), explanation: this.i18n('chromeCleanupExplanationRemoving'), actionButton: null, flags: ChromeCleanupCardFlags.WAITING_FOR_RESULT | ChromeCleanupCardFlags.SHOW_ITEMS_TO_REMOVE, - } + }, ], [ - ChromeCleanerCardState.REBOOT_REQUIRED, { + ChromeCleanerCardState.REBOOT_REQUIRED, + { title: this.i18n('chromeCleanupTitleRestart'), explanation: null, actionButton: actionButtons.RESTART_COMPUTER, flags: ChromeCleanupCardFlags.NONE, - } + }, ], [ - ChromeCleanerCardState.CLEANUP_SUCCEEDED, { + ChromeCleanerCardState.CLEANUP_SUCCEEDED, + { title: this.i18nAdvanced('chromeCleanupTitleRemoved', {tags: ['a']}), explanation: null, actionButton: null, flags: ChromeCleanupCardFlags.NONE, - } + }, ], [ - ChromeCleanerCardState.CLEANING_FAILED, { + ChromeCleanerCardState.CLEANING_FAILED, + { title: this.i18n('chromeCleanupTitleErrorCantRemove'), explanation: this.i18n('chromeCleanupExplanationCleanupError'), actionButton: null, flags: ChromeCleanupCardFlags.NONE, - } + }, ], [ - ChromeCleanerCardState.SCANNING_OFFERED, { + ChromeCleanerCardState.SCANNING_OFFERED, + { title: this.i18n('chromeCleanupTitleFindAndRemove'), explanation: this.i18n('chromeCleanupExplanationFindAndRemove'), actionButton: actionButtons.FIND, flags: ChromeCleanupCardFlags.SHOW_LOGS_PERMISSIONS, - } + }, ], [ - ChromeCleanerCardState.SCANNING, { + ChromeCleanerCardState.SCANNING, + { title: this.i18n('chromeCleanupTitleScanning'), explanation: null, actionButton: null, flags: ChromeCleanupCardFlags.WAITING_FOR_RESULT, - } + }, ], [ // TODO(crbug.com/776538): Could we offer to reset settings here? - ChromeCleanerCardState.SCANNING_FOUND_NOTHING, { + ChromeCleanerCardState.SCANNING_FOUND_NOTHING, + { title: this.i18n('chromeCleanupTitleNothingFound'), explanation: null, actionButton: null, flags: ChromeCleanupCardFlags.NONE, - } + }, ], [ - ChromeCleanerCardState.SCANNING_FAILED, { + ChromeCleanerCardState.SCANNING_FAILED, + { title: this.i18n('chromeCleanupTitleScanningFailed'), explanation: this.i18n('chromeCleanupExplanationScanError'), actionButton: null, flags: ChromeCleanupCardFlags.NONE, - } + }, ], [ ChromeCleanerCardState.CLEANER_DOWNLOAD_FAILED,
diff --git a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.ts b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.ts index 6ffa0fc..b8f484a 100644 --- a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.ts +++ b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.ts
@@ -129,7 +129,7 @@ // Will be filled as results are reported. value() { return {}; - } + }, }, /** @@ -437,7 +437,8 @@ } const haveInstalledApps = this.installedApps_.length > 0; chrome.send('metricsHandler:recordBooleanHistogram', [ - 'History.ClearBrowsingData.InstalledAppsDialogShown', haveInstalledApps + 'History.ClearBrowsingData.InstalledAppsDialogShown', + haveInstalledApps, ]); return haveInstalledApps; }
diff --git a/chrome/browser/resources/settings/controls/settings_textarea.ts b/chrome/browser/resources/settings/controls/settings_textarea.ts index f2582492..6a77e3f 100644 --- a/chrome/browser/resources/settings/controls/settings_textarea.ts +++ b/chrome/browser/resources/settings/controls/settings_textarea.ts
@@ -54,7 +54,7 @@ type: Boolean, value: false, reflectToAttribute: true, - observer: 'onDisabledChanged_' + observer: 'onDisabledChanged_', }, /** Maximum length (in characters) of the text area. */
diff --git a/chrome/browser/resources/settings/downloads_page/downloads_page.ts b/chrome/browser/resources/settings/downloads_page/downloads_page.ts index e8db9b5..439759f 100644 --- a/chrome/browser/resources/settings/downloads_page/downloads_page.ts +++ b/chrome/browser/resources/settings/downloads_page/downloads_page.ts
@@ -96,7 +96,7 @@ // <if expr="chromeos_ash"> static get observers() { return [ - 'handleDownloadLocationChanged_(prefs.download.default_directory.value)' + 'handleDownloadLocationChanged_(prefs.download.default_directory.value)', ]; } // </if>
diff --git a/chrome/browser/resources/settings/languages_page/languages.ts b/chrome/browser/resources/settings/languages_page/languages.ts index 4d05dd0..cdf1e4e0 100644 --- a/chrome/browser/resources/settings/languages_page/languages.ts +++ b/chrome/browser/resources/settings/languages_page/languages.ts
@@ -430,7 +430,7 @@ isManaged: blockedCodesSet.has(language.code), spellCheckEnabled: false, downloadDictionaryStatus: null, - downloadDictionaryFailureCount: 0 + downloadDictionaryFailureCount: 0, }); } }
diff --git a/chrome/browser/resources/settings/metrics_browser_proxy.ts b/chrome/browser/resources/settings/metrics_browser_proxy.ts index a392f6a..645ec97 100644 --- a/chrome/browser/resources/settings/metrics_browser_proxy.ts +++ b/chrome/browser/resources/settings/metrics_browser_proxy.ts
@@ -196,15 +196,17 @@ recordSafetyCheckInteractionHistogram(interaction: SafetyCheckInteractions) { chrome.send('metricsHandler:recordInHistogram', [ - 'Settings.SafetyCheck.Interactions', interaction, - SafetyCheckInteractions.COUNT + 'Settings.SafetyCheck.Interactions', + interaction, + SafetyCheckInteractions.COUNT, ]); } recordSettingsPageHistogram(interaction: PrivacyElementInteractions) { chrome.send('metricsHandler:recordInHistogram', [ - 'Settings.PrivacyElementInteractions', interaction, - PrivacyElementInteractions.COUNT + 'Settings.PrivacyElementInteractions', + interaction, + PrivacyElementInteractions.COUNT, ]); } @@ -213,30 +215,34 @@ // TODO(crbug.com/1124491): Set the correct suffix for // SafeBrowsing.Settings.UserAction. Use the .Default suffix for now. chrome.send('metricsHandler:recordInHistogram', [ - 'SafeBrowsing.Settings.UserAction.Default', interaction, - SafeBrowsingInteractions.COUNT + 'SafeBrowsing.Settings.UserAction.Default', + interaction, + SafeBrowsingInteractions.COUNT, ]); } recordPrivacyGuideNextNavigationHistogram(interaction: PrivacyGuideInteractions) { chrome.send('metricsHandler:recordInHistogram', [ - 'Settings.PrivacyGuide.NextNavigation', interaction, - PrivacyGuideInteractions.COUNT + 'Settings.PrivacyGuide.NextNavigation', + interaction, + PrivacyGuideInteractions.COUNT, ]); } recordPrivacyGuideEntryExitHistogram(interaction: PrivacyGuideInteractions) { chrome.send('metricsHandler:recordInHistogram', [ - 'Settings.PrivacyGuide.EntryExit', interaction, - PrivacyGuideInteractions.COUNT + 'Settings.PrivacyGuide.EntryExit', + interaction, + PrivacyGuideInteractions.COUNT, ]); } recordPrivacyGuideSettingsStatesHistogram(state: PrivacyGuideSettingsStates) { chrome.send('metricsHandler:recordInHistogram', [ - 'Settings.PrivacyGuide.SettingsStates', state, - PrivacyGuideSettingsStates.COUNT + 'Settings.PrivacyGuide.SettingsStates', + state, + PrivacyGuideSettingsStates.COUNT, ]); }
diff --git a/chrome/browser/resources/settings/people_page/sync_encryption_options.ts b/chrome/browser/resources/settings/people_page/sync_encryption_options.ts index 279b11a..61651cf 100644 --- a/chrome/browser/resources/settings/people_page/sync_encryption_options.ts +++ b/chrome/browser/resources/settings/people_page/sync_encryption_options.ts
@@ -188,7 +188,7 @@ this.dispatchEvent(new CustomEvent('passphrase-changed', { bubbles: true, composed: true, - detail: {didChange: successfullySet} + detail: {didChange: successfullySet}, })); this.isSettingEncryptionPassphrase_ = false; });
diff --git a/chrome/browser/resources/settings/people_page/sync_page.ts b/chrome/browser/resources/settings/people_page/sync_page.ts index 588f6ee5..c699c43 100644 --- a/chrome/browser/resources/settings/people_page/sync_page.ts +++ b/chrome/browser/resources/settings/people_page/sync_page.ts
@@ -138,7 +138,7 @@ dataEncrypted_: { type: Boolean, - computed: 'computeDataEncrypted_(syncPrefs.encryptAllData)' + computed: 'computeDataEncrypted_(syncPrefs.encryptAllData)', }, encryptionExpanded_: { @@ -550,8 +550,8 @@ tags: ['a'], substitutions: [ loadTimeData.getString('syncErrorsHelpUrl'), - this.syncPrefs.explicitPassphraseTime - ] + this.syncPrefs.explicitPassphraseTime, + ], }); }
diff --git a/chrome/browser/resources/settings/prefs/prefs.ts b/chrome/browser/resources/settings/prefs/prefs.ts index 288463f..1127f370 100644 --- a/chrome/browser/resources/settings/prefs/prefs.ts +++ b/chrome/browser/resources/settings/prefs/prefs.ts
@@ -215,7 +215,7 @@ this.dispatchEvent(new CustomEvent('user-action-setting-change', { bubbles: true, composed: true, - detail: {prefKey: key, prefValue: prefObj.value} + detail: {prefKey: key, prefValue: prefObj.value}, })); // </if>
diff --git a/chrome/browser/resources/settings/privacy_page/cookies_page.ts b/chrome/browser/resources/settings/privacy_page/cookies_page.ts index 2ab5962d..d2a4ea2b 100644 --- a/chrome/browser/resources/settings/privacy_page/cookies_page.ts +++ b/chrome/browser/resources/settings/privacy_page/cookies_page.ts
@@ -240,7 +240,7 @@ 'blockAllPref_', Object.assign(this.getPref('generated.cookie_primary_setting'), { controlledBy: sessionOnlyPref.controlledBy, - controlledByName: sessionOnlyPref.controlledByName + controlledByName: sessionOnlyPref.controlledByName, })); }
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_page.ts b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_page.ts index 6b2d867..4fd3ea3 100644 --- a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_page.ts +++ b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_page.ts
@@ -128,7 +128,7 @@ reflectToAttribute: true, type: Boolean, value: false, - } + }, }; }
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_guide/step_indicator.ts b/chrome/browser/resources/settings/privacy_page/privacy_guide/step_indicator.ts index 1bf32fd3c..766c6bf 100644 --- a/chrome/browser/resources/settings/privacy_page/privacy_guide/step_indicator.ts +++ b/chrome/browser/resources/settings/privacy_page/privacy_guide/step_indicator.ts
@@ -38,7 +38,7 @@ dots_: { type: Array, computed: 'computeDots_(model.total)', - } + }, }; }
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page.ts b/chrome/browser/resources/settings/privacy_page/privacy_page.ts index 6b453731..87f7141 100644 --- a/chrome/browser/resources/settings/privacy_page/privacy_page.ts +++ b/chrome/browser/resources/settings/privacy_page/privacy_page.ts
@@ -89,7 +89,7 @@ type: Boolean, value() { return loadTimeData.getBoolean('isGuest'); - } + }, }, showClearBrowsingDataDialog_: Boolean, @@ -99,7 +99,7 @@ type: Boolean, value() { return loadTimeData.getBoolean('enableSafeBrowsingSubresourceFilter'); - } + }, }, cookieSettingDescription_: String, @@ -108,21 +108,21 @@ type: Boolean, value() { return loadTimeData.getBoolean('enableBlockAutoplayContentSetting'); - } + }, }, blockAutoplayStatus_: { type: Object, value() { return {}; - } + }, }, enablePaymentHandlerContentSetting_: { type: Boolean, value() { return loadTimeData.getBoolean('enablePaymentHandlerContentSetting'); - } + }, }, enableFederatedIdentityApiContentSetting_: { @@ -130,7 +130,7 @@ value() { return loadTimeData.getBoolean( 'enableFederatedIdentityApiContentSetting'); - } + }, }, enableExperimentalWebPlatformFeatures_: { @@ -146,7 +146,7 @@ readOnly: true, value() { return loadTimeData.getBoolean('enableSecurityKeysSubpage'); - } + }, }, enableQuietNotificationPromptsSetting_: { @@ -268,7 +268,7 @@ type: chrome.settingsPrivate.PrefType.BOOLEAN, value: false, }, - enabled: false + enabled: false, }); this.addWebUIListener(
diff --git a/chrome/browser/resources/settings/privacy_page/secure_dns_input.ts b/chrome/browser/resources/settings/privacy_page/secure_dns_input.ts index a71b08b..0fb23d0 100644 --- a/chrome/browser/resources/settings/privacy_page/secure_dns_input.ts +++ b/chrome/browser/resources/settings/privacy_page/secure_dns_input.ts
@@ -46,7 +46,7 @@ * The error text to display beneath the input field when |showError_| is * true. */ - errorText_: {type: String, value: ''} + errorText_: {type: String, value: ''}, }; } @@ -96,7 +96,7 @@ this.dispatchEvent(new CustomEvent('value-update', { bubbles: true, composed: true, - detail: {isValid: valid, text: valueToValidate} + detail: {isValid: valid, text: valueToValidate}, })); }
diff --git a/chrome/browser/resources/settings/privacy_page/security_keys_bio_enroll_dialog.ts b/chrome/browser/resources/settings/privacy_page/security_keys_bio_enroll_dialog.ts index 9353918836..a786cdc 100644 --- a/chrome/browser/resources/settings/privacy_page/security_keys_bio_enroll_dialog.ts +++ b/chrome/browser/resources/settings/privacy_page/security_keys_bio_enroll_dialog.ts
@@ -31,9 +31,9 @@ import {WebUIListenerMixin} from 'chrome://resources/js/web_ui_listener_mixin.js'; import {IronListElement} from 'chrome://resources/polymer/v3_0/iron-list/iron-list.js'; import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {getTemplate} from './security_keys_bio_enroll_dialog.html.js'; -import {Ctap2Status, Enrollment, EnrollmentResponse, SampleResponse, SampleStatus, SecurityKeysBioEnrollProxy, SecurityKeysBioEnrollProxyImpl,} from './security_keys_browser_proxy.js'; +import {getTemplate} from './security_keys_bio_enroll_dialog.html.js'; +import {Ctap2Status, Enrollment, EnrollmentResponse, SampleResponse, SampleStatus, SecurityKeysBioEnrollProxy, SecurityKeysBioEnrollProxyImpl} from './security_keys_browser_proxy.js'; import {SettingsSecurityKeysPinFieldElement} from './security_keys_pin_field.js'; export enum BioEnrollDialogPage {
diff --git a/chrome/browser/resources/settings/privacy_page/security_keys_subpage.ts b/chrome/browser/resources/settings/privacy_page/security_keys_subpage.ts index 6e9ff39..0367120b 100644 --- a/chrome/browser/resources/settings/privacy_page/security_keys_subpage.ts +++ b/chrome/browser/resources/settings/privacy_page/security_keys_subpage.ts
@@ -46,7 +46,7 @@ readOnly: true, value() { return loadTimeData.getBoolean('enableSecurityKeysBioEnrollment'); - } + }, }, showSetPINDialog_: {
diff --git a/chrome/browser/resources/settings/privacy_page/security_page.ts b/chrome/browser/resources/settings/privacy_page/security_page.ts index a4adc4b..a281ce7 100644 --- a/chrome/browser/resources/settings/privacy_page/security_page.ts +++ b/chrome/browser/resources/settings/privacy_page/security_page.ts
@@ -133,7 +133,7 @@ readOnly: true, value() { return loadTimeData.getBoolean('enableSecurityKeysSubpage'); - } + }, }, // <if expr="is_win"> @@ -145,7 +145,7 @@ // it exists. Thus the phones subpage is only linked from this page // if the security keys subpage is disabled. return !loadTimeData.getBoolean('enableSecurityKeysSubpage'); - } + }, }, // </if>
diff --git a/chrome/browser/resources/settings/search_engines_page/search_engine_edit_dialog.ts b/chrome/browser/resources/settings/search_engines_page/search_engine_edit_dialog.ts index f323aad..9391ec79 100644 --- a/chrome/browser/resources/settings/search_engines_page/search_engine_edit_dialog.ts +++ b/chrome/browser/resources/settings/search_engines_page/search_engine_edit_dialog.ts
@@ -175,7 +175,9 @@ private updateActionButtonState_() { const allValid = [ - this.$.searchEngine, this.$.keyword, this.$.queryUrl + this.$.searchEngine, + this.$.keyword, + this.$.queryUrl, ].every(function(inputElement) { return !inputElement.invalid && inputElement.value.length > 0; });
diff --git a/chrome/browser/resources/settings/search_engines_page/search_engine_entry.ts b/chrome/browser/resources/settings/search_engines_page/search_engine_entry.ts index 6cc2ffbc..4ced27e 100644 --- a/chrome/browser/resources/settings/search_engines_page/search_engine_entry.ts +++ b/chrome/browser/resources/settings/search_engines_page/search_engine_entry.ts
@@ -50,13 +50,13 @@ isDefault: { reflectToAttribute: true, type: Boolean, - computed: 'computeIsDefault_(engine)' + computed: 'computeIsDefault_(engine)', }, disableMenuButton: { reflectToAttribute: true, type: Boolean, - computed: 'computeDisableMenuButton_(engine)' + computed: 'computeDisableMenuButton_(engine)', }, };
diff --git a/chrome/browser/resources/settings/search_page/search_page.ts b/chrome/browser/resources/settings/search_page/search_page.ts index fed9007..9da0afb 100644 --- a/chrome/browser/resources/settings/search_page/search_page.ts +++ b/chrome/browser/resources/settings/search_page/search_page.ts
@@ -52,7 +52,7 @@ type: Array, value() { return []; - } + }, }, /** Filter applied to search engines. */ @@ -109,7 +109,7 @@ this.dispatchEvent(new CustomEvent('refresh-pref', { bubbles: true, composed: true, - detail: 'default_search_provider.enabled' + detail: 'default_search_provider.enabled', })); }
diff --git a/chrome/browser/resources/settings/settings_page/main_page_mixin.ts b/chrome/browser/resources/settings/settings_page/main_page_mixin.ts index fd941082..6146559 100644 --- a/chrome/browser/resources/settings/settings_page/main_page_mixin.ts +++ b/chrome/browser/resources/settings/settings_page/main_page_mixin.ts
@@ -94,11 +94,12 @@ return new Map([ [RouteState.INITIAL, allStates], [ - RouteState.DIALOG, new Set([ + RouteState.DIALOG, + new Set([ RouteState.SECTION, RouteState.SUBPAGE, RouteState.TOP_LEVEL, - ]) + ]), ], [RouteState.SECTION, allStates], [RouteState.SUBPAGE, allStates],
diff --git a/chrome/browser/resources/settings/site_settings/all_sites.ts b/chrome/browser/resources/settings/site_settings/all_sites.ts index 9abb325..2d6e5d796 100644 --- a/chrome/browser/resources/settings/site_settings/all_sites.ts +++ b/chrome/browser/resources/settings/site_settings/all_sites.ts
@@ -467,7 +467,7 @@ etldPlus1: siteGroupToUpdate.etldPlus1, hasInstalledPWA: siteGroupToUpdate.hasInstalledPWA, numCookies: siteGroupToUpdate.numCookies, - origins: [] + origins: [], }; if (actionScope === 'origin') { @@ -903,7 +903,7 @@ etldPlus1: siteGroupToUpdate.etldPlus1, hasInstalledPWA: siteGroupToUpdate.hasInstalledPWA, numCookies: 0, - origins: [] + origins: [], }; this.browserProxy.clearEtldPlus1DataAndCookies(siteGroupToUpdate.etldPlus1);
diff --git a/chrome/browser/resources/settings/site_settings/cookie_info.ts b/chrome/browser/resources/settings/site_settings/cookie_info.ts index fe7cc45..5b2f3f0b 100644 --- a/chrome/browser/resources/settings/site_settings/cookie_info.ts +++ b/chrome/browser/resources/settings/site_settings/cookie_info.ts
@@ -29,27 +29,34 @@ // 3) What user friendly label to prefix the data with. export const cookieInfo: {[key: string]: string[][]} = { 'cookie': [ - ['name', 'cookieName'], ['content', 'cookieContent'], - ['domain', 'cookieDomain'], ['path', 'cookiePath'], + ['name', 'cookieName'], + ['content', 'cookieContent'], + ['domain', 'cookieDomain'], + ['path', 'cookiePath'], ['sendfor', 'cookieSendFor'], ['accessibleToScript', 'cookieAccessibleToScript'], - ['created', 'cookieCreated'], ['expires', 'cookieExpires'] + ['created', 'cookieCreated'], + ['expires', 'cookieExpires'], ], 'database': [ - ['origin', 'databaseOrigin'], ['size', 'localStorageSize'], - ['modified', 'localStorageLastModified'] + ['origin', 'databaseOrigin'], + ['size', 'localStorageSize'], + ['modified', 'localStorageLastModified'], ], 'local_storage': [ - ['origin', 'localStorageOrigin'], ['size', 'localStorageSize'], - ['modified', 'localStorageLastModified'] + ['origin', 'localStorageOrigin'], + ['size', 'localStorageSize'], + ['modified', 'localStorageLastModified'], ], 'indexed_db': [ - ['origin', 'indexedDbOrigin'], ['size', 'indexedDbSize'], - ['modified', 'indexedDbLastModified'] + ['origin', 'indexedDbOrigin'], + ['size', 'indexedDbSize'], + ['modified', 'indexedDbLastModified'], ], 'file_system': [ - ['origin', 'fileSystemOrigin'], ['persistent', 'fileSystemPersistentUsage'], - ['temporary', 'fileSystemTemporaryUsage'] + ['origin', 'fileSystemOrigin'], + ['persistent', 'fileSystemPersistentUsage'], + ['temporary', 'fileSystemTemporaryUsage'], ], 'quota': [['origin', 'quotaOrigin'], ['totalUsage', 'quotaSize']], 'service_worker': @@ -57,13 +64,15 @@ 'shared_worker': [['worker', 'sharedWorkerWorker'], ['name', 'sharedWorkerName']], 'cache_storage': [ - ['origin', 'cacheStorageOrigin'], ['size', 'cacheStorageSize'], - ['modified', 'cacheStorageLastModified'] + ['origin', 'cacheStorageOrigin'], + ['size', 'cacheStorageSize'], + ['modified', 'cacheStorageLastModified'], ], 'flash_lso': [['domain', 'cookieDomain']], 'media_license': [ - ['origin', 'mediaLicenseOrigin'], ['size', 'mediaLicenseSize'], - ['modified', 'mediaLicenseLastModified'] + ['origin', 'mediaLicenseOrigin'], + ['size', 'mediaLicenseSize'], + ['modified', 'mediaLicenseLastModified'], ], };
diff --git a/chrome/browser/resources/settings/site_settings/site_list.ts b/chrome/browser/resources/settings/site_settings/site_list.ts index d8ee00c..063d0b53 100644 --- a/chrome/browser/resources/settings/site_settings/site_list.ts +++ b/chrome/browser/resources/settings/site_settings/site_list.ts
@@ -141,7 +141,7 @@ BLOCK: 'Block', RESET: 'Reset', SESSION_ONLY: 'SessionOnly', - } + }, }, lastFocused_: Object,
diff --git a/chrome/browser/resources/settings/site_settings_page/site_settings_list.ts b/chrome/browser/resources/settings/site_settings_page/site_settings_list.ts index 69f1347..9371e82 100644 --- a/chrome/browser/resources/settings/site_settings_page/site_settings_list.ts +++ b/chrome/browser/resources/settings/site_settings_page/site_settings_list.ts
@@ -77,7 +77,7 @@ // The prefs object is only populated for the instance of this element // which contains the notifications link row, avoiding non-actionable // firing of the observer. - 'updateNotificationsLabel_(prefs.generated.notification.*)' + 'updateNotificationsLabel_(prefs.generated.notification.*)', ]; }
diff --git a/chrome/browser/resources/settings/site_settings_page/site_settings_page.ts b/chrome/browser/resources/settings/site_settings_page/site_settings_page.ts index a87bb18..af1c286c 100644 --- a/chrome/browser/resources/settings/site_settings_page/site_settings_page.ts +++ b/chrome/browser/resources/settings/site_settings_page/site_settings_page.ts
@@ -397,7 +397,7 @@ Id.FEDERATED_IDENTITY_API, ]), }; - } + }, }, focusConfig: {
diff --git a/chrome/browser/resources/side_panel/bookmarks/bookmark_folder.ts b/chrome/browser/resources/side_panel/bookmarks/bookmark_folder.ts index 39c8e1a..2d929a5 100644 --- a/chrome/browser/resources/side_panel/bookmarks/bookmark_folder.ts +++ b/chrome/browser/resources/side_panel/bookmarks/bookmark_folder.ts
@@ -48,7 +48,7 @@ open_: { type: Boolean, value: false, - computed: 'computeIsOpen_(openFolders, folder.id)' + computed: 'computeIsOpen_(openFolders, folder.id)', }, openFolders: Array, @@ -158,7 +158,7 @@ detail: { id: this.folder.id, open: !this.open_, - } + }, })); chrome.metricsPrivate.recordUserAction(
diff --git a/chrome/browser/resources/side_panel/read_anything/app.ts b/chrome/browser/resources/side_panel/read_anything/app.ts index e4c878f2..a9ed0c7 100644 --- a/chrome/browser/resources/side_panel/read_anything/app.ts +++ b/chrome/browser/resources/side_panel/read_anything/app.ts
@@ -53,7 +53,7 @@ return { fontName_: { type: String, - } + }, }; } @@ -65,9 +65,15 @@ // the names set in read_anything_font_model.cc. private defaultFontName: string = 'Standard font'; private validFontNames: Array<{name: string}> = [ - {name: 'Standard font'}, {name: 'Sans'}, {name: 'Serif'}, {name: 'Arial'}, - {name: 'Roboto'}, {name: 'Courier New'}, {name: 'Comic Sans MS'}, - {name: 'Webdings'}, {name: 'Impact'} + {name: 'Standard font'}, + {name: 'Sans'}, + {name: 'Serif'}, + {name: 'Arial'}, + {name: 'Roboto'}, + {name: 'Courier New'}, + {name: 'Comic Sans MS'}, + {name: 'Webdings'}, + {name: 'Impact'}, ]; override connectedCallback() {
diff --git a/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome_app.ts b/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome_app.ts index c78f3d47..c9e26bc 100644 --- a/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome_app.ts +++ b/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome_app.ts
@@ -77,7 +77,7 @@ reflectToAttribute: true, value() { return loadTimeData.getBoolean('isModalDialog'); - } + }, }, showLinkDataCheckbox_: { @@ -85,7 +85,7 @@ reflectToAttribute: true, value() { return loadTimeData.getBoolean('showLinkDataCheckbox'); - } + }, }, /** The label for the button to proceed with the flow */ @@ -106,7 +106,7 @@ type: Boolean, reflectToAttribute: true, value: false, - observer: 'linkDataChanged_' + observer: 'linkDataChanged_', }, }; }
diff --git a/chrome/browser/resources/signin/profile_picker/navigation_mixin.ts b/chrome/browser/resources/signin/profile_picker/navigation_mixin.ts index 9742ca0..0ca9ccf70 100644 --- a/chrome/browser/resources/signin/profile_picker/navigation_mixin.ts +++ b/chrome/browser/resources/signin/profile_picker/navigation_mixin.ts
@@ -90,7 +90,7 @@ { route: Routes.PROFILE_SWITCH, step: computeStep(Routes.PROFILE_SWITCH), - isFirst: true + isFirst: true, }, '', path); break; @@ -100,7 +100,7 @@ { route: Routes.ACCOUNT_SELECTION_LACROS, step: computeStep(Routes.ACCOUNT_SELECTION_LACROS), - isFirst: true + isFirst: true, }, '', path); break; @@ -164,7 +164,9 @@ // <if expr="chromeos_lacros"> Routes.ACCOUNT_SELECTION_LACROS, // </if> - Routes.MAIN, Routes.NEW_PROFILE, Routes.PROFILE_SWITCH + Routes.MAIN, + Routes.NEW_PROFILE, + Routes.PROFILE_SWITCH, ].includes(route)); navigateToStep(route, computeStep(route)); }
diff --git a/chrome/browser/resources/signin/profile_picker/profile_card_menu.ts b/chrome/browser/resources/signin/profile_picker/profile_card_menu.ts index 12bb54cc..eeccd8e 100644 --- a/chrome/browser/resources/signin/profile_picker/profile_card_menu.ts +++ b/chrome/browser/resources/signin/profile_picker/profile_card_menu.ts
@@ -89,7 +89,7 @@ // Will be filled as results are reported. value() { return {}; - } + }, }, /** @@ -98,8 +98,10 @@ profileStatistics_: { type: Array, value: [ - ProfileStatistics.BROWSING_HISTORY, ProfileStatistics.PASSWORDS, - ProfileStatistics.BOOKMARKS, ProfileStatistics.AUTOFILL + ProfileStatistics.BROWSING_HISTORY, + ProfileStatistics.PASSWORDS, + ProfileStatistics.BOOKMARKS, + ProfileStatistics.AUTOFILL, ], },
diff --git a/chrome/browser/resources/signin/profile_picker/profile_creation_flow/local_profile_customization.ts b/chrome/browser/resources/signin/profile_picker/profile_creation_flow/local_profile_customization.ts index e3256545..622e70c 100644 --- a/chrome/browser/resources/signin/profile_picker/profile_creation_flow/local_profile_customization.ts +++ b/chrome/browser/resources/signin/profile_picker/profile_creation_flow/local_profile_customization.ts
@@ -315,7 +315,7 @@ if (this.selectedTheme_.type === ThemeType.kAutogenerated) { theme = { colorId: 0, - color: this.selectedTheme_.info.autogeneratedThemeColors!.frame.value + color: this.selectedTheme_.info.autogeneratedThemeColors!.frame.value, }; } else if (this.selectedTheme_.type === ThemeType.kChrome) { theme = {
diff --git a/chrome/browser/resources/signin/profile_picker/profile_picker_main_view.ts b/chrome/browser/resources/signin/profile_picker/profile_picker_main_view.ts index ae5ed1f..1682461 100644 --- a/chrome/browser/resources/signin/profile_picker/profile_picker_main_view.ts +++ b/chrome/browser/resources/signin/profile_picker/profile_picker_main_view.ts
@@ -73,7 +73,7 @@ type: Boolean, value() { return loadTimeData.getBoolean('askOnStartup'); - } + }, }, }; }
diff --git a/chrome/browser/resources/signin/signin_reauth/signin_reauth_app.ts b/chrome/browser/resources/signin/signin_reauth/signin_reauth_app.ts index 60c1229..351ef22 100644 --- a/chrome/browser/resources/signin/signin_reauth/signin_reauth_app.ts +++ b/chrome/browser/resources/signin/signin_reauth/signin_reauth_app.ts
@@ -46,7 +46,7 @@ confirmButtonHidden_: {type: Boolean, value: true}, - cancelButtonHidden_: {type: Boolean, value: true} + cancelButtonHidden_: {type: Boolean, value: true}, }; }
diff --git a/chrome/browser/resources/signin/sync_confirmation/sync_confirmation_app.ts b/chrome/browser/resources/signin/sync_confirmation/sync_confirmation_app.ts index 4f98e6e..5470788 100644 --- a/chrome/browser/resources/signin/sync_confirmation/sync_confirmation_app.ts +++ b/chrome/browser/resources/signin/sync_confirmation/sync_confirmation_app.ts
@@ -54,7 +54,7 @@ type: Boolean, value() { return loadTimeData.getBoolean('isModalDialog'); - } + }, }, showEnterpriseBadge_: {
diff --git a/chrome/browser/resources/support_tool/data_collectors.ts b/chrome/browser/resources/support_tool/data_collectors.ts index 5bc58af..cba80de 100644 --- a/chrome/browser/resources/support_tool/data_collectors.ts +++ b/chrome/browser/resources/support_tool/data_collectors.ts
@@ -28,7 +28,7 @@ dataCollectors_: { type: Array, value: () => [], - } + }, }; }
diff --git a/chrome/browser/resources/support_tool/data_export_done.ts b/chrome/browser/resources/support_tool/data_export_done.ts index 7af1361..3d1e15a 100644 --- a/chrome/browser/resources/support_tool/data_export_done.ts +++ b/chrome/browser/resources/support_tool/data_export_done.ts
@@ -30,7 +30,7 @@ path_: { type: String, value: '', - } + }, }; }
diff --git a/chrome/browser/resources/support_tool/issue_details.ts b/chrome/browser/resources/support_tool/issue_details.ts index f89651d..6ed34696 100644 --- a/chrome/browser/resources/support_tool/issue_details.ts +++ b/chrome/browser/resources/support_tool/issue_details.ts
@@ -74,7 +74,7 @@ emailAddress: (this.selectedEmail_ === DONT_INCLUDE_EMAIL) ? '' : this.selectedEmail_, - issueDescription: this.issueDescription_ + issueDescription: this.issueDescription_, }; } }
diff --git a/chrome/browser/resources/support_tool/pii_selection.ts b/chrome/browser/resources/support_tool/pii_selection.ts index 52c3c5c..dbc03c55 100644 --- a/chrome/browser/resources/support_tool/pii_selection.ts +++ b/chrome/browser/resources/support_tool/pii_selection.ts
@@ -57,7 +57,7 @@ showPIISelection_: { type: Boolean, value: false, - } + }, }; }
diff --git a/chrome/browser/resources/support_tool/spinner_page.ts b/chrome/browser/resources/support_tool/spinner_page.ts index 299e997..8eebfbb 100644 --- a/chrome/browser/resources/support_tool/spinner_page.ts +++ b/chrome/browser/resources/support_tool/spinner_page.ts
@@ -28,7 +28,7 @@ pageTitle: { type: String, value: '', - } + }, }; }
diff --git a/chrome/browser/resources/support_tool/support_tool.ts b/chrome/browser/resources/support_tool/support_tool.ts index 6c9d210..70e50f7c 100644 --- a/chrome/browser/resources/support_tool/support_tool.ts +++ b/chrome/browser/resources/support_tool/support_tool.ts
@@ -78,7 +78,7 @@ errorMessage_: { type: String, value: '', - } + }, }; }
diff --git a/chrome/browser/resources/support_tool/url_generator.ts b/chrome/browser/resources/support_tool/url_generator.ts index b0d25fa..e396554 100644 --- a/chrome/browser/resources/support_tool/url_generator.ts +++ b/chrome/browser/resources/support_tool/url_generator.ts
@@ -53,7 +53,7 @@ buttonDisabled_: { type: Boolean, value: true, - } + }, }; }
diff --git a/chrome/browser/resources/tab_search/app.ts b/chrome/browser/resources/tab_search/app.ts index 2ab8433..61f7c2cd 100644 --- a/chrome/browser/resources/tab_search/app.ts +++ b/chrome/browser/resources/tab_search/app.ts
@@ -113,7 +113,7 @@ loadTimeData.getValue('recentlyClosedDefaultItemDisplayCount'), }, - searchResultText_: {type: String, value: ''} + searchResultText_: {type: String, value: ''}, }; }
diff --git a/chrome/browser/resources/tab_search/fuzzy_search.ts b/chrome/browser/resources/tab_search/fuzzy_search.ts index 998d6fc..266ebfcd 100644 --- a/chrome/browser/resources/tab_search/fuzzy_search.ts +++ b/chrome/browser/resources/tab_search/fuzzy_search.ts
@@ -130,7 +130,7 @@ if (matchFound) { exactMatches.push({ tab: matchedRecord, - score: scoringFunction(matchedRecord, distance, searchFieldWeights) + score: scoringFunction(matchedRecord, distance, searchFieldWeights), }); } }
diff --git a/chrome/browser/resources/tab_strip/tab_list.ts b/chrome/browser/resources/tab_strip/tab_list.ts index a92653a..68aef37 100644 --- a/chrome/browser/resources/tab_strip/tab_list.ts +++ b/chrome/browser/resources/tab_strip/tab_list.ts
@@ -41,7 +41,7 @@ const rect = element.getBoundingClientRect(); return { x: rect.left + TOUCH_CONTEXT_MENU_OFFSET_X, - y: rect.bottom + TOUCH_CONTEXT_MENU_OFFSET_Y + y: rect.bottom + TOUCH_CONTEXT_MENU_OFFSET_Y, }; }
diff --git a/chrome/browser/resources/tab_strip/tab_swiper.ts b/chrome/browser/resources/tab_strip/tab_swiper.ts index b267fe7..4e61eb50c 100644 --- a/chrome/browser/resources/tab_strip/tab_swiper.ts +++ b/chrome/browser/resources/tab_strip/tab_swiper.ts
@@ -83,13 +83,13 @@ opacity: 1, maxWidth: 'var(--tabstrip-tab-width)', [paddingInlineEnd]: 'var(--tabstrip-tab-spacing)', - transform: `translateY(0)` + transform: `translateY(0)`, }, { // Start of transform animation swiping up. offset: TRANSLATE_ANIMATION_THRESHOLD_PX / SWIPE_FINISH_THRESHOLD_PX, - transform: `translateY(0)` + transform: `translateY(0)`, }, { // Start of max-width and opacity animation swiping up. @@ -103,7 +103,7 @@ maxWidth: '0px', opacity: 0, [paddingInlineEnd]: 0, - transform: `translateY(-${SWIPE_FINISH_THRESHOLD_PX}px)` + transform: `translateY(-${SWIPE_FINISH_THRESHOLD_PX}px)`, }, ], {
diff --git a/chrome/browser/resources/usb_internals/descriptor_panel.ts b/chrome/browser/resources/usb_internals/descriptor_panel.ts index 85c016e..8d43869 100644 --- a/chrome/browser/resources/usb_internals/descriptor_panel.ts +++ b/chrome/browser/resources/usb_internals/descriptor_panel.ts
@@ -72,8 +72,22 @@ const WEB_USB_CAPABILITY_UUID = [ // Little-endian encoding of {3408b638-09a9-47a0-8bfd-a0768815b665}. - 0x38, 0xB6, 0x08, 0x34, 0xA9, 0x09, 0xA0, 0x47, 0x8B, 0xFD, 0xA0, 0x76, 0x88, - 0x15, 0xB6, 0x65 + 0x38, + 0xB6, + 0x08, + 0x34, + 0xA9, + 0x09, + 0xA0, + 0x47, + 0x8B, + 0xFD, + 0xA0, + 0x76, + 0x88, + 0x15, + 0xB6, + 0x65, ]; // These constants are defined by Microsoft OS 2.0 Descriptors Specification @@ -110,8 +124,22 @@ const MS_OS_20_PLATFORM_CAPABILITY_UUID = [ // Little-endian encoding of {D8DD60DF-4589-4CC7-9CD2-659D9E648A9F}. - 0xDF, 0x60, 0xDD, 0xD8, 0x89, 0x45, 0xC7, 0x4C, 0x9C, 0xD2, 0x65, 0x9D, 0x9E, - 0x64, 0x8A, 0x9F + 0xDF, + 0x60, + 0xDD, + 0xD8, + 0x89, + 0x45, + 0xC7, + 0x4C, + 0x9C, + 0xD2, + 0x65, + 0x9D, + 0x9E, + 0x64, + 0x8A, + 0x9F, ]; export class DescriptorPanel {
diff --git a/chrome/browser/resources/welcome/ntp_background/nux_ntp_background.ts b/chrome/browser/resources/welcome/ntp_background/nux_ntp_background.ts index 840d7e5..a693cc8 100644 --- a/chrome/browser/resources/welcome/ntp_background/nux_ntp_background.ts +++ b/chrome/browser/resources/welcome/ntp_background/nux_ntp_background.ts
@@ -58,7 +58,7 @@ subtitle: { type: String, value: loadTimeData.getString('ntpBackgroundDescription'), - } + }, }; }
diff --git a/chrome/browser/resources/welcome/shared/step_indicator.ts b/chrome/browser/resources/welcome/shared/step_indicator.ts index 314601c..46b0ec6 100644 --- a/chrome/browser/resources/welcome/shared/step_indicator.ts +++ b/chrome/browser/resources/welcome/shared/step_indicator.ts
@@ -34,7 +34,7 @@ dots_: { type: Array, computed: 'computeDots_(model.total)', - } + }, }; }
diff --git a/chrome/browser/resources/welcome/welcome_app.ts b/chrome/browser/resources/welcome/welcome_app.ts index ccbd63fe..76450f0 100644 --- a/chrome/browser/resources/welcome/welcome_app.ts +++ b/chrome/browser/resources/welcome/welcome_app.ts
@@ -37,7 +37,10 @@ * onboarding flow. */ const MODULES_WHITELIST: Set<string> = new Set([ - 'nux-google-apps', 'nux-ntp-background', 'nux-set-as-default', 'signin-view' + 'nux-google-apps', + 'nux-ntp-background', + 'nux-set-as-default', + 'signin-view', ]); /** @@ -82,7 +85,7 @@ this.modules_ = { 'new-user': loadTimeData.getString('newUserModules').split(','), 'returning-user': - loadTimeData.getString('returningUserModules').split(',') + loadTimeData.getString('returningUserModules').split(','), }; } @@ -188,7 +191,7 @@ if (MODULES_NEEDING_INDICATOR.has(elementTagName)) { element.set('indicatorModel', { total: indicatorElementCount, - active: indicatorActiveCount++ + active: indicatorActiveCount++, }); } });
diff --git a/chrome/browser/resources/whats_new/whats_new_app.ts b/chrome/browser/resources/whats_new/whats_new_app.ts index f6fff73f..1a0e0df 100644 --- a/chrome/browser/resources/whats_new/whats_new_app.ts +++ b/chrome/browser/resources/whats_new/whats_new_app.ts
@@ -39,7 +39,7 @@ url_: { type: String, value: '', - } + }, }; }
diff --git a/chrome/browser/search_resumption/BUILD.gn b/chrome/browser/search_resumption/BUILD.gn index 713d5bd..c8aa2c8 100644 --- a/chrome/browser/search_resumption/BUILD.gn +++ b/chrome/browser/search_resumption/BUILD.gn
@@ -6,17 +6,21 @@ android_library("java") { sources = [ - "java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionContainerView.java", "java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleCoordinator.java", "java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleMediator.java", + "java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleProperties.java", "java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleUtils.java", + "java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleView.java", + "java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleViewBinder.java", "java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionTileBuilder.java", + "java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionTileContainerView.java", "java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionTileView.java", ] deps = [ ":java_resources", "//base:base_java", "//chrome/browser/flags:java", + "//chrome/browser/preferences:java", "//chrome/browser/profiles/android:java", "//chrome/browser/search_engines/android:java", "//chrome/browser/signin/services/android:java", @@ -30,6 +34,7 @@ "//third_party/androidx:androidx_annotation_annotation_java", "//third_party/androidx:androidx_core_core_java", "//third_party/metrics_proto:metrics_proto_java", + "//ui/android:ui_no_recycler_view_java", "//url:gurl_java", ] resources_package = "org.chromium.chrome.browser.search_resumption" @@ -56,6 +61,7 @@ sources = [ "junit/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleMediatorUnitTest.java", "junit/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleUtilsUnitTest.java", + "junit/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleViewUnitTest.java", "junit/src/org/chromium/chrome/browser/search_resumption/SearchResumptionTileBuilderUnitTest.java", ] @@ -65,6 +71,7 @@ "//base:base_java_test_support", "//base:base_junit_test_support", "//chrome/browser/flags:java", + "//chrome/browser/preferences:java", "//chrome/browser/profiles/android:java", "//chrome/browser/search_engines/android:java", "//chrome/browser/signin/services/android:java", @@ -76,9 +83,11 @@ "//components/signin/public/android:java", "//content/public/android:content_full_java", "//third_party/android_deps:robolectric_all_java", + "//third_party/androidx:androidx_core_core_java", "//third_party/androidx:androidx_test_runner_java", "//third_party/junit:junit", "//third_party/mockito:mockito_java", + "//ui/android:ui_no_recycler_view_java", "//url:gurl_java", ] }
diff --git a/chrome/browser/search_resumption/java/res/layout/search_resumption_module_layout.xml b/chrome/browser/search_resumption/java/res/layout/search_resumption_module_layout.xml index e800fe0..8402ce2 100644 --- a/chrome/browser/search_resumption/java/res/layout/search_resumption_module_layout.xml +++ b/chrome/browser/search_resumption/java/res/layout/search_resumption_module_layout.xml
@@ -4,32 +4,53 @@ found in the LICENSE file. --> <!-- A layout to show search suggestions. --> -<LinearLayout +<org.chromium.chrome.browser.search_resumption.SearchResumptionModuleView xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/search_resumption_module_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> - <TextView + <RelativeLayout android:id="@+id/search_resumption_module_header" android:layout_width="match_parent" android:layout_height="wrap_content" + android:gravity="center_vertical|start" android:paddingTop="@dimen/search_resumption_module_header_padding_top" android:paddingBottom="@dimen/search_resumption_module_header_padding_top" android:paddingStart="@dimen/search_resumption_module_header_padding_start" - android:gravity="center_vertical|start" - android:singleLine="true" - android:text="@string/search_resumption_module_title" - android:textAlignment="viewStart" - android:textAppearance="@style/TextAppearance.TextMediumThick.Secondary"/> + android:paddingEnd="@dimen/search_resumption_module_header_padding_start" + android:contentDescription="@string/search_resumption_module_title"> - <org.chromium.chrome.browser.search_resumption.SearchResumptionContainerView + <TextView + android:id="@+id/header_text" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:singleLine="true" + android:text="@string/search_resumption_module_title" + android:textAlignment="viewStart" + android:layout_toStartOf="@+id/header_option" + android:layout_alignParentStart="true" + android:textAppearance="@style/TextAppearance.TextMediumThick.Secondary"/> + + <ImageView + android:id="@+id/header_option" + android:layout_width="wrap_content" + android:layout_height="@dimen/search_resumption_module_option_button_height" + android:layout_alignParentEnd="true" + android:layout_centerVertical="true" + android:contentDescription="@string/DefaultSearchProviderSuggestURLDesc" + android:src="@drawable/ic_expand_less_black_24dp"/> + </RelativeLayout> + + <org.chromium.chrome.browser.search_resumption.SearchResumptionTileContainerView android:id="@+id/search_resumption_module_tiles_container" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="@dimen/search_resumption_module_margin_bottom" android:baselineAligned="false" + android:visibility="gone" android:orientation="vertical"> - </org.chromium.chrome.browser.search_resumption.SearchResumptionContainerView> -</LinearLayout> \ No newline at end of file + </org.chromium.chrome.browser.search_resumption.SearchResumptionTileContainerView> +</org.chromium.chrome.browser.search_resumption.SearchResumptionModuleView> \ No newline at end of file
diff --git a/chrome/browser/search_resumption/java/res/values/dimens.xml b/chrome/browser/search_resumption/java/res/values/dimens.xml index bbe3818a..7ccc05c 100644 --- a/chrome/browser/search_resumption/java/res/values/dimens.xml +++ b/chrome/browser/search_resumption/java/res/values/dimens.xml
@@ -13,4 +13,5 @@ <dimen name="search_resumption_module_margin_bottom" tools:ignore="UnusedResources">30dp</dimen> <dimen name="search_resumption_module_rounded_corner_radius_small" tools:ignore="UnusedResources">2dp</dimen> <dimen name="search_resumption_module_rounded_corner_radius_big" tools:ignore="UnusedResources">16dp</dimen> + <dimen name="search_resumption_module_option_button_height" tools:ignore="UnusedResources">20dp</dimen> </resources>
diff --git a/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionContainerView.java b/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionContainerView.java deleted file mode 100644 index 6966902..0000000 --- a/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionContainerView.java +++ /dev/null
@@ -1,37 +0,0 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.chrome.browser.search_resumption; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.widget.LinearLayout; - -import androidx.annotation.Nullable; - -/** - * The view for the entire search resumption layout, including a header and the section of a set of - * search suggestions. - */ -public class SearchResumptionContainerView extends LinearLayout { - public SearchResumptionContainerView(Context context, @Nullable AttributeSet attrs) { - super(context, attrs); - } - - /** - * Inflates a {@link SearchResumptionTileView} instance. - */ - SearchResumptionTileView buildTileView() { - return (SearchResumptionTileView) LayoutInflater.from(getContext()) - .inflate(R.layout.search_resumption_module_tile_layout, this, false); - } - - void destroy() { - for (int i = 0; i < getChildCount(); i++) { - ((SearchResumptionTileView) getChildAt(i)).destroy(); - } - removeAllViews(); - } -}
diff --git a/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleMediator.java b/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleMediator.java index 0a619d61..7d3159e0 100644 --- a/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleMediator.java +++ b/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleMediator.java
@@ -4,7 +4,6 @@ package org.chromium.chrome.browser.search_resumption; -import android.view.View; import android.view.ViewStub; import androidx.annotation.Nullable; @@ -14,6 +13,8 @@ import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteController; import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteController.OnSuggestionsReceivedListener; +import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; +import org.chromium.chrome.browser.preferences.SharedPreferencesManager; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory; import org.chromium.chrome.browser.signin.services.IdentityServicesProvider; @@ -23,6 +24,8 @@ import org.chromium.components.metrics.OmniboxEventProtos.OmniboxEventProto.PageClassification; import org.chromium.components.omnibox.AutocompleteMatch; import org.chromium.components.omnibox.AutocompleteResult; +import org.chromium.ui.modelutil.PropertyModel; +import org.chromium.ui.modelutil.PropertyModelChangeProcessor; import java.util.List; @@ -39,9 +42,9 @@ private final SearchResumptionTileBuilder mTileBuilder; private final SigninManager mSignInManager; private AutocompleteController mAutoComplete; - private SearchResumptionContainerView mSuggestionTilesContainerView; + private PropertyModel mModel; - private @Nullable View mModuleLayoutView; + private @Nullable SearchResumptionModuleView mModuleLayoutView; SearchResumptionModuleMediator(ViewStub moduleStub, Tab tabToTrack, Profile profile, SearchResumptionTileBuilder tileBuilder) { @@ -57,7 +60,7 @@ @Override public void onSuggestionsReceived( AutocompleteResult autocompleteResult, String inlineAutocompleteText, boolean isFinal) { - if (!isFinal || mModuleLayoutView != null + if (!isFinal || mModel != null || !shouldShowSuggestionModule(autocompleteResult.getSuggestionsList())) { return; } @@ -79,22 +82,26 @@ * @param autocompleteResult The suggestions to show on the module. */ void showSearchSuggestionModule(AutocompleteResult autocompleteResult) { - if (mModuleLayoutView != null) return; + if (mModel != null) return; - mModuleLayoutView = mStub.inflate(); - mSuggestionTilesContainerView = - mModuleLayoutView.findViewById(R.id.search_resumption_module_tiles_container); - mTileBuilder.buildSuggestionTile( - autocompleteResult.getSuggestionsList(), mSuggestionTilesContainerView); + mModuleLayoutView = (SearchResumptionModuleView) mStub.inflate(); + mModel = new PropertyModel(SearchResumptionModuleProperties.ALL_KEYS); + PropertyModelChangeProcessor.create( + mModel, mModuleLayoutView, new SearchResumptionModuleViewBinder()); - mModuleLayoutView.setVisibility(View.VISIBLE); + mTileBuilder.buildSuggestionTile(autocompleteResult.getSuggestionsList(), + mModuleLayoutView.findViewById(R.id.search_resumption_module_tiles_container)); + mModel.set(SearchResumptionModuleProperties.EXPAND_COLLAPSE_CLICK_CALLBACK, + this::onExpandedOrCollapsed); RecordUserAction.record(ACTION_SHOW); } void destroy() { - mAutoComplete.removeOnSuggestionsReceivedListener(this); - if (mSuggestionTilesContainerView != null) { - mSuggestionTilesContainerView.destroy(); + if (mAutoComplete != null) { + mAutoComplete.removeOnSuggestionsReceivedListener(this); + } + if (mModuleLayoutView != null) { + mModuleLayoutView.destroy(); } TemplateUrlServiceFactory.get().removeObserver(this::onTemplateURLServiceChanged); mSignInManager.removeSignInStateObserver(this); @@ -150,9 +157,17 @@ } private void setVisibility(boolean isVisible) { - if (mModuleLayoutView == null) return; + if (mModel != null) { + mModel.set(SearchResumptionModuleProperties.IS_VISIBLE, isVisible); + } + } - mModuleLayoutView.setVisibility(isVisible ? View.VISIBLE : View.GONE); + /** + * Saves the user's choice of expanding/collapsing of the suggestions in the SharedPreference. + */ + private void onExpandedOrCollapsed(Boolean expanded) { + SharedPreferencesManager.getInstance().writeBoolean( + ChromePreferenceKeys.SEARCH_RESUMPTION_MODULE_COLLAPSE_ON_NTP, !expanded); } @VisibleForTesting
diff --git a/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleProperties.java b/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleProperties.java new file mode 100644 index 0000000..87b6789 --- /dev/null +++ b/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleProperties.java
@@ -0,0 +1,18 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.search_resumption; + +import org.chromium.base.Callback; +import org.chromium.ui.modelutil.PropertyKey; +import org.chromium.ui.modelutil.PropertyModel.WritableBooleanPropertyKey; +import org.chromium.ui.modelutil.PropertyModel.WritableObjectPropertyKey; + +interface SearchResumptionModuleProperties { + WritableBooleanPropertyKey IS_VISIBLE = new WritableBooleanPropertyKey(); + WritableObjectPropertyKey<Callback<Boolean>> EXPAND_COLLAPSE_CLICK_CALLBACK = + new WritableObjectPropertyKey<>(); + + PropertyKey[] ALL_KEYS = new PropertyKey[] {IS_VISIBLE, EXPAND_COLLAPSE_CLICK_CALLBACK}; +} \ No newline at end of file
diff --git a/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleView.java b/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleView.java new file mode 100644 index 0000000..1587531e --- /dev/null +++ b/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleView.java
@@ -0,0 +1,70 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.search_resumption; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; + +import androidx.annotation.Nullable; + +import org.chromium.base.Callback; +import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; +import org.chromium.chrome.browser.preferences.SharedPreferencesManager; + +/** + * The view for the entire search resumption layout, including a header, an option button to + * collapse or expand the suggestion section, and the section of a set of search suggestions. + */ +public class SearchResumptionModuleView extends LinearLayout { + private View mHeaderView; + private ImageView mOptionView; + private SearchResumptionTileContainerView mTileContainerView; + + public SearchResumptionModuleView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + mHeaderView = findViewById(R.id.search_resumption_module_header); + mTileContainerView = findViewById(R.id.search_resumption_module_tiles_container); + mOptionView = findViewById(R.id.header_option); + configureExpandedCollapsed( + !SharedPreferencesManager.getInstance().readBoolean( + ChromePreferenceKeys.SEARCH_RESUMPTION_MODULE_COLLAPSE_ON_NTP, + false) /* shouldExpand */, + false /* isAnimationEnabled */); + } + + void setExpandCollapseCallback(Callback<Boolean> callback) { + mHeaderView.setOnClickListener(v -> { + boolean shouldExpand = mTileContainerView.isExpanded() ? false : true; + configureExpandedCollapsed(shouldExpand, true /* isAnimationEnabled */); + callback.onResult(shouldExpand); + }); + } + + void destroy() { + mTileContainerView.destroy(); + } + + /** + * Configures expanding or collapsing the suggest sections. + */ + private void configureExpandedCollapsed(boolean shouldExpand, boolean isAnimationEnabled) { + if (mTileContainerView.isExpanded() == shouldExpand) return; + + if (shouldExpand) { + mOptionView.setImageResource(org.chromium.ui.R.drawable.ic_expand_less_black_24dp); + } else { + mOptionView.setImageResource(org.chromium.ui.R.drawable.ic_expand_more_black_24dp); + } + mTileContainerView.configureExpandedCollapsed(shouldExpand, isAnimationEnabled); + } +}
diff --git a/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleViewBinder.java b/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleViewBinder.java new file mode 100644 index 0000000..eff0c7c --- /dev/null +++ b/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleViewBinder.java
@@ -0,0 +1,29 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.search_resumption; + +import android.view.View; + +import org.chromium.ui.modelutil.PropertyKey; +import org.chromium.ui.modelutil.PropertyModel; +import org.chromium.ui.modelutil.PropertyModelChangeProcessor.ViewBinder; + +class SearchResumptionModuleViewBinder implements ViewBinder<PropertyModel, View, PropertyKey> { + @Override + public final void bind(PropertyModel model, View view, PropertyKey propertyKey) { + SearchResumptionModuleView moduleView = (SearchResumptionModuleView) view; + + if (SearchResumptionModuleProperties.IS_VISIBLE == propertyKey) { + moduleView.setVisibility(model.get(SearchResumptionModuleProperties.IS_VISIBLE) + ? View.VISIBLE + : View.GONE); + } else if (SearchResumptionModuleProperties.EXPAND_COLLAPSE_CLICK_CALLBACK == propertyKey) { + moduleView.setExpandCollapseCallback( + model.get(SearchResumptionModuleProperties.EXPAND_COLLAPSE_CLICK_CALLBACK)); + } else { + assert false : "Unhandled property detected in SearchResumptionModuleViewBinder!"; + } + } +}
diff --git a/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionTileBuilder.java b/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionTileBuilder.java index bbcf29e..953c1a7a 100644 --- a/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionTileBuilder.java +++ b/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionTileBuilder.java
@@ -47,7 +47,7 @@ * number of available suggestions to build on the parent ViewGroup. */ void buildSuggestionTile( - List<AutocompleteMatch> suggestions, SearchResumptionContainerView parent) { + List<AutocompleteMatch> suggestions, SearchResumptionTileContainerView parent) { try (TraceEvent e = TraceEvent.scoped("SearchSuggestionTileProvider.addTileSection")) { assert parent.getChildCount() == 0; @@ -78,7 +78,7 @@ * Builds a {@link SearchResumptionTileView} based on the given suggestion. */ SearchResumptionTileView buildTileView( - AutocompleteMatch suggestion, SearchResumptionContainerView parent) { + AutocompleteMatch suggestion, SearchResumptionTileContainerView parent) { SearchResumptionTileView tileView = parent.buildTileView(); tileView.updateSuggestionData(suggestion); tileView.addOnSuggestionClickCallback(mCallback);
diff --git a/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionTileContainerView.java b/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionTileContainerView.java new file mode 100644 index 0000000..9c4db80 --- /dev/null +++ b/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionTileContainerView.java
@@ -0,0 +1,126 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.search_resumption; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.Animation; +import android.view.animation.Transformation; +import android.widget.LinearLayout; + +import androidx.annotation.Nullable; + +/** + * The view for the section of a set of search suggestions on the search resumption module. + */ +public class SearchResumptionTileContainerView extends LinearLayout { + private static final int ANIMATION_DURATION_MS = 200; + + private boolean mIsExpanded; + + public SearchResumptionTileContainerView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + /** + * Inflates a {@link SearchResumptionTileView} instance. + */ + SearchResumptionTileView buildTileView() { + return (SearchResumptionTileView) LayoutInflater.from(getContext()) + .inflate(R.layout.search_resumption_module_tile_layout, this, false); + } + + boolean isExpanded() { + return mIsExpanded; + } + + void destroy() { + for (int i = 0; i < getChildCount(); i++) { + ((SearchResumptionTileView) getChildAt(i)).destroy(); + } + removeAllViews(); + } + + /** + * Expands or collapses the view, with an animation if enabled. + */ + void configureExpandedCollapsed(boolean expand, boolean isAnimationEnabled) { + if (mIsExpanded == expand) return; + + mIsExpanded = expand; + if (expand) { + expand(isAnimationEnabled); + } else { + collapse(isAnimationEnabled); + } + } + + /** + * Expands this view to full height. + */ + private void expand(boolean isAnimationEnabled) { + // Width is match_parent and height is wrap_content. + int widthMeasureSpec = + View.MeasureSpec.makeMeasureSpec(getWidth(), View.MeasureSpec.EXACTLY); + int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); + measure(widthMeasureSpec, heightMeasureSpec); + int targetHeight = getMeasuredHeight(); + + // Older (pre-API21) Android versions cancel animations with height of 0. + getLayoutParams().height = 1; + setVisibility(VISIBLE); + + Animation animation = new Animation() { + @Override + protected void applyTransformation(float interpolatedTime, Transformation t) { + int height; + if (interpolatedTime == 1) { + height = ViewGroup.LayoutParams.WRAP_CONTENT; + } else { + height = (int) (targetHeight * interpolatedTime); + } + getLayoutParams().height = height; + requestLayout(); + } + + @Override + public boolean willChangeBounds() { + return true; + } + }; + + animation.setDuration(isAnimationEnabled ? ANIMATION_DURATION_MS : 0); + startAnimation(animation); + } + + /** Collapses this view to 0 height and then marks it GONE. */ + private void collapse(boolean isAnimationEnabled) { + int initialHeight = getMeasuredHeight(); + + Animation animation = new Animation() { + @Override + protected void applyTransformation(float interpolatedTime, Transformation t) { + if (interpolatedTime == 1) { + setVisibility(GONE); + } else { + getLayoutParams().height = + initialHeight - (int) (initialHeight * interpolatedTime); + requestLayout(); + } + } + + @Override + public boolean willChangeBounds() { + return true; + } + }; + + animation.setDuration(isAnimationEnabled ? ANIMATION_DURATION_MS : 0); + startAnimation(animation); + } +}
diff --git a/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionTileView.java b/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionTileView.java index 0ee1b6c..30a70dd 100644 --- a/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionTileView.java +++ b/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionTileView.java
@@ -62,4 +62,8 @@ void destroy() { setOnClickListener(null); } + + String getTextForTesting() { + return mTileContent.getText().toString(); + } }
diff --git a/chrome/browser/search_resumption/junit/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleMediatorUnitTest.java b/chrome/browser/search_resumption/junit/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleMediatorUnitTest.java index 02059c9..9c977162 100644 --- a/chrome/browser/search_resumption/junit/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleMediatorUnitTest.java +++ b/chrome/browser/search_resumption/junit/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleMediatorUnitTest.java
@@ -95,9 +95,9 @@ @Mock private ViewStub mParent; @Mock - private View mModuleLayoutView; + private SearchResumptionModuleView mModuleLayoutView; @Mock - private SearchResumptionContainerView mSuggestionTilesContainerView; + private SearchResumptionTileContainerView mSuggestionTilesContainerView; @Mock private AutocompleteController mAutocompleteController; @Mock @@ -135,7 +135,9 @@ GURL url = createMockGurl(URL_TO_TRACK); doReturn(url).when(mTabToTrack).getUrl(); doReturn(mModuleLayoutView).when(mParent).inflate(); - doReturn(mSuggestionTilesContainerView).when(mModuleLayoutView).findViewById(anyInt()); + doReturn(mSuggestionTilesContainerView) + .when(mModuleLayoutView) + .findViewById(R.id.search_resumption_module_tiles_container); TemplateUrlServiceFactory.setInstanceForTesting(mTemplateUrlService); when(mTemplateUrlService.isSearchResultsPageFromDefaultSearchProvider(any())) .thenReturn(false); @@ -197,13 +199,11 @@ @MediumTest public void testModuleVisibility() { testShowModuleWithEnoughResults(); - verify(mModuleLayoutView, times(1)).setVisibility(View.VISIBLE); - mMediator.onSignedOut(); verify(mModuleLayoutView, times(1)).setVisibility(View.GONE); mMediator.onSignedIn(); - verify(mModuleLayoutView, times(2)).setVisibility(View.VISIBLE); + verify(mModuleLayoutView, times(1)).setVisibility(View.VISIBLE); doReturn(false).when(mTemplateUrlService).isDefaultSearchEngineGoogle(); mMediator.onTemplateURLServiceChanged(); @@ -211,7 +211,16 @@ doReturn(true).when(mTemplateUrlService).isDefaultSearchEngineGoogle(); mMediator.onTemplateURLServiceChanged(); - verify(mModuleLayoutView, times(3)).setVisibility(View.VISIBLE); + verify(mModuleLayoutView, times(2)).setVisibility(View.VISIBLE); + } + + @Test + @MediumTest + public void testDestroy() { + testShowModuleWithEnoughResults(); + mMediator.destroy(); + + verify(mModuleLayoutView, times(1)).destroy(); } private static GURL createMockGurl(String url) {
diff --git a/chrome/browser/search_resumption/junit/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleViewUnitTest.java b/chrome/browser/search_resumption/junit/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleViewUnitTest.java new file mode 100644 index 0000000..57fbecc --- /dev/null +++ b/chrome/browser/search_resumption/junit/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleViewUnitTest.java
@@ -0,0 +1,173 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.search_resumption; + +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import android.app.Activity; +import android.view.View; + +import androidx.test.filters.SmallTest; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.robolectric.Robolectric; +import org.robolectric.annotation.Config; + +import org.chromium.base.Callback; +import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; +import org.chromium.chrome.browser.preferences.SharedPreferencesManager; +import org.chromium.chrome.browser.search_resumption.SearchResumptionTileBuilder.OnSuggestionClickCallback; +import org.chromium.components.omnibox.AutocompleteMatch; +import org.chromium.ui.modelutil.PropertyModel; +import org.chromium.ui.modelutil.PropertyModelChangeProcessor; + +/** Tests for {@link SearchResumptionModuleView}. */ +@RunWith(BaseRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class SearchResumptionModuleViewUnitTest { + private Activity mActivity; + private SearchResumptionModuleView mModuleView; + private View mHeaderView; + private SearchResumptionTileContainerView mTilesView; + private PropertyModel mPropertyModel; + private PropertyModelChangeProcessor mPropertyModelChangeProcessor; + + @Mock + Callback<Boolean> mOnClickedCallback; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + mActivity = Robolectric.buildActivity(Activity.class).setup().get(); + mPropertyModel = new PropertyModel(SearchResumptionModuleProperties.ALL_KEYS); + } + + @After + public void tearDown() throws Exception { + if (mPropertyModelChangeProcessor != null) { + mPropertyModelChangeProcessor.destroy(); + } + mPropertyModel = null; + mModuleView = null; + mActivity = null; + } + + @Test + @SmallTest + public void testVisibilityAllowInitially() { + inflateModuleView(); + + Assert.assertTrue(mTilesView.isExpanded()); + Assert.assertFalse(SharedPreferencesManager.getInstance().readBoolean( + ChromePreferenceKeys.SEARCH_RESUMPTION_MODULE_COLLAPSE_ON_NTP, false)); + } + + @Test + @SmallTest + public void testVisibilityDisallowInitially() { + SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getInstance(); + sharedPreferencesManager.writeBoolean( + ChromePreferenceKeys.SEARCH_RESUMPTION_MODULE_COLLAPSE_ON_NTP, true); + + inflateModuleView(); + Assert.assertFalse(mTilesView.isExpanded()); + Assert.assertTrue(sharedPreferencesManager.readBoolean( + ChromePreferenceKeys.SEARCH_RESUMPTION_MODULE_COLLAPSE_ON_NTP, false)); + + sharedPreferencesManager.writeBoolean( + ChromePreferenceKeys.SEARCH_RESUMPTION_MODULE_COLLAPSE_ON_NTP, false); + } + + @Test + @SmallTest + public void testVisible() { + inflateModuleView(); + Assert.assertTrue(isViewVisible(mModuleView)); + + mPropertyModel.set(SearchResumptionModuleProperties.IS_VISIBLE, false); + Assert.assertFalse(isViewVisible(mModuleView)); + + mPropertyModel.set(SearchResumptionModuleProperties.IS_VISIBLE, true); + Assert.assertTrue(isViewVisible(mModuleView)); + } + + @Test + @SmallTest + public void testExpandCollapseCallback() { + inflateModuleView(); + Assert.assertTrue(mTilesView.isExpanded()); + + mPropertyModel.set(SearchResumptionModuleProperties.EXPAND_COLLAPSE_CLICK_CALLBACK, + mOnClickedCallback); + mHeaderView.performClick(); + verify(mOnClickedCallback, times(1)).onResult(false); + Assert.assertFalse(mTilesView.isExpanded()); + + mHeaderView.performClick(); + verify(mOnClickedCallback, times(1)).onResult(true); + Assert.assertTrue(mTilesView.isExpanded()); + } + + @Test + @SmallTest + public void testDestroy() { + inflateModuleView(); + Assert.assertTrue(mTilesView.isExpanded()); + SearchResumptionTileView tileView = inflateTileView(); + mTilesView.addView(tileView); + Assert.assertEquals(1, mTilesView.getChildCount()); + + mModuleView.destroy(); + Assert.assertEquals(0, mTilesView.getChildCount()); + } + + @Test + @SmallTest + public void testTileView() { + SearchResumptionTileView tileView = inflateTileView(); + String text = "foo"; + AutocompleteMatch match = Mockito.mock(AutocompleteMatch.class); + doReturn(text).when(match).getDisplayText(); + + tileView.updateSuggestionData(match); + Assert.assertEquals(text, tileView.getTextForTesting()); + + OnSuggestionClickCallback callback = Mockito.mock(OnSuggestionClickCallback.class); + tileView.addOnSuggestionClickCallback(callback); + Assert.assertTrue(tileView.hasOnClickListeners()); + + tileView.destroy(); + Assert.assertFalse(tileView.hasOnClickListeners()); + } + + private void inflateModuleView() { + mModuleView = (SearchResumptionModuleView) mActivity.getLayoutInflater().inflate( + R.layout.search_resumption_module_layout, null); + mActivity.setContentView(mModuleView); + mHeaderView = mModuleView.findViewById(R.id.search_resumption_module_header); + mTilesView = mModuleView.findViewById(R.id.search_resumption_module_tiles_container); + mPropertyModelChangeProcessor = PropertyModelChangeProcessor.create( + mPropertyModel, mModuleView, new SearchResumptionModuleViewBinder()); + } + + private SearchResumptionTileView inflateTileView() { + return (SearchResumptionTileView) mActivity.getLayoutInflater().inflate( + R.layout.search_resumption_module_tile_layout, null); + } + + private boolean isViewVisible(View view) { + return view.getVisibility() == View.VISIBLE; + } +}
diff --git a/chrome/browser/search_resumption/junit/src/org/chromium/chrome/browser/search_resumption/SearchResumptionTileBuilderUnitTest.java b/chrome/browser/search_resumption/junit/src/org/chromium/chrome/browser/search_resumption/SearchResumptionTileBuilderUnitTest.java index 1272303d..d35f3438 100644 --- a/chrome/browser/search_resumption/junit/src/org/chromium/chrome/browser/search_resumption/SearchResumptionTileBuilderUnitTest.java +++ b/chrome/browser/search_resumption/junit/src/org/chromium/chrome/browser/search_resumption/SearchResumptionTileBuilderUnitTest.java
@@ -48,7 +48,7 @@ @Mock private Tab mTab; @Mock - private SearchResumptionContainerView mSuggestionTilesContainerView; + private SearchResumptionTileContainerView mSuggestionTilesContainerView; @Mock SearchResumptionTileView mTileView1; @Mock
diff --git a/chrome/browser/sync/test/integration/invalidations/fake_server_sync_invalidation_sender.cc b/chrome/browser/sync/test/integration/invalidations/fake_server_sync_invalidation_sender.cc index d5655b7e..635df724 100644 --- a/chrome/browser/sync/test/integration/invalidations/fake_server_sync_invalidation_sender.cc +++ b/chrome/browser/sync/test/integration/invalidations/fake_server_sync_invalidation_sender.cc
@@ -6,6 +6,7 @@ #include "base/containers/contains.h" #include "base/time/time.h" +#include "components/sync/base/time.h" #include "components/sync/invalidations/fcm_handler.h" namespace fake_server { @@ -53,13 +54,18 @@ base::Erase(fcm_handlers_, fcm_handler); } +void FakeServerSyncInvalidationSender::OnWillCommit() { + token_to_interested_data_types_.clear(); + UpdateTokenToInterestedDataTypesMap(); +} + void FakeServerSyncInvalidationSender::OnCommit( const std::string& committer_invalidator_client_id, syncer::ModelTypeSet committed_model_types) { - const std::map<std::string, syncer::ModelTypeSet> - token_to_interested_data_types_map = GetTokenToInterestedDataTypesMap(); - - for (const auto& token_and_data_types : token_to_interested_data_types_map) { + // Update token to interested data types mapping. This is needed to support + // newly added DeviceInfos during commit request. + UpdateTokenToInterestedDataTypesMap(); + for (const auto& token_and_data_types : token_to_interested_data_types_) { const std::string& token = token_and_data_types.first; // Send the invalidation only for interested types. @@ -90,31 +96,6 @@ DeliverInvalidationsToHandlers(); } -std::map<std::string, syncer::ModelTypeSet> -FakeServerSyncInvalidationSender::GetTokenToInterestedDataTypesMap() { - std::map<std::string, syncer::ModelTypeSet> result; - for (const sync_pb::SyncEntity& entity : - fake_server_->GetSyncEntitiesByModelType(syncer::DEVICE_INFO)) { - const sync_pb::InvalidationSpecificFields& invalidation_fields = - entity.specifics().device_info().invalidation_fields(); - const std::string& token = invalidation_fields.instance_id_token(); - if (token.empty()) { - continue; - } - - DCHECK(!result.count(token)); - result[token] = syncer::ModelTypeSet(); - for (const int field_number : - invalidation_fields.interested_data_type_ids()) { - syncer::ModelType data_type = - syncer::GetModelTypeFromSpecificsFieldNumber(field_number); - DCHECK(syncer::IsRealDataType(data_type)); - result[token].Put(data_type); - } - } - return result; -} - void FakeServerSyncInvalidationSender::DeliverInvalidationsToHandlers() { for (auto& token_and_invalidations : invalidations_to_deliver_) { const std::string& token = token_and_invalidations.first; @@ -147,4 +128,38 @@ return nullptr; } +void FakeServerSyncInvalidationSender::UpdateTokenToInterestedDataTypesMap() { + std::map<std::string, base::Time> token_to_mtime; + for (const sync_pb::SyncEntity& entity : + fake_server_->GetSyncEntitiesByModelType(syncer::DEVICE_INFO)) { + const sync_pb::InvalidationSpecificFields& invalidation_fields = + entity.specifics().device_info().invalidation_fields(); + const std::string& token = invalidation_fields.instance_id_token(); + if (token.empty()) { + continue; + } + + // If several DeviceInfos have the same FCM registration token, select the + // latest updated one. This may happen after resetting sync engine and + // changing cache GUID without signout. + // TODO(crbug.com/1325295): remove once fixed. + const base::Time last_updated = syncer::ProtoTimeToTime( + entity.specifics().device_info().last_updated_timestamp()); + if (token_to_mtime.find(token) != token_to_mtime.end() && + token_to_mtime[token] >= last_updated) { + continue; + } + + token_to_mtime[token] = last_updated; + token_to_interested_data_types_[token] = syncer::ModelTypeSet(); + for (const int field_number : + invalidation_fields.interested_data_type_ids()) { + const syncer::ModelType data_type = + syncer::GetModelTypeFromSpecificsFieldNumber(field_number); + DCHECK(syncer::IsRealDataType(data_type)); + token_to_interested_data_types_[token].Put(data_type); + } + } +} + } // namespace fake_server
diff --git a/chrome/browser/sync/test/integration/invalidations/fake_server_sync_invalidation_sender.h b/chrome/browser/sync/test/integration/invalidations/fake_server_sync_invalidation_sender.h index acf8de2e..1a171f6 100644 --- a/chrome/browser/sync/test/integration/invalidations/fake_server_sync_invalidation_sender.h +++ b/chrome/browser/sync/test/integration/invalidations/fake_server_sync_invalidation_sender.h
@@ -41,6 +41,7 @@ void RemoveFCMHandler(syncer::FCMHandler* fcm_handler); // FakeServer::Observer implementation. + void OnWillCommit() override; void OnCommit(const std::string& committer_invalidator_client_id, syncer::ModelTypeSet committed_model_types) override; @@ -48,9 +49,6 @@ void OnFCMRegistrationTokenChanged() override; private: - std::map<std::string, syncer::ModelTypeSet> - GetTokenToInterestedDataTypesMap(); - // Returns a corresponding FCM handler having the same // |fcm_registration_token| if exists. Otherwise, returns nullptr. syncer::FCMHandler* GetFCMHandlerByToken( @@ -60,6 +58,10 @@ // Messages for FCM tokens which are not registered will be kept. void DeliverInvalidationsToHandlers(); + // Updates |token_to_interested_data_types_map_before_commit_| from DeviceInfo + // data type. + void UpdateTokenToInterestedDataTypesMap(); + raw_ptr<FakeServer> fake_server_; std::vector<syncer::FCMHandler*> fcm_handlers_; @@ -69,6 +71,10 @@ // will remain here until a handler is added. std::map<std::string, std::vector<sync_pb::SyncInvalidationsPayload>> invalidations_to_deliver_; + + // List of tokens with a list of interested data types. Used to send + // invalidations to a corresponding FCMHandler. + std::map<std::string, syncer::ModelTypeSet> token_to_interested_data_types_; }; } // namespace fake_server
diff --git a/chrome/browser/sync_file_system/drive_backend/drive_backend_sync_unittest.cc b/chrome/browser/sync_file_system/drive_backend/drive_backend_sync_unittest.cc index 813835f..65dfb990 100644 --- a/chrome/browser/sync_file_system/drive_backend/drive_backend_sync_unittest.cc +++ b/chrome/browser/sync_file_system/drive_backend/drive_backend_sync_unittest.cc
@@ -224,7 +224,10 @@ CannedSyncableFileSystem* file_system = new CannedSyncableFileSystem( origin, in_memory_env_.get(), io_task_runner_.get(), file_task_runner_.get()); - file_system->SetUp(CannedSyncableFileSystem::QUOTA_DISABLED); + // TODO(https://crbug.com/1344144): Refactor + // CannedSyncableFileSystem::SetUp() to remove Quota Enabling/Disabling + // flag. + file_system->SetUp(CannedSyncableFileSystem::QUOTA_ENABLED); SyncStatusCode status = SYNC_STATUS_UNKNOWN; base::RunLoop run_loop;
diff --git a/chrome/browser/sync_file_system/local/canned_syncable_file_system.cc b/chrome/browser/sync_file_system/local/canned_syncable_file_system.cc index a664dccf..ecf2709 100644 --- a/chrome/browser/sync_file_system/local/canned_syncable_file_system.cc +++ b/chrome/browser/sync_file_system/local/canned_syncable_file_system.cc
@@ -36,6 +36,7 @@ #include "storage/browser/quota/quota_manager.h" #include "storage/browser/quota/quota_manager_proxy.h" #include "storage/browser/test/mock_blob_util.h" +#include "storage/browser/test/mock_quota_manager.h" #include "storage/browser/test/mock_special_storage_policy.h" #include "storage/browser/test/test_file_system_options.h" #include "testing/gtest/include/gtest/gtest.h" @@ -248,10 +249,11 @@ base::MakeRefCounted<storage::MockSpecialStoragePolicy>(); if (quota_mode == QUOTA_ENABLED) { - quota_manager_ = base::MakeRefCounted<QuotaManager>( - false /* is_incognito */, data_dir_.GetPath(), io_task_runner_.get(), - /*quota_change_callback=*/base::DoNothing(), storage_policy.get(), - storage::GetQuotaSettingsFunc()); + quota_manager_ = base::MakeRefCounted<storage::MockQuotaManager>( + /*is_incognito=*/false, data_dir_.GetPath(), io_task_runner_.get(), + storage_policy.get()); + quota_manager_proxy_ = base::MakeRefCounted<storage::MockQuotaManagerProxy>( + quota_manager_.get(), io_task_runner_.get()); } std::vector<std::string> additional_allowed_schemes; @@ -267,7 +269,7 @@ io_task_runner_, file_task_runner_, storage::ExternalMountPoints::CreateRefCounted(), std::move(storage_policy), - quota_manager_.get() ? quota_manager_->proxy() : nullptr, + quota_manager_.get() ? quota_manager_proxy_.get() : nullptr, std::move(additional_backends), std::vector<storage::URLRequestAutoMountHandler>(), data_dir_.GetPath(), options);
diff --git a/chrome/browser/sync_file_system/local/canned_syncable_file_system.h b/chrome/browser/sync_file_system/local/canned_syncable_file_system.h index 789870d..f239cc42 100644 --- a/chrome/browser/sync_file_system/local/canned_syncable_file_system.h +++ b/chrome/browser/sync_file_system/local/canned_syncable_file_system.h
@@ -22,6 +22,8 @@ #include "storage/browser/file_system/file_system_url.h" #include "storage/browser/file_system/file_system_util.h" #include "storage/browser/quota/quota_callbacks.h" +#include "storage/browser/test/mock_quota_manager.h" +#include "storage/browser/test/mock_quota_manager_proxy.h" #include "storage/common/file_system/file_system_types.h" #include "storage/common/file_system/file_system_util.h" #include "third_party/blink/public/mojom/quota/quota_types.mojom-forward.h" @@ -36,10 +38,6 @@ class FileSystemURL; } -namespace storage { -class QuotaManager; -} - namespace sync_file_system { class FileChangeList; @@ -103,7 +101,7 @@ storage::FileSystemContext* file_system_context() { return file_system_context_.get(); } - storage::QuotaManager* quota_manager() { return quota_manager_.get(); } + storage::MockQuotaManager* quota_manager() { return quota_manager_.get(); } GURL origin() const { return origin_; } storage::FileSystemType type() const { return type_; } blink::mojom::StorageType storage_type() const { @@ -226,7 +224,8 @@ base::ScopedTempDir data_dir_; const std::string service_name_; - scoped_refptr<storage::QuotaManager> quota_manager_; + scoped_refptr<storage::MockQuotaManager> quota_manager_; + scoped_refptr<storage::MockQuotaManagerProxy> quota_manager_proxy_; scoped_refptr<storage::FileSystemContext> file_system_context_; const GURL origin_; const storage::FileSystemType type_;
diff --git a/chrome/browser/sync_file_system/local/syncable_file_system_unittest.cc b/chrome/browser/sync_file_system/local/syncable_file_system_unittest.cc index aee8400..88cb99d 100644 --- a/chrome/browser/sync_file_system/local/syncable_file_system_unittest.cc +++ b/chrome/browser/sync_file_system/local/syncable_file_system_unittest.cc
@@ -124,7 +124,9 @@ const int64_t kOriginalQuota = QuotaManager::kSyncableStorageDefaultHostQuota; const int64_t kQuota = 12345 * 1024; - QuotaManager::kSyncableStorageDefaultHostQuota = kQuota; + file_system_.quota_manager()->SetQuota( + blink::StorageKey(url::Origin::Create(file_system_.origin())), + file_system_.storage_type(), kQuota); int64_t usage, quota; EXPECT_EQ(blink::mojom::QuotaStatusCode::kOk, file_system_.GetUsageAndQuota(&usage, "a)); @@ -149,7 +151,9 @@ // Shrink the quota to the current usage, try to extend the file further // and see if it fails. - QuotaManager::kSyncableStorageDefaultHostQuota = new_usage; + file_system_.quota_manager()->SetQuota( + blink::StorageKey(url::Origin::Create(file_system_.origin())), + file_system_.storage_type(), new_usage); EXPECT_EQ(base::File::FILE_ERROR_NO_SPACE, file_system_.TruncateFile(URL("dir/foo"), kFileSizeToExtend + 1)); @@ -168,7 +172,9 @@ EXPECT_EQ(0, usage); // Restore the system default quota. - QuotaManager::kSyncableStorageDefaultHostQuota = kOriginalQuota; + file_system_.quota_manager()->SetQuota( + blink::StorageKey(url::Origin::Create(file_system_.origin())), + file_system_.storage_type(), kOriginalQuota); } // Combined testing with LocalFileChangeTracker.
diff --git a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillView.java b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillView.java index 0506db6..18f31b6 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillView.java +++ b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillView.java
@@ -329,9 +329,17 @@ private @Px int getHeightWhenFullyExtended() { assert mContentView.getMeasuredHeight() > 0 : "ContentView hasn't been measured."; - return getHeightWithMargins(mContentView.findViewById(R.id.drag_handlebar), false) - + getSheetItemListHeightWithMargins(false) - + getHeightWithMargins(mContentView.findViewById(R.id.touch_to_fill_footer), false); + int height = getHeightWithMargins(mContentView.findViewById(R.id.drag_handlebar), false) + + getSheetItemListHeightWithMargins(false); + View footer = mContentView.findViewById(R.id.touch_to_fill_footer); + if (footer.getMeasuredHeight() == 0) { + // This can happen when bottom sheet container layout changes, apparently causing + // the footer layout to be invalidated. Measure the content view again. + remeasure(true); + footer.requestLayout(); + } + height += getHeightWithMargins(footer, false); + return height; } private @Px int getSheetItemListHeightWithMargins(boolean showOnlyInitialItems) {
diff --git a/chrome/browser/touch_to_fill/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java b/chrome/browser/touch_to_fill/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java index a9ef9a537..dff3818 100644 --- a/chrome/browser/touch_to_fill/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java +++ b/chrome/browser/touch_to_fill/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java
@@ -46,7 +46,6 @@ import org.robolectric.annotation.Config; import org.chromium.base.metrics.RecordHistogram; -import org.chromium.base.metrics.RecordHistogramJni; import org.chromium.base.metrics.UmaRecorderHolder; import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.util.JniMocker; @@ -98,9 +97,6 @@ @Mock private LargeIconBridge mMockIconBridge; - @Mock - private RecordHistogram.Natives mMockRecordHistogram; - // Can't be local, as it has to be initialized by initMocks. @Captor private ArgumentCaptor<LargeIconBridge.LargeIconCallback> mCallbackArgumentCaptor; @@ -114,7 +110,6 @@ UmaRecorderHolder.resetForTesting(); MockitoAnnotations.initMocks(this); mJniMocker.mock(UrlFormatterJni.TEST_HOOKS, mUrlFormatterJniMock); - mJniMocker.mock(RecordHistogramJni.TEST_HOOKS, mMockRecordHistogram); when(mUrlFormatterJniMock.formatUrlForDisplayOmitScheme(anyString())) .then(inv -> format(inv.getArgument(0))); when(mUrlFormatterJniMock.formatUrlForSecurityDisplay(
diff --git a/chrome/browser/ui/ash/assistant/assistant_test_mixin.cc b/chrome/browser/ui/ash/assistant/assistant_test_mixin.cc index dbe8ce27..3f81e02 100644 --- a/chrome/browser/ui/ash/assistant/assistant_test_mixin.cc +++ b/chrome/browser/ui/ash/assistant/assistant_test_mixin.cc
@@ -11,7 +11,7 @@ #include "ash/assistant/model/ui/assistant_card_element.h" #include "ash/assistant/ui/assistant_ui_constants.h" #include "ash/assistant/ui/main_stage/assistant_ui_element_view.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/constants/ash_switches.h" #include "ash/public/cpp/assistant/assistant_state.h" #include "ash/public/cpp/test/assistant_test_api.h"
diff --git a/chrome/browser/ui/ash/clipboard_history_browsertest.cc b/chrome/browser/ui/ash/clipboard_history_browsertest.cc index 5d74d8c..6c70652 100644 --- a/chrome/browser/ui/ash/clipboard_history_browsertest.cc +++ b/chrome/browser/ui/ash/clipboard_history_browsertest.cc
@@ -1226,7 +1226,7 @@ // in this test case. // Flaky: crbug/1224777 IN_PROC_BROWSER_TEST_F(ClipboardHistoryWebContentsBrowserTest, - VerifyHTMLRendering) { + DISABLED_VerifyHTMLRendering) { // Load the web page which contains images and text. ASSERT_TRUE(ui_test_utils::NavigateToURL( browser(), embedded_test_server()->GetURL("/image-and-text.html"))); @@ -1251,19 +1251,8 @@ // history shows, the process of HTML rendering starts. auto event_generator = std::make_unique<ui::test::EventGenerator>( ash::Shell::GetPrimaryRootWindow()); - - EXPECT_FALSE(GetClipboardHistoryController()->IsMenuShowing()); event_generator->PressAndReleaseKey(ui::VKEY_V, ui::EF_COMMAND_DOWN); - // Add a callback that collects the stack trace when the clipboard history - // menu is closed. It helps to investigate the reason why the clipboard - // history menu is closed unexpectedly. - // TODO(https://crbug.com/1224777): when the flakiness is fixed, remove it. - GetClipboardHistoryController()->set_on_menu_closed_callback_for_test( - base::BindOnce([]() { - ADD_FAILURE() << "The clipboard history menu should not be closed"; - })); - // Render HTML with auto-resize mode enabled. Wait until the rendering // finishes. ImageModelRequestTestParams test_params(/*callback=*/base::NullCallback(), @@ -1283,14 +1272,6 @@ // Verify that the clipboard history menu shows. Then close the menu. EXPECT_TRUE(GetClipboardHistoryController()->IsMenuShowing()); - - // Reset the callback that runs when the clipboard history menu is closed. - // According to the CQ record, the unexpected menu close happens before - // this line. - // TODO(https://crbug.com/1224777): when the flakiness is fixed, remove it. - GetClipboardHistoryController()->set_on_menu_closed_callback_for_test( - base::NullCallback()); - event_generator->PressAndReleaseKey(ui::VKEY_ESCAPE, ui::EF_NONE); EXPECT_FALSE(GetClipboardHistoryController()->IsMenuShowing());
diff --git a/chrome/browser/ui/ash/in_session_auth_dialog_client.h b/chrome/browser/ui/ash/in_session_auth_dialog_client.h index 8c0b108..7dd4466 100644 --- a/chrome/browser/ui/ash/in_session_auth_dialog_client.h +++ b/chrome/browser/ui/ash/in_session_auth_dialog_client.h
@@ -7,7 +7,7 @@ #include "ash/components/login/auth/auth_status_consumer.h" #include "ash/components/login/auth/extended_authenticator.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/public/cpp/in_session_auth_dialog_client.h" #include "base/callback.h" #include "base/memory/scoped_refptr.h"
diff --git a/chrome/browser/ui/ash/in_session_auth_token_provider_impl.h b/chrome/browser/ui/ash/in_session_auth_token_provider_impl.h index a54f071e..efdf4e3 100644 --- a/chrome/browser/ui/ash/in_session_auth_token_provider_impl.h +++ b/chrome/browser/ui/ash/in_session_auth_token_provider_impl.h
@@ -5,7 +5,7 @@ #ifndef CHROME_BROWSER_UI_ASH_IN_SESSION_AUTH_TOKEN_PROVIDER_IMPL_H_ #define CHROME_BROWSER_UI_ASH_IN_SESSION_AUTH_TOKEN_PROVIDER_IMPL_H_ -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/public/cpp/ash_public_export.h" #include "ash/public/cpp/in_session_auth_token_provider.h" #include "base/callback_forward.h"
diff --git a/chrome/browser/ui/autofill/payments/autofill_dialog_models.cc b/chrome/browser/ui/autofill/payments/autofill_dialog_models.cc index b2104e69..130c546 100644 --- a/chrome/browser/ui/autofill/payments/autofill_dialog_models.cc +++ b/chrome/browser/ui/autofill/payments/autofill_dialog_models.cc
@@ -63,20 +63,20 @@ MonthComboboxModel::~MonthComboboxModel() {} -int MonthComboboxModel::GetItemCount() const { +size_t MonthComboboxModel::GetItemCount() const { // 12 months plus the empty entry. return 13; } -std::u16string MonthComboboxModel::GetItemAt(int index) const { +std::u16string MonthComboboxModel::GetItemAt(size_t index) const { return index == 0 ? l10n_util::GetStringUTF16( IDS_AUTOFILL_DIALOG_PLACEHOLDER_EXPIRY_MONTH) - : FormatMonth(index); + : FormatMonth(static_cast<int>(index)); } void MonthComboboxModel::SetDefaultIndexByMonth(int month) { if (month >= 1 && month <= 12) - default_index_ = month; + default_index_ = static_cast<size_t>(month); } absl::optional<size_t> MonthComboboxModel::GetDefaultIndex() const { @@ -92,7 +92,7 @@ void YearComboboxModel::SetDefaultIndexByYear(int year) { const std::u16string& year_value = base::NumberToString16(year); - for (int i = 1; i < GetItemCount(); i++) { + for (size_t i = 1; i < GetItemCount(); i++) { if (year_value == GetItemAt(i)) { default_index_ = i; return;
diff --git a/chrome/browser/ui/autofill/payments/autofill_dialog_models.h b/chrome/browser/ui/autofill/payments/autofill_dialog_models.h index c3787d2..e01ee63 100644 --- a/chrome/browser/ui/autofill/payments/autofill_dialog_models.h +++ b/chrome/browser/ui/autofill/payments/autofill_dialog_models.h
@@ -25,14 +25,14 @@ void SetDefaultIndexByMonth(int month); // ui::Combobox implementation: - int GetItemCount() const override; - std::u16string GetItemAt(int index) const override; + size_t GetItemCount() const override; + std::u16string GetItemAt(size_t index) const override; absl::optional<size_t> GetDefaultIndex() const override; private: // The index of the item that is selected by default (before user // interaction). - int default_index_ = 0; + size_t default_index_ = 0; }; // A model for years between now and a decade hence. @@ -56,7 +56,7 @@ private: // The index of the item that is selected by default (before user // interaction). - int default_index_ = 0; + size_t default_index_ = 0; }; } // namespace autofill
diff --git a/chrome/browser/ui/autofill/payments/autofill_dialog_models_unittest.cc b/chrome/browser/ui/autofill/payments/autofill_dialog_models_unittest.cc index 2c321622..048dc956 100644 --- a/chrome/browser/ui/autofill/payments/autofill_dialog_models_unittest.cc +++ b/chrome/browser/ui/autofill/payments/autofill_dialog_models_unittest.cc
@@ -24,7 +24,7 @@ test_clock.SetNow(kJune2017); YearComboboxModel model; - ASSERT_EQ(11, model.GetItemCount()); // Placeholder + 2017-2026. + ASSERT_EQ(11u, model.GetItemCount()); // Placeholder + 2017-2026. EXPECT_EQ( l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_PLACEHOLDER_EXPIRY_YEAR), model.GetItemAt(0)); @@ -46,7 +46,7 @@ test_clock.SetNow(kJune2017); YearComboboxModel model(2016); - ASSERT_EQ(12, model.GetItemCount()); // Placeholder + 2016 + 2017-2026. + ASSERT_EQ(12u, model.GetItemCount()); // Placeholder + 2016 + 2017-2026. EXPECT_EQ( l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_PLACEHOLDER_EXPIRY_YEAR), model.GetItemAt(0)); @@ -70,7 +70,7 @@ test_clock.SetNow(kJune2017); YearComboboxModel model(2042); - ASSERT_EQ(12, model.GetItemCount()); // Placeholder + 2017-2026 + 2042. + ASSERT_EQ(12u, model.GetItemCount()); // Placeholder + 2017-2026 + 2042. EXPECT_EQ( l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_PLACEHOLDER_EXPIRY_YEAR), model.GetItemAt(0));
diff --git a/chrome/browser/ui/bookmarks/recently_used_folders_combo_model.cc b/chrome/browser/ui/bookmarks/recently_used_folders_combo_model.cc index 7427349..55773ca 100644 --- a/chrome/browser/ui/bookmarks/recently_used_folders_combo_model.cc +++ b/chrome/browser/ui/bookmarks/recently_used_folders_combo_model.cc
@@ -93,11 +93,11 @@ bookmark_model_->RemoveObserver(this); } -int RecentlyUsedFoldersComboModel::GetItemCount() const { - return static_cast<int>(items_.size()); +size_t RecentlyUsedFoldersComboModel::GetItemCount() const { + return items_.size(); } -std::u16string RecentlyUsedFoldersComboModel::GetItemAt(int index) const { +std::u16string RecentlyUsedFoldersComboModel::GetItemAt(size_t index) const { switch (items_[index].type) { case Item::TYPE_NODE: return items_[index].node->GetTitle(); @@ -113,7 +113,7 @@ return std::u16string(); } -bool RecentlyUsedFoldersComboModel::IsItemSeparatorAt(int index) const { +bool RecentlyUsedFoldersComboModel::IsItemSeparatorAt(size_t index) const { return items_[index].type == Item::TYPE_SEPARATOR; } @@ -214,10 +214,9 @@ } } -void RecentlyUsedFoldersComboModel::MaybeChangeParent( - const BookmarkNode* node, - int selected_index) { - DCHECK_LT(selected_index, static_cast<int>(items_.size())); +void RecentlyUsedFoldersComboModel::MaybeChangeParent(const BookmarkNode* node, + size_t selected_index) { + DCHECK_LT(selected_index, items_.size()); if (items_[selected_index].type != Item::TYPE_NODE) return; @@ -228,10 +227,8 @@ } } -const BookmarkNode* RecentlyUsedFoldersComboModel::GetNodeAt(int index) { - if (index < 0 || index >= static_cast<int>(items_.size())) - return nullptr; - return items_[index].node; +const BookmarkNode* RecentlyUsedFoldersComboModel::GetNodeAt(size_t index) { + return (index < items_.size()) ? items_[index].node : nullptr; } void RecentlyUsedFoldersComboModel::RemoveNode(const BookmarkNode* node) {
diff --git a/chrome/browser/ui/bookmarks/recently_used_folders_combo_model.h b/chrome/browser/ui/bookmarks/recently_used_folders_combo_model.h index 7cb8803..5eb3a1a 100644 --- a/chrome/browser/ui/bookmarks/recently_used_folders_combo_model.h +++ b/chrome/browser/ui/bookmarks/recently_used_folders_combo_model.h
@@ -34,9 +34,9 @@ ~RecentlyUsedFoldersComboModel() override; // Overridden from ui::ComboboxModel: - int GetItemCount() const override; - std::u16string GetItemAt(int index) const override; - bool IsItemSeparatorAt(int index) const override; + size_t GetItemCount() const override; + std::u16string GetItemAt(size_t index) const override; + bool IsItemSeparatorAt(size_t index) const override; absl::optional<size_t> GetDefaultIndex() const override; // Overriden from bookmarks::BookmarkModelObserver: @@ -73,11 +73,11 @@ // If necessary this function moves |node| into the corresponding folder for // the given |selected_index|. void MaybeChangeParent(const bookmarks::BookmarkNode* node, - int selected_index); + size_t selected_index); private: // Returns the node at the specified |index|. - const bookmarks::BookmarkNode* GetNodeAt(int index); + const bookmarks::BookmarkNode* GetNodeAt(size_t index); // Removes |node| from |items_|. Does nothing if |node| is not in |items_|. void RemoveNode(const bookmarks::BookmarkNode* node);
diff --git a/chrome/browser/ui/bookmarks/recently_used_folders_combo_model_unittest.cc b/chrome/browser/ui/bookmarks/recently_used_folders_combo_model_unittest.cc index 3bfe6852..9fb4e62 100644 --- a/chrome/browser/ui/bookmarks/recently_used_folders_combo_model_unittest.cc +++ b/chrome/browser/ui/bookmarks/recently_used_folders_combo_model_unittest.cc
@@ -68,7 +68,7 @@ bookmark_model->bookmark_bar_node(), 0, u"a", GURL("http://a")); RecentlyUsedFoldersComboModel model(bookmark_model.get(), new_node); std::set<std::u16string> items; - for (int i = 0; i < model.GetItemCount(); ++i) { + for (size_t i = 0; i < model.GetItemCount(); ++i) { if (!model.IsItemSeparatorAt(i)) EXPECT_EQ(0u, items.count(model.GetItemAt(i))); } @@ -87,11 +87,11 @@ TestComboboxModelObserver observer; model.AddObserver(&observer); - const int initial_count = model.GetItemCount(); + const size_t initial_count = model.GetItemCount(); // Remove a folder, it should remove an item from the model too. bookmark_model->Remove(sub_folder); EXPECT_TRUE(observer.GetAndClearChanged()); - const int updated_count = model.GetItemCount(); + const size_t updated_count = model.GetItemCount(); EXPECT_LT(updated_count, initial_count); // Remove all, which should remove a folder too.
diff --git a/chrome/browser/ui/extensions/extension_site_access_combobox_model.cc b/chrome/browser/ui/extensions/extension_site_access_combobox_model.cc index 09a8f03f..efb6fd8d 100644 --- a/chrome/browser/ui/extensions/extension_site_access_combobox_model.cc +++ b/chrome/browser/ui/extensions/extension_site_access_combobox_model.cc
@@ -27,12 +27,12 @@ ExtensionSiteAccessComboboxModel::~ExtensionSiteAccessComboboxModel() = default; -void ExtensionSiteAccessComboboxModel::HandleSelection(int new_index) { +void ExtensionSiteAccessComboboxModel::HandleSelection(size_t new_index) { content::WebContents* web_contents = browser_->tab_strip_model()->GetActiveWebContents(); if (!web_contents || !ExtensionIsValid()) return; - DCHECK_LT(static_cast<size_t>(new_index), items_.size()); + DCHECK_LT(new_index, items_.size()); LogSiteAccessAction(items_[new_index]); @@ -40,7 +40,7 @@ .UpdateSiteAccess(*extension_, web_contents, items_[new_index]); } -int ExtensionSiteAccessComboboxModel::GetCurrentSiteAccessIndex() const { +size_t ExtensionSiteAccessComboboxModel::GetCurrentSiteAccessIndex() const { DCHECK(ExtensionIsValid()); content::WebContents* web_contents = @@ -53,14 +53,14 @@ auto item_it = std::find(items_.begin(), items_.end(), current_access); DCHECK(item_it != items_.end()); - return item_it - items_.begin(); + return static_cast<size_t>(item_it - items_.begin()); } -int ExtensionSiteAccessComboboxModel::GetItemCount() const { +size_t ExtensionSiteAccessComboboxModel::GetItemCount() const { return items_.size(); } -std::u16string ExtensionSiteAccessComboboxModel::GetItemAt(int index) const { +std::u16string ExtensionSiteAccessComboboxModel::GetItemAt(size_t index) const { int label_id = 0; switch (items_[index]) { case extensions::SitePermissionsHelper::SiteAccess::kOnClick: @@ -81,7 +81,7 @@ return GetCurrentSiteAccessIndex(); } -bool ExtensionSiteAccessComboboxModel::IsItemEnabledAt(int index) const { +bool ExtensionSiteAccessComboboxModel::IsItemEnabledAt(size_t index) const { content::WebContents* web_contents = browser_->tab_strip_model()->GetActiveWebContents(); if (!web_contents || !ExtensionIsValid())
diff --git a/chrome/browser/ui/extensions/extension_site_access_combobox_model.h b/chrome/browser/ui/extensions/extension_site_access_combobox_model.h index 8fec7170..2da5b5d 100644 --- a/chrome/browser/ui/extensions/extension_site_access_combobox_model.h +++ b/chrome/browser/ui/extensions/extension_site_access_combobox_model.h
@@ -29,16 +29,16 @@ ~ExtensionSiteAccessComboboxModel() override; // Handles the action corresponding to the `selected_index`. - void HandleSelection(int selected_index); + void HandleSelection(size_t selected_index); // Gets the combobox item index corresponding to the current site access. - int GetCurrentSiteAccessIndex() const; + size_t GetCurrentSiteAccessIndex() const; // ui::ComboboxModel: - int GetItemCount() const override; - std::u16string GetItemAt(int index) const override; + size_t GetItemCount() const override; + std::u16string GetItemAt(size_t index) const override; absl::optional<size_t> GetDefaultIndex() const override; - bool IsItemEnabledAt(int index) const override; + bool IsItemEnabledAt(size_t index) const override; private: // Checks if `extension_` is still valid by checking its
diff --git a/chrome/browser/ui/translate/source_language_combobox_model.cc b/chrome/browser/ui/translate/source_language_combobox_model.cc index 04e5117..a8dad0a 100644 --- a/chrome/browser/ui/translate/source_language_combobox_model.cc +++ b/chrome/browser/ui/translate/source_language_combobox_model.cc
@@ -17,11 +17,11 @@ SourceLanguageComboboxModel::~SourceLanguageComboboxModel() = default; -int SourceLanguageComboboxModel::GetItemCount() const { +size_t SourceLanguageComboboxModel::GetItemCount() const { return model_->GetNumberOfSourceLanguages(); } -std::u16string SourceLanguageComboboxModel::GetItemAt(int index) const { +std::u16string SourceLanguageComboboxModel::GetItemAt(size_t index) const { return model_->GetSourceLanguageNameAt(index); }
diff --git a/chrome/browser/ui/translate/source_language_combobox_model.h b/chrome/browser/ui/translate/source_language_combobox_model.h index 88151e73..40c0bdc 100644 --- a/chrome/browser/ui/translate/source_language_combobox_model.h +++ b/chrome/browser/ui/translate/source_language_combobox_model.h
@@ -28,8 +28,8 @@ ~SourceLanguageComboboxModel() override; // Overridden from ui::ComboboxModel: - int GetItemCount() const override; - std::u16string GetItemAt(int index) const override; + size_t GetItemCount() const override; + std::u16string GetItemAt(size_t index) const override; absl::optional<size_t> GetDefaultIndex() const override; private:
diff --git a/chrome/browser/ui/translate/target_language_combobox_model.cc b/chrome/browser/ui/translate/target_language_combobox_model.cc index 61d1b68..c7e31b1 100644 --- a/chrome/browser/ui/translate/target_language_combobox_model.cc +++ b/chrome/browser/ui/translate/target_language_combobox_model.cc
@@ -17,11 +17,11 @@ TargetLanguageComboboxModel::~TargetLanguageComboboxModel() = default; -int TargetLanguageComboboxModel::GetItemCount() const { +size_t TargetLanguageComboboxModel::GetItemCount() const { return model_->GetNumberOfTargetLanguages(); } -std::u16string TargetLanguageComboboxModel::GetItemAt(int index) const { +std::u16string TargetLanguageComboboxModel::GetItemAt(size_t index) const { return model_->GetTargetLanguageNameAt(index); }
diff --git a/chrome/browser/ui/translate/target_language_combobox_model.h b/chrome/browser/ui/translate/target_language_combobox_model.h index dc330b4..38a7db6 100644 --- a/chrome/browser/ui/translate/target_language_combobox_model.h +++ b/chrome/browser/ui/translate/target_language_combobox_model.h
@@ -27,8 +27,8 @@ ~TargetLanguageComboboxModel() override; // Overridden from ui::ComboboxModel: - int GetItemCount() const override; - std::u16string GetItemAt(int index) const override; + size_t GetItemCount() const override; + std::u16string GetItemAt(size_t index) const override; absl::optional<size_t> GetDefaultIndex() const override; private:
diff --git a/chrome/browser/ui/views/apps/app_info_dialog/app_info_summary_panel.cc b/chrome/browser/ui/views/apps/app_info_dialog/app_info_summary_panel.cc index 2d6d572..4bcde22d 100644 --- a/chrome/browser/ui/views/apps/app_info_dialog/app_info_summary_panel.cc +++ b/chrome/browser/ui/views/apps/app_info_dialog/app_info_summary_panel.cc
@@ -45,8 +45,8 @@ int GetIndexForLaunchType(extensions::LaunchType launch_type) const; // Overridden from ui::ComboboxModel: - int GetItemCount() const override; - std::u16string GetItemAt(int index) const override; + size_t GetItemCount() const override; + std::u16string GetItemAt(size_t index) const override; private: // A list of the launch types available in the combobox, in order. @@ -88,11 +88,11 @@ return 0; } -int LaunchOptionsComboboxModel::GetItemCount() const { +size_t LaunchOptionsComboboxModel::GetItemCount() const { return launch_types_.size(); } -std::u16string LaunchOptionsComboboxModel::GetItemAt(int index) const { +std::u16string LaunchOptionsComboboxModel::GetItemAt(size_t index) const { return launch_type_messages_[index]; }
diff --git a/chrome/browser/ui/views/bluetooth_device_pair_confirm_view.cc b/chrome/browser/ui/views/bluetooth_device_pair_confirm_view.cc index f17d117..d5049dd 100644 --- a/chrome/browser/ui/views/bluetooth_device_pair_confirm_view.cc +++ b/chrome/browser/ui/views/bluetooth_device_pair_confirm_view.cc
@@ -62,6 +62,36 @@ void BluetoothDevicePairConfirmView::InitControls( const std::u16string& device_identifier, const absl::optional<std::u16string> pin) { + // + // Create the following layout: + // + // ┌───────────────┬────────────────────────────────────────────────┐ + // │ │ IDS_BLUETOOTH_DEVICE_PAIR_CONFIRM_TITLE │ + // │ ┌───────────┐ │ │ + // │ │ │ │ IDS_BLUETOOTH_DEVICE_PAIR_CONFIRM_LABEL │ + // │ │ Bluetooth │ │ │ + // │ │ icon │ │ │ + // │ │ │ │ │ + // │ └───────────┘ │ ┌──────┐ ┌────────┐ │ + // │ │ │ OK │ │ Cancel │ │ + // │ │ └──────┘ └────────┘ │ + // └───────────────┴────────────────────────────────────────────────┘ + // + // Or, if a |pin| is specified. + // + // ┌───────────────┬────────────────────────────────────────────────┐ + // │ │ IDS_BLUETOOTH_DEVICE_PASSKEY_CONFIRM_TITLE │ + // │ ┌───────────┐ │ │ + // │ │ │ │ IDS_BLUETOOTH_DEVICE_PASSKEY_CONFIRM_LABEL │ + // │ │ Bluetooth │ │ │ + // │ │ icon │ │ │ + // │ │ │ │ │ + // │ └───────────┘ │ ┌──────┐ ┌────────┐ │ + // │ │ │ OK │ │ Cancel │ │ + // │ │ └──────┘ └────────┘ │ + // └───────────────┴────────────────────────────────────────────────┘ + // + SetLayoutManager(std::make_unique<views::FlexLayout>()) ->SetCrossAxisAlignment(views::LayoutAlignment::kCenter);
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc index 7286fbd0..63e6a6b 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc
@@ -103,10 +103,9 @@ } void OnComboboxAction() { - if (dialog_model() - ->GetComboboxByUniqueId(kBookmarkFolder) - ->selected_index() + - 1 == + const auto* combobox = + dialog_model()->GetComboboxByUniqueId(kBookmarkFolder); + if (static_cast<size_t>(combobox->selected_index()) + 1 == GetFolderModel()->GetItemCount()) { base::RecordAction(UserMetricsAction("BookmarkBubble_EditFromCombobox")); ShowEditor();
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.cc b/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.cc index f9b0c01..a8ef9dd1 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.cc
@@ -619,7 +619,6 @@ DCHECK(node->is_folder()); child_menu_item = menu->AppendSubMenu( id, MaybeEscapeLabel(node->GetTitle()), folder_icon); - child_menu_item->GetViewAccessibility().OverrideDescription(""); } AddMenuToMaps(child_menu_item, node); }
diff --git a/chrome/browser/ui/views/content_setting_bubble_contents.cc b/chrome/browser/ui/views/content_setting_bubble_contents.cc index 7a2e42c..c8b91c3 100644 --- a/chrome/browser/ui/views/content_setting_bubble_contents.cc +++ b/chrome/browser/ui/views/content_setting_bubble_contents.cc
@@ -82,8 +82,8 @@ int GetDeviceIndex(const blink::MediaStreamDevice& device) const; // ui::ComboboxModel: - int GetItemCount() const override; - std::u16string GetItemAt(int index) const override; + size_t GetItemCount() const override; + std::u16string GetItemAt(size_t index) const override; private: blink::mojom::MediaStreamType type_; @@ -183,11 +183,11 @@ return 0; } -int MediaComboboxModel::GetItemCount() const { - return std::max(1, static_cast<int>(GetDevices().size())); +size_t MediaComboboxModel::GetItemCount() const { + return std::max(size_t{1}, GetDevices().size()); } -std::u16string MediaComboboxModel::GetItemAt(int index) const { +std::u16string MediaComboboxModel::GetItemAt(size_t index) const { return GetDevices().empty() ? l10n_util::GetStringUTF16(IDS_MEDIA_MENU_NO_DEVICE_TITLE) : base::UTF8ToUTF16(GetDevices()[index].name);
diff --git a/chrome/browser/ui/views/download/download_item_view.cc b/chrome/browser/ui/views/download/download_item_view.cc index ce6d427..7f4bf98 100644 --- a/chrome/browser/ui/views/download/download_item_view.cc +++ b/chrome/browser/ui/views/download/download_item_view.cc
@@ -965,7 +965,8 @@ const std::u16string& accessible_alert_text) { views::ViewAccessibility& ax = accessible_alert_->GetViewAccessibility(); ax.OverrideRole(ax::mojom::Role::kAlert); - ax.OverrideName(accessible_alert_text); + if (!accessible_alert_text.empty()) + ax.OverrideName(accessible_alert_text); if (announce_accessible_alert_soon_ || !accessible_alert_timer_.IsRunning()) { AnnounceAccessibleAlert(); accessible_alert_timer_.Reset();
diff --git a/chrome/browser/ui/views/dropdown_bar_host.cc b/chrome/browser/ui/views/dropdown_bar_host.cc index 69febae8..610820fb 100644 --- a/chrome/browser/ui/views/dropdown_bar_host.cc +++ b/chrome/browser/ui/views/dropdown_bar_host.cc
@@ -53,7 +53,6 @@ views::Widget::InitParams params(views::Widget::InitParams::TYPE_CONTROL); params.delegate = this; params.name = "DropdownBarHost"; - params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.parent = browser_view_->GetWidget()->GetNativeView(); params.opacity = views::Widget::InitParams::WindowOpacity::kTranslucent; #if BUILDFLAG(IS_MAC) @@ -100,6 +99,8 @@ } void DropdownBarHost::Show(bool animate) { + DCHECK(host_); + if (!focus_tracker_) { // Stores the currently focused view, and tracks focus changes so that we // can restore focus when the dropdown widget is closed. @@ -213,6 +214,7 @@ if (!animation_->IsShowing()) { // Animation has finished closing. + DCHECK(host_); host_->Hide(); is_visible_ = false; OnVisibilityChanged();
diff --git a/chrome/browser/ui/views/dropdown_bar_host.h b/chrome/browser/ui/views/dropdown_bar_host.h index 2729446..fb12007 100644 --- a/chrome/browser/ui/views/dropdown_bar_host.h +++ b/chrome/browser/ui/views/dropdown_bar_host.h
@@ -13,6 +13,7 @@ #include "ui/gfx/native_widget_types.h" #include "ui/views/animation/animation_delegate_views.h" #include "ui/views/focus/focus_manager.h" +#include "ui/views/widget/unique_widget_ptr.h" #include "ui/views/widget/widget_delegate.h" class BrowserView; @@ -181,7 +182,7 @@ // Host is the Widget implementation that is created and maintained by the // dropdown bar. It contains the DropdownBarView. - std::unique_ptr<views::Widget> host_; + views::UniqueWidgetPtr host_; // A flag to manually manage visibility. GTK/X11 is asynchronous and // the state of the widget can be out of sync.
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_view.cc b/chrome/browser/ui/views/extensions/extensions_menu_view.cc index 5e41c26..86e9647 100644 --- a/chrome/browser/ui/views/extensions/extensions_menu_view.cc +++ b/chrome/browser/ui/views/extensions/extensions_menu_view.cc
@@ -104,7 +104,17 @@ SetButtons(ui::DIALOG_BUTTON_NONE); SetShowCloseButton(true); SetTitle(IDS_EXTENSIONS_MENU_TITLE); - GetViewAccessibility().OverrideName(GetAccessibleWindowTitle()); + + // ExtensionsMenuView::GetAccessibleWindowTitle always returns an empty + // string. This was done to prevent repetition of "Alert Extensions" + // when the user selects Extensions from the Desktop PWA three dot menu. + // See crrev.com/c/2661700. Should that change, kAttributeExplicitlyEmpty + // will not be appropriate. + ax::mojom::NameFrom name_from = + GetAccessibleWindowTitle().empty() + ? ax::mojom::NameFrom::kAttributeExplicitlyEmpty + : ax::mojom::NameFrom::kAttribute; + GetViewAccessibility().OverrideName(GetAccessibleWindowTitle(), name_from); SetEnableArrowKeyTraversal(true);
diff --git a/chrome/browser/ui/views/extensions/extensions_tabbed_menu_view.cc b/chrome/browser/ui/views/extensions/extensions_tabbed_menu_view.cc index 5287a37..fee5164c 100644 --- a/chrome/browser/ui/views/extensions/extensions_tabbed_menu_view.cc +++ b/chrome/browser/ui/views/extensions/extensions_tabbed_menu_view.cc
@@ -237,7 +237,15 @@ // appropriately. SetPaintClientToLayer(true); - GetViewAccessibility().OverrideName(GetAccessibleWindowTitle()); + // ExtensionsTabbedMenuView::GetAccessibleWindowTitle always returns an empty + // string. This was done because the title is already spoken via the call to + // SetTitle(). Should that change, kAttributeExplicitlyEmpty will not be + // appropriate. + ax::mojom::NameFrom name_from = + GetAccessibleWindowTitle().empty() + ? ax::mojom::NameFrom::kAttributeExplicitlyEmpty + : ax::mojom::NameFrom::kAttribute; + GetViewAccessibility().OverrideName(GetAccessibleWindowTitle(), name_from); toolbar_model_observation_.Observe(toolbar_model_.get()); browser_->tab_strip_model()->AddObserver(this);
diff --git a/chrome/browser/ui/views/javascript_tab_modal_dialog_view_views.cc b/chrome/browser/ui/views/javascript_tab_modal_dialog_view_views.cc index a0d619a..74b4231 100644 --- a/chrome/browser/ui/views/javascript_tab_modal_dialog_view_views.cc +++ b/chrome/browser/ui/views/javascript_tab_modal_dialog_view_views.cc
@@ -49,9 +49,10 @@ auto* bubble_frame_view = static_cast<views::BubbleFrameView*>( GetWidget()->non_client_view()->frame_view()); bubble_frame_view->SetTitleView(CreateTitleOriginLabel(GetWindowTitle())); - GetWidget()->GetRootView()->GetViewAccessibility().OverrideDescription( - message_text_); - + if (!message_text_.empty()) { + GetWidget()->GetRootView()->GetViewAccessibility().OverrideDescription( + message_text_); + } // On some platforms, the platform accessibility API automatically // calculates the name of the native window based on the child RootView. // We override that calculation here so that we can present both the
diff --git a/chrome/browser/ui/views/javascript_tab_modal_dialog_view_views_browsertest.cc b/chrome/browser/ui/views/javascript_tab_modal_dialog_view_views_browsertest.cc index db23024..2d4fde3 100644 --- a/chrome/browser/ui/views/javascript_tab_modal_dialog_view_views_browsertest.cc +++ b/chrome/browser/ui/views/javascript_tab_modal_dialog_view_views_browsertest.cc
@@ -33,13 +33,8 @@ EXPECT_EQ(data.GetString16Attribute(ax::mojom::StringAttribute::kDescription), message); EXPECT_EQ(data.role, ax::mojom::Role::kDialog); - - // TODO(crbug.com/1325879): Nothing sets the description-from attribute - // when Views override the description. If we fix that in OverrideDescription, - // the value will still not be carried over to the AXNodeData for the reason - // described in the issue. EXPECT_EQ(data.GetIntAttribute(ax::mojom::IntAttribute::kDescriptionFrom), - static_cast<int32_t>(ax::mojom::DescriptionFrom::kNone)); + static_cast<int32_t>(ax::mojom::DescriptionFrom::kAriaDescription)); } IN_PROC_BROWSER_TEST_F(JavaScriptTabModalDialogViewViewsBrowserTest,
diff --git a/chrome/browser/ui/views/payments/payment_method_view_controller_browsertest.cc b/chrome/browser/ui/views/payments/payment_method_view_controller_browsertest.cc index e69db01..b3d2d32 100644 --- a/chrome/browser/ui/views/payments/payment_method_view_controller_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_method_view_controller_browsertest.cc
@@ -33,9 +33,7 @@ protected: PaymentMethodViewControllerTest() : gpay_server_(net::EmbeddedTestServer::TYPE_HTTPS), - kylepay_server_(net::EmbeddedTestServer::TYPE_HTTPS) { - feature_list_.InitAndEnableFeature(::features::kPaymentRequestBasicCard); - } + kylepay_server_(net::EmbeddedTestServer::TYPE_HTTPS) {} void SetUpOnMainThread() override { host_resolver()->AddRule("*", "127.0.0.1"); @@ -71,133 +69,6 @@ base::test::ScopedFeatureList feature_list_; }; -class PaymentMethodViewControllerBasicCardTest - : public PaymentMethodViewControllerTest { - public: - PaymentMethodViewControllerBasicCardTest( - const PaymentMethodViewControllerBasicCardTest&) = delete; - PaymentMethodViewControllerBasicCardTest& operator=( - const PaymentMethodViewControllerBasicCardTest&) = delete; - - protected: - PaymentMethodViewControllerBasicCardTest() { - feature_list_.InitAndEnableFeature(features::kPaymentRequestBasicCard); - } - - private: - base::test::ScopedFeatureList feature_list_; -}; - -IN_PROC_BROWSER_TEST_F(PaymentMethodViewControllerBasicCardTest, - OneCardSelected) { - NavigateTo("/payment_request_no_shipping_test.html"); - autofill::AutofillProfile billing_profile(autofill::test::GetFullProfile()); - AddAutofillProfile(billing_profile); - autofill::CreditCard card = autofill::test::GetCreditCard(); - card.set_billing_address_id(billing_profile.guid()); - AddCreditCard(card); - - InvokePaymentRequestUI(); - OpenPaymentMethodScreen(); - - PaymentRequest* request = GetPaymentRequests().front(); - EXPECT_EQ(1U, request->state()->available_apps().size()); - - views::View* list_view = dialog_view()->GetViewByID( - static_cast<int>(DialogViewID::PAYMENT_METHOD_SHEET_LIST_VIEW)); - EXPECT_TRUE(list_view); - EXPECT_EQ(1u, list_view->children().size()); - - EXPECT_EQ(request->state()->available_apps().front().get(), - request->state()->selected_app()); - views::View* checkmark_view = list_view->children().front()->GetViewByID( - static_cast<int>(DialogViewID::CHECKMARK_VIEW)); - EXPECT_TRUE(checkmark_view->GetVisible()); -} - -IN_PROC_BROWSER_TEST_F(PaymentMethodViewControllerBasicCardTest, - OneCardSelectedOutOfMany) { - NavigateTo("/payment_request_no_shipping_test.html"); - autofill::AutofillProfile billing_profile(autofill::test::GetFullProfile()); - AddAutofillProfile(billing_profile); - - autofill::CreditCard card1 = autofill::test::GetCreditCard(); - card1.set_billing_address_id(billing_profile.guid()); - - // Ensure that this card is the first suggestion. - card1.set_use_count(5U); - AddCreditCard(card1); - - // Slightly different visa. - autofill::CreditCard card2 = autofill::test::GetCreditCard(); - card2.SetNumber(u"4111111111111112"); - card2.set_billing_address_id(billing_profile.guid()); - card2.set_use_count(1U); - AddCreditCard(card2); - - InvokePaymentRequestUI(); - OpenPaymentMethodScreen(); - - PaymentRequest* request = GetPaymentRequests().front(); - EXPECT_EQ(2U, request->state()->available_apps().size()); - EXPECT_EQ(request->state()->available_apps().front().get(), - request->state()->selected_app()); - - views::View* list_view = dialog_view()->GetViewByID( - static_cast<int>(DialogViewID::PAYMENT_METHOD_SHEET_LIST_VIEW)); - EXPECT_TRUE(list_view); - EXPECT_EQ(2u, list_view->children().size()); - - EXPECT_EQ(request->state()->available_apps().front().get(), - request->state()->selected_app()); - views::View* checkmark_view = list_view->children()[0]->GetViewByID( - static_cast<int>(DialogViewID::CHECKMARK_VIEW)); - EXPECT_TRUE(checkmark_view->GetVisible()); - - views::View* checkmark_view2 = list_view->children()[1]->GetViewByID( - static_cast<int>(DialogViewID::CHECKMARK_VIEW)); - EXPECT_FALSE(checkmark_view2->GetVisible()); - - ResetEventWaiter(DialogEvent::BACK_NAVIGATION); - // Simulate selecting the second card. - ClickOnDialogViewAndWait(list_view->children()[1]); - - EXPECT_EQ(request->state()->available_apps().back().get(), - request->state()->selected_app()); - - OpenPaymentMethodScreen(); - list_view = dialog_view()->GetViewByID( - static_cast<int>(DialogViewID::PAYMENT_METHOD_SHEET_LIST_VIEW)); - - ResetEventWaiter(DialogEvent::BACK_NAVIGATION); - // Clicking on the second card again should not modify any state, and should - // return to the main payment sheet. - ClickOnDialogViewAndWait(list_view->children()[1]); - - EXPECT_EQ(request->state()->available_apps().back().get(), - request->state()->selected_app()); -} - -IN_PROC_BROWSER_TEST_F(PaymentMethodViewControllerBasicCardTest, - EditButtonOpensEditor) { - NavigateTo("/payment_request_no_shipping_test.html"); - AddCreditCard(autofill::test::GetCreditCard()); - - InvokePaymentRequestUI(); - OpenPaymentMethodScreen(); - - views::View* list_view = dialog_view()->GetViewByID( - static_cast<int>(DialogViewID::PAYMENT_METHOD_SHEET_LIST_VIEW)); - EXPECT_TRUE(list_view); - EXPECT_EQ(1u, list_view->children().size()); - - views::View* edit_button = list_view->children().front()->GetViewByID( - static_cast<int>(DialogViewID::EDIT_ITEM_BUTTON)); - - ResetEventWaiter(DialogEvent::CREDIT_CARD_EDITOR_OPENED); - ClickOnDialogViewAndWait(edit_button); -} - IN_PROC_BROWSER_TEST_F(PaymentMethodViewControllerTest, DoNotShowAddCardWhenBasicCardIsNotSupported) { NavigateTo("/payment_request_bobpay_and_cards_test.html"); @@ -220,24 +91,7 @@ EXPECT_EQ(nullptr, add_card_button); } -class PaymentMethodViewControllerPaymentHandlerTest - : public PaymentMethodViewControllerTest { - public: - PaymentMethodViewControllerPaymentHandlerTest( - const PaymentMethodViewControllerPaymentHandlerTest&) = delete; - PaymentMethodViewControllerPaymentHandlerTest& operator=( - const PaymentMethodViewControllerPaymentHandlerTest&) = delete; - - protected: - PaymentMethodViewControllerPaymentHandlerTest() { - feature_list_.InitAndDisableFeature(features::kPaymentRequestBasicCard); - } - - private: - base::test::ScopedFeatureList feature_list_; -}; - -IN_PROC_BROWSER_TEST_F(PaymentMethodViewControllerPaymentHandlerTest, +IN_PROC_BROWSER_TEST_F(PaymentMethodViewControllerTest, OneAppSelectedOutOfMany) { std::string payment_method_a; InstallPaymentApp("a.com", "/nickpay.com/app.js", &payment_method_a);
diff --git a/chrome/browser/ui/views/payments/payment_request_browsertest.cc b/chrome/browser/ui/views/payments/payment_request_browsertest.cc index f0e5507..3f28c6f 100644 --- a/chrome/browser/ui/views/payments/payment_request_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_request_browsertest.cc
@@ -18,7 +18,6 @@ #include "components/autofill/core/browser/data_model/credit_card.h" #include "components/payments/content/payment_request.h" #include "components/web_modal/web_contents_modal_dialog_manager.h" -#include "content/public/common/content_features.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" #include "testing/gmock/include/gmock/gmock.h" @@ -52,113 +51,7 @@ delete; protected: - PaymentRequestNoShippingTest() { - feature_list_.InitAndEnableFeature(::features::kPaymentRequestBasicCard); - } - - private: - base::test::ScopedFeatureList feature_list_; -}; - -IN_PROC_BROWSER_TEST_F(PaymentRequestNoShippingTest, OpenAndNavigateTo404) { - NavigateTo("/payment_request_no_shipping_test.html"); - InvokePaymentRequestUI(); - - ResetEventWaiter(DialogEvent::DIALOG_CLOSED); - - NavigateTo("/non-existent.html"); - - WaitForObservedEvent(); -} - -IN_PROC_BROWSER_TEST_F(PaymentRequestNoShippingTest, OpenAndNavigateToSame) { - NavigateTo("/payment_request_no_shipping_test.html"); - InvokePaymentRequestUI(); - - ResetEventWaiter(DialogEvent::DIALOG_CLOSED); - - NavigateTo("/payment_request_no_shipping_test.html"); - - WaitForObservedEvent(); -} - -IN_PROC_BROWSER_TEST_F(PaymentRequestNoShippingTest, OpenAndReload) { - NavigateTo("/payment_request_no_shipping_test.html"); - InvokePaymentRequestUI(); - - ResetEventWaiter(DialogEvent::DIALOG_CLOSED); - - chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB); - - WaitForObservedEvent(); -} - -IN_PROC_BROWSER_TEST_F(PaymentRequestNoShippingTest, OpenAndClickCancel) { - NavigateTo("/payment_request_no_shipping_test.html"); - InvokePaymentRequestUI(); - - ResetEventWaiter(DialogEvent::DIALOG_CLOSED); - - ClickOnDialogViewAndWait(DialogViewID::CANCEL_BUTTON, - /*wait_for_animation=*/false); -} - -IN_PROC_BROWSER_TEST_F(PaymentRequestNoShippingTest, - OrderSummaryAndClickCancel) { - NavigateTo("/payment_request_no_shipping_test.html"); - InvokePaymentRequestUI(); - - OpenOrderSummaryScreen(); - - ResetEventWaiter(DialogEvent::DIALOG_CLOSED); - - ClickOnDialogViewAndWait(DialogViewID::CANCEL_BUTTON, - /*wait_for_animation=*/false); -} - -// Disabled due to incompatibility with flaky test fix for crbug.com/1306453, -// and this test is soon to be removed with basic-card. -IN_PROC_BROWSER_TEST_F(PaymentRequestNoShippingTest, DISABLED_PayWithVisa) { - NavigateTo("/payment_request_no_shipping_test.html"); - autofill::AutofillProfile billing_address = autofill::test::GetFullProfile(); - AddAutofillProfile(billing_address); - autofill::CreditCard card = autofill::test::GetCreditCard(); - card.set_billing_address_id(billing_address.guid()); - AddCreditCard(card); // Visa. - - InvokePaymentRequestUI(); - - ResetEventWaiter(DialogEvent::DIALOG_CLOSED); - - PayWithCreditCardAndWait(u"123"); - - WaitForObservedEvent(); - - // The actual structure of the card response is unit-tested. - ExpectBodyContains( - {"4111111111111111", "Test User", - base::UTF16ToUTF8(card.Expiration2DigitMonthAsString()).c_str(), - base::UTF16ToUTF8(card.Expiration4DigitYearAsString()).c_str()}); - ExpectBodyContains({"John", "H.", "Doe", "Underworld", "666 Erebus St.", - "Apt 8", "Elysium", "CA", "91111", "US", "16502111111"}); -} - -// The tests in this class correspond to the tests of the same name in -// PaymentRequestNoShippingTest, with the basic-card being disabled. -// Parameterized tests are not used because the test setup for both tests are -// too different. -class PaymentRequestNoShippingWithBasicCardDisabledTest - : public PaymentRequestBrowserTestBase { - public: - PaymentRequestNoShippingWithBasicCardDisabledTest( - const PaymentRequestNoShippingWithBasicCardDisabledTest&) = delete; - PaymentRequestNoShippingWithBasicCardDisabledTest& operator=( - const PaymentRequestNoShippingWithBasicCardDisabledTest&) = delete; - - protected: - PaymentRequestNoShippingWithBasicCardDisabledTest() { - feature_list_.InitAndDisableFeature(::features::kPaymentRequestBasicCard); - } + PaymentRequestNoShippingTest() = default; void OpenPaymentRequestDialog() { // Installs two apps so that the Payment Request UI will be shown. @@ -174,44 +67,37 @@ "buyWithMethods([{supportedMethods:$1}, {supportedMethods:$2}]);", a_method_name, b_method_name)); } - - private: - base::test::ScopedFeatureList feature_list_; }; -IN_PROC_BROWSER_TEST_F(PaymentRequestNoShippingWithBasicCardDisabledTest, - OpenAndNavigateTo404) { +IN_PROC_BROWSER_TEST_F(PaymentRequestNoShippingTest, OpenAndNavigateTo404) { OpenPaymentRequestDialog(); ResetEventWaiter(DialogEvent::DIALOG_CLOSED); NavigateTo("/non-existent.html"); WaitForObservedEvent(); } -IN_PROC_BROWSER_TEST_F(PaymentRequestNoShippingWithBasicCardDisabledTest, - OpenAndNavigateToSame) { +IN_PROC_BROWSER_TEST_F(PaymentRequestNoShippingTest, OpenAndNavigateToSame) { OpenPaymentRequestDialog(); ResetEventWaiter(DialogEvent::DIALOG_CLOSED); NavigateTo("/payment_request_no_shipping_test.html"); WaitForObservedEvent(); } -IN_PROC_BROWSER_TEST_F(PaymentRequestNoShippingWithBasicCardDisabledTest, - OpenAndReload) { +IN_PROC_BROWSER_TEST_F(PaymentRequestNoShippingTest, OpenAndReload) { OpenPaymentRequestDialog(); ResetEventWaiter(DialogEvent::DIALOG_CLOSED); chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB); WaitForObservedEvent(); } -IN_PROC_BROWSER_TEST_F(PaymentRequestNoShippingWithBasicCardDisabledTest, - OpenAndClickCancel) { +IN_PROC_BROWSER_TEST_F(PaymentRequestNoShippingTest, OpenAndClickCancel) { OpenPaymentRequestDialog(); ResetEventWaiter(DialogEvent::DIALOG_CLOSED); ClickOnDialogViewAndWait(DialogViewID::CANCEL_BUTTON, /*wait_for_animation=*/false); } -IN_PROC_BROWSER_TEST_F(PaymentRequestNoShippingWithBasicCardDisabledTest, +IN_PROC_BROWSER_TEST_F(PaymentRequestNoShippingTest, OrderSummaryAndClickCancel) { OpenPaymentRequestDialog(); OpenOrderSummaryScreen(); @@ -220,8 +106,7 @@ /*wait_for_animation=*/false); } -IN_PROC_BROWSER_TEST_F(PaymentRequestNoShippingWithBasicCardDisabledTest, - InactiveBrowserWindow) { +IN_PROC_BROWSER_TEST_F(PaymentRequestNoShippingTest, InactiveBrowserWindow) { std::string a_method_name; InstallPaymentApp("a.com", "payment_request_success_responder.js", &a_method_name); @@ -241,8 +126,7 @@ a_method_name, b_method_name))); } -IN_PROC_BROWSER_TEST_F(PaymentRequestNoShippingWithBasicCardDisabledTest, - InvalidSSL) { +IN_PROC_BROWSER_TEST_F(PaymentRequestNoShippingTest, InvalidSSL) { std::string a_method_name; InstallPaymentApp("a.com", "payment_request_success_responder.js", &a_method_name); @@ -262,91 +146,10 @@ a_method_name, b_method_name))); } -class PaymentRequestAbortTest : public PaymentRequestBrowserTestBase { - public: - PaymentRequestAbortTest(const PaymentRequestAbortTest&) = delete; - PaymentRequestAbortTest& operator=(const PaymentRequestAbortTest&) = delete; - - protected: - PaymentRequestAbortTest() { - feature_list_.InitAndEnableFeature(::features::kPaymentRequestBasicCard); - } - - private: - base::test::ScopedFeatureList feature_list_; -}; +using PaymentRequestAbortTest = PaymentRequestBrowserTestBase; // Testing the use of the abort() JS API. IN_PROC_BROWSER_TEST_F(PaymentRequestAbortTest, OpenThenAbort) { - NavigateTo("/payment_request_abort_test.html"); - InvokePaymentRequestUI(); - - ResetEventWaiterForSequence( - {DialogEvent::ABORT_CALLED, DialogEvent::DIALOG_CLOSED}); - - content::WebContents* web_contents = GetActiveWebContents(); - const std::string click_buy_button_js = - "(function() { document.getElementById('abort').click(); })();"; - ASSERT_TRUE(content::ExecuteScript(web_contents, click_buy_button_js)); - - WaitForObservedEvent(); - - ExpectBodyContains({"Aborted"}); - - // The web-modal dialog should now be closed. - web_modal::WebContentsModalDialogManager* web_contents_modal_dialog_manager = - web_modal::WebContentsModalDialogManager::FromWebContents(web_contents); - EXPECT_FALSE(web_contents_modal_dialog_manager->IsDialogActive()); -} - -IN_PROC_BROWSER_TEST_F(PaymentRequestAbortTest, - AbortUnsuccessfulAfterCVCPromptShown) { - NavigateTo("/payment_request_abort_test.html"); - autofill::AutofillProfile billing_address = autofill::test::GetFullProfile(); - AddAutofillProfile(billing_address); - autofill::CreditCard card = autofill::test::GetCreditCard(); - card.set_billing_address_id(billing_address.guid()); - AddCreditCard(card); // Visa. - - InvokePaymentRequestUI(); - OpenCVCPromptWithCVC(u"123"); - - ResetEventWaiter(DialogEvent::ABORT_CALLED); - - content::WebContents* web_contents = GetActiveWebContents(); - const std::string click_buy_button_js = - "(function() { document.getElementById('abort').click(); })();"; - ASSERT_TRUE(content::ExecuteScript(web_contents, click_buy_button_js)); - - WaitForObservedEvent(); - - ExpectBodyContains({"Cannot abort"}); -} - -// The tests in this class correspond to the tests of the same name in -// PaymentRequestAbortTest, with the basic-card being disabled. -// Parameterized tests are not used because the test setup for both tests are -// too different. -class PaymentRequestAbortWithBasicCardDisabledTest - : public PaymentRequestBrowserTestBase { - public: - PaymentRequestAbortWithBasicCardDisabledTest( - const PaymentRequestAbortWithBasicCardDisabledTest&) = delete; - PaymentRequestAbortWithBasicCardDisabledTest& operator=( - const PaymentRequestAbortWithBasicCardDisabledTest&) = delete; - - protected: - PaymentRequestAbortWithBasicCardDisabledTest() { - feature_list_.InitAndDisableFeature(::features::kPaymentRequestBasicCard); - } - - private: - base::test::ScopedFeatureList feature_list_; -}; - -// Testing the use of the abort() JS API. -IN_PROC_BROWSER_TEST_F(PaymentRequestAbortWithBasicCardDisabledTest, - OpenThenAbort) { // Installs two apps so that the Payment Request UI will be shown. std::string a_method_name; InstallPaymentApp("a.com", "payment_request_success_responder.js", @@ -378,118 +181,11 @@ EXPECT_FALSE(web_contents_modal_dialog_manager->IsDialogActive()); } -class PaymentRequestPaymentMethodIdentifierTest - : public PaymentRequestBrowserTestBase { - public: - PaymentRequestPaymentMethodIdentifierTest( - const PaymentRequestPaymentMethodIdentifierTest&) = delete; - PaymentRequestPaymentMethodIdentifierTest& operator=( - const PaymentRequestPaymentMethodIdentifierTest&) = delete; - - protected: - PaymentRequestPaymentMethodIdentifierTest() { - feature_list_.InitAndEnableFeature(::features::kPaymentRequestBasicCard); - } - - void InvokePaymentRequestWithJs(const std::string& js) { - ResetEventWaiterForDialogOpened(); - - ASSERT_TRUE(content::ExecuteScript(GetActiveWebContents(), js)); - - WaitForObservedEvent(); - } - - private: - base::test::ScopedFeatureList feature_list_; -}; - -// One network is specified in 'basic-card' data, one in supportedMethods. -IN_PROC_BROWSER_TEST_F(PaymentRequestPaymentMethodIdentifierTest, - BasicCard_NetworksSpecified) { - NavigateTo("/payment_request_payment_method_identifier_test.html"); - InvokePaymentRequestWithJs("buy();"); - - std::vector<PaymentRequest*> requests = GetPaymentRequests(); - EXPECT_EQ(1u, requests.size()); - std::vector<std::string> supported_card_networks = - requests[0]->spec()->supported_card_networks(); - EXPECT_EQ(2u, supported_card_networks.size()); - // The networks appear in the order in which they were specified by the - // merchant. - EXPECT_EQ("mastercard", supported_card_networks[0]); - EXPECT_EQ("visa", supported_card_networks[1]); -} - -// Only specifying 'basic-card' with no supportedNetworks means all networks are -// supported. -IN_PROC_BROWSER_TEST_F(PaymentRequestPaymentMethodIdentifierTest, - BasicCard_NoNetworksSpecified) { - NavigateTo("/payment_request_payment_method_identifier_test.html"); - InvokePaymentRequestWithJs("buyHelper([basicCardMethod]);"); - - std::vector<PaymentRequest*> requests = GetPaymentRequests(); - EXPECT_EQ(1u, requests.size()); - std::vector<std::string> supported_card_networks = - requests[0]->spec()->supported_card_networks(); - // The default ordering is alphabetical. - EXPECT_EQ(8u, supported_card_networks.size()); - EXPECT_EQ("amex", supported_card_networks[0]); - EXPECT_EQ("diners", supported_card_networks[1]); - EXPECT_EQ("discover", supported_card_networks[2]); - EXPECT_EQ("jcb", supported_card_networks[3]); - EXPECT_EQ("mastercard", supported_card_networks[4]); - EXPECT_EQ("mir", supported_card_networks[5]); - EXPECT_EQ("unionpay", supported_card_networks[6]); - EXPECT_EQ("visa", supported_card_networks[7]); -} +using PaymentRequestPaymentMethodIdentifierTest = PaymentRequestBrowserTestBase; // A url-based payment method identifier is only supported if it has an https // scheme. IN_PROC_BROWSER_TEST_F(PaymentRequestPaymentMethodIdentifierTest, Url_Valid) { - NavigateTo("/payment_request_payment_method_identifier_test.html"); - InvokePaymentRequestWithJs( - "buyHelper([{" - " supportedMethods: 'https://bobpay.xyz'" - "}, {" - " supportedMethods: 'basic-card'" - "}]);"); - - std::vector<PaymentRequest*> requests = GetPaymentRequests(); - EXPECT_EQ(1u, requests.size()); - std::vector<GURL> url_payment_method_identifiers = - requests[0]->spec()->url_payment_method_identifiers(); - EXPECT_EQ(1u, url_payment_method_identifiers.size()); - EXPECT_EQ(GURL("https://bobpay.xyz"), url_payment_method_identifiers[0]); -} - -// The tests in this class correspond to the tests of the same name in -// PaymentRequestPaymentMethodIdentifierTest, with the basic-card being -// disabled. Parameterized tests are not used because the test setup for both -// tests are too different. -class PaymentRequestPaymentMethodIdentifierWithBasicCardDisabledTest - : public PaymentRequestBrowserTestBase { - public: - PaymentRequestPaymentMethodIdentifierWithBasicCardDisabledTest( - const PaymentRequestPaymentMethodIdentifierWithBasicCardDisabledTest&) = - delete; - PaymentRequestPaymentMethodIdentifierWithBasicCardDisabledTest& operator=( - const PaymentRequestPaymentMethodIdentifierWithBasicCardDisabledTest&) = - delete; - - protected: - PaymentRequestPaymentMethodIdentifierWithBasicCardDisabledTest() { - feature_list_.InitAndDisableFeature(::features::kPaymentRequestBasicCard); - } - - private: - base::test::ScopedFeatureList feature_list_; -}; - -// A url-based payment method identifier is only supported if it has an https -// scheme. -IN_PROC_BROWSER_TEST_F( - PaymentRequestPaymentMethodIdentifierWithBasicCardDisabledTest, - Url_Valid) { // Installs two apps so that the Payment Request UI will be shown. std::string a_method_name; InstallPaymentApp("a.com", "payment_request_success_responder.js", @@ -521,47 +217,7 @@ delete; protected: - PaymentsRequestVisualTest() { - feature_list_.InitAndEnableFeature(::features::kPaymentRequestBasicCard); - } - - // TestBrowserDialog: - void ShowUi(const std::string& name) override { InvokePaymentRequestUI(); } - - bool AlwaysCloseAsynchronously() override { - // Bypassing Widget::CanClose() causes payments::JourneyLogger to see the - // show, but not the close, resulting in a DCHECK in its destructor. - return true; - } - - private: - base::test::ScopedFeatureList feature_list_; -}; - -IN_PROC_BROWSER_TEST_F(PaymentsRequestVisualTest, InvokeUi_NoShipping) { - NavigateTo("/payment_request_no_shipping_test.html"); - ShowAndVerifyUi(); -} - -// The tests in this class correspond to the tests of the same name in -// PaymentRequestNoShippingTest, with the basic-card being disabled. -// Parameterized tests are not used because the test setup for both tests are -// too different. -// Test harness integrating with DialogBrowserTest to present the dialog in an -// interactive manner for visual testing. -class PaymentsRequestVisualWithBasicCardDisabledTest - : public SupportsTestDialog< - PaymentRequestNoShippingWithBasicCardDisabledTest> { - public: - PaymentsRequestVisualWithBasicCardDisabledTest( - const PaymentsRequestVisualWithBasicCardDisabledTest&) = delete; - PaymentsRequestVisualWithBasicCardDisabledTest& operator=( - const PaymentsRequestVisualWithBasicCardDisabledTest&) = delete; - - protected: - PaymentsRequestVisualWithBasicCardDisabledTest() { - feature_list_.InitAndDisableFeature(::features::kPaymentRequestBasicCard); - } + PaymentsRequestVisualTest() = default; // TestBrowserDialog: void ShowUi(const std::string& name) override { @@ -578,13 +234,9 @@ std::string a_method_name_; std::string b_method_name_; - - private: - base::test::ScopedFeatureList feature_list_; }; -IN_PROC_BROWSER_TEST_F(PaymentsRequestVisualWithBasicCardDisabledTest, - InvokeUi_NoShipping) { +IN_PROC_BROWSER_TEST_F(PaymentsRequestVisualTest, InvokeUi_NoShipping) { // Installs two apps so that the Payment Request UI will be shown. std::string a_method_name; InstallPaymentApp("a.com", "payment_request_success_responder.js", @@ -597,21 +249,7 @@ ShowAndVerifyUi(); } -class PaymentRequestSettingsLinkTest : public PaymentRequestBrowserTestBase { - public: - PaymentRequestSettingsLinkTest(const PaymentRequestSettingsLinkTest&) = - delete; - PaymentRequestSettingsLinkTest& operator=( - const PaymentRequestSettingsLinkTest&) = delete; - - protected: - PaymentRequestSettingsLinkTest() { - feature_list_.InitAndEnableFeature(::features::kPaymentRequestBasicCard); - } - - private: - base::test::ScopedFeatureList feature_list_; -}; +using PaymentRequestSettingsLinkTest = PaymentRequestBrowserTestBase; // Tests that clicking the settings link brings the user to settings. IN_PROC_BROWSER_TEST_F(PaymentRequestSettingsLinkTest, ClickSettingsLink) { @@ -621,60 +259,6 @@ ->InstallSystemAppsForTesting(); #endif - NavigateTo("/payment_request_no_shipping_test.html"); - // Setup a credit card with an associated billing address. - autofill::AutofillProfile billing_address = autofill::test::GetFullProfile(); - AddAutofillProfile(billing_address); - autofill::CreditCard card = autofill::test::GetCreditCard(); - card.set_billing_address_id(billing_address.guid()); - AddCreditCard(card); // Visa. - - // Click on the settings link in the payment request dialog window. - InvokePaymentRequestUI(); - views::StyledLabel* styled_label = - static_cast<views::StyledLabel*>(dialog_view()->GetViewByID( - static_cast<int>(DialogViewID::DATA_SOURCE_LABEL))); - EXPECT_TRUE(styled_label); - content::WebContentsAddedObserver web_contents_added_observer; - styled_label->ClickFirstLinkForTesting(); - content::WebContents* new_tab_contents = - web_contents_added_observer.GetWebContents(); - - EXPECT_EQ( - std::string(chrome::kChromeUISettingsURL) + chrome::kPaymentsSubPage, - new_tab_contents->GetVisibleURL().spec()); -} - -// The tests in this class correspond to the tests of the same name in -// PaymentRequestSettingsLinkTest, with the basic-card being disabled. -// Parameterized tests are not used because the test setup for both tests are -// too different. -class PaymentRequestSettingsLinkWithBasicCardDisabledTest - : public PaymentRequestBrowserTestBase { - public: - PaymentRequestSettingsLinkWithBasicCardDisabledTest( - const PaymentRequestSettingsLinkWithBasicCardDisabledTest&) = delete; - PaymentRequestSettingsLinkWithBasicCardDisabledTest& operator=( - const PaymentRequestSettingsLinkWithBasicCardDisabledTest&) = delete; - - protected: - PaymentRequestSettingsLinkWithBasicCardDisabledTest() { - feature_list_.InitAndDisableFeature(::features::kPaymentRequestBasicCard); - } - - private: - base::test::ScopedFeatureList feature_list_; -}; - -// Tests that clicking the settings link brings the user to settings. -IN_PROC_BROWSER_TEST_F(PaymentRequestSettingsLinkWithBasicCardDisabledTest, - ClickSettingsLink) { -#if BUILDFLAG(IS_CHROMEOS_ASH) - // Install the Settings App. - ash::SystemWebAppManager::GetForTest(browser()->profile()) - ->InstallSystemAppsForTesting(); -#endif - // Installs two apps so that the Payment Request UI will be shown. std::string a_method_name; InstallPaymentApp("a.com", "payment_request_success_responder.js",
diff --git a/chrome/browser/ui/views/payments/payment_request_can_make_payment_metrics_browsertest.cc b/chrome/browser/ui/views/payments/payment_request_can_make_payment_metrics_browsertest.cc index 415f4f4..69fcb4b6 100644 --- a/chrome/browser/ui/views/payments/payment_request_can_make_payment_metrics_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_request_can_make_payment_metrics_browsertest.cc
@@ -31,725 +31,8 @@ const PaymentRequestCanMakePaymentMetricsTest&) = delete; protected: - PaymentRequestCanMakePaymentMetricsTest() { - feature_list_.InitAndEnableFeature(::features::kPaymentRequestBasicCard); - } - - void SetupInitialAddressAndCreditCard() { - autofill::AutofillProfile billing_address = - autofill::test::GetFullProfile(); - AddAutofillProfile(billing_address); - autofill::CreditCard card = autofill::test::GetCreditCard(); - card.set_billing_address_id(billing_address.guid()); - AddCreditCard(card); - } - - void CheckPaymentSupportAndThenShow() { - // Start the Payment Request and expect CanMakePayment and - // HasEnrolledInstrument to be called before the Payment Request is shown. - ResetEventWaiterForSequence({DialogEvent::CAN_MAKE_PAYMENT_CALLED, - DialogEvent::CAN_MAKE_PAYMENT_RETURNED, - DialogEvent::HAS_ENROLLED_INSTRUMENT_CALLED, - DialogEvent::HAS_ENROLLED_INSTRUMENT_RETURNED, - DialogEvent::PROCESSING_SPINNER_SHOWN, - DialogEvent::PROCESSING_SPINNER_HIDDEN, - DialogEvent::DIALOG_OPENED}); - ASSERT_TRUE(content::ExecuteScript(GetActiveWebContents(), "queryShow();")); - WaitForObservedEvent(); - // Wait for all callbacks to run. - base::RunLoop().RunUntilIdle(); - } - - private: - base::test::ScopedFeatureList feature_list_; -}; - -IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentMetricsTest, - Called_True_Shown_Completed) { - NavigateTo("/payment_request_can_make_payment_metrics_test.html"); - base::HistogramTester histogram_tester; - - // Setup a credit card with an associated billing address so - // HasEnrolledInstrument returns true. - SetupInitialAddressAndCreditCard(); - - CheckPaymentSupportAndThenShow(); - - // Complete the Payment Request. - PayWithCreditCardAndWait(u"123"); - - // Make sure the correct events were logged. - std::vector<base::Bucket> buckets = - histogram_tester.GetAllSamples("PaymentRequest.Events"); - ASSERT_EQ(1U, buckets.size()); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_SHOWN); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_PAY_CLICKED); - EXPECT_TRUE(buckets[0].min & - JourneyLogger::EVENT_RECEIVED_INSTRUMENT_DETAILS); - EXPECT_TRUE(buckets[0].min & - JourneyLogger::EVENT_HAD_INITIAL_FORM_OF_PAYMENT); - EXPECT_TRUE(buckets[0].min & - JourneyLogger::EVENT_HAD_NECESSARY_COMPLETE_SUGGESTIONS); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_COMPLETED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_OTHER_ABORTED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_SKIPPED_SHOW); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_USER_ABORTED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_SHIPPING); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); - EXPECT_TRUE(buckets[0].min & - JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_TRUE); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_FALSE); -} - -IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentMetricsTest, - Called_True_Shown_OtherAborted) { - NavigateTo("/payment_request_can_make_payment_metrics_test.html"); - base::HistogramTester histogram_tester; - - // Setup a credit card with an associated billing address so - // HasEnrolledInstrument returns true. - SetupInitialAddressAndCreditCard(); - - CheckPaymentSupportAndThenShow(); - - // Simulate that an unexpected error occurs. - ResetEventWaiterForSequence( - {DialogEvent::ABORT_CALLED, DialogEvent::DIALOG_CLOSED}); - const std::string click_buy_button_js = - "(function() { document.getElementById('abort').click(); })();"; - ASSERT_TRUE( - content::ExecuteScript(GetActiveWebContents(), click_buy_button_js)); - WaitForObservedEvent(); - - // Make sure the correct events were logged. - std::vector<base::Bucket> buckets = - histogram_tester.GetAllSamples("PaymentRequest.Events"); - ASSERT_EQ(1U, buckets.size()); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_SHOWN); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_PAY_CLICKED); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_RECEIVED_INSTRUMENT_DETAILS); - EXPECT_TRUE(buckets[0].min & - JourneyLogger::EVENT_HAD_INITIAL_FORM_OF_PAYMENT); - EXPECT_TRUE(buckets[0].min & - JourneyLogger::EVENT_HAD_NECESSARY_COMPLETE_SUGGESTIONS); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_COMPLETED); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_OTHER_ABORTED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_SKIPPED_SHOW); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_USER_ABORTED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_SHIPPING); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); - EXPECT_TRUE(buckets[0].min & - JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_TRUE); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_FALSE); -} - -IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentMetricsTest, - Called_True_Shown_UserAborted) { - NavigateTo("/payment_request_can_make_payment_metrics_test.html"); - base::HistogramTester histogram_tester; - - // Setup a credit card with an associated billing address so - // HasEnrolledInstrument returns true. - SetupInitialAddressAndCreditCard(); - - CheckPaymentSupportAndThenShow(); - - // Simulate that the user cancels the Payment Request. - ClickOnCancel(); - - // Make sure the correct events were logged. - std::vector<base::Bucket> buckets = - histogram_tester.GetAllSamples("PaymentRequest.Events"); - ASSERT_EQ(1U, buckets.size()); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_SHOWN); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_PAY_CLICKED); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_RECEIVED_INSTRUMENT_DETAILS); - EXPECT_TRUE(buckets[0].min & - JourneyLogger::EVENT_HAD_INITIAL_FORM_OF_PAYMENT); - EXPECT_TRUE(buckets[0].min & - JourneyLogger::EVENT_HAD_NECESSARY_COMPLETE_SUGGESTIONS); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_COMPLETED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_OTHER_ABORTED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_SKIPPED_SHOW); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_USER_ABORTED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_SHIPPING); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); - EXPECT_TRUE(buckets[0].min & - JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_TRUE); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_FALSE); -} - -IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentMetricsTest, - Called_False_Shown_Completed) { - NavigateTo("/payment_request_can_make_payment_metrics_test.html"); - base::HistogramTester histogram_tester; - - // An address is needed so that the UI can choose it as a billing address. - autofill::AutofillProfile billing_address = autofill::test::GetFullProfile(); - AddAutofillProfile(billing_address); - - // Don't add a card on file, so HasEnrolledInstrument returns false. - CheckPaymentSupportAndThenShow(); - - // Add a test credit card. - OpenCreditCardEditorScreen(); - SetEditorTextfieldValue(u"Bob Simpson", autofill::CREDIT_CARD_NAME_FULL); - SetEditorTextfieldValue(u"4111111111111111", autofill::CREDIT_CARD_NUMBER); - SetComboboxValue(u"05", autofill::CREDIT_CARD_EXP_MONTH); - SetComboboxValue(u"2026", autofill::CREDIT_CARD_EXP_4_DIGIT_YEAR); - SelectBillingAddress(billing_address.guid()); - ResetEventWaiter(DialogEvent::BACK_TO_PAYMENT_SHEET_NAVIGATION); - ClickOnDialogViewAndWait(DialogViewID::EDITOR_SAVE_BUTTON); - - // Complete the Payment Request. - PayWithCreditCardAndWait(u"123"); - - // Make sure the correct events were logged. - std::vector<base::Bucket> buckets = - histogram_tester.GetAllSamples("PaymentRequest.Events"); - ASSERT_EQ(1U, buckets.size()); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_SHOWN); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_PAY_CLICKED); - EXPECT_TRUE(buckets[0].min & - JourneyLogger::EVENT_RECEIVED_INSTRUMENT_DETAILS); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAD_INITIAL_FORM_OF_PAYMENT); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAD_NECESSARY_COMPLETE_SUGGESTIONS); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_COMPLETED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_OTHER_ABORTED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_SKIPPED_SHOW); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_USER_ABORTED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_SHIPPING); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_TRUE); - EXPECT_TRUE(buckets[0].min & - JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_FALSE); -} - -IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentMetricsTest, - Called_False_Shown_OtherAborted) { - NavigateTo("/payment_request_can_make_payment_metrics_test.html"); - base::HistogramTester histogram_tester; - - // Don't add a card on file, so HasEnrolledInstrument returns false. - CheckPaymentSupportAndThenShow(); - - // Simulate that an unexpected error occurs. - ResetEventWaiterForSequence( - {DialogEvent::ABORT_CALLED, DialogEvent::DIALOG_CLOSED}); - const std::string click_buy_button_js = - "(function() { document.getElementById('abort').click(); })();"; - ASSERT_TRUE( - content::ExecuteScript(GetActiveWebContents(), click_buy_button_js)); - WaitForObservedEvent(); - - // Make sure the correct events were logged. - std::vector<base::Bucket> buckets = - histogram_tester.GetAllSamples("PaymentRequest.Events"); - ASSERT_EQ(1U, buckets.size()); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_SHOWN); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_PAY_CLICKED); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_RECEIVED_INSTRUMENT_DETAILS); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAD_INITIAL_FORM_OF_PAYMENT); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAD_NECESSARY_COMPLETE_SUGGESTIONS); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_COMPLETED); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_OTHER_ABORTED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_SKIPPED_SHOW); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_USER_ABORTED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_SHIPPING); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_TRUE); - EXPECT_TRUE(buckets[0].min & - JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_FALSE); -} - -IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentMetricsTest, - Called_False_Shown_UserAborted) { - NavigateTo("/payment_request_can_make_payment_metrics_test.html"); - base::HistogramTester histogram_tester; - - // Don't add a card on file, so HasEnrolledInstrument returns false. - CheckPaymentSupportAndThenShow(); - - // Simulate that the user cancels the Payment Request. - ClickOnCancel(); - - // Make sure the correct events were logged. - std::vector<base::Bucket> buckets = - histogram_tester.GetAllSamples("PaymentRequest.Events"); - ASSERT_EQ(1U, buckets.size()); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_SHOWN); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_PAY_CLICKED); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_RECEIVED_INSTRUMENT_DETAILS); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAD_INITIAL_FORM_OF_PAYMENT); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAD_NECESSARY_COMPLETE_SUGGESTIONS); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_COMPLETED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_OTHER_ABORTED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_SKIPPED_SHOW); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_USER_ABORTED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_SHIPPING); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_TRUE); - EXPECT_TRUE(buckets[0].min & - JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_FALSE); -} - -IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentMetricsTest, - Called_True_NotShown) { - NavigateTo("/payment_request_can_make_payment_metrics_test.html"); - base::HistogramTester histogram_tester; - - // Setup a credit card with an associated billing address so - // HasEnrolledInstrument returns true. - SetupInitialAddressAndCreditCard(); - - // Try to start the Payment Request, but only check payment support without - // calling show(). - ResetEventWaiterForSequence({DialogEvent::CAN_MAKE_PAYMENT_CALLED, - DialogEvent::CAN_MAKE_PAYMENT_RETURNED, - DialogEvent::HAS_ENROLLED_INSTRUMENT_CALLED, - DialogEvent::HAS_ENROLLED_INSTRUMENT_RETURNED}); - ASSERT_TRUE(content::ExecuteScript(GetActiveWebContents(), "queryNoShow();")); - WaitForObservedEvent(); - - // Navigate away to trigger the log. - NavigateTo("/payment_request_email_test.html"); - - // Make sure the correct events were logged. - std::vector<base::Bucket> buckets = - histogram_tester.GetAllSamples("PaymentRequest.Events"); - ASSERT_EQ(1U, buckets.size()); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_SHOWN); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_PAY_CLICKED); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_RECEIVED_INSTRUMENT_DETAILS); - EXPECT_TRUE(buckets[0].min & - JourneyLogger::EVENT_HAD_INITIAL_FORM_OF_PAYMENT); - EXPECT_TRUE(buckets[0].min & - JourneyLogger::EVENT_HAD_NECESSARY_COMPLETE_SUGGESTIONS); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_COMPLETED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_OTHER_ABORTED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_SKIPPED_SHOW); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_USER_ABORTED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_SHIPPING); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); - EXPECT_TRUE(buckets[0].min & - JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_TRUE); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_FALSE); -} - -IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentMetricsTest, - Called_False_NotShown) { - NavigateTo("/payment_request_can_make_payment_metrics_test.html"); - base::HistogramTester histogram_tester; - - // Don't add a card on file, so HasEnrolledInstrument returns false. - // Try to start the Payment Request, but only check payment support without - // calling show(). - ResetEventWaiterForSequence({DialogEvent::CAN_MAKE_PAYMENT_CALLED, - DialogEvent::CAN_MAKE_PAYMENT_RETURNED, - DialogEvent::HAS_ENROLLED_INSTRUMENT_CALLED, - DialogEvent::HAS_ENROLLED_INSTRUMENT_RETURNED}); - ASSERT_TRUE(content::ExecuteScript(GetActiveWebContents(), "queryNoShow();")); - WaitForObservedEvent(); - - // Navigate away to trigger the log. - NavigateTo("/payment_request_email_test.html"); - - // Make sure the correct events were logged. - std::vector<base::Bucket> buckets = - histogram_tester.GetAllSamples("PaymentRequest.Events"); - ASSERT_EQ(1U, buckets.size()); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_SHOWN); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_PAY_CLICKED); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_RECEIVED_INSTRUMENT_DETAILS); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAD_INITIAL_FORM_OF_PAYMENT); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAD_NECESSARY_COMPLETE_SUGGESTIONS); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_COMPLETED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_OTHER_ABORTED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_SKIPPED_SHOW); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_USER_ABORTED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_SHIPPING); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_TRUE); - EXPECT_TRUE(buckets[0].min & - JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_FALSE); -} - -IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentMetricsTest, - NotCalled_Shown_Completed) { - NavigateTo("/payment_request_can_make_payment_metrics_test.html"); - base::HistogramTester histogram_tester; - - // Setup a credit card with an associated billing address to make it simpler - // to complete the Payment Request. - SetupInitialAddressAndCreditCard(); - - ResetEventWaiterForDialogOpened(); - ASSERT_TRUE(content::ExecuteScript(GetActiveWebContents(), "noQueryShow();")); - WaitForObservedEvent(); - - // Complete the Payment Request. - PayWithCreditCardAndWait(u"123"); - - // Make sure that no canMakePayment events were logged. - std::vector<base::Bucket> buckets = - histogram_tester.GetAllSamples("PaymentRequest.Events"); - ASSERT_EQ(1U, buckets.size()); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_SHOWN); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_PAY_CLICKED); - EXPECT_TRUE(buckets[0].min & - JourneyLogger::EVENT_RECEIVED_INSTRUMENT_DETAILS); - EXPECT_TRUE(buckets[0].min & - JourneyLogger::EVENT_HAD_INITIAL_FORM_OF_PAYMENT); - EXPECT_TRUE(buckets[0].min & - JourneyLogger::EVENT_HAD_NECESSARY_COMPLETE_SUGGESTIONS); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_COMPLETED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_OTHER_ABORTED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_SKIPPED_SHOW); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_USER_ABORTED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_SHIPPING); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_TRUE); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_FALSE); -} - -IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentMetricsTest, - NotCalled_Shown_OtherAborted) { - NavigateTo("/payment_request_can_make_payment_metrics_test.html"); - base::HistogramTester histogram_tester; - - // Setup a credit card with an associated billing address to make it simpler - // to complete the Payment Request. - SetupInitialAddressAndCreditCard(); - - ResetEventWaiterForDialogOpened(); - ASSERT_TRUE(content::ExecuteScript(GetActiveWebContents(), "noQueryShow();")); - WaitForObservedEvent(); - - // Simulate that an unexpected error occurs. - ResetEventWaiterForSequence( - {DialogEvent::ABORT_CALLED, DialogEvent::DIALOG_CLOSED}); - const std::string click_buy_button_js = - "(function() { document.getElementById('abort').click(); })();"; - ASSERT_TRUE( - content::ExecuteScript(GetActiveWebContents(), click_buy_button_js)); - WaitForObservedEvent(); - - // Make sure that no canMakePayment events were logged. - std::vector<base::Bucket> buckets = - histogram_tester.GetAllSamples("PaymentRequest.Events"); - ASSERT_EQ(1U, buckets.size()); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_SHOWN); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_PAY_CLICKED); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_RECEIVED_INSTRUMENT_DETAILS); - EXPECT_TRUE(buckets[0].min & - JourneyLogger::EVENT_HAD_INITIAL_FORM_OF_PAYMENT); - EXPECT_TRUE(buckets[0].min & - JourneyLogger::EVENT_HAD_NECESSARY_COMPLETE_SUGGESTIONS); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_COMPLETED); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_OTHER_ABORTED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_SKIPPED_SHOW); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_USER_ABORTED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_SHIPPING); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_TRUE); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_FALSE); -} - -IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentMetricsTest, - NotCalled_Shown_UserAborted) { - NavigateTo("/payment_request_can_make_payment_metrics_test.html"); - base::HistogramTester histogram_tester; - - // Setup a credit card with an associated billing address to make it simpler - // to complete the Payment Request. - SetupInitialAddressAndCreditCard(); - - ResetEventWaiterForDialogOpened(); - ASSERT_TRUE(content::ExecuteScript(GetActiveWebContents(), "noQueryShow();")); - WaitForObservedEvent(); - - // Simulate that the user cancels the Payment Request. - ClickOnCancel(); - - // Make sure that no canMakePayment events were logged. - std::vector<base::Bucket> buckets = - histogram_tester.GetAllSamples("PaymentRequest.Events"); - ASSERT_EQ(1U, buckets.size()); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_SHOWN); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_PAY_CLICKED); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_RECEIVED_INSTRUMENT_DETAILS); - EXPECT_TRUE(buckets[0].min & - JourneyLogger::EVENT_HAD_INITIAL_FORM_OF_PAYMENT); - EXPECT_TRUE(buckets[0].min & - JourneyLogger::EVENT_HAD_NECESSARY_COMPLETE_SUGGESTIONS); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_COMPLETED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_OTHER_ABORTED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_SKIPPED_SHOW); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_USER_ABORTED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_SHIPPING); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_TRUE); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_FALSE); -} - -IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentMetricsTest, - UserAborted_NavigationToSameOrigin) { - NavigateTo("/payment_request_can_make_payment_metrics_test.html"); - base::HistogramTester histogram_tester; - - CheckPaymentSupportAndThenShow(); - - // Simulate that the user navigates away from the Payment Request by opening a - // different page on the same origin. - ResetEventWaiterForSequence({DialogEvent::DIALOG_CLOSED}); - NavigateTo("/payment_request_email_test.html"); - WaitForObservedEvent(); - - // Make sure the correct events were logged. - std::vector<base::Bucket> buckets = - histogram_tester.GetAllSamples("PaymentRequest.Events"); - ASSERT_EQ(1U, buckets.size()); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_SHOWN); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_PAY_CLICKED); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_RECEIVED_INSTRUMENT_DETAILS); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAD_INITIAL_FORM_OF_PAYMENT); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAD_NECESSARY_COMPLETE_SUGGESTIONS); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_COMPLETED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_OTHER_ABORTED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_SKIPPED_SHOW); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_USER_ABORTED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_SHIPPING); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_TRUE); - EXPECT_TRUE(buckets[0].min & - JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_FALSE); -} - -IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentMetricsTest, - UserAborted_NavigationToDifferentOrigin) { - NavigateTo("/payment_request_can_make_payment_metrics_test.html"); - base::HistogramTester histogram_tester; - - CheckPaymentSupportAndThenShow(); - - // Simulate that the user navigates away from the Payment Request by opening a - // different page on a different origin. - ResetEventWaiterForSequence({DialogEvent::DIALOG_CLOSED}); - GURL other_origin_url = - https_server()->GetURL("b.com", "/payment_request_email_test.html"); - ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), other_origin_url)); - WaitForObservedEvent(); - - // Make sure the correct events were logged. - std::vector<base::Bucket> buckets = - histogram_tester.GetAllSamples("PaymentRequest.Events"); - ASSERT_EQ(1U, buckets.size()); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_SHOWN); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_PAY_CLICKED); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_RECEIVED_INSTRUMENT_DETAILS); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAD_INITIAL_FORM_OF_PAYMENT); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAD_NECESSARY_COMPLETE_SUGGESTIONS); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_COMPLETED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_OTHER_ABORTED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_SKIPPED_SHOW); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_USER_ABORTED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_SHIPPING); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_TRUE); - EXPECT_TRUE(buckets[0].min & - JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_FALSE); -} - -IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentMetricsTest, - UserAborted_TabClose) { - NavigateTo("/payment_request_can_make_payment_metrics_test.html"); - base::HistogramTester histogram_tester; - - CheckPaymentSupportAndThenShow(); - - // Simulate that the user closes the tab containing the Payment Request. - ResetEventWaiterForSequence({DialogEvent::DIALOG_CLOSED}); - chrome::CloseTab(browser()); - WaitForObservedEvent(); - - // Make sure the correct events were logged. - std::vector<base::Bucket> buckets = - histogram_tester.GetAllSamples("PaymentRequest.Events"); - ASSERT_EQ(1U, buckets.size()); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_SHOWN); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_PAY_CLICKED); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_RECEIVED_INSTRUMENT_DETAILS); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAD_INITIAL_FORM_OF_PAYMENT); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAD_NECESSARY_COMPLETE_SUGGESTIONS); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_COMPLETED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_OTHER_ABORTED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_SKIPPED_SHOW); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_USER_ABORTED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_SHIPPING); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_TRUE); - EXPECT_TRUE(buckets[0].min & - JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_FALSE); -} - -IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentMetricsTest, - UserAborted_Reload) { - NavigateTo("/payment_request_can_make_payment_metrics_test.html"); - base::HistogramTester histogram_tester; - - CheckPaymentSupportAndThenShow(); - - // Simulate that the user reloads the page containing the Payment Request. - ResetEventWaiterForSequence({DialogEvent::DIALOG_CLOSED}); - chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB); - WaitForObservedEvent(); - - // Make sure the correct events were logged. - std::vector<base::Bucket> buckets = - histogram_tester.GetAllSamples("PaymentRequest.Events"); - ASSERT_EQ(1U, buckets.size()); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_SHOWN); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_PAY_CLICKED); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_RECEIVED_INSTRUMENT_DETAILS); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAD_INITIAL_FORM_OF_PAYMENT); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAD_NECESSARY_COMPLETE_SUGGESTIONS); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_COMPLETED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_OTHER_ABORTED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_SKIPPED_SHOW); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_USER_ABORTED); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_SHIPPING); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_NAME); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_PHONE); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_REQUEST_PAYER_EMAIL); - EXPECT_TRUE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_TRUE); - EXPECT_FALSE(buckets[0].min & JourneyLogger::EVENT_CAN_MAKE_PAYMENT_FALSE); - EXPECT_FALSE(buckets[0].min & - JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_TRUE); - EXPECT_TRUE(buckets[0].min & - JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_FALSE); -} - -// The tests in this class correspond to the tests of the same name in -// PaymentRequestCanMakePaymentMetricsTest, with the basic-card being disabled. -// Parameterized tests are not used because the test setup for both tests are -// too different. -class PaymentRequestCanMakePaymentMetricsWithBasicCardDisabledTest - : public PaymentRequestCanMakePaymentMetricsTest { - public: - PaymentRequestCanMakePaymentMetricsWithBasicCardDisabledTest( - const PaymentRequestCanMakePaymentMetricsWithBasicCardDisabledTest&) = - delete; - PaymentRequestCanMakePaymentMetricsWithBasicCardDisabledTest& operator=( - const PaymentRequestCanMakePaymentMetricsWithBasicCardDisabledTest&) = - delete; - net::EmbeddedTestServer nickpay_server_; - - protected: - PaymentRequestCanMakePaymentMetricsWithBasicCardDisabledTest() - : nickpay_server_(net::EmbeddedTestServer::TYPE_HTTPS) { - feature_list_.InitWithFeatures({}, {::features::kPaymentRequestBasicCard}); - } + PaymentRequestCanMakePaymentMetricsTest() + : nickpay_server_(net::EmbeddedTestServer::TYPE_HTTPS) {} void SetUpOnMainThread() override { PaymentRequestBrowserTestBase::SetUpOnMainThread(); @@ -817,13 +100,11 @@ base::RunLoop().RunUntilIdle(); } - private: - base::test::ScopedFeatureList feature_list_; + net::EmbeddedTestServer nickpay_server_; }; -IN_PROC_BROWSER_TEST_F( - PaymentRequestCanMakePaymentMetricsWithBasicCardDisabledTest, - Called_True_NotShown) { +IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentMetricsTest, + Called_True_NotShown) { NavigateTo("a.com", "/payment_handler_installer.html"); base::HistogramTester histogram_tester; @@ -873,9 +154,8 @@ JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_FALSE); } -IN_PROC_BROWSER_TEST_F( - PaymentRequestCanMakePaymentMetricsWithBasicCardDisabledTest, - Called_False_NotShown) { +IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentMetricsTest, + Called_False_NotShown) { NavigateTo("/payment_request_can_make_payment_metrics_test.html"); base::HistogramTester histogram_tester; @@ -920,9 +200,8 @@ JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_FALSE); } -IN_PROC_BROWSER_TEST_F( - PaymentRequestCanMakePaymentMetricsWithBasicCardDisabledTest, - Called_False_Shown_Completed) { +IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentMetricsTest, + Called_False_Shown_Completed) { NavigateTo("/payment_request_can_make_payment_metrics_test.html"); base::HistogramTester histogram_tester; @@ -983,9 +262,8 @@ JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_FALSE); } -IN_PROC_BROWSER_TEST_F( - PaymentRequestCanMakePaymentMetricsWithBasicCardDisabledTest, - Called_False_Shown_OtherAborted) { +IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentMetricsTest, + Called_False_Shown_OtherAborted) { NavigateTo("/payment_request_can_make_payment_metrics_test.html"); base::HistogramTester histogram_tester; @@ -1051,9 +329,8 @@ JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_FALSE); } -IN_PROC_BROWSER_TEST_F( - PaymentRequestCanMakePaymentMetricsWithBasicCardDisabledTest, - Called_False_Shown_UserAborted) { +IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentMetricsTest, + Called_False_Shown_UserAborted) { NavigateTo("/payment_request_can_make_payment_metrics_test.html"); base::HistogramTester histogram_tester; @@ -1113,9 +390,8 @@ JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_FALSE); } -IN_PROC_BROWSER_TEST_F( - PaymentRequestCanMakePaymentMetricsWithBasicCardDisabledTest, - Called_True_Shown_Completed) { +IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentMetricsTest, + Called_True_Shown_Completed) { base::HistogramTester histogram_tester; std::string a_method_name; @@ -1165,9 +441,8 @@ JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_FALSE); } -IN_PROC_BROWSER_TEST_F( - PaymentRequestCanMakePaymentMetricsWithBasicCardDisabledTest, - Called_True_Shown_OtherAborted) { +IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentMetricsTest, + Called_True_Shown_OtherAborted) { base::HistogramTester histogram_tester; InstallTwoPaymentHandlersAndQueryShow(); @@ -1208,9 +483,8 @@ JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_FALSE); } -IN_PROC_BROWSER_TEST_F( - PaymentRequestCanMakePaymentMetricsWithBasicCardDisabledTest, - Called_True_Shown_UserAborted) { +IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentMetricsTest, + Called_True_Shown_UserAborted) { base::HistogramTester histogram_tester; InstallTwoPaymentHandlersAndQueryShow(); @@ -1245,9 +519,8 @@ JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_FALSE); } -IN_PROC_BROWSER_TEST_F( - PaymentRequestCanMakePaymentMetricsWithBasicCardDisabledTest, - NotCalled_Shown_Completed) { +IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentMetricsTest, + NotCalled_Shown_Completed) { base::HistogramTester histogram_tester; InstallTwoPaymentHandlersAndNoQueryShow(); @@ -1284,9 +557,8 @@ JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_FALSE); } -IN_PROC_BROWSER_TEST_F( - PaymentRequestCanMakePaymentMetricsWithBasicCardDisabledTest, - NotCalled_Shown_OtherAborted) { +IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentMetricsTest, + NotCalled_Shown_OtherAborted) { base::HistogramTester histogram_tester; InstallTwoPaymentHandlersAndNoQueryShow(); @@ -1327,9 +599,8 @@ JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_FALSE); } -IN_PROC_BROWSER_TEST_F( - PaymentRequestCanMakePaymentMetricsWithBasicCardDisabledTest, - NotCalled_Shown_UserAborted) { +IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentMetricsTest, + NotCalled_Shown_UserAborted) { base::HistogramTester histogram_tester; InstallTwoPaymentHandlersAndNoQueryShow(); @@ -1364,9 +635,8 @@ JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_FALSE); } -IN_PROC_BROWSER_TEST_F( - PaymentRequestCanMakePaymentMetricsWithBasicCardDisabledTest, - UserAborted_NavigationToDifferentOrigin) { +IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentMetricsTest, + UserAborted_NavigationToDifferentOrigin) { base::HistogramTester histogram_tester; InstallTwoPaymentHandlersAndQueryShow(); @@ -1406,9 +676,8 @@ JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_FALSE); } -IN_PROC_BROWSER_TEST_F( - PaymentRequestCanMakePaymentMetricsWithBasicCardDisabledTest, - UserAborted_NavigationToSameOrigin) { +IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentMetricsTest, + UserAborted_NavigationToSameOrigin) { base::HistogramTester histogram_tester; InstallTwoPaymentHandlersAndQueryShow(); @@ -1447,9 +716,8 @@ JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_FALSE); } -IN_PROC_BROWSER_TEST_F( - PaymentRequestCanMakePaymentMetricsWithBasicCardDisabledTest, - UserAborted_Reload) { +IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentMetricsTest, + UserAborted_Reload) { base::HistogramTester histogram_tester; InstallTwoPaymentHandlersAndQueryShow(); @@ -1487,9 +755,8 @@ JourneyLogger::EVENT_HAS_ENROLLED_INSTRUMENT_FALSE); } -IN_PROC_BROWSER_TEST_F( - PaymentRequestCanMakePaymentMetricsWithBasicCardDisabledTest, - UserAborted_TabClose) { +IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentMetricsTest, + UserAborted_TabClose) { base::HistogramTester histogram_tester; InstallTwoPaymentHandlersAndQueryShow();
diff --git a/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc b/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc index 85c8073..d30f7cb 100644 --- a/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc +++ b/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc
@@ -187,7 +187,7 @@ autofill::CountryComboboxModel* country_model = static_cast<autofill::CountryComboboxModel*>( country_combobox->GetModel()); - int i = 0; + size_t i = 0; for (; i < country_model->GetItemCount(); i++) { if (country_model->GetItemAt(i) == country_name) break; @@ -390,11 +390,11 @@ static_cast<autofill::RegionComboboxModel*>( region_combobox->GetModel()); if (use_regions1) { - ASSERT_EQ(2, region_model->GetItemCount()); + ASSERT_EQ(2u, region_model->GetItemCount()); EXPECT_EQ(u"---", region_model->GetItemAt(0)); EXPECT_EQ(u"region1a", region_model->GetItemAt(1)); } else { - ASSERT_EQ(3, region_model->GetItemCount()); + ASSERT_EQ(3u, region_model->GetItemCount()); EXPECT_EQ(u"---", region_model->GetItemAt(0)); EXPECT_EQ(u"region2a", region_model->GetItemAt(1)); EXPECT_EQ(u"region2b", region_model->GetItemAt(2));
diff --git a/chrome/browser/ui/views/side_panel/lens/lens_side_panel_coordinator.cc b/chrome/browser/ui/views/side_panel/lens/lens_side_panel_coordinator.cc index 5100e4f..1cf25d7 100644 --- a/chrome/browser/ui/views/side_panel/lens/lens_side_panel_coordinator.cc +++ b/chrome/browser/ui/views/side_panel/lens/lens_side_panel_coordinator.cc
@@ -9,6 +9,7 @@ #include "base/metrics/user_metrics.h" #include "base/metrics/user_metrics_action.h" #include "base/scoped_observation.h" +#include "chrome/app/vector_icons/vector_icons.h" #include "chrome/browser/ui/ui_features.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/side_panel/lens/lens_unified_side_panel_view.h" @@ -38,7 +39,7 @@ ->side_panel_coordinator() ->RemoveSidePanelViewStateObserver(this); } -}; +} void LensSidePanelCoordinator::OnSidePanelDidClose() { lens_side_panel_view_ = nullptr; @@ -79,9 +80,7 @@ auto entry = std::make_unique<SidePanelEntry>( SidePanelEntry::Id::kLens, l10n_util::GetStringUTF16(IDS_SIDE_PANEL_COMBO_BOX_GOOGLE_LENS_LABEL), - // leaving the star icon for this CL, will change this to lens icon in a - // different CL. - ui::ImageModel::FromVectorIcon(omnibox::kStarIcon, ui::kColorIcon), + ui::ImageModel::FromVectorIcon(kGoogleLensLogoIcon, ui::kColorIcon), base::BindRepeating(&LensSidePanelCoordinator::CreateLensWebView, base::Unretained(this), params)); entry->AddObserver(this);
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.cc index c95b731..a71e29d 100644 --- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.cc +++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.cc
@@ -42,7 +42,7 @@ observers_.RemoveObserver(obs); } -void ReadAnythingModel::SetSelectedFontByIndex(int new_index) { +void ReadAnythingModel::SetSelectedFontByIndex(size_t new_index) { // Check that the index is valid. DCHECK(font_model_->IsValidFontIndex(new_index)); @@ -114,38 +114,38 @@ base::UTF8ToUTF16(font_name)) != font_choices_.end(); } -bool ReadAnythingFontModel::IsValidFontIndex(int index) { - return index >= 0 && index <= GetItemCount(); +bool ReadAnythingFontModel::IsValidFontIndex(size_t index) { + return index < GetItemCount(); } void ReadAnythingFontModel::SetDefaultIndexFromPrefsFontName( std::string prefs_font_name) { auto it = std::find(font_choices_.begin(), font_choices_.end(), base::UTF8ToUTF16(prefs_font_name)); - default_index_ = it - font_choices_.begin(); + default_index_ = static_cast<size_t>(it - font_choices_.begin()); } absl::optional<size_t> ReadAnythingFontModel::GetDefaultIndex() const { return default_index_; } -int ReadAnythingFontModel::GetItemCount() const { +size_t ReadAnythingFontModel::GetItemCount() const { return font_choices_.size(); } -std::u16string ReadAnythingFontModel::GetItemAt(int index) const { +std::u16string ReadAnythingFontModel::GetItemAt(size_t index) const { // TODO(1266555): Placeholder text, replace when finalized. return u"Default font"; } -std::u16string ReadAnythingFontModel::GetDropDownTextAt(int index) const { - DCHECK(index >= 0 && index < GetItemCount()); - return font_choices_.at(index); +std::u16string ReadAnythingFontModel::GetDropDownTextAt(size_t index) const { + DCHECK_LT(index, GetItemCount()); + return font_choices_[index]; } -std::string ReadAnythingFontModel::GetFontNameAt(int index) { - DCHECK(index >= 0 && index < GetItemCount()); - return base::UTF16ToUTF8(font_choices_.at(index)); +std::string ReadAnythingFontModel::GetFontNameAt(size_t index) { + DCHECK_LT(index, GetItemCount()); + return base::UTF16ToUTF8(font_choices_[index]); } // This method uses the text from the drop down at |index| and creates the @@ -155,7 +155,7 @@ // the chosen font does not work for some reason. // E.g. User chooses 'Roboto', this method returns 'Roboto, Arial, 18px'. // TODO(1266555): Finalize font choices and approach with UI/UX. -std::string ReadAnythingFontModel::GetLabelFontListAt(int index) { +std::string ReadAnythingFontModel::GetLabelFontListAt(size_t index) { std::string font_label = base::UTF16ToUTF8(GetDropDownTextAt(index)); base::StringAppendF(&font_label, "%s", ", Arial, 18px"); return font_label;
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.h b/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.h index bfcd1a1..e006890 100644 --- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.h +++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.h
@@ -30,25 +30,25 @@ ReadAnythingFontModel& operator=(const ReadAnythingFontModel&) = delete; ~ReadAnythingFontModel() override; - std::string GetFontNameAt(int index); + std::string GetFontNameAt(size_t index); bool IsValidFontName(const std::string& font_name); - bool IsValidFontIndex(int index); + bool IsValidFontIndex(size_t index); void SetDefaultIndexFromPrefsFontName(std::string prefs_font_name); - std::string GetLabelFontListAt(int index); + std::string GetLabelFontListAt(size_t index); protected: // ui::Combobox implementation: absl::optional<size_t> GetDefaultIndex() const override; - int GetItemCount() const override; - std::u16string GetItemAt(int index) const override; - std::u16string GetDropDownTextAt(int index) const override; + size_t GetItemCount() const override; + std::u16string GetItemAt(size_t index) const override; + std::u16string GetDropDownTextAt(size_t index) const override; private: // Styled font names for the drop down options in front-end. std::vector<std::u16string> font_choices_; // Default index for drop down, either zero or populated from prefs. - int default_index_ = 0; + size_t default_index_ = 0; }; /////////////////////////////////////////////////////////////////////////////// @@ -82,7 +82,7 @@ void SetDistilledAXTree(ui::AXTreeUpdate snapshot, std::vector<ui::AXNodeID> content_node_ids); - void SetSelectedFontByIndex(int new_index); + void SetSelectedFontByIndex(size_t new_index); void DecreaseTextSize(); void IncreaseTextSize();
diff --git a/chrome/browser/ui/views/side_panel/side_panel_combobox_model.cc b/chrome/browser/ui/views/side_panel/side_panel_combobox_model.cc index 14b78a4..666fe7d3 100644 --- a/chrome/browser/ui/views/side_panel/side_panel_combobox_model.cc +++ b/chrome/browser/ui/views/side_panel/side_panel_combobox_model.cc
@@ -73,14 +73,14 @@ return 0; } -int SidePanelComboboxModel::GetItemCount() const { +size_t SidePanelComboboxModel::GetItemCount() const { return entries_.size(); } -std::u16string SidePanelComboboxModel::GetItemAt(int index) const { +std::u16string SidePanelComboboxModel::GetItemAt(size_t index) const { return entries_[index].text; } -ui::ImageModel SidePanelComboboxModel::GetIconAt(int index) const { +ui::ImageModel SidePanelComboboxModel::GetIconAt(size_t index) const { return entries_[index].icon; }
diff --git a/chrome/browser/ui/views/side_panel/side_panel_combobox_model.h b/chrome/browser/ui/views/side_panel/side_panel_combobox_model.h index b527193f..da0017f 100644 --- a/chrome/browser/ui/views/side_panel/side_panel_combobox_model.h +++ b/chrome/browser/ui/views/side_panel/side_panel_combobox_model.h
@@ -48,9 +48,9 @@ int GetIndexForId(SidePanelEntry::Id id); // ui::ComboboxModel: - int GetItemCount() const override; - std::u16string GetItemAt(int index) const override; - ui::ImageModel GetIconAt(int index) const override; + size_t GetItemCount() const override; + std::u16string GetItemAt(size_t index) const override; + ui::ImageModel GetIconAt(size_t index) const override; private: std::vector<Item> entries_;
diff --git a/chrome/browser/ui/views/side_search/unified_side_search_controller.cc b/chrome/browser/ui/views/side_search/unified_side_search_controller.cc index c9b8473..19a7b7d3 100644 --- a/chrome/browser/ui/views/side_search/unified_side_search_controller.cc +++ b/chrome/browser/ui/views/side_search/unified_side_search_controller.cc
@@ -119,6 +119,13 @@ if (browser_view) { browser_view->side_panel_coordinator()->Show( SidePanelEntry::Id::kSideSearch); + auto* active_contents = browser_view->GetActiveWebContents(); + if (active_contents) { + auto* helper = + SideSearchTabContentsHelper::FromWebContents(active_contents); + if (helper) + helper->MaybeRecordDurationSidePanelAvailableToFirstOpen(); + } } UpdateSidePanel(); } @@ -193,11 +200,15 @@ base::Unretained(this))); entry->AddObserver(this); registry->Register(std::move(entry)); + RecordSideSearchAvailabilityChanged( + SideSearchAvailabilityChangeType::kBecomeAvailable); } if (current_entry && !is_available) { current_entry->RemoveObserver(this); registry->Deregister(SidePanelEntry::Id::kSideSearch); + RecordSideSearchAvailabilityChanged( + SideSearchAvailabilityChangeType::kBecomeUnavailable); } }
diff --git a/chrome/browser/ui/views/toolbar/chrome_labs_item_view.cc b/chrome/browser/ui/views/toolbar/chrome_labs_item_view.cc index 961de8b..cdf0121 100644 --- a/chrome/browser/ui/views/toolbar/chrome_labs_item_view.cc +++ b/chrome/browser/ui/views/toolbar/chrome_labs_item_view.cc
@@ -51,20 +51,20 @@ public: explicit LabsComboboxModel(const LabInfo& lab, const flags_ui::FeatureEntry* feature_entry, - int default_index) + size_t default_index) : lab_(lab), feature_entry_(feature_entry), default_index_(default_index) {} // ui::ComboboxModel: - int GetItemCount() const override { return feature_entry_->NumOptions(); } + size_t GetItemCount() const override { return feature_entry_->NumOptions(); } // The order in which these descriptions are returned is the same in // flags_ui::FeatureEntry::DescriptionForOption(..). If there are changes to // this, the same changes must be made in // flags_ui::FeatureEntry::DescriptionForOption(..). - std::u16string GetItemAt(int index) const override { - DCHECK_LT(index, feature_entry_->NumOptions()); + std::u16string GetItemAt(size_t index) const override { + DCHECK_LT(index, static_cast<size_t>(feature_entry_->NumOptions())); int description_translation_id = IDS_CHROMELABS_DEFAULT; if (feature_entry_->type == flags_ui::FeatureEntry::FEATURE_WITH_PARAMS_VALUE) { @@ -72,14 +72,14 @@ description_translation_id = IDS_CHROMELABS_DEFAULT; } else if (index == 1) { description_translation_id = IDS_CHROMELABS_ENABLED; - } else if (index < feature_entry_->NumOptions() - 1) { + } else if (index + 1 < + static_cast<size_t>(feature_entry_->NumOptions())) { // First two options do not have variations params. - int variation_index = index - 2; + size_t variation_index = index - 2; return l10n_util::GetStringFUTF16( IDS_CHROMELABS_ENABLED_WITH_VARIATION_NAME, lab_.translated_feature_variation_descriptions[variation_index]); } else { - DCHECK_EQ(feature_entry_->NumOptions() - 1, index); description_translation_id = IDS_CHROMELABS_DISABLED; } } else { @@ -100,7 +100,7 @@ private: const LabInfo& lab_; raw_ptr<const flags_ui::FeatureEntry> feature_entry_; - int default_index_; + size_t default_index_; }; ChromeLabsItemView::ChromeLabsItemView( @@ -156,7 +156,8 @@ experiment_name_->GetViewAccessibility().OverrideIsIgnored(true); experiment_description->GetViewAccessibility().OverrideIsIgnored(true); GetViewAccessibility().OverrideRole(ax::mojom::Role::kGroup); - GetViewAccessibility().OverrideName(lab.visible_name); + if (!lab.visible_name.empty()) + GetViewAccessibility().OverrideName(lab.visible_name); // There is currently a MacOS VoiceOver screen reader bug where VoiceOver does // not announce the accessible description for groups (crbug.com/1197159). The @@ -170,7 +171,8 @@ // when VoiceOver bug is fixed. #if !BUILDFLAG(IS_MAC) - GetViewAccessibility().OverrideDescription(lab.visible_description); + if (!lab.visible_description.empty()) + GetViewAccessibility().OverrideDescription(lab.visible_description); #endif AddChildView(
diff --git a/chrome/browser/ui/views/uninstall_view.cc b/chrome/browser/ui/views/uninstall_view.cc index dfe147e..43f465d2 100644 --- a/chrome/browser/ui/views/uninstall_view.cc +++ b/chrome/browser/ui/views/uninstall_view.cc
@@ -139,13 +139,13 @@ user_selection_ = chrome::RESULT_CODE_UNINSTALL_USER_CANCEL; } -int UninstallView::GetItemCount() const { +size_t UninstallView::GetItemCount() const { DCHECK(!browsers_->empty()); return browsers_->size(); } -std::u16string UninstallView::GetItemAt(int index) const { - DCHECK_LT(index, static_cast<int>(browsers_->size())); +std::u16string UninstallView::GetItemAt(size_t index) const { + DCHECK_LT(index, browsers_->size()); BrowsersMap::const_iterator i = browsers_->begin(); std::advance(i, index); return base::WideToUTF16(i->first);
diff --git a/chrome/browser/ui/views/uninstall_view.h b/chrome/browser/ui/views/uninstall_view.h index ec5089c..3ffe15c 100644 --- a/chrome/browser/ui/views/uninstall_view.h +++ b/chrome/browser/ui/views/uninstall_view.h
@@ -33,8 +33,8 @@ ~UninstallView() override; // Overridden from ui::ComboboxModel: - int GetItemCount() const override; - std::u16string GetItemAt(int index) const override; + size_t GetItemCount() const override; + std::u16string GetItemAt(size_t index) const override; private: typedef std::map<std::wstring, std::wstring> BrowsersMap;
diff --git a/chrome/browser/ui/web_applications/file_stream_data_pipe_getter_unittest.cc b/chrome/browser/ui/web_applications/file_stream_data_pipe_getter_unittest.cc index 69420f2f..d9225eb 100644 --- a/chrome/browser/ui/web_applications/file_stream_data_pipe_getter_unittest.cc +++ b/chrome/browser/ui/web_applications/file_stream_data_pipe_getter_unittest.cc
@@ -24,6 +24,9 @@ #include "storage/browser/file_system/open_file_system_mode.h" #include "storage/browser/quota/quota_manager_proxy.h" #include "storage/browser/test/async_file_test_helper.h" +#include "storage/browser/test/mock_quota_manager.h" +#include "storage/browser/test/mock_quota_manager_proxy.h" +#include "storage/browser/test/mock_special_storage_policy.h" #include "storage/browser/test/test_file_system_context.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/storage_key/storage_key.h" @@ -85,8 +88,14 @@ void SetUp() override { ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); + base::FilePath temp_path = temp_dir_.GetPath(); + quota_manager_ = base::MakeRefCounted<storage::MockQuotaManager>( + /*is_incognito=*/false, temp_path, base::ThreadTaskRunnerHandle::Get(), + base::MakeRefCounted<storage::MockSpecialStoragePolicy>()); + quota_manager_proxy_ = base::MakeRefCounted<storage::MockQuotaManagerProxy>( + quota_manager_.get(), base::ThreadTaskRunnerHandle::Get()); file_system_context_ = storage::CreateFileSystemContextForTesting( - /*quota_manager_proxy=*/nullptr, temp_dir_.GetPath()); + quota_manager_proxy_.get(), temp_path); base::RunLoop run_loop; file_system_context_->OpenFileSystem( blink::StorageKey::CreateFromStringForTesting(kURLOrigin), @@ -159,6 +168,8 @@ const std::string test_data_; base::ScopedTempDir temp_dir_; + scoped_refptr<storage::MockQuotaManager> quota_manager_; + scoped_refptr<storage::MockQuotaManagerProxy> quota_manager_proxy_; scoped_refptr<storage::FileSystemContext> file_system_context_; };
diff --git a/chrome/browser/ui/webui/chromeos/in_session_password_change/confirm_password_change_handler.cc b/chrome/browser/ui/webui/chromeos/in_session_password_change/confirm_password_change_handler.cc index d0b148d..4fa9821d 100644 --- a/chrome/browser/ui/webui/chromeos/in_session_password_change/confirm_password_change_handler.cc +++ b/chrome/browser/ui/webui/chromeos/in_session_password_change/confirm_password_change_handler.cc
@@ -6,7 +6,7 @@ #include <string> -#include "ash/components/login/auth/saml_password_attributes.h" +#include "ash/components/login/auth/public/saml_password_attributes.h" #include "base/check.h" #include "base/values.h" #include "chrome/browser/ash/login/saml/in_session_password_change_manager.h"
diff --git a/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_reauth_handler.cc b/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_reauth_handler.cc index 84453bc..b1e3aa7b 100644 --- a/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_reauth_handler.cc +++ b/chrome/browser/ui/webui/chromeos/in_session_password_change/lock_screen_reauth_handler.cc
@@ -7,7 +7,7 @@ #include <memory> #include "ash/components/login/auth/challenge_response/cert_utils.h" -#include "ash/components/login/auth/cryptohome_key_constants.h" +#include "ash/components/login/auth/public/cryptohome_key_constants.h" #include "ash/constants/ash_features.h" #include "base/notreached.h" #include "chrome/browser/ash/login/saml/in_session_password_sync_manager.h"
diff --git a/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_handler.cc b/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_handler.cc index 9b09505..07013a3 100644 --- a/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_handler.cc +++ b/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_handler.cc
@@ -6,7 +6,7 @@ #include <string> -#include "ash/components/login/auth/saml_password_attributes.h" +#include "ash/components/login/auth/public/saml_password_attributes.h" #include "base/logging.h" #include "base/values.h" #include "chrome/browser/ash/login/auth/chrome_cryptohome_authenticator.h"
diff --git a/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_ui.cc b/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_ui.cc index e6d6433b..b5715d79 100644 --- a/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_ui.cc +++ b/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_ui.cc
@@ -6,7 +6,7 @@ #include <memory> -#include "ash/components/login/auth/saml_password_attributes.h" +#include "ash/components/login/auth/public/saml_password_attributes.h" #include "ash/constants/ash_switches.h" #include "base/bind.h" #include "base/command_line.h"
diff --git a/chrome/browser/ui/webui/chromeos/in_session_password_change/urgent_password_expiry_notification_handler.cc b/chrome/browser/ui/webui/chromeos/in_session_password_change/urgent_password_expiry_notification_handler.cc index dcea39e..718077b 100644 --- a/chrome/browser/ui/webui/chromeos/in_session_password_change/urgent_password_expiry_notification_handler.cc +++ b/chrome/browser/ui/webui/chromeos/in_session_password_change/urgent_password_expiry_notification_handler.cc
@@ -6,7 +6,7 @@ #include <string> -#include "ash/components/login/auth/saml_password_attributes.h" +#include "ash/components/login/auth/public/saml_password_attributes.h" #include "base/values.h" #include "chrome/browser/ash/login/saml/in_session_password_change_manager.h" #include "chrome/browser/ash/login/saml/password_expiry_notification.h"
diff --git a/chrome/browser/ui/webui/chromeos/login/check_passwords_against_cryptohome_helper.cc b/chrome/browser/ui/webui/chromeos/login/check_passwords_against_cryptohome_helper.cc index de39434..322f5837 100644 --- a/chrome/browser/ui/webui/chromeos/login/check_passwords_against_cryptohome_helper.cc +++ b/chrome/browser/ui/webui/chromeos/login/check_passwords_against_cryptohome_helper.cc
@@ -6,9 +6,9 @@ #include "ash/components/login/auth/auth_status_consumer.h" #include "ash/components/login/auth/cryptohome_authenticator.h" -#include "ash/components/login/auth/cryptohome_key_constants.h" #include "ash/components/login/auth/extended_authenticator.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/cryptohome_key_constants.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/constants/ash_features.h" #include "base/values.h"
diff --git a/chrome/browser/ui/webui/chromeos/login/check_passwords_against_cryptohome_helper.h b/chrome/browser/ui/webui/chromeos/login/check_passwords_against_cryptohome_helper.h index 9ebf706..a4a03c9 100644 --- a/chrome/browser/ui/webui/chromeos/login/check_passwords_against_cryptohome_helper.h +++ b/chrome/browser/ui/webui/chromeos/login/check_passwords_against_cryptohome_helper.h
@@ -7,7 +7,7 @@ #include "ash/components/login/auth/auth_status_consumer.h" #include "ash/components/login/auth/cryptohome_authenticator.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "base/values.h" #include "components/login/base_screen_handler_utils.h"
diff --git a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc index b201623..dd5e5bb 100644 --- a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
@@ -10,10 +10,10 @@ #include <utility> #include "ash/components/login/auth/challenge_response/cert_utils.h" -#include "ash/components/login/auth/cryptohome_key_constants.h" -#include "ash/components/login/auth/saml_password_attributes.h" -#include "ash/components/login/auth/sync_trusted_vault_keys.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/cryptohome_key_constants.h" +#include "ash/components/login/auth/public/saml_password_attributes.h" +#include "ash/components/login/auth/public/sync_trusted_vault_keys.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/components/settings/cros_settings_names.h" #include "ash/constants/ash_features.h" #include "ash/constants/ash_switches.h"
diff --git a/chrome/browser/ui/webui/chromeos/login/online_login_helper.cc b/chrome/browser/ui/webui/chromeos/login/online_login_helper.cc index e37a58b3..64a291bc 100644 --- a/chrome/browser/ui/webui/chromeos/login/online_login_helper.cc +++ b/chrome/browser/ui/webui/chromeos/login/online_login_helper.cc
@@ -5,7 +5,7 @@ #include "chrome/browser/ui/webui/chromeos/login/online_login_helper.h" #include "ash/components/login/auth/challenge_response/cert_utils.h" -#include "ash/components/login/auth/cryptohome_key_constants.h" +#include "ash/components/login/auth/public/cryptohome_key_constants.h" #include "chrome/browser/ash/login/signin_partition_manager.h" #include "chrome/browser/ash/login/ui/login_display_host_webui.h" #include "chrome/browser/ash/login/ui/signin_ui.h"
diff --git a/chrome/browser/ui/webui/chromeos/login/online_login_helper.h b/chrome/browser/ui/webui/chromeos/login/online_login_helper.h index 39971173..bf0b70b4 100644 --- a/chrome/browser/ui/webui/chromeos/login/online_login_helper.h +++ b/chrome/browser/ui/webui/chromeos/login/online_login_helper.h
@@ -10,9 +10,9 @@ #include "ash/components/login/auth/cryptohome_authenticator.h" // TODO(https://crbug.com/1164001): move to forward declaration -#include "ash/components/login/auth/sync_trusted_vault_keys.h" +#include "ash/components/login/auth/public/sync_trusted_vault_keys.h" // TODO(https://crbug.com/1164001): move to forward declaration -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/user_context.h" #include "chrome/browser/ash/login/login_client_cert_usage_observer.h" #include "chrome/browser/ash/login/signin_partition_manager.h" #include "chrome/browser/ash/login/ui/login_display_host.h"
diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc index c0b74d3..7d60aa01 100644 --- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
@@ -11,8 +11,8 @@ #include <utility> #include <vector> -#include "ash/components/login/auth/key.h" -#include "ash/components/login/auth/user_context.h" +#include "ash/components/login/auth/public/key.h" +#include "ash/components/login/auth/public/user_context.h" #include "ash/components/proximity_auth/screenlock_bridge.h" #include "ash/constants/ash_features.h" #include "ash/public/mojom/tray_action.mojom.h"
diff --git a/chrome/browser/ui/webui/chromeos/login/theme_selection_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/theme_selection_screen_handler.cc index 49e9d60..f15523f 100644 --- a/chrome/browser/ui/webui/chromeos/login/theme_selection_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/theme_selection_screen_handler.cc
@@ -13,6 +13,10 @@ namespace chromeos { +namespace { +constexpr char kSelectedTheme[] = "selectedTheme"; +} + constexpr StaticOobeScreenId ThemeSelectionScreenView::kScreenId; ThemeSelectionScreenHandler::ThemeSelectionScreenHandler() @@ -20,8 +24,10 @@ ThemeSelectionScreenHandler::~ThemeSelectionScreenHandler() = default; -void ThemeSelectionScreenHandler::Show() { - ShowInWebUI(); +void ThemeSelectionScreenHandler::Show(const std::string& mode) { + base::Value::Dict data; + data.Set(kSelectedTheme, mode); + ShowInWebUI(std::move(data)); } void ThemeSelectionScreenHandler::DeclareLocalizedValues(
diff --git a/chrome/browser/ui/webui/chromeos/login/theme_selection_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/theme_selection_screen_handler.h index 59a282a..36e18bd 100644 --- a/chrome/browser/ui/webui/chromeos/login/theme_selection_screen_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/theme_selection_screen_handler.h
@@ -24,9 +24,13 @@ constexpr static StaticOobeScreenId kScreenId{"theme-selection", "ThemeSelectionScreen"}; + inline constexpr static char kAutoMode[] = "auto"; + inline constexpr static char kDarkMode[] = "dark"; + inline constexpr static char kLightMode[] = "light"; + virtual ~ThemeSelectionScreenView() = default; - virtual void Show() = 0; + virtual void Show(const std::string& mode) = 0; }; class ThemeSelectionScreenHandler : public ThemeSelectionScreenView, @@ -43,7 +47,7 @@ ~ThemeSelectionScreenHandler() override; // ThemeSelectionScreenView implementation - void Show() override; + void Show(const std::string& mode) override; // BaseScreenHandler implementation void DeclareLocalizedValues(
diff --git a/chrome/browser/web_applications/user_uninstalled_preinstalled_web_app_prefs_browsertest.cc b/chrome/browser/web_applications/user_uninstalled_preinstalled_web_app_prefs_browsertest.cc index c533b9c..5c01e4e 100644 --- a/chrome/browser/web_applications/user_uninstalled_preinstalled_web_app_prefs_browsertest.cc +++ b/chrome/browser/web_applications/user_uninstalled_preinstalled_web_app_prefs_browsertest.cc
@@ -11,7 +11,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/web_applications/web_app_controller_browsertest.h" -#include "chrome/browser/web_applications/test/fake_web_app_provider.h" +#include "chrome/browser/web_applications/preinstalled_web_app_manager.h" #include "chrome/browser/web_applications/test/web_app_install_test_utils.h" #include "chrome/browser/web_applications/web_app.h" #include "chrome/browser/web_applications/web_app_constants.h" @@ -23,8 +23,17 @@ namespace web_app { -using UserUninstalledPreinstalledWebAppPrefsBrowserTest = - WebAppControllerBrowserTest; +class UserUninstalledPreinstalledWebAppPrefsBrowserTest + : public WebAppControllerBrowserTest { + public: + UserUninstalledPreinstalledWebAppPrefsBrowserTest() = default; + ~UserUninstalledPreinstalledWebAppPrefsBrowserTest() override = default; + + void SetUp() override { + PreinstalledWebAppManager::SkipStartupForTesting(); + WebAppControllerBrowserTest::SetUp(); + } +}; IN_PROC_BROWSER_TEST_F(UserUninstalledPreinstalledWebAppPrefsBrowserTest, BasicOperations) { @@ -103,9 +112,8 @@ EXPECT_EQ(absl::nullopt, preinstalled_prefs.LookUpAppIdByInstallUrl(url2)); } -// TODO(crbug.com/1341391): Flakily crashes on Mac, Windows, Chrome OS, Linux. IN_PROC_BROWSER_TEST_F(UserUninstalledPreinstalledWebAppPrefsBrowserTest, - DISABLED_PrefsPropagateProperlyOnDefaultUninstall) { + PrefsPropagateProperlyOnDefaultUninstall) { auto app_info1 = std::make_unique<WebAppInstallInfo>(); app_info1->start_url = GURL("https://example_url1.com/"); app_info1->title = u"Example App1"; @@ -121,7 +129,7 @@ AppId app_id2 = test::InstallWebApp(profile(), std::move(app_info2), /*overwrite_existing_manifest_fields=*/false, - webapps::WebappInstallSource::ARC); + webapps::WebappInstallSource::OMNIBOX_INSTALL_ICON); // Verify that the prefs aren't filled just on installation. UserUninstalledPreinstalledWebAppPrefs preinstalled_prefs(
diff --git a/chrome/browser/webauthn/cablev2_devices.cc b/chrome/browser/webauthn/cablev2_devices.cc index 861bb19..91e7183 100644 --- a/chrome/browser/webauthn/cablev2_devices.cc +++ b/chrome/browser/webauthn/cablev2_devices.cc
@@ -104,15 +104,15 @@ // DeletePairingByPublicKey erases any pairing with the given public key // from `list`. -void DeletePairingByPublicKey(base::Value* list, +void DeletePairingByPublicKey(base::Value::List& list, const std::string& public_key_base64) { - list->EraseListValueIf([&public_key_base64](const auto& value) { + list.EraseIf([&public_key_base64](const auto& value) { if (!value.is_dict()) { return false; } - const base::Value* pref_public_key = value.FindKey(kPairingPrefPublicKey); - return pref_public_key && pref_public_key->is_string() && - pref_public_key->GetString() == public_key_base64; + const std::string* pref_public_key = + value.GetDict().FindString(kPairingPrefPublicKey); + return pref_public_key && *pref_public_key == public_key_base64; }); } @@ -222,19 +222,18 @@ continue; } + const base::Value::Dict& dict = pairing.GetDict(); auto out_pairing = std::make_unique<Pairing>(); - if (!CopyString(&out_pairing->name, - pairing.FindStringKey(kPairingPrefName)) || + if (!CopyString(&out_pairing->name, dict.FindString(kPairingPrefName)) || !CopyString(&out_pairing->tunnel_server_domain, - pairing.FindStringKey(kPairingPrefTunnelServer)) || + dict.FindString(kPairingPrefTunnelServer)) || !CopyBytestring(&out_pairing->contact_id, - pairing.FindStringKey(kPairingPrefContactId)) || - !CopyBytestring(&out_pairing->id, - pairing.FindStringKey(kPairingPrefId)) || + dict.FindString(kPairingPrefContactId)) || + !CopyBytestring(&out_pairing->id, dict.FindString(kPairingPrefId)) || !CopyBytestring(&out_pairing->secret, - pairing.FindStringKey(kPairingPrefSecret)) || + dict.FindString(kPairingPrefSecret)) || !CopyBytestring(&out_pairing->peer_public_key_x962, - pairing.FindStringKey(kPairingPrefPublicKey))) { + dict.FindString(kPairingPrefPublicKey))) { continue; } @@ -361,33 +360,30 @@ // key so it's not possible for an evil phone to displace another's pairing. std::string public_key_base64 = base::Base64Encode(pairing->peer_public_key_x962); - DeletePairingByPublicKey(update.Get(), public_key_base64); + DeletePairingByPublicKey(update->GetList(), public_key_base64); - base::Value dict(base::Value::Type::DICTIONARY); - dict.SetKey(kPairingPrefPublicKey, base::Value(std::move(public_key_base64))); - dict.SetKey(kPairingPrefTunnelServer, - base::Value(pairing->tunnel_server_domain)); + base::Value::Dict dict; + dict.Set(kPairingPrefPublicKey, std::move(public_key_base64)); + dict.Set(kPairingPrefTunnelServer, pairing->tunnel_server_domain); // `Names` is called without calling `MergeDevices` because that function will // discard linked entries with duplicate public keys, which can hide some // names that we would still like to avoid colliding with. - dict.SetKey(kPairingPrefName, - base::Value(FindUniqueName( - pairing->name, KnownDevices::FromProfile(profile)->Names()))); - dict.SetKey(kPairingPrefContactId, - base::Value(base::Base64Encode(pairing->contact_id))); - dict.SetKey(kPairingPrefId, base::Value(base::Base64Encode(pairing->id))); - dict.SetKey(kPairingPrefSecret, - base::Value(base::Base64Encode(pairing->secret))); + dict.Set(kPairingPrefName, + FindUniqueName(pairing->name, + KnownDevices::FromProfile(profile)->Names())); + dict.Set(kPairingPrefContactId, base::Base64Encode(pairing->contact_id)); + dict.Set(kPairingPrefId, base::Base64Encode(pairing->id)); + dict.Set(kPairingPrefSecret, base::Base64Encode(pairing->secret)); base::Time::Exploded now; base::Time::Now().UTCExplode(&now); - dict.SetKey(kPairingPrefTime, - // RFC 3339 time format. - base::Value(base::StringPrintf( - "%04d-%02d-%02dT%02d:%02d:%02dZ", now.year, now.month, - now.day_of_month, now.hour, now.minute, now.second))); + dict.Set( + kPairingPrefTime, + // RFC 3339 time format. + base::StringPrintf("%04d-%02d-%02dT%02d:%02d:%02dZ", now.year, now.month, + now.day_of_month, now.hour, now.minute, now.second)); - update->Append(std::move(dict)); + update->GetList().Append(std::move(dict)); } // DeletePairingByPublicKey erases any pairing with the given public key @@ -396,7 +392,7 @@ PrefService* pref_service, std::array<uint8_t, device::kP256X962Length> public_key) { ListPrefUpdate update(pref_service, kWebAuthnCablePairingsPrefName); - DeletePairingByPublicKey(update.Get(), base::Base64Encode(public_key)); + DeletePairingByPublicKey(update->GetList(), base::Base64Encode(public_key)); } bool RenamePairing( @@ -408,16 +404,16 @@ const std::string public_key_base64 = base::Base64Encode(public_key); ListPrefUpdate update(pref_service, kWebAuthnCablePairingsPrefName); - base::Value::ListView list = update.Get()->GetListDeprecated(); - for (base::Value& value : list) { + for (base::Value& value : update->GetList()) { if (!value.is_dict()) { continue; } - const std::string* pref_public_key = - value.FindStringKey(kPairingPrefPublicKey); + + base::Value::Dict& dict = value.GetDict(); + const std::string* pref_public_key = dict.FindString(kPairingPrefPublicKey); if (pref_public_key && *pref_public_key == public_key_base64) { - value.SetKey(kPairingPrefName, base::Value(std::move(name))); + dict.Set(kPairingPrefName, std::move(name)); return true; } }
diff --git a/chrome/browser/webauthn/chrome_authenticator_request_delegate_unittest.cc b/chrome/browser/webauthn/chrome_authenticator_request_delegate_unittest.cc index f3c1930..904538e 100644 --- a/chrome/browser/webauthn/chrome_authenticator_request_delegate_unittest.cc +++ b/chrome/browser/webauthn/chrome_authenticator_request_delegate_unittest.cc
@@ -125,11 +125,11 @@ PrefService* prefs = Profile::FromBrowserContext(GetBrowserContext())->GetPrefs(); if (!test.permit_attestation_policy_values.empty()) { - std::vector<base::Value> policy_values; + base::Value::List policy_values; for (const std::string& v : test.permit_attestation_policy_values) - policy_values.emplace_back(v); - prefs->Set(prefs::kSecurityKeyPermitAttestation, - base::Value(std::move(policy_values))); + policy_values.Append(v); + prefs->SetList(prefs::kSecurityKeyPermitAttestation, + std::move(policy_values)); } else { prefs->ClearPref(prefs::kSecurityKeyPermitAttestation); }
diff --git a/chrome/browser/webauthn/local_credential_management_unittest.cc b/chrome/browser/webauthn/local_credential_management_unittest.cc index 077c889e..6e7a975 100644 --- a/chrome/browser/webauthn/local_credential_management_unittest.cc +++ b/chrome/browser/webauthn/local_credential_management_unittest.cc
@@ -123,6 +123,54 @@ EXPECT_FALSE(profile_.GetPrefs()->GetBoolean(kHasPlatformCredentialsPref)); } +TEST_F(LocalCredentialManagementTest, Sorting) { + constexpr uint8_t kCredId1[] = {1}; + constexpr uint8_t kCredId2[] = {2}; + constexpr uint8_t kCredId3[] = {3}; + constexpr uint8_t kCredId4[] = {4}; + constexpr uint8_t kCredId5[] = {5}; + constexpr uint8_t kCredId6[] = {6}; + constexpr uint8_t kCredId7[] = {7}; + + api_.InjectDiscoverableCredential( + kCredId7, {"zzz.de", absl::nullopt, absl::nullopt}, + {{1, 2, 3, 4}, "username", absl::nullopt, absl::nullopt}); + api_.InjectDiscoverableCredential( + kCredId2, {"zzz.de", absl::nullopt, absl::nullopt}, + {{1, 2, 3, 4}, "username", absl::nullopt, absl::nullopt}); + api_.InjectDiscoverableCredential( + kCredId3, {"www.example.co.uk", absl::nullopt, absl::nullopt}, + {{1, 2, 3, 4}, "user1", absl::nullopt, absl::nullopt}); + api_.InjectDiscoverableCredential( + kCredId4, {"foo.www.example.co.uk", absl::nullopt, absl::nullopt}, + {{1, 2, 3, 4}, "user1", absl::nullopt, absl::nullopt}); + api_.InjectDiscoverableCredential( + kCredId5, {"foo.example.co.uk", absl::nullopt, absl::nullopt}, + {{1, 2, 3, 4}, "user1", absl::nullopt, absl::nullopt}); + api_.InjectDiscoverableCredential( + kCredId6, {"aardvark.us", absl::nullopt, absl::nullopt}, + {{1, 2, 3, 4}, "username", absl::nullopt, absl::nullopt}); + api_.InjectDiscoverableCredential( + kCredId1, {"example.co.uk", absl::nullopt, absl::nullopt}, + {{1, 2, 3, 4}, "user2", absl::nullopt, absl::nullopt}); + + const std::vector<device::DiscoverableCredentialMetadata> result = + Enumerate().value(); + ASSERT_EQ(result.size(), 7u); + EXPECT_EQ(result[0].rp_id, "aardvark.us"); + // Despite starting with other characters, all entries for example.co.uk + // should be sorted together. + EXPECT_EQ(result[1].rp_id, "example.co.uk"); + EXPECT_EQ(result[2].rp_id, "foo.example.co.uk"); + EXPECT_EQ(result[3].rp_id, "www.example.co.uk"); + EXPECT_EQ(result[4].rp_id, "foo.www.example.co.uk"); + EXPECT_EQ(result[5].rp_id, "zzz.de"); + EXPECT_EQ(result[6].rp_id, "zzz.de"); + // The two zzz.de entries have the same RP ID and user.name, thus they should + // be sorted by credential ID. + EXPECT_EQ(result[6].cred_id[0], 7); +} + } // namespace #endif
diff --git a/chrome/browser/webauthn/local_credential_management_win.cc b/chrome/browser/webauthn/local_credential_management_win.cc index 516d0f6..57c3865 100644 --- a/chrome/browser/webauthn/local_credential_management_win.cc +++ b/chrome/browser/webauthn/local_credential_management_win.cc
@@ -7,6 +7,10 @@ #include <algorithm> #include "base/bind.h" +#include "base/i18n/string_compare.h" +#include "base/strings/string_split.h" +#include "base/strings/string_util.h" +#include "base/strings/utf_string_conversions.h" #include "base/threading/sequenced_task_runner_handle.h" #include "build/build_config.h" #include "chrome/browser/profiles/profile.h" @@ -16,9 +20,67 @@ #include "components/user_prefs/user_prefs.h" #include "device/fido/win/authenticator.h" #include "device/fido/win/webauthn_api.h" +#include "net/base/registry_controlled_domains/registry_controlled_domain.h" +#include "third_party/icu/source/common/unicode/locid.h" +#include "third_party/icu/source/i18n/unicode/coll.h" namespace { +// CredentialComparator compares two credentials based on their RP ID's eTLD + +// 1, then on the label-reversed RP ID, then on user.name, and finally on +// credential ID if the previous values are equal. +class CredentialComparator { + public: + CredentialComparator() { + UErrorCode error = U_ZERO_ERROR; + collator_.reset( + icu::Collator::createInstance(icu::Locale::getDefault(), error)); + } + + bool operator()(const device::DiscoverableCredentialMetadata& a, + const device::DiscoverableCredentialMetadata& b) { + UCollationResult relation = base::i18n::CompareString16WithCollator( + *collator_, ETLDPlus1(a.rp_id), ETLDPlus1(b.rp_id)); + if (relation != UCOL_EQUAL) { + return relation == UCOL_LESS; + } + + relation = base::i18n::CompareString16WithCollator( + *collator_, LabelReverse(a.rp_id), LabelReverse(b.rp_id)); + if (relation != UCOL_EQUAL) { + return relation == UCOL_LESS; + } + + relation = base::i18n::CompareString16WithCollator( + *collator_, base::UTF8ToUTF16(a.user.name.value_or("")), + base::UTF8ToUTF16(b.user.name.value_or(""))); + if (relation != UCOL_EQUAL) { + return relation == UCOL_LESS; + } + + return a.cred_id < b.cred_id; + } + + private: + static std::u16string ETLDPlus1(const std::string& rp_id) { + std::string domain = net::registry_controlled_domains::GetDomainAndRegistry( + rp_id, net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES); + if (domain.empty()) { + domain = rp_id; + } + return base::UTF8ToUTF16(domain); + } + + static std::u16string LabelReverse(const std::string& rp_id) { + std::vector<base::StringPiece> parts = base::SplitStringPiece( + rp_id, ".", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); + std::reverse(parts.begin(), parts.end()); + return base::UTF8ToUTF16(base::JoinString(parts, ".")); + } + + std::unique_ptr<icu::Collator> collator_; +}; + bool ContainsUserCreatedCredential( const std::vector<device::DiscoverableCredentialMetadata> credentials) { return std::any_of( @@ -72,6 +134,7 @@ kHasPlatformCredentialsPref, ContainsUserCreatedCredential(credentials)); } + std::sort(credentials.begin(), credentials.end(), CredentialComparator()); std::move(callback_).Run(std::move(credentials)); }
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index de205ec9..4c5b578 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1657864792-3f46723d5919ce98defbebfef0f846c0de539dff.profdata +chrome-linux-main-1657885898-4f2e89a4834dc0caf2932f3c6e9b29d84010a1b3.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index 3906c5ab..cde1e30 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1657864792-a34ef75c5ef2c42d005fa54e6a7cb61bba428a3d.profdata +chrome-mac-arm-main-1657885898-dd0f692736af009e01c4b18dfab05f637307f8a2.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index cb263a2..fd35686 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1657864792-3d2c7454c721d269634d34ebc680a586c218b5eb.profdata +chrome-mac-main-1657885898-2645d310bcf3b025a09ffe11d036bc2c3365e4e7.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 02ce1e45..ee25e23 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1657864792-a58a22efcafb41a05e28bdb1d62ffff5a9cfa0c3.profdata +chrome-win32-main-1657896989-2d35d43189235fcda704ef0b7baed4bbb0751a5f.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 8006fad..000a3759c 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1657853539-edefda2c8e05f8eac8cf8bff3d1ffe8477431ad8.profdata +chrome-win64-main-1657896989-29b2c7b2ee6bfe54594c656fb98587a4b9081588.profdata
diff --git a/chrome/chrome_cleaner/ipc/sandbox.cc b/chrome/chrome_cleaner/ipc/sandbox.cc index 5d6f2f3..5e5d643 100644 --- a/chrome/chrome_cleaner/ipc/sandbox.cc +++ b/chrome/chrome_cleaner/ipc/sandbox.cc
@@ -108,9 +108,8 @@ // This rule is needed to allow user32.dll and gdi32.dll to initialize during // load, while still blocking other WIN32K calls. - sandbox_result = - policy->AddRule(sandbox::TargetPolicy::SUBSYS_WIN32K_LOCKDOWN, - sandbox::TargetPolicy::FAKE_USER_GDI_INIT, nullptr); + sandbox_result = policy->AddRule(sandbox::SubSystem::kWin32kLockdown, + sandbox::Semantics::kFakeGdiInit, nullptr); CHECK_EQ(sandbox::SBOX_ALL_OK, sandbox_result); #if !BUILDFLAG(IS_OFFICIAL_CHROME_CLEANER_BUILD) @@ -119,8 +118,8 @@ if (!product_path.value().empty()) { // In developer builds, let the sandbox target process write logs to the // product directory. - sandbox_result = policy->AddRule(sandbox::TargetPolicy::SUBSYS_FILES, - sandbox::TargetPolicy::FILES_ALLOW_ANY, + sandbox_result = policy->AddRule(sandbox::SubSystem::kFiles, + sandbox::Semantics::kFilesAllowAny, product_path.Append(L"*").value().c_str()); LOG_IF(ERROR, sandbox_result != sandbox::SBOX_ALL_OK) << "Failed to give the target process access to the product directory";
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc index 139d1a8..5ddf6e3 100644 --- a/chrome/common/pref_names.cc +++ b/chrome/common/pref_names.cc
@@ -2684,6 +2684,17 @@ "media.hardware_secure_decryption.disabled_times"; #endif // BUILDFLAG(IS_WIN) +#if BUILDFLAG(IS_CHROMEOS) +// A dictionary containing kiosk metrics latest session related information. +// For example, kiosk session start times, number of network drops. +// This setting resides in local state. +const char kKioskMetrics[] = "kiosk-metrics"; + +// A boolean pref which determines whether a Web Kiosk can open more than one +// browser window. +const char kNewWindowsInKioskAllowed[] = "new_windows_in_kiosk_allowed"; +#endif // BUILDFLAG(IS_CHROMEOS) + // *************** SERVICE PREFS *************** // These are attached to the service process. @@ -3540,11 +3551,4 @@ const char kConsumerAutoUpdateToggle[] = "settings.consumer_auto_update_toggle"; #endif -#if BUILDFLAG(IS_CHROMEOS) -// A dictionary containing kiosk metrics latest session related information. -// For example, kiosk session start times, number of network drops. -// This setting resides in local state. -const char kKioskMetrics[] = "kiosk-metrics"; -#endif // BUILDFLAG(IS_CHROMEOS) - } // namespace prefs
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h index 50004c13..1f9c629 100644 --- a/chrome/common/pref_names.h +++ b/chrome/common/pref_names.h
@@ -919,6 +919,11 @@ extern const char kHardwareSecureDecryptionDisabledTimes[]; #endif // BUILDFLAG(IS_WIN) +#if BUILDFLAG(IS_CHROMEOS) +extern const char kKioskMetrics[]; +extern const char kNewWindowsInKioskAllowed[]; +#endif // BUILDFLAG(IS_CHROMEOS) + #if !BUILDFLAG(IS_ANDROID) extern const char kAttemptedToEnableAutoupdate[]; @@ -1253,10 +1258,6 @@ extern const char kConsumerAutoUpdateToggle[]; #endif -#if BUILDFLAG(IS_CHROMEOS) -extern const char kKioskMetrics[]; -#endif // BUILDFLAG(IS_CHROMEOS) - } // namespace prefs #endif // CHROME_COMMON_PREF_NAMES_H_
diff --git a/chrome/services/system_signals/linux/linux_system_signals_service_unittest.cc b/chrome/services/system_signals/linux/linux_system_signals_service_unittest.cc index 85de08f3..ddbf64d 100644 --- a/chrome/services/system_signals/linux/linux_system_signals_service_unittest.cc +++ b/chrome/services/system_signals/linux/linux_system_signals_service_unittest.cc
@@ -41,7 +41,7 @@ // Tests that GetFileSystemSignals forwards the signal collection to // FileSystemService. -TEST_F(LinuxSystemSignalsServiceTest, DISABLED_GetFileSystemSignals) { +TEST_F(LinuxSystemSignalsServiceTest, GetFileSystemSignals) { device_signals::GetFileSystemInfoOptions options; options.file_path = base::FilePath::FromUTF8Unsafe("/some/file/path");
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index d84860e5..389b5f5c 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -4084,7 +4084,6 @@ "//ash/components/hid_detection:hid_detection", "//ash/components/hid_detection:test_support", "//ash/components/login/auth", - "//ash/components/login/auth:challenge_response_key", "//ash/components/login/auth:test_support", "//ash/components/smbfs", "//ash/components/timezone", @@ -5091,6 +5090,7 @@ "../browser/browsing_data/counters/site_settings_counter_unittest.cc", "../browser/browsing_data/site_data_size_collector_unittest.cc", "../browser/chooser_controller/title_util_unittest.cc", + "../browser/chrome_browser_field_trials_unittest.cc", "../browser/chrome_content_browser_client_unittest.cc", "../browser/command_updater_impl_unittest.cc", "../browser/complex_tasks/task_tab_helper_unittest.cc", @@ -7309,8 +7309,8 @@ "//chromeos/ash/components/dbus/seneschal", "//chromeos/ash/components/dbus/update_engine", "//chromeos/ash/components/dbus/update_engine:proto", + "//chromeos/ash/components/feature_usage", "//chromeos/ash/services/assistant/public/cpp", - "//chromeos/components/feature_usage:feature_usage", "//chromeos/components/onc", "//chromeos/components/quick_answers:quick_answers", "//chromeos/components/quick_answers/public/cpp:cpp",
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json index 9823faa6..0a55403 100644 --- a/chrome/test/data/policy/policy_test_cases.json +++ b/chrome/test/data/policy/policy_test_cases.json
@@ -12385,6 +12385,48 @@ "AllowKioskAppControlChromeVersion": { "reason_for_missing_test": "This policy has no pref as it is only directly read by the update engine daemon." }, + "NewWindowsInKioskAllowed": { + "os": [ + "chromeos_ash", + "chromeos_lacros" + ], + "policy_pref_mapping_tests": [ + { + "note": "Check default value (no policies set)", + "policies": { }, + "prefs": { + "new_windows_in_kiosk_allowed": { + "location": "user_profile", + "default_value": false + } + } + }, + { + "note": "Check true policy value", + "policies": { + "NewWindowsInKioskAllowed": true + }, + "prefs": { + "new_windows_in_kiosk_allowed": { + "location": "user_profile", + "value": true + } + } + }, + { + "note": "Check false policy value", + "policies": { + "NewWindowsInKioskAllowed": false + }, + "prefs": { + "new_windows_in_kiosk_allowed": { + "location": "user_profile", + "value": false + } + } + } + ] + }, "LoginAuthenticationBehavior": { "reason_for_missing_test": "Maps into CrosSettings" },
diff --git a/chromeos/ash/components/BUILD.gn b/chromeos/ash/components/BUILD.gn index b6b45c2d..da5809a 100644 --- a/chromeos/ash/components/BUILD.gn +++ b/chromeos/ash/components/BUILD.gn
@@ -13,6 +13,7 @@ deps = [ "//chromeos/ash/components/browser_context_helper:unit_tests", "//chromeos/ash/components/dbus:unit_tests", + "//chromeos/ash/components/feature_usage:unit_tests", "//chromeos/ash/components/human_presence:unit_tests", "//chromeos/ash/components/local_search_service:unit_tests", "//chromeos/ash/components/local_search_service/public/mojom:unit_tests",
diff --git a/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.cc b/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.cc index 9b513d2..5c822710 100644 --- a/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.cc +++ b/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.cc
@@ -946,6 +946,30 @@ ReturnProtobufMethodCallback(reply, std::move(callback)); } +void FakeUserDataAuthClient::GetAuthSessionStatus( + const ::user_data_auth::GetAuthSessionStatusRequest& request, + GetAuthSessionStatusCallback callback) { + ::user_data_auth::GetAuthSessionStatusReply reply; + + const std::string auth_session_id = request.auth_session_id(); + auto auth_session = auth_sessions_.find(auth_session_id); + + // Check if the token refers to a valid AuthSession. + if (auth_session == auth_sessions_.end()) { + reply.set_error(::user_data_auth::CryptohomeErrorCode:: + CRYPTOHOME_INVALID_AUTH_SESSION_TOKEN); + } else if (auth_session->second.authenticated) { + reply.set_status(::user_data_auth::AUTH_SESSION_STATUS_AUTHENTICATED); + // Use 5 minutes timeout - as if auth session has just started. + reply.set_time_left(5 * 60); + } else { + reply.set_status( + ::user_data_auth::AUTH_SESSION_STATUS_FURTHER_FACTOR_REQUIRED); + } + + ReturnProtobufMethodCallback(reply, std::move(callback)); +} + void FakeUserDataAuthClient::WaitForServiceToBeAvailable( chromeos::WaitForServiceToBeAvailableCallback callback) { if (TestApi::Get()->service_is_available_ ||
diff --git a/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.h b/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.h index 18046f82..0fdf6103 100644 --- a/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.h +++ b/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.h
@@ -230,6 +230,9 @@ void RemoveAuthFactor( const ::user_data_auth::RemoveAuthFactorRequest& request, RemoveAuthFactorCallback callback) override; + void GetAuthSessionStatus( + const ::user_data_auth::GetAuthSessionStatusRequest& request, + GetAuthSessionStatusCallback callback) override; // Sets the CryptohomeError value to return. void set_cryptohome_error(::user_data_auth::CryptohomeErrorCode error) {
diff --git a/chromeos/ash/components/dbus/userdataauth/mock_userdataauth_client.h b/chromeos/ash/components/dbus/userdataauth/mock_userdataauth_client.h index 4e7b4b1..9d28b17d 100644 --- a/chromeos/ash/components/dbus/userdataauth/mock_userdataauth_client.h +++ b/chromeos/ash/components/dbus/userdataauth/mock_userdataauth_client.h
@@ -180,6 +180,11 @@ (const ::user_data_auth::RemoveAuthFactorRequest& request, RemoveAuthFactorCallback callback), (override)); + MOCK_METHOD(void, + GetAuthSessionStatus, + (const ::user_data_auth::GetAuthSessionStatusRequest& request, + GetAuthSessionStatusCallback callback), + (override)); }; } // namespace ash
diff --git a/chromeos/ash/components/dbus/userdataauth/userdataauth_client.cc b/chromeos/ash/components/dbus/userdataauth/userdataauth_client.cc index 63f33b9..c61f2d3 100644 --- a/chromeos/ash/components/dbus/userdataauth/userdataauth_client.cc +++ b/chromeos/ash/components/dbus/userdataauth/userdataauth_client.cc
@@ -330,6 +330,14 @@ std::move(callback)); } + void GetAuthSessionStatus( + const ::user_data_auth::GetAuthSessionStatusRequest& request, + GetAuthSessionStatusCallback callback) override { + CallProtoMethod(::user_data_auth::kGetAuthSessionStatus, + ::user_data_auth::kUserDataAuthInterface, request, + std::move(callback)); + } + private: // Calls cryptohomed's |method_name| method in |interface_name| interface, // passing in |request| as input with |timeout_ms|. Once the (asynchronous)
diff --git a/chromeos/ash/components/dbus/userdataauth/userdataauth_client.h b/chromeos/ash/components/dbus/userdataauth/userdataauth_client.h index 89e572d..9d1512e 100644 --- a/chromeos/ash/components/dbus/userdataauth/userdataauth_client.h +++ b/chromeos/ash/components/dbus/userdataauth/userdataauth_client.h
@@ -94,6 +94,8 @@ DBusMethodCallback<::user_data_auth::UpdateAuthFactorReply>; using RemoveAuthFactorCallback = DBusMethodCallback<::user_data_auth::RemoveAuthFactorReply>; + using GetAuthSessionStatusCallback = + DBusMethodCallback<::user_data_auth::GetAuthSessionStatusReply>; // Not copyable or movable. UserDataAuthClient(const UserDataAuthClient&) = delete; @@ -287,6 +289,11 @@ const ::user_data_auth::RemoveAuthFactorRequest& request, RemoveAuthFactorCallback callback) = 0; + // This is called when a user wants to get an AuthSession status. + virtual void GetAuthSessionStatus( + const ::user_data_auth::GetAuthSessionStatusRequest& request, + GetAuthSessionStatusCallback callback) = 0; + protected: // Initialize/Shutdown should be used instead. UserDataAuthClient();
diff --git a/chromeos/components/feature_usage/BUILD.gn b/chromeos/ash/components/feature_usage/BUILD.gn similarity index 87% rename from chromeos/components/feature_usage/BUILD.gn rename to chromeos/ash/components/feature_usage/BUILD.gn index ebf8384..c656146b 100644 --- a/chromeos/components/feature_usage/BUILD.gn +++ b/chromeos/ash/components/feature_usage/BUILD.gn
@@ -2,6 +2,10 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/chromeos/ui_mode.gni") + +assert(is_chromeos_ash) + static_library("feature_usage") { sources = [ "feature_usage_metrics.cc",
diff --git a/chromeos/components/feature_usage/OWNERS b/chromeos/ash/components/feature_usage/OWNERS similarity index 100% rename from chromeos/components/feature_usage/OWNERS rename to chromeos/ash/components/feature_usage/OWNERS
diff --git a/chromeos/components/feature_usage/README.md b/chromeos/ash/components/feature_usage/README.md similarity index 100% rename from chromeos/components/feature_usage/README.md rename to chromeos/ash/components/feature_usage/README.md
diff --git a/chromeos/components/feature_usage/feature_usage_metrics.cc b/chromeos/ash/components/feature_usage/feature_usage_metrics.cc similarity index 97% rename from chromeos/components/feature_usage/feature_usage_metrics.cc rename to chromeos/ash/components/feature_usage/feature_usage_metrics.cc index 23d0ee8..c216ad5 100644 --- a/chromeos/components/feature_usage/feature_usage_metrics.cc +++ b/chromeos/ash/components/feature_usage/feature_usage_metrics.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/components/feature_usage/feature_usage_metrics.h" +#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h" #include "base/bind.h" #include "base/callback.h" @@ -19,7 +19,7 @@ #include "base/timer/timer.h" #include "third_party/abseil-cpp/absl/types/optional.h" -namespace feature_usage { +namespace ash::feature_usage { namespace { @@ -201,4 +201,4 @@ return clock_->Now(); } -} // namespace feature_usage +} // namespace ash::feature_usage
diff --git a/chromeos/components/feature_usage/feature_usage_metrics.h b/chromeos/ash/components/feature_usage/feature_usage_metrics.h similarity index 89% rename from chromeos/components/feature_usage/feature_usage_metrics.h rename to chromeos/ash/components/feature_usage/feature_usage_metrics.h index a99c8a5..7b201e1 100644 --- a/chromeos/components/feature_usage/feature_usage_metrics.h +++ b/chromeos/ash/components/feature_usage/feature_usage_metrics.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 CHROMEOS_COMPONENTS_FEATURE_USAGE_FEATURE_USAGE_METRICS_H_ -#define CHROMEOS_COMPONENTS_FEATURE_USAGE_FEATURE_USAGE_METRICS_H_ +#ifndef CHROMEOS_ASH_COMPONENTS_FEATURE_USAGE_FEATURE_USAGE_METRICS_H_ +#define CHROMEOS_ASH_COMPONENTS_FEATURE_USAGE_FEATURE_USAGE_METRICS_H_ #include <memory> @@ -20,7 +20,7 @@ class TickClock; } // namespace base -namespace feature_usage { +namespace ash::feature_usage { // Helper class to unify tracking features usage by users. // It provides unified naming for the tracked events. Which reduces effort on @@ -113,6 +113,11 @@ SEQUENCE_CHECKER(sequence_checker_); }; -} // namespace feature_usage +} // namespace ash::feature_usage -#endif // CHROMEOS_COMPONENTS_FEATURE_USAGE_FEATURE_USAGE_METRICS_H_ +// TODO(https://crbug.com/1164001): remove after the migration is finished. +namespace chromeos::feature_usage { +using ::ash::feature_usage::FeatureUsageMetrics; +} + +#endif // CHROMEOS_ASH_COMPONENTS_FEATURE_USAGE_FEATURE_USAGE_METRICS_H_
diff --git a/chromeos/components/feature_usage/feature_usage_metrics_unittest.cc b/chromeos/ash/components/feature_usage/feature_usage_metrics_unittest.cc similarity index 98% rename from chromeos/components/feature_usage/feature_usage_metrics_unittest.cc rename to chromeos/ash/components/feature_usage/feature_usage_metrics_unittest.cc index 476f9446..086d2ac 100644 --- a/chromeos/components/feature_usage/feature_usage_metrics_unittest.cc +++ b/chromeos/ash/components/feature_usage/feature_usage_metrics_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/components/feature_usage/feature_usage_metrics.h" +#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h" #include "base/logging.h" #include "base/power_monitor/power_monitor.h" @@ -15,7 +15,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" -namespace feature_usage { +namespace ash::feature_usage { namespace { @@ -276,4 +276,4 @@ kTestMetric, static_cast<int>(FeatureUsageMetrics::Event::kEnabled), 3); } -} // namespace feature_usage +} // namespace ash::feature_usage
diff --git a/chromeos/ash/components/network/BUILD.gn b/chromeos/ash/components/network/BUILD.gn index 6db2a7ce..fb3441d9 100644 --- a/chromeos/ash/components/network/BUILD.gn +++ b/chromeos/ash/components/network/BUILD.gn
@@ -16,10 +16,10 @@ "//ash/constants", "//base", "//chromeos/ash/components/dbus/hermes", + "//chromeos/ash/components/feature_usage", "//chromeos/ash/components/network/metrics", "//chromeos/ash/components/network/onc", "//chromeos/ash/components/network/proxy", - "//chromeos/components/feature_usage", "//chromeos/components/onc", "//chromeos/dbus/common", "//chromeos/dbus/permission_broker", @@ -213,7 +213,7 @@ "//base", "//base:i18n", "//base/test:test_support", - "//chromeos/components/feature_usage", + "//chromeos/ash/components/feature_usage", "//chromeos/components/onc", "//chromeos/components/onc:test_support", "//chromeos/dbus:test_support",
diff --git a/chromeos/ash/components/network/DEPS b/chromeos/ash/components/network/DEPS index 9d07639..807d241 100644 --- a/chromeos/ash/components/network/DEPS +++ b/chromeos/ash/components/network/DEPS
@@ -8,10 +8,10 @@ "+ash/constants", "+base", "+base/component_export.h", + "+chromeos/ash/components/feature_usage", "+chromeos/test", "+chromeos/ash/components/dbus", "+chromeos/dbus", - "+chromeos/components/feature_usage", "+chromeos/components/onc", "+chromeos/login/login_state", "+chromeos/network",
diff --git a/chromeos/ash/components/network/cellular_metrics_logger.cc b/chromeos/ash/components/network/cellular_metrics_logger.cc index 1ee7130a..1876ebdf 100644 --- a/chromeos/ash/components/network/cellular_metrics_logger.cc +++ b/chromeos/ash/components/network/cellular_metrics_logger.cc
@@ -10,13 +10,13 @@ #include "base/metrics/histogram_macros.h" #include "base/time/tick_clock.h" #include "chromeos/ash/components/dbus/hermes/hermes_manager_client.h" +#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h" #include "chromeos/ash/components/network/cellular_esim_profile.h" #include "chromeos/ash/components/network/cellular_esim_profile_handler.h" #include "chromeos/ash/components/network/cellular_utils.h" #include "chromeos/ash/components/network/network_connection_handler.h" #include "chromeos/ash/components/network/network_event_log.h" #include "chromeos/ash/components/network/network_state_handler.h" -#include "chromeos/components/feature_usage/feature_usage_metrics.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" #include "third_party/cros_system_api/dbus/service_constants.h"
diff --git a/chromeos/ash/components/network/cellular_metrics_logger_unittest.cc b/chromeos/ash/components/network/cellular_metrics_logger_unittest.cc index aef7cb0..2b427fe 100644 --- a/chromeos/ash/components/network/cellular_metrics_logger_unittest.cc +++ b/chromeos/ash/components/network/cellular_metrics_logger_unittest.cc
@@ -11,6 +11,7 @@ #include "base/test/metrics/histogram_tester.h" #include "base/test/task_environment.h" #include "base/time/time.h" +#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h" #include "chromeos/ash/components/network/cellular_esim_profile.h" #include "chromeos/ash/components/network/cellular_inhibitor.h" #include "chromeos/ash/components/network/network_connection_handler.h" @@ -18,7 +19,6 @@ #include "chromeos/ash/components/network/network_state_test_helper.h" #include "chromeos/ash/components/network/network_ui_data.h" #include "chromeos/ash/components/network/test_cellular_esim_profile_handler.h" -#include "chromeos/components/feature_usage/feature_usage_metrics.h" #include "chromeos/login/login_state/login_state.h" #include "dbus/object_path.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chromeos/ash/components/trash_service/BUILD.gn b/chromeos/ash/components/trash_service/BUILD.gn new file mode 100644 index 0000000..f499f57 --- /dev/null +++ b/chromeos/ash/components/trash_service/BUILD.gn
@@ -0,0 +1,21 @@ +# Copyright 2022 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/chromeos/ui_mode.gni") + +assert(is_chromeos_ash, "Non-ChromeOS builds cannot depend on //ash") + +source_set("trash_service") { + sources = [ + "trash_service_impl.cc", + "trash_service_impl.h", + ] + + deps = [ + "//base", + "//mojo/public/cpp/bindings", + ] + + public_deps = [ "//chromeos/ash/components/trash_service/public/mojom" ] +}
diff --git a/chromeos/ash/components/trash_service/DEPS b/chromeos/ash/components/trash_service/DEPS new file mode 100644 index 0000000..83cb501 --- /dev/null +++ b/chromeos/ash/components/trash_service/DEPS
@@ -0,0 +1,5 @@ +# Required to launch the sandboxed process. + +include_rules = [ + "+content/public/browser/service_process_host.h", +]
diff --git a/chromeos/ash/components/trash_service/DIR_METADATA b/chromeos/ash/components/trash_service/DIR_METADATA new file mode 100644 index 0000000..e9400b87 --- /dev/null +++ b/chromeos/ash/components/trash_service/DIR_METADATA
@@ -0,0 +1 @@ +mixins: "//ui/file_manager/COMMON_METADATA"
diff --git a/chromeos/ash/components/trash_service/OWNERS b/chromeos/ash/components/trash_service/OWNERS new file mode 100644 index 0000000..73220a8 --- /dev/null +++ b/chromeos/ash/components/trash_service/OWNERS
@@ -0,0 +1 @@ +file://ui/file_manager/OWNERS
diff --git a/chromeos/ash/components/trash_service/public/cpp/BUILD.gn b/chromeos/ash/components/trash_service/public/cpp/BUILD.gn new file mode 100644 index 0000000..5448dfd4 --- /dev/null +++ b/chromeos/ash/components/trash_service/public/cpp/BUILD.gn
@@ -0,0 +1,21 @@ +# Copyright 2022 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/chromeos/ui_mode.gni") + +assert(is_chromeos_ash, "Non-ChromeOS builds cannot depend on //chromeos/ash") + +source_set("cpp") { + sources = [ + "trash_service.cc", + "trash_service.h", + ] + + deps = [ "//content/public/browser" ] + + public_deps = [ + "//chromeos/ash/components/trash_service/public/mojom", + "//mojo/public/cpp/bindings", + ] +}
diff --git a/chromeos/ash/components/trash_service/public/cpp/trash_service.cc b/chromeos/ash/components/trash_service/public/cpp/trash_service.cc new file mode 100644 index 0000000..e6411d8 --- /dev/null +++ b/chromeos/ash/components/trash_service/public/cpp/trash_service.cc
@@ -0,0 +1,22 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromeos/ash/components/trash_service/public/cpp/trash_service.h" + +#include "chromeos/ash/components/trash_service/public/mojom/trash_service.mojom.h" +#include "content/public/browser/service_process_host.h" + +namespace chromeos::trash_service { + +mojo::PendingRemote<mojom::TrashService> LaunchTrashService() { + mojo::PendingRemote<mojom::TrashService> remote; + content::ServiceProcessHost::Launch<mojom::TrashService>( + remote.InitWithNewPipeAndPassReceiver(), + content::ServiceProcessHost::Options() + .WithDisplayName("ChromeOS Trash Service") + .Pass()); + return remote; +} + +} // namespace chromeos::trash_service
diff --git a/chromeos/ash/components/trash_service/public/cpp/trash_service.h b/chromeos/ash/components/trash_service/public/cpp/trash_service.h new file mode 100644 index 0000000..ee17b46 --- /dev/null +++ b/chromeos/ash/components/trash_service/public/cpp/trash_service.h
@@ -0,0 +1,21 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROMEOS_ASH_COMPONENTS_TRASH_SERVICE_PUBLIC_CPP_TRASH_SERVICE_H_ +#define CHROMEOS_ASH_COMPONENTS_TRASH_SERVICE_PUBLIC_CPP_TRASH_SERVICE_H_ + +#include "chromeos/ash/components/trash_service/public/mojom/trash_service.mojom-forward.h" +#include "mojo/public/cpp/bindings/pending_remote.h" + +namespace chromeos::trash_service { + +// Starts up an out-of-process Trash service, binds receiver and returns the +// pending remote. +// TODO(b/238943248): This should not launch an individual service every time +// but should re-use one if it's already running. +mojo::PendingRemote<mojom::TrashService> LaunchTrashService(); + +} // namespace chromeos::trash_service + +#endif // CHROMEOS_ASH_COMPONENTS_TRASH_SERVICE_PUBLIC_CPP_TRASH_SERVICE_H_
diff --git a/chromeos/ash/components/trash_service/public/mojom/BUILD.gn b/chromeos/ash/components/trash_service/public/mojom/BUILD.gn new file mode 100644 index 0000000..283bd0ec --- /dev/null +++ b/chromeos/ash/components/trash_service/public/mojom/BUILD.gn
@@ -0,0 +1,17 @@ +# Copyright 2022 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/chromeos/ui_mode.gni") +import("//mojo/public/tools/bindings/mojom.gni") + +assert(is_chromeos_ash, "Non-ChromeOS builds cannot depend on //chromeos/ash") + +mojom("mojom") { + sources = [ "trash_service.mojom" ] + + public_deps = [ + "//mojo/public/mojom/base", + "//sandbox/policy/mojom", + ] +}
diff --git a/chromeos/ash/components/trash_service/public/mojom/OWNERS b/chromeos/ash/components/trash_service/public/mojom/OWNERS new file mode 100644 index 0000000..08850f4 --- /dev/null +++ b/chromeos/ash/components/trash_service/public/mojom/OWNERS
@@ -0,0 +1,2 @@ +per-file *.mojom=set noparent +per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/chromeos/ash/components/trash_service/public/mojom/trash_service.mojom b/chromeos/ash/components/trash_service/public/mojom/trash_service.mojom new file mode 100644 index 0000000..76dc80b --- /dev/null +++ b/chromeos/ash/components/trash_service/public/mojom/trash_service.mojom
@@ -0,0 +1,14 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +module chromeos.trash_service.mojom; + +import "sandbox/policy/mojom/sandbox.mojom"; + +// Interface to the out-of-process Trash service. The service parses the +// .trashinfo files and returns a path to restore the files to as well as the +// deleted date. +[ServiceSandbox=sandbox.mojom.Sandbox.kUtility] +interface TrashService { +};
diff --git a/chromeos/ash/components/trash_service/trash_service_impl.cc b/chromeos/ash/components/trash_service/trash_service_impl.cc new file mode 100644 index 0000000..7fb91484 --- /dev/null +++ b/chromeos/ash/components/trash_service/trash_service_impl.cc
@@ -0,0 +1,18 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromeos/ash/components/trash_service/trash_service_impl.h" + +#include <utility> + +namespace chromeos::trash_service { + +TrashImpl::TrashServiceImpl( + mojo::PendingReceiver<mojom::TrashService> receiver) { + receivers_.Add(this, std::move(receiver)); +} + +TrashImpl::~TrashServiceImpl() = default; + +} // namespace chromeos::trash_service
diff --git a/chromeos/ash/components/trash_service/trash_service_impl.h b/chromeos/ash/components/trash_service/trash_service_impl.h new file mode 100644 index 0000000..38c8278 --- /dev/null +++ b/chromeos/ash/components/trash_service/trash_service_impl.h
@@ -0,0 +1,42 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROMEOS_ASH_COMPONENTS_TRASH_SERVICE_TRASH_SERVICE_IMPL_H_ +#define CHROMEOS_ASH_COMPONENTS_TRASH_SERVICE_TRASH_SERVICE_IMPL_H_ + +#include "chromeos/ash/components/trash_service/public/mojom/trash_service.mojom.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/receiver_set.h" + +namespace chromeos::trash_service { + +// Implementation of the Trash utility process. The trash implementation follows +// the XDG specification which maintains metadata in a user visible directory at +// ({TRASH_DIR}/info) and in files with a suffix .trashinfo. These files have a +// format as follows: +// [Trash Info] +// Path=/foo/bar.txt +// DeletionDate=2011-10-05T14:48:00.000Z +// Where Path is relative to the parent of the {TRASH_DIR} and the DeletionDate +// is an ISO-8601 compliant string. This utility process parses this content and +// ensures both these values are well-formed and valid. Upon completion it +// responds with a status and the parsed contents. +class TrashServiceImpl : public mojom::TrashService { + public: + explicit TrashServiceImpl( + mojo::PendingReceiver<mojom::TrashService> receiver); + ~TrashServiceImpl() override; + + TrashServiceImpl(const TrashServiceImpl&) = delete; + TrashServiceImpl& operator=(const TrashServiceImpl&) = delete; + + // TODO(b/238943248): Add the ParseTrashInfoFile method with implementation + // here. + private: + mojo::ReceiverSet<mojom::TrashService> receivers_; +}; + +} // namespace chromeos::trash_service + +#endif // CHROMEOS_ASH_COMPONENTS_TRASH_SERVICE_TRASH_SERVICE_IMPL_H_
diff --git a/chromeos/components/BUILD.gn b/chromeos/components/BUILD.gn index 9ba1179..47cecd37 100644 --- a/chromeos/components/BUILD.gn +++ b/chromeos/components/BUILD.gn
@@ -22,7 +22,6 @@ "//base/test:test_support", "//build:chromeos_buildflags", "//chromeos/components/cdm_factory_daemon:unit_tests", - "//chromeos/components/feature_usage:unit_tests", "//chromeos/components/mojo_bootstrap:unit_tests", "//chromeos/components/onc:unit_tests", "//chromeos/components/quick_answers:unit_tests",
diff --git a/chromeos/components/feature_usage/DEPS b/chromeos/components/feature_usage/DEPS deleted file mode 100644 index d9ef433..0000000 --- a/chromeos/components/feature_usage/DEPS +++ /dev/null
@@ -1,3 +0,0 @@ -include_rules = [ - "+components/metrics", -]
diff --git a/chromeos/network/DEPS b/chromeos/network/DEPS index 867805d1..e8b0b3d2 100644 --- a/chromeos/network/DEPS +++ b/chromeos/network/DEPS
@@ -11,7 +11,6 @@ "+chromeos/ash/components/network", "+chromeos/test", "+chromeos/dbus", - "+chromeos/components/feature_usage", "+chromeos/components/onc", "+chromeos/login/login_state", "+chromeos/services/network_config/public",
diff --git a/components/autofill/core/browser/ui/address_combobox_model.cc b/components/autofill/core/browser/ui/address_combobox_model.cc index 1ecc6e2..58fda87 100644 --- a/components/autofill/core/browser/ui/address_combobox_model.cc +++ b/components/autofill/core/browser/ui/address_combobox_model.cc
@@ -20,7 +20,7 @@ namespace { // There's one header entry to prompt the user to select an address, and a // separator. -int kNbHeaderEntries = 2; +constexpr size_t kNbHeaderEntries = 2; } // namespace AddressComboboxModel::AddressComboboxModel( @@ -36,7 +36,7 @@ AddressComboboxModel::~AddressComboboxModel() {} -int AddressComboboxModel::GetItemCount() const { +size_t AddressComboboxModel::GetItemCount() const { // When there are not addresses, a special entry is shown to prompt the user // to add addresses, but nothing else is shown, since there are no address to // select from, and no need for a separator. @@ -47,10 +47,9 @@ return addresses_.size() + kNbHeaderEntries; } -std::u16string AddressComboboxModel::GetItemAt(int index) const { - DCHECK_GE(index, 0); +std::u16string AddressComboboxModel::GetItemAt(size_t index) const { // A special entry is always added at index 0 and a separator at index 1. - DCHECK_LT(static_cast<size_t>(index), addresses_.size() + kNbHeaderEntries); + DCHECK_LT(index, addresses_.size() + kNbHeaderEntries); // Special entry when no profiles have been created yet. if (addresses_.empty()) @@ -59,15 +58,13 @@ // Always show the "Select" entry at the top, default selection position. if (index == 0) return l10n_util::GetStringUTF16(IDS_AUTOFILL_SELECT); - - // Always show the "Select" entry at the top, default selection position. if (index == 1) return u"---"; return addresses_[index - kNbHeaderEntries].second; } -bool AddressComboboxModel::IsItemSeparatorAt(int index) const { +bool AddressComboboxModel::IsItemSeparatorAt(size_t index) const { // The only separator is between the "Select" entry at 0 and the first address // at index 2. So there must be at least one address for a separator to be // shown. @@ -77,35 +74,35 @@ absl::optional<size_t> AddressComboboxModel::GetDefaultIndex() const { if (!default_selected_guid_.empty()) { - int address_index = GetIndexOfIdentifier(default_selected_guid_); - if (address_index != -1) - return address_index; + const auto index = GetIndexOfIdentifier(default_selected_guid_); + if (index.has_value()) + return index; } return ui::ComboboxModel::GetDefaultIndex(); } -int AddressComboboxModel::AddNewProfile(const AutofillProfile& profile) { +size_t AddressComboboxModel::AddNewProfile(const AutofillProfile& profile) { profiles_cache_.push_back(std::make_unique<AutofillProfile>(profile)); UpdateAddresses(); - DCHECK_GT(addresses_.size(), 0UL); + DCHECK(!addresses_.empty()); return addresses_.size() + kNbHeaderEntries - 1; } -std::string AddressComboboxModel::GetItemIdentifierAt(int index) { +std::string AddressComboboxModel::GetItemIdentifierAt(size_t index) { // The first two indices are special entries, with no addresses. if (index < kNbHeaderEntries) return std::string(); - DCHECK_LT(static_cast<size_t>(index), addresses_.size() + kNbHeaderEntries); + DCHECK_LT(index, addresses_.size() + kNbHeaderEntries); return addresses_[index - kNbHeaderEntries].first; } -int AddressComboboxModel::GetIndexOfIdentifier( +absl::optional<size_t> AddressComboboxModel::GetIndexOfIdentifier( const std::string& identifier) const { for (size_t i = 0; i < addresses_.size(); ++i) { if (addresses_[i].first == identifier) return i + kNbHeaderEntries; } - return -1; + return absl::nullopt; } void AddressComboboxModel::UpdateAddresses() {
diff --git a/components/autofill/core/browser/ui/address_combobox_model.h b/components/autofill/core/browser/ui/address_combobox_model.h index 9a2ea750..a7844d6f 100644 --- a/components/autofill/core/browser/ui/address_combobox_model.h +++ b/components/autofill/core/browser/ui/address_combobox_model.h
@@ -36,22 +36,23 @@ ~AddressComboboxModel() override; // ui::ComboboxModel implementation: - int GetItemCount() const override; - std::u16string GetItemAt(int index) const override; - bool IsItemSeparatorAt(int index) const override; + size_t GetItemCount() const override; + std::u16string GetItemAt(size_t index) const override; + bool IsItemSeparatorAt(size_t index) const override; absl::optional<size_t> GetDefaultIndex() const override; // Adds |profile| to model and return its combobox index. The lifespan of // |profile| beyond this call is undefined so a copy must be made. - int AddNewProfile(const AutofillProfile& profile); + size_t AddNewProfile(const AutofillProfile& profile); // Returns the unique identifier of the profile at |index|, unless |index| // refers to a special entry, in which case an empty string is returned. - std::string GetItemIdentifierAt(int index); + std::string GetItemIdentifierAt(size_t index); - // Returns the combobox index of the item with the given id or -1 if it's not - // found. - int GetIndexOfIdentifier(const std::string& identifier) const; + // Returns the combobox index of the item with the given id or nullopt if it's + // not found. + absl::optional<size_t> GetIndexOfIdentifier( + const std::string& identifier) const; private: // Update |addresses_| based on |profiles_cache_| and notify observers.
diff --git a/components/autofill/core/browser/ui/address_combobox_model_unittest.cc b/components/autofill/core/browser/ui/address_combobox_model_unittest.cc index 7a84fc1..812a7ae 100644 --- a/components/autofill/core/browser/ui/address_combobox_model_unittest.cc +++ b/components/autofill/core/browser/ui/address_combobox_model_unittest.cc
@@ -20,10 +20,10 @@ test_personal_data_manager.SetAutofillProfileEnabled(true); AddressComboboxModel model(test_personal_data_manager, kAppLocale, ""); - EXPECT_EQ(1, model.GetItemCount()); + EXPECT_EQ(1u, model.GetItemCount()); EXPECT_FALSE(model.IsItemSeparatorAt(0)); EXPECT_TRUE(model.GetItemIdentifierAt(0).empty()); - EXPECT_EQ(-1, model.GetIndexOfIdentifier("Anything")); + EXPECT_FALSE(model.GetIndexOfIdentifier("Anything").has_value()); } TEST(AddressComboboxModelTest, OneAddress) { @@ -34,14 +34,14 @@ AddressComboboxModel model(test_personal_data_manager, kAppLocale, profile1.guid()); - EXPECT_EQ(3, model.GetItemCount()); + EXPECT_EQ(3u, model.GetItemCount()); EXPECT_FALSE(model.IsItemSeparatorAt(0)); EXPECT_TRUE(model.IsItemSeparatorAt(1)); EXPECT_TRUE(model.GetItemIdentifierAt(0).empty()); EXPECT_TRUE(model.GetItemIdentifierAt(1).empty()); - EXPECT_EQ(-1, model.GetIndexOfIdentifier("Anything")); + EXPECT_FALSE(model.GetIndexOfIdentifier("Anything").has_value()); EXPECT_EQ(profile1.guid(), model.GetItemIdentifierAt(2)); - EXPECT_EQ(2, model.GetIndexOfIdentifier(profile1.guid())); + EXPECT_EQ(2u, model.GetIndexOfIdentifier(profile1.guid())); EXPECT_EQ(2u, model.GetDefaultIndex()); } @@ -58,16 +58,16 @@ AddressComboboxModel model(test_personal_data_manager, kAppLocale, profile2.guid()); - EXPECT_EQ(4, model.GetItemCount()); + EXPECT_EQ(4u, model.GetItemCount()); EXPECT_FALSE(model.IsItemSeparatorAt(0)); EXPECT_TRUE(model.IsItemSeparatorAt(1)); EXPECT_TRUE(model.GetItemIdentifierAt(0).empty()); EXPECT_TRUE(model.GetItemIdentifierAt(1).empty()); - EXPECT_EQ(-1, model.GetIndexOfIdentifier("Anything")); + EXPECT_FALSE(model.GetIndexOfIdentifier("Anything").has_value()); EXPECT_EQ(profile1.guid(), model.GetItemIdentifierAt(2)); EXPECT_EQ(profile2.guid(), model.GetItemIdentifierAt(3)); - EXPECT_EQ(2, model.GetIndexOfIdentifier(profile1.guid())); - EXPECT_EQ(3, model.GetIndexOfIdentifier(profile2.guid())); + EXPECT_EQ(2u, model.GetIndexOfIdentifier(profile1.guid())); + EXPECT_EQ(3u, model.GetIndexOfIdentifier(profile2.guid())); EXPECT_EQ(3u, model.GetDefaultIndex()); } @@ -78,20 +78,19 @@ test_personal_data_manager.AddProfile(profile1); AddressComboboxModel model(test_personal_data_manager, kAppLocale, ""); - EXPECT_EQ(3, model.GetItemCount()); + EXPECT_EQ(3u, model.GetItemCount()); EXPECT_EQ(profile1.guid(), model.GetItemIdentifierAt(2)); - EXPECT_EQ(2, model.GetIndexOfIdentifier(profile1.guid())); + EXPECT_EQ(2u, model.GetIndexOfIdentifier(profile1.guid())); AutofillProfile profile2(test::GetFullProfile2()); - int new_profile_index = model.AddNewProfile(profile2); - EXPECT_EQ(3, new_profile_index); - EXPECT_EQ(4, model.GetItemCount()); + EXPECT_EQ(3u, model.AddNewProfile(profile2)); + EXPECT_EQ(4u, model.GetItemCount()); EXPECT_EQ(profile2.guid(), model.GetItemIdentifierAt(3)); - EXPECT_EQ(3, model.GetIndexOfIdentifier(profile2.guid())); + EXPECT_EQ(3u, model.GetIndexOfIdentifier(profile2.guid())); // First profile shouldn't have changed, here the order is guaranteed. EXPECT_EQ(profile1.guid(), model.GetItemIdentifierAt(2)); - EXPECT_EQ(2, model.GetIndexOfIdentifier(profile1.guid())); + EXPECT_EQ(2u, model.GetIndexOfIdentifier(profile1.guid())); } } // namespace autofill
diff --git a/components/autofill/core/browser/ui/country_combobox_model.cc b/components/autofill/core/browser/ui/country_combobox_model.cc index 2716013f..fbd39e6 100644 --- a/components/autofill/core/browser/ui/country_combobox_model.cc +++ b/components/autofill/core/browser/ui/country_combobox_model.cc
@@ -75,11 +75,11 @@ std::back_inserter(countries_)); } -int CountryComboboxModel::GetItemCount() const { +size_t CountryComboboxModel::GetItemCount() const { return countries_.size(); } -std::u16string CountryComboboxModel::GetItemAt(int index) const { +std::u16string CountryComboboxModel::GetItemAt(size_t index) const { AutofillCountry* country = countries_[index].get(); if (country) return countries_[index]->name(); @@ -89,7 +89,7 @@ return u"---"; } -bool CountryComboboxModel::IsItemSeparatorAt(int index) const { +bool CountryComboboxModel::IsItemSeparatorAt(size_t index) const { return !countries_[index]; }
diff --git a/components/autofill/core/browser/ui/country_combobox_model.h b/components/autofill/core/browser/ui/country_combobox_model.h index 873d483..a9260126 100644 --- a/components/autofill/core/browser/ui/country_combobox_model.h +++ b/components/autofill/core/browser/ui/country_combobox_model.h
@@ -38,9 +38,9 @@ const std::string& app_locale); // ui::ComboboxModel implementation: - int GetItemCount() const override; - std::u16string GetItemAt(int index) const override; - bool IsItemSeparatorAt(int index) const override; + size_t GetItemCount() const override; + std::u16string GetItemAt(size_t index) const override; + bool IsItemSeparatorAt(size_t index) const override; // The list of countries always has the default country at the top as well as // within the sorted vector.
diff --git a/components/autofill/core/browser/ui/country_combobox_model_unittest.cc b/components/autofill/core/browser/ui/country_combobox_model_unittest.cc index 1e5c531..f00d722 100644 --- a/components/autofill/core/browser/ui/country_combobox_model_unittest.cc +++ b/components/autofill/core/browser/ui/country_combobox_model_unittest.cc
@@ -50,7 +50,7 @@ TEST_F(CountryComboboxModelTest, AllCountriesHaveComponents) { ::i18n::addressinput::Localization localization; std::string unused; - for (int i = 0; i < model()->GetItemCount(); ++i) { + for (size_t i = 0; i < model()->GetItemCount(); ++i) { if (model()->IsItemSeparatorAt(i)) continue;
diff --git a/components/autofill/core/browser/ui/region_combobox_model.cc b/components/autofill/core/browser/ui/region_combobox_model.cc index 42626aff..df17223 100644 --- a/components/autofill/core/browser/ui/region_combobox_model.cc +++ b/components/autofill/core/browser/ui/region_combobox_model.cc
@@ -37,18 +37,15 @@ weak_factory_.GetWeakPtr())); } -int RegionComboboxModel::GetItemCount() const { +size_t RegionComboboxModel::GetItemCount() const { // The combobox view needs to always have at least one item. If the regions // have not been completely loaded yet, we display a single "loading" item. - if (regions_.size() == 0) - return 1; - return regions_.size(); + return std::max(regions_.size(), size_t{1}); } -std::u16string RegionComboboxModel::GetItemAt(int index) const { - DCHECK_GE(index, 0); +std::u16string RegionComboboxModel::GetItemAt(size_t index) const { // This might happen because of the asynchronous nature of the data. - if (static_cast<size_t>(index) >= regions_.size()) + if (index >= regions_.size()) return l10n_util::GetStringUTF16(IDS_AUTOFILL_LOADING_REGIONS); if (!regions_[index].second.empty()) @@ -59,12 +56,8 @@ return u"---"; } -bool RegionComboboxModel::IsItemSeparatorAt(int index) const { - // This might happen because of the asynchronous nature of the data. - DCHECK_GE(index, 0); - if (static_cast<size_t>(index) >= regions_.size()) - return false; - return regions_[index].first.empty(); +bool RegionComboboxModel::IsItemSeparatorAt(size_t index) const { + return index < regions_.size() && regions_[index].first.empty(); } void RegionComboboxModel::OnRegionDataLoaded(
diff --git a/components/autofill/core/browser/ui/region_combobox_model.h b/components/autofill/core/browser/ui/region_combobox_model.h index 52cffd5..ead471d 100644 --- a/components/autofill/core/browser/ui/region_combobox_model.h +++ b/components/autofill/core/browser/ui/region_combobox_model.h
@@ -51,9 +51,9 @@ } // ui::ComboboxModel implementation: - int GetItemCount() const override; - std::u16string GetItemAt(int index) const override; - bool IsItemSeparatorAt(int index) const override; + size_t GetItemCount() const override; + std::u16string GetItemAt(size_t index) const override; + bool IsItemSeparatorAt(size_t index) const override; private: // Callback for the RegionDataLoader.
diff --git a/components/autofill/core/browser/ui/region_combobox_model_unittest.cc b/components/autofill/core/browser/ui/region_combobox_model_unittest.cc index 3c018e2..6984b134c 100644 --- a/components/autofill/core/browser/ui/region_combobox_model_unittest.cc +++ b/components/autofill/core/browser/ui/region_combobox_model_unittest.cc
@@ -38,7 +38,7 @@ test_region_data_loader.SendAsynchronousData(regions); - EXPECT_EQ(3, model.GetItemCount()); + EXPECT_EQ(3u, model.GetItemCount()); EXPECT_EQ(u"---", model.GetItemAt(0)); EXPECT_EQ(kQuebecName16, model.GetItemAt(1)); EXPECT_EQ(kOntarioName16, model.GetItemAt(2)); @@ -54,7 +54,7 @@ std::vector<std::pair<std::string, std::string>>()); // There's always 1 item, even in failure cases. - EXPECT_EQ(1, model.GetItemCount()); + EXPECT_EQ(1u, model.GetItemCount()); EXPECT_TRUE(model.failed_to_load_data()); }
diff --git a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantBottomBarCoordinator.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantBottomBarCoordinator.java index 00cb90c..cdaf867 100644 --- a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantBottomBarCoordinator.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantBottomBarCoordinator.java
@@ -268,8 +268,6 @@ updateVisualViewportHeight(); } else if (AssistantModel.PEEK_MODE_DISABLED == propertyKey) { mContent.setPeekModeDisabled(model.get(AssistantModel.PEEK_MODE_DISABLED)); - } else if (AssistantModel.HANDLE_BACK_PRESS == propertyKey) { - mContent.setHandleBackPress(model.get(AssistantModel.HANDLE_BACK_PRESS)); } });
diff --git a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantBottomSheetContent.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantBottomSheetContent.java index d31d961..d7c4ee7 100644 --- a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantBottomSheetContent.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantBottomSheetContent.java
@@ -12,9 +12,9 @@ import androidx.annotation.Nullable; import org.chromium.base.Callback; -import org.chromium.base.supplier.ObservableSupplierImpl; import org.chromium.base.supplier.Supplier; import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent; +import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; /** * The {@link BottomSheetContent} for the Autofill Assistant. It supports notifying the @@ -28,10 +28,9 @@ private ScrollView mContentScrollableView; private Supplier<AssistantBottomBarDelegate> mBottomBarDelegateSupplier; private boolean mPeekModeDisabled; + private BottomSheetController mController; @Nullable private Callback<Integer> mOffsetController; - private final ObservableSupplierImpl<Boolean> mBackPressStateChangedSupplier = - new ObservableSupplierImpl<>(); public AssistantBottomSheetContent( Context context, Supplier<AssistantBottomBarDelegate> supplier) { @@ -58,15 +57,6 @@ mBottomBarDelegateSupplier = supplier; } - /** - * Initialize or update back press handling behavior by sheet content ahead-of-time. If never - * invoked after content initialization, it will be assumed that sheet content will not handle a - * back press. - */ - public void setHandleBackPress(boolean handleBackPress) { - mBackPressStateChangedSupplier.set(handleBackPress); - } - public void setPeekModeDisabled(boolean disabled) { mPeekModeDisabled = disabled; } @@ -167,18 +157,6 @@ } @Override - public ObservableSupplierImpl<Boolean> getBackPressStateChangedSupplier() { - return mBackPressStateChangedSupplier; - } - - @Override - public void onBackPressed() { - if (mBottomBarDelegateSupplier.get() != null) { - mBottomBarDelegateSupplier.get().onBackButtonPressed(); - } - } - - @Override public boolean contentControlsOffset() { return true; }
diff --git a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantModel.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantModel.java index 042e07b0..7d9a7d8 100644 --- a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantModel.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantModel.java
@@ -38,8 +38,6 @@ static final WritableObjectPropertyKey<WebContents> WEB_CONTENTS = new WritableObjectPropertyKey<>(); - static final WritableBooleanPropertyKey HANDLE_BACK_PRESS = new WritableBooleanPropertyKey(); - private final AssistantOverlayModel mOverlayModel; private final AssistantHeaderModel mHeaderModel = new AssistantHeaderModel(); private final AssistantDetailsModel mDetailsModel = new AssistantDetailsModel(); @@ -58,7 +56,7 @@ AssistantModel(AssistantOverlayModel overlayModel) { super(ALLOW_SOFT_KEYBOARD, ALLOW_TALKBACK_ON_WEBSITE, BOTTOM_BAR_DELEGATE, BOTTOM_SHEET_STATE, TALKBACK_SHEET_SIZE_FRACTION, VISIBLE, PEEK_MODE_DISABLED, - WEB_CONTENTS, HANDLE_BACK_PRESS); + WEB_CONTENTS); mOverlayModel = overlayModel; } @@ -157,9 +155,4 @@ private void setWebContents(WebContents contents) { set(WEB_CONTENTS, contents); } - - @CalledByNative - private void setHandleBackPress(boolean handleBackPress) { - set(HANDLE_BACK_PRESS, handleBackPress); - } }
diff --git a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/onboarding/BottomSheetOnboardingCoordinator.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/onboarding/BottomSheetOnboardingCoordinator.java index 6096360..0275f8e 100644 --- a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/onboarding/BottomSheetOnboardingCoordinator.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/onboarding/BottomSheetOnboardingCoordinator.java
@@ -141,7 +141,6 @@ } else { mContent = new AssistantBottomSheetContent(getContext(), () -> delegate); } - mContent.setHandleBackPress(true); } @Override
diff --git a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/trigger_scripts/AssistantTriggerScript.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/trigger_scripts/AssistantTriggerScript.java index 832359e..a00d7938 100644 --- a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/trigger_scripts/AssistantTriggerScript.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/trigger_scripts/AssistantTriggerScript.java
@@ -304,9 +304,6 @@ if (scrollToHide) enableScrollToHide(); - if (mContent != null) { - mContent.setHandleBackPress(true); - } return true; } @@ -314,9 +311,6 @@ disableScrollToHide(); mBottomSheetController.removeObserver(mBottomSheetObserver); mBottomSheetController.hideContent(mContent, /* animate = */ mAnimateBottomSheet); - if (mContent != null) { - mContent.setHandleBackPress(false); - } mResizeVisualViewport = false; updateVisualViewportHeight(); }
diff --git a/components/autofill_assistant/browser/android/ui_controller_android.cc b/components/autofill_assistant/browser/android/ui_controller_android.cc index e7f1e362..6bf279f 100644 --- a/components/autofill_assistant/browser/android/ui_controller_android.cc +++ b/components/autofill_assistant/browser/android/ui_controller_android.cc
@@ -382,10 +382,6 @@ UpdateActions(ui_delegate_->GetUserActions()); AutofillAssistantState state = execution_delegate_->GetState(); - Java_AssistantModel_setHandleBackPress( - AttachCurrentThread(), GetModel(), - state != AutofillAssistantState::BROWSE); - bool should_prompt_action_expand_sheet = ui_delegate_->ShouldPromptActionExpandSheet(); switch (state) {
diff --git a/components/autofill_assistant/browser/controller.cc b/components/autofill_assistant/browser/controller.cc index 2993311..ac11864 100644 --- a/components/autofill_assistant/browser/controller.cc +++ b/components/autofill_assistant/browser/controller.cc
@@ -509,9 +509,14 @@ periodic_script_check_count_--; } - if (periodic_script_check_count_ <= 0 && !allow_autostart()) { + if (periodic_script_check_count_ <= 0 && + (!allow_autostart() || autostart_timeout_script_path_.empty())) { DCHECK_EQ(0, periodic_script_check_count_); periodic_script_check_scheduled_ = false; + + if (allow_autostart()) { + OnNoRunnableScriptsForPage(); + } return; }
diff --git a/components/autofill_assistant/browser/controller_unittest.cc b/components/autofill_assistant/browser/controller_unittest.cc index e8d239e4..13763b5b 100644 --- a/components/autofill_assistant/browser/controller_unittest.cc +++ b/components/autofill_assistant/browser/controller_unittest.cc
@@ -792,6 +792,34 @@ } } +TEST_F(ControllerTest, ScriptTimeoutGiveUp) { + // Wait for #element to show up for will_never_match. After 2s, give up. + SupportsScriptResponseProto script_response; + ClientSettingsProto* client_settings_proto = + script_response.mutable_client_settings(); + client_settings_proto->set_periodic_script_check_count(2); + client_settings_proto->set_periodic_script_check_interval_ms(1000); + *AddRunnableScript(&script_response, "will_never_match") + ->mutable_presentation() + ->mutable_precondition() + ->mutable_element_condition() + ->mutable_match() = ToSelectorProto("#element"); + SetNextScriptResponse(script_response); + + EXPECT_CALL(*mock_service_, GetActions).Times(0); + Start("http://a.example.com/path"); + EXPECT_EQ(AutofillAssistantState::STARTING, controller_->GetState()); + + // Still ok after one check / one second. + task_environment()->FastForwardBy(base::Seconds(1)); + EXPECT_EQ(AutofillAssistantState::STARTING, controller_->GetState()); + + // After two seconds, the last periodic check finishes and the controller + // stops. + task_environment()->FastForwardBy(base::Seconds(1)); + EXPECT_EQ(AutofillAssistantState::STOPPED, controller_->GetState()); +} + TEST_F(ControllerTest, SuccessfulNavigation) { EXPECT_FALSE(controller_->IsNavigatingToNewDocument()); EXPECT_FALSE(controller_->HasNavigationError());
diff --git a/components/browser_ui/bottomsheet/android/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheet.java b/components/browser_ui/bottomsheet/android/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheet.java index 90c9cc3..8b99f79b 100644 --- a/components/browser_ui/bottomsheet/android/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheet.java +++ b/components/browser_ui/bottomsheet/android/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheet.java
@@ -352,8 +352,14 @@ mContainerHeight = bottom - top; if (previousWidth != mContainerWidth || previousHeight != mContainerHeight) { - if (mCurrentState == SheetState.HALF && !isHalfStateEnabled()) { - setSheetState(SheetState.FULL, false); + if (!isHalfStateEnabled()) { + if (mCurrentState == SheetState.HALF) { + setSheetState(SheetState.FULL, false); + } else if (mCurrentState == SheetState.SCROLLING + && mTargetState == SheetState.HALF) { + // Let the animation resume to the full height. + mTargetState = SheetState.FULL; + } } invalidateContentDesiredHeight(); sizeAndPositionSheetInParent();
diff --git a/components/browser_ui/bottomsheet/android/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl.java b/components/browser_ui/bottomsheet/android/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl.java index 38b678d..4c52f4c 100644 --- a/components/browser_ui/bottomsheet/android/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl.java +++ b/components/browser_ui/bottomsheet/android/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl.java
@@ -624,6 +624,8 @@ /** * Update the supplier to hold true when the sheet is in a valid state and holds sheet content, * and when there are no suppression tokens, false otherwise. + * TODO (crbug.com/1279941): Account for sheet content back press handling and #isSheetOpen + * after sheet content refactor. */ private void updateBackPressStateChangedSupplier() { mBackPressStateChangedSupplier.set(mBottomSheet != null && !mSuppressionTokens.hasTokens()
diff --git a/components/browser_ui/bottomsheet/android/java/res/layout/bottom_sheet.xml b/components/browser_ui/bottomsheet/android/java/res/layout/bottom_sheet.xml index 69f25388..974195f1 100644 --- a/components/browser_ui/bottomsheet/android/java/res/layout/bottom_sheet.xml +++ b/components/browser_ui/bottomsheet/android/java/res/layout/bottom_sheet.xml
@@ -23,11 +23,14 @@ android:background="@drawable/bottom_sheet_background" /> <org.chromium.components.browser_ui.bottomsheet.TouchRestrictingFrameLayout + android:importantForAccessibility="yes" android:id="@+id/bottom_sheet_content" android:layout_width="match_parent" android:layout_height="match_parent" /> <FrameLayout + android:importantForAccessibility="yes" + android:accessibilityTraversalBefore="@id/bottom_sheet_content" android:id="@+id/bottom_sheet_control_container" android:layout_width="match_parent" android:layout_height="wrap_content" >
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json index 43aec76..0e05c78 100644 --- a/components/certificate_transparency/data/log_list.json +++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@ { - "version": "10.42", - "log_list_timestamp": "2022-07-14T12:54:48Z", + "version": "10.43", + "log_list_timestamp": "2022-07-15T12:55:12Z", "operators": [ { "name": "Google",
diff --git a/components/device_signals/core/browser/signals_types.h b/components/device_signals/core/browser/signals_types.h index 2c3c59f..ae7792f 100644 --- a/components/device_signals/core/browser/signals_types.h +++ b/components/device_signals/core/browser/signals_types.h
@@ -59,7 +59,7 @@ // If set, represents a collection error that occurred while getting the // signal. - absl::optional<SignalCollectionError> collection_error; + absl::optional<SignalCollectionError> collection_error = absl::nullopt; }; #if BUILDFLAG(IS_WIN) @@ -71,7 +71,7 @@ ~AntiVirusSignalResponse() override; - std::vector<AvProduct> av_products; + std::vector<AvProduct> av_products{}; }; struct HotfixSignalResponse : BaseSignalResponse { @@ -82,7 +82,7 @@ ~HotfixSignalResponse() override; - std::vector<InstalledHotfix> hotfixes; + std::vector<InstalledHotfix> hotfixes{}; }; #endif // BUILDFLAG(IS_WIN) @@ -94,7 +94,7 @@ ~FileSystemInfoResponse() override; - std::vector<FileSystemItem> file_system_items; + std::vector<FileSystemItem> file_system_items{}; }; // Request struct containing properties that will be used by the @@ -110,14 +110,14 @@ ~SignalsAggregationRequest(); // Information about the user for whom these signals are collected. - UserContext user_context; + UserContext user_context{}; // Names of the signals that need to be collected. - std::unordered_set<SignalName> signal_names; + std::unordered_set<SignalName> signal_names{}; // Parameters required when requesting the collection of signals living on // the device's file system. - std::vector<GetFileSystemInfoOptions> file_system_signal_parameters; + std::vector<GetFileSystemInfoOptions> file_system_signal_parameters{}; bool operator==(const SignalsAggregationRequest& other) const; }; @@ -135,13 +135,14 @@ // If set, represents an error that occurred before any signal could be // collected. - absl::optional<SignalCollectionError> top_level_error; + absl::optional<SignalCollectionError> top_level_error = absl::nullopt; #if BUILDFLAG(IS_WIN) - absl::optional<AntiVirusSignalResponse> av_signal_response; - absl::optional<HotfixSignalResponse> hotfix_signal_response; + absl::optional<AntiVirusSignalResponse> av_signal_response = absl::nullopt; + absl::optional<HotfixSignalResponse> hotfix_signal_response = absl::nullopt; #endif // BUILDFLAG(IS_WIN) - absl::optional<FileSystemInfoResponse> file_system_info_response; + absl::optional<FileSystemInfoResponse> file_system_info_response = + absl::nullopt; }; } // namespace device_signals
diff --git a/components/device_signals/core/common/base_platform_delegate.cc b/components/device_signals/core/common/base_platform_delegate.cc index af30959..e885d94 100644 --- a/components/device_signals/core/common/base_platform_delegate.cc +++ b/components/device_signals/core/common/base_platform_delegate.cc
@@ -13,10 +13,6 @@ BasePlatformDelegate::BasePlatformDelegate() = default; BasePlatformDelegate::~BasePlatformDelegate() = default; -bool BasePlatformDelegate::PathExists(const base::FilePath& file_path) const { - return base::PathExists(file_path); -} - bool BasePlatformDelegate::PathIsReadable( const base::FilePath& file_path) const { return base::PathIsReadable(file_path);
diff --git a/components/device_signals/core/common/base_platform_delegate.h b/components/device_signals/core/common/base_platform_delegate.h index 767a828..6d41a43e 100644 --- a/components/device_signals/core/common/base_platform_delegate.h +++ b/components/device_signals/core/common/base_platform_delegate.h
@@ -16,7 +16,6 @@ ~BasePlatformDelegate() override; // PlatformDelegate: - bool PathExists(const base::FilePath& file_path) const override; bool PathIsReadable(const base::FilePath& file_path) const override; bool DirectoryExists(const base::FilePath& file_path) const override;
diff --git a/components/device_signals/core/common/base_platform_delegate_unittest.cc b/components/device_signals/core/common/base_platform_delegate_unittest.cc index 84f445677..47330d1 100644 --- a/components/device_signals/core/common/base_platform_delegate_unittest.cc +++ b/components/device_signals/core/common/base_platform_delegate_unittest.cc
@@ -51,7 +51,6 @@ // Sanity checks for functions that wrap base namespace functions. Only tests // success cases as underlying functions are tested on their own. TEST_F(BasePlatformDelegateTest, SanityChecks) { - EXPECT_TRUE(platform_delegate_.PathExists(file_path_)); EXPECT_TRUE(platform_delegate_.PathIsReadable(file_path_)); EXPECT_FALSE(platform_delegate_.DirectoryExists(file_path_)); EXPECT_TRUE(platform_delegate_.DirectoryExists(scoped_dir_.GetPath()));
diff --git a/components/device_signals/core/common/common_types.h b/components/device_signals/core/common/common_types.h index e6a3261..27434b7 100644 --- a/components/device_signals/core/common/common_types.h +++ b/components/device_signals/core/common/common_types.h
@@ -27,20 +27,20 @@ // Is true if the file for which this payload was generated is indeed an // executable. If this is false, all of the other properties will be // absl::nullopt. - bool is_executable; + bool is_executable = false; // Is true if a currently running process was spawned from this file. - absl::optional<bool> is_running; + absl::optional<bool> is_running = absl::nullopt; // SHA256 hash of the public key of the certificate used to sign the // executable. - absl::optional<std::string> public_key_sha256; + absl::optional<std::string> public_key_sha256 = absl::nullopt; // Product name of this executable. - absl::optional<std::string> product_name; + absl::optional<std::string> product_name = absl::nullopt; // Version of this executable. - absl::optional<std::string> version; + absl::optional<std::string> version = absl::nullopt; bool operator==(const ExecutableMetadata& other) const; }; @@ -54,20 +54,20 @@ ~FileSystemItem(); // Path to the file system object for whom those signals were collected. - base::FilePath file_path; + base::FilePath file_path{}; // Value indicating whether the specific resource could be found or not. - PresenceValue presence; + PresenceValue presence = PresenceValue::kUnspecified; // SHA256 hash of a file’s bytes. Ignored when `path` points to a // directory. Collected only when `compute_sha256` is set to true in the // corresponding GetFileSystemInfoOptions parameter. - absl::optional<std::string> sha256_hash; + absl::optional<std::string> sha256_hash = absl::nullopt; // Set of properties only relevant for executable files. Will only be // collected if computeIsExecutable is set to true in the given signals // collection parameters and if `path` points to an executable file. - absl::optional<ExecutableMetadata> executable_metadata; + absl::optional<ExecutableMetadata> executable_metadata = absl::nullopt; bool operator==(const FileSystemItem& other) const; }; @@ -80,11 +80,11 @@ ~GetFileSystemInfoOptions(); - base::FilePath file_path; + base::FilePath file_path{}; - bool compute_sha256; + bool compute_sha256 = false; - bool compute_is_executable; + bool compute_is_executable = false; bool operator==(const GetFileSystemInfoOptions& other) const; };
diff --git a/components/device_signals/core/common/file_system_service.cc b/components/device_signals/core/common/file_system_service.cc index 3c04806..3e4eb2d 100644 --- a/components/device_signals/core/common/file_system_service.cc +++ b/components/device_signals/core/common/file_system_service.cc
@@ -67,16 +67,12 @@ base::FilePath local_resolved_path; if (delegate_->ResolveFilePath(original_file_path, &local_resolved_path)) { *resolved_file_path = local_resolved_path; - if (delegate_->PathExists(local_resolved_path)) { - if (delegate_->PathIsReadable(local_resolved_path)) { - return PresenceValue::kFound; - } - return PresenceValue::kAccessDenied; + if (delegate_->PathIsReadable(local_resolved_path)) { + return PresenceValue::kFound; } - return PresenceValue::kNotFound; + return PresenceValue::kAccessDenied; } - - return PresenceValue::kUnspecified; + return PresenceValue::kNotFound; } } // namespace device_signals
diff --git a/components/device_signals/core/common/file_system_service_unittest.cc b/components/device_signals/core/common/file_system_service_unittest.cc index 4d58744..cd6d001 100644 --- a/components/device_signals/core/common/file_system_service_unittest.cc +++ b/components/device_signals/core/common/file_system_service_unittest.cc
@@ -56,11 +56,6 @@ })); } - void ExpectPathExists(const base::FilePath& path) { - EXPECT_CALL(*mock_platform_delegate_, PathExists(path)) - .WillOnce(Return(true)); - } - void ExpectPathIsReadable(const base::FilePath& path) { EXPECT_CALL(*mock_platform_delegate_, PathIsReadable(path)) .WillOnce(Return(true)); @@ -78,20 +73,11 @@ ResolveFilePath(unresolvable_file_path, _)) .WillOnce(Return(false)); - base::FilePath not_found_path = - base::FilePath::FromUTF8Unsafe("/cannot/find"); - base::FilePath not_found_path_resolved = - base::FilePath::FromUTF8Unsafe("/cannot/find/resolved"); - ExpectResolvablePath(not_found_path, not_found_path_resolved); - EXPECT_CALL(*mock_platform_delegate_, PathExists(not_found_path_resolved)) - .WillOnce(Return(false)); - base::FilePath access_denied_path = base::FilePath::FromUTF8Unsafe("/cannot/access"); base::FilePath access_denied_path_resolved = base::FilePath::FromUTF8Unsafe("/cannot/access/resolved"); ExpectResolvablePath(access_denied_path, access_denied_path_resolved); - ExpectPathExists(access_denied_path_resolved); EXPECT_CALL(*mock_platform_delegate_, PathIsReadable(access_denied_path_resolved)) .WillOnce(Return(false)); @@ -100,18 +86,16 @@ base::FilePath found_path_resolved = base::FilePath::FromUTF8Unsafe("/found/resolved"); ExpectResolvablePath(found_path, found_path_resolved); - ExpectPathExists(found_path_resolved); ExpectPathIsReadable(found_path_resolved); std::vector<GetFileSystemInfoOptions> options; options.push_back(CreateOptions(unresolvable_file_path, false, false)); - options.push_back(CreateOptions(not_found_path, false, false)); options.push_back(CreateOptions(access_denied_path, false, false)); options.push_back(CreateOptions(found_path, false, false)); std::array<PresenceValue, 4> expected_presence_values{ - PresenceValue::kUnspecified, PresenceValue::kNotFound, - PresenceValue::kAccessDenied, PresenceValue::kFound}; + PresenceValue::kNotFound, PresenceValue::kAccessDenied, + PresenceValue::kFound}; auto file_system_items = file_system_service_->GetSignals(options);
diff --git a/components/device_signals/core/common/mock_platform_delegate.h b/components/device_signals/core/common/mock_platform_delegate.h index 6721766..fce6c41 100644 --- a/components/device_signals/core/common/mock_platform_delegate.h +++ b/components/device_signals/core/common/mock_platform_delegate.h
@@ -17,7 +17,6 @@ MockPlatformDelegate(); ~MockPlatformDelegate() override; - MOCK_METHOD(bool, PathExists, (const base::FilePath&), (const override)); MOCK_METHOD(bool, PathIsReadable, (const base::FilePath&), (const override)); MOCK_METHOD(bool, DirectoryExists, (const base::FilePath&), (const override)); MOCK_METHOD(bool,
diff --git a/components/device_signals/core/common/platform_delegate.h b/components/device_signals/core/common/platform_delegate.h index 8c45918..5b563e3c 100644 --- a/components/device_signals/core/common/platform_delegate.h +++ b/components/device_signals/core/common/platform_delegate.h
@@ -20,13 +20,13 @@ // Wrapper functions around implementation in base/files/file_util.h to allow // mocking in tests. - virtual bool PathExists(const base::FilePath& file_path) const = 0; virtual bool PathIsReadable(const base::FilePath& file_path) const = 0; virtual bool DirectoryExists(const base::FilePath& file_path) const = 0; // Resolves environment variables and relative markers in `file_path`, and // returns the absolute path via `resolved_file_path`. Returns true if - // successful. + // successful. For consistency on all platforms, this method will return false + // if no file system item resides at the end path. virtual bool ResolveFilePath(const base::FilePath& file_path, base::FilePath* resolved_file_path) = 0;
diff --git a/components/device_signals/core/common/win/win_types.h b/components/device_signals/core/common/win/win_types.h index 9f9748b..a90b01c 100644 --- a/components/device_signals/core/common/win/win_types.h +++ b/components/device_signals/core/common/win/win_types.h
@@ -23,13 +23,13 @@ // On Win7 and below, this can be retrieve by an undocumented method in WMI, // which goes through the SecurityCenter2 WMI server. struct AvProduct { - std::string display_name; - AvProductState state; + std::string display_name{}; + AvProductState state = AvProductState::kOff; // Although not present on the documentation, IWscProduct exposes a // `get_ProductGuid` function to retrieve an GUID representing an Antivirus // software. - std::string product_id; + std::string product_id{}; bool operator==(const AvProduct& other) const; @@ -41,7 +41,7 @@ // In WMI, this value represents the `HotFixID` property from entries in // "Win32_QuickFixEngineering". They have a format looking like `KB123123`. // https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/win32-quickfixengineering - std::string hotfix_id; + std::string hotfix_id{}; bool operator==(const InstalledHotfix& other) const;
diff --git a/components/device_signals/core/system_signals/win/BUILD.gn b/components/device_signals/core/system_signals/win/BUILD.gn index 4641f16..394eae6 100644 --- a/components/device_signals/core/system_signals/win/BUILD.gn +++ b/components/device_signals/core/system_signals/win/BUILD.gn
@@ -50,6 +50,7 @@ source_set("unit_tests") { testonly = true sources = [ + "win_platform_delegate_unittest.cc", "wmi_client_impl_unittest.cc", "wsc_client_impl_unittest.cc", ]
diff --git a/components/device_signals/core/system_signals/win/win_platform_delegate.cc b/components/device_signals/core/system_signals/win/win_platform_delegate.cc index 40e4801d..1007855 100644 --- a/components/device_signals/core/system_signals/win/win_platform_delegate.cc +++ b/components/device_signals/core/system_signals/win/win_platform_delegate.cc
@@ -7,6 +7,7 @@ #include <windows.h> #include "base/files/file_path.h" +#include "base/files/file_util.h" #include "base/strings/string_util.h" #include "components/device_signals/core/common/common_types.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -49,7 +50,12 @@ return false; } - *resolved_file_path = base::FilePath(expanded_path_wstring.value()); + auto expanded_file_path = base::FilePath(expanded_path_wstring.value()); + if (!base::PathExists(expanded_file_path)) { + return false; + } + + *resolved_file_path = base::MakeAbsoluteFilePath(expanded_file_path); return true; }
diff --git a/components/device_signals/core/system_signals/win/win_platform_delegate_unittest.cc b/components/device_signals/core/system_signals/win/win_platform_delegate_unittest.cc new file mode 100644 index 0000000..8e6f82a0 --- /dev/null +++ b/components/device_signals/core/system_signals/win/win_platform_delegate_unittest.cc
@@ -0,0 +1,80 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/device_signals/core/system_signals/win/win_platform_delegate.h" + +#include <array> + +#include "base/environment.h" +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/files/scoped_temp_dir.h" +#include "base/strings/strcat.h" +#include "base/strings/string_util.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace device_signals { + +namespace { + +// Using regular strings instead of file path literals as they will be used +// to construct all sorts of file paths, and also non-file-paths. +constexpr char kEnvironmentVariableName[] = "TestEnvironmentVariablePath"; +constexpr char kTestFileName[] = "test_file"; + +constexpr base::FilePath::CharType kInexistantFileName[] = + FILE_PATH_LITERAL("does_not_exit"); + +} // namespace + +class WinPlatformDelegateTest : public testing::Test { + protected: + WinPlatformDelegateTest() : env_(base::Environment::Create()) { + EXPECT_TRUE(scoped_dir_.CreateUniqueTempDir()); + absolute_file_path_ = scoped_dir_.GetPath().Append( + base::FilePath::FromUTF8Unsafe(kTestFileName)); + EXPECT_TRUE( + base::WriteFile(absolute_file_path_, "irrelevant file content")); + + env_->SetVar(kEnvironmentVariableName, + scoped_dir_.GetPath().AsUTF8Unsafe()); + } + + ~WinPlatformDelegateTest() override { + env_->UnSetVar(kEnvironmentVariableName); + } + + base::ScopedTempDir scoped_dir_; + base::FilePath absolute_file_path_; + std::unique_ptr<base::Environment> env_; + WinPlatformDelegate platform_delegate_; +}; + +TEST_F(WinPlatformDelegateTest, ResolveFilePath_Success) { + std::string directory_name = scoped_dir_.GetPath().BaseName().AsUTF8Unsafe(); + + std::array<std::string, 4> test_cases = { + absolute_file_path_.AsUTF8Unsafe(), + base::StrCat({"%", kEnvironmentVariableName, "%\\", kTestFileName}), + base::StrCat({"%", kEnvironmentVariableName, "%\\..\\", directory_name, + "\\", kTestFileName}), + + // Should work with directories too. + scoped_dir_.GetPath().AsUTF8Unsafe()}; + + for (const auto& test_case : test_cases) { + base::FilePath resolved_fp; + EXPECT_TRUE(platform_delegate_.ResolveFilePath( + base::FilePath::FromUTF8Unsafe(test_case), &resolved_fp)); + } +} + +TEST_F(WinPlatformDelegateTest, ResolveFilePath_Fail) { + base::FilePath resolved_fp; + EXPECT_FALSE(platform_delegate_.ResolveFilePath( + scoped_dir_.GetPath().Append(kInexistantFileName), &resolved_fp)); + EXPECT_EQ(resolved_fp, base::FilePath()); +} + +} // namespace device_signals
diff --git a/components/password_manager/core/browser/sync/password_sync_bridge.cc b/components/password_manager/core/browser/sync/password_sync_bridge.cc index 352da3a..13a17d1 100644 --- a/components/password_manager/core/browser/sync/password_sync_bridge.cc +++ b/components/password_manager/core/browser/sync/password_sync_bridge.cc
@@ -53,8 +53,13 @@ // Reading successful but cleaning initiated in order to force initial sync. // This will clean undecryptable passwords. kReadSuccessButCleared = 3, + // Reading successful, but the base entity specifics cache contains proto + // fields supported in the current browser version. The cache is meant to only + // preserve unsupported fields, hence the initial sync flow is forced to + // resolve this incosistency. + kNewlySupportedFieldDetectedInUnsupportedFieldsCache = 4, - kMaxValue = kReadSuccessButCleared, + kMaxValue = kNewlySupportedFieldDetectedInUnsupportedFieldsCache, }; std::string ComputeClientTag( @@ -265,6 +270,8 @@ // the local model. password_store_sync_->GetMetadataStore()->DeleteAllSyncMetadata(); batch = std::make_unique<syncer::MetadataBatch>(); + sync_metadata_read_error = SyncMetadataReadError:: + kNewlySupportedFieldDetectedInUnsupportedFieldsCache; } } base::UmaHistogramEnumeration("PasswordManager.SyncMetadataReadError", @@ -887,8 +894,6 @@ .client_only_encrypted_data(); } -// TODO(crbug.com/1296159): Consider moving this logic to processor. If not -// moved, add a metric for read errors where this function is being called. bool PasswordSyncBridge::SyncMetadataCacheContainsSupportedFields( const syncer::EntityMetadataMap& metadata_map) const { for (const auto& metadata_entry : metadata_map) {
diff --git a/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc b/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc index 8889dff..a267fd27 100644 --- a/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc +++ b/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc
@@ -890,6 +890,7 @@ TEST_F(PasswordSyncBridgeTest, ShouldRemoveSyncMetadataWhenSpecificsCacheContainsSupportedFields) { + base::HistogramTester histogram_tester; base::test::ScopedFeatureList feature_list; feature_list.InitAndEnableFeature( syncer::kCacheBaseEntitySpecificsInMetadata); @@ -920,6 +921,9 @@ auto bridge = std::make_unique<PasswordSyncBridge>( mock_processor().CreateForwardingProcessor(), mock_password_store_sync(), base::DoNothing()); + + histogram_tester.ExpectUniqueSample("PasswordManager.SyncMetadataReadError", + 4, 1); } TEST_F(
diff --git a/components/policy/core/browser/browser_policy_connector.cc b/components/policy/core/browser/browser_policy_connector.cc index 877cb99..62ec6b3 100644 --- a/components/policy/core/browser/browser_policy_connector.cc +++ b/components/policy/core/browser/browser_policy_connector.cc
@@ -12,6 +12,7 @@ #include <utility> #include "base/bind.h" +#include "base/check_is_test.h" #include "base/command_line.h" #include "base/logging.h" #include "base/strings/utf_string_conversions.h" @@ -127,6 +128,8 @@ // initialized (unit tests). if (device_management_service_) device_management_service_->ScheduleInitialization(delay_milliseconds); + else + CHECK_IS_TEST(); } bool BrowserPolicyConnector::ProviderHasPolicies(
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json index 054432ec..9d1585e 100644 --- a/components/policy/resources/policy_templates.json +++ b/components/policy/resources/policy_templates.json
@@ -1069,6 +1069,7 @@ 'DeviceLocalAccountAutoLoginBailoutEnabled', 'DeviceLocalAccountPromptForNetworkWhenOffline', 'AllowKioskAppControlChromeVersion', + 'NewWindowsInKioskAllowed', ], }, { @@ -17325,6 +17326,36 @@ 'arc_support': 'If the kiosk app is an Android app, it will have no control over the <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> version, even if this policy is set to <ph name="TRUE">True</ph>.', }, { + 'name': 'NewWindowsInKioskAllowed', + 'owners': ['irfedorova@google.com', 'chromeos-kiosk-eng@google.com'], + 'type': 'main', + 'schema': { 'type': 'boolean' }, + 'items': [ + { + 'value': True, + 'caption': 'Allow a Kiosk Web App to open another browser window', + }, + { + 'value': False, + 'caption': 'Prohibit a Kiosk Web App from opening another browser window', + }, + ], + 'future_on': ['chrome_os'], + 'supported_chrome_os_management': ['google_cloud'], + 'features': { + 'dynamic_refresh': True, + 'per_profile': True, + }, + 'example_value': True, + 'default': False, + 'id': 995, + 'caption': '''Allow Web Kiosk to open more than one browser window on any screen''', + 'tags': [], + 'desc': '''Setting the policy to Enabled means a Kiosk Web App can open another browser window which can be placed on the same screen or on a different screen. To open a new window, Web App should call <ph name="OPEN_NEW_WINDOW_JS">window.open(url, target, windowFeatures)</ph> JavaScript function. + + Setting the policy to Disabled or leaving it unset means a Kiosk Web App can use only the main browser window and cannot open a new window. Calling any Javascript functions for opening a new window will be ignored.''' + }, + { 'name': 'LoginAuthenticationBehavior', 'owners': ['afakhry@chromium.org', 'tbarzic@chromium.org'], 'type': 'int-enum', @@ -32568,6 +32599,6 @@ 'placeholders': [], 'deleted_policy_ids': [114, 115, 204, 205, 206, 341, 412, 476, 544, 546, 562, 569, 578, 583, 585, 586, 587, 588, 589, 590, 591, 600, 668, 669, 872], 'deleted_atomic_policy_group_ids': [19], - 'highest_id_currently_used': 994, + 'highest_id_currently_used': 995, 'highest_atomic_group_id_currently_used': 43 }
diff --git a/components/segmentation_platform/internal/segmentation_platform_service_impl.cc b/components/segmentation_platform/internal/segmentation_platform_service_impl.cc index 1265715..1d68dde 100644 --- a/components/segmentation_platform/internal/segmentation_platform_service_impl.cc +++ b/components/segmentation_platform/internal/segmentation_platform_service_impl.cc
@@ -159,7 +159,19 @@ CHECK(segment_selectors_.find(segmentation_key) != segment_selectors_.end()); auto& selector = segment_selectors_.at(segmentation_key); - selector->GetSelectedSegmentOnDemand(input_context, std::move(callback)); + + // Wrap callback to record metrics. + auto wrapped_callback = base::BindOnce( + [](const std::string& segmentation_key, base::Time start_time, + SegmentSelectionCallback callback, + const SegmentSelectionResult& result) -> void { + stats::RecordOnDemandSegmentSelectionDuration( + segmentation_key, result, base::Time::Now() - start_time); + std::move(callback).Run(result); + }, + segmentation_key, base::Time::Now(), std::move(callback)); + selector->GetSelectedSegmentOnDemand(input_context, + std::move(wrapped_callback)); } CallbackId @@ -197,6 +209,8 @@ const TriggerType trigger = trigger_context->trigger_type(); if (clients_for_trigger_.find(trigger) == clients_for_trigger_.end()) return; + // This method is scheduled to be deprecated. + NOTREACHED(); scoped_refptr<InputContext> input_context = base::MakeRefCounted<InputContext>(*trigger_context); for (const auto& segmentation_key : clients_for_trigger_[trigger]) {
diff --git a/components/segmentation_platform/internal/stats.cc b/components/segmentation_platform/internal/stats.cc index a4c0f563..19bf9ed4 100644 --- a/components/segmentation_platform/internal/stats.cc +++ b/components/segmentation_platform/internal/stats.cc
@@ -472,6 +472,23 @@ duration); } +void RecordOnDemandSegmentSelectionDuration( + const std::string& segmentation_key, + const SegmentSelectionResult& result, + base::TimeDelta duration) { + std::string histogram_prefix = + base::StrCat({"SegmentationPlatform.SegmentSelectionOnDemand.Duration.", + SegmentationKeyToUmaName(segmentation_key), "."}); + base::UmaHistogramTimes(base::StrCat({histogram_prefix, "Any"}), duration); + + std::string histogram_name = base::StrCat( + {histogram_prefix, + result.segment.has_value() + ? OptimizationTargetToHistogramVariant(result.segment.value()) + : "None"}); + base::UmaHistogramTimes(histogram_name, duration); +} + void RecordModelExecutionResult(SegmentId segment_id, float result) { base::UmaHistogramPercentage( "SegmentationPlatform.ModelExecution.Result." +
diff --git a/components/segmentation_platform/internal/stats.h b/components/segmentation_platform/internal/stats.h index 15fd8c59..58ccb32 100644 --- a/components/segmentation_platform/internal/stats.h +++ b/components/segmentation_platform/internal/stats.h
@@ -119,6 +119,12 @@ void RecordModelExecutionDurationTotal(SegmentId segment_id, ModelExecutionStatus status, base::TimeDelta duration); +// Records the total duration of on-demand segment selection which includes +// running all the models associated with the client and computing result. +void RecordOnDemandSegmentSelectionDuration( + const std::string& segmentation_key, + const SegmentSelectionResult& result, + base::TimeDelta duration); // Records the result value after successfully executing an ML model. void RecordModelExecutionResult(SegmentId segment_id, float result); // Records whether the result value of of executing an ML model was successfully
diff --git a/components/sync/base/features.h b/components/sync/base/features.h index d853200d..5231e4a9 100644 --- a/components/sync/base/features.h +++ b/components/sync/base/features.h
@@ -128,6 +128,12 @@ "SyncTrustedVaultVerifyDeviceRegistration", base::FEATURE_DISABLED_BY_DEFAULT}; +// Triggers another device registration attempt if the device was registered +// before this feature was introduced. +inline constexpr base::Feature kSyncTrustedVaultRedoDeviceRegistration{ + "SyncTrustedVaultRedoDeviceRegistration", + base::FEATURE_DISABLED_BY_DEFAULT}; + // If enabled, the device will register with FCM and listen to new // invalidations. Also, FCM token will be set in DeviceInfo, which signals to // the server that device listens to new invalidations.
diff --git a/components/sync/driver/trusted_vault_histograms.cc b/components/sync/driver/trusted_vault_histograms.cc index f34004c..56c9e238 100644 --- a/components/sync/driver/trusted_vault_histograms.cc +++ b/components/sync/driver/trusted_vault_histograms.cc
@@ -37,8 +37,6 @@ registration_state); } -// Records url fetch response status (combined http and net error code). -// Either |http_status| or |net_error| must be non zero. void RecordTrustedVaultURLFetchResponse( int http_response_code, int net_error, @@ -58,4 +56,9 @@ } } +void RecordTrustedVaultDownloadKeysStatus( + TrustedVaultDownloadKeysStatusForUMA status) { + base::UmaHistogramEnumeration("Sync.TrustedVaultDownloadKeysStatus", status); +} + } // namespace syncer
diff --git a/components/sync/driver/trusted_vault_histograms.h b/components/sync/driver/trusted_vault_histograms.h index 63c5dfd..439d5a13 100644 --- a/components/sync/driver/trusted_vault_histograms.h +++ b/components/sync/driver/trusted_vault_histograms.h
@@ -9,15 +9,15 @@ // These values are persisted to logs. Entries should not be renumbered and // numeric values should never be reused. -// Exposed publicly for testing. enum class TrustedVaultDeviceRegistrationStateForUMA { - kAlreadyRegistered = 0, + kAlreadyRegisteredV0 = 0, kLocalKeysAreStale = 1, kThrottledClientSide = 2, kAttemptingRegistrationWithNewKeyPair = 3, kAttemptingRegistrationWithExistingKeyPair = 4, kAttemptingRegistrationWithPersistentAuthError = 5, - kMaxValue = kAttemptingRegistrationWithPersistentAuthError, + kAlreadyRegisteredV1 = 6, + kMaxValue = kAlreadyRegisteredV1, }; // Used to provide UMA metric breakdowns. @@ -29,18 +29,43 @@ kDownloadIsRecoverabilityDegraded, }; +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +enum class TrustedVaultDownloadKeysStatusForUMA { + kSuccess = 0, + // Deprecated in favor of the more fine-grained buckets. + kDeprecatedMembershipNotFoundOrCorrupted = 1, + kNoNewKeys = 2, + kKeyProofsVerificationFailed = 3, + kAccessTokenFetchingFailure = 4, + kOtherError = 5, + kMemberNotFound = 6, + kMembershipNotFound = 7, + kMembershipCorrupted = 8, + kMembershipEmpty = 9, + kNoPrimaryAccount = 10, + kDeviceNotRegistered = 11, + kThrottledClientSide = 12, + kCorruptedLocalDeviceRegistration = 13, + kAborted = 14, + kMaxValue = kAborted +}; + void RecordTrustedVaultDeviceRegistrationState( TrustedVaultDeviceRegistrationStateForUMA registration_state); // Records url fetch response status (combined http and net error code). If // |http_response_code| is non-zero, it will be recorded, otherwise |net_error| -// will be recorded. +// will be recorded. Either |http_status| or |net_error| must be non zero. void RecordTrustedVaultURLFetchResponse( int http_response_code, int net_error, TrustedVaultURLFetchReasonForUMA reason = TrustedVaultURLFetchReasonForUMA::kUnspecified); +void RecordTrustedVaultDownloadKeysStatus( + TrustedVaultDownloadKeysStatusForUMA status); + } // namespace syncer #endif // COMPONENTS_SYNC_DRIVER_TRUSTED_VAULT_HISTOGRAMS_H_
diff --git a/components/sync/protocol/local_trusted_vault.proto b/components/sync/protocol/local_trusted_vault.proto index cb1d23b..c0e06474 100644 --- a/components/sync/protocol/local_trusted_vault.proto +++ b/components/sync/protocol/local_trusted_vault.proto
@@ -21,6 +21,10 @@ // Indicates whether device is registered, i.e. whether its public key is // successfully submitted to the server. optional bool device_registered = 2; + + // Used to trigger another device registration attempt, even if device is + // already registered. Not set if `device_registered` is false. + optional int32 device_registered_version = 3; } message LocalTrustedVaultPerUser { @@ -30,10 +34,10 @@ // All keys known for a user. repeated LocalTrustedVaultKey vault_key = 2; - // The version corresponding to the last element in |vault_key|. + // The version corresponding to the last element in `vault_key`. optional int32 last_vault_key_version = 3; - // Indicates whether |vault_key| is stale, i.e. that the latest locally + // Indicates whether `vault_key` is stale, i.e. that the latest locally // available key isn't the latest key in the vault. New keys need to be // fetched through key retrieval procedure or by following key rotation. optional bool keys_are_stale = 4;
diff --git a/components/sync/test/fake_server/fake_server.cc b/components/sync/test/fake_server/fake_server.cc index e0d00517..a37db03 100644 --- a/components/sync/test/fake_server/fake_server.cc +++ b/components/sync/test/fake_server/fake_server.cc
@@ -10,7 +10,6 @@ #include <utility> #include "base/command_line.h" -#include "base/guid.h" #include "base/hash/hash.h" #include "base/json/json_writer.h" #include "base/logging.h" @@ -18,16 +17,13 @@ #include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" -#include "base/synchronization/lock.h" #include "base/threading/thread_restrictions.h" #include "base/time/time.h" #include "base/values.h" -#include "components/sync/engine/net/server_connection_manager.h" #include "components/sync/protocol/data_type_progress_marker.pb.h" #include "components/sync/protocol/proto_value_conversions.h" #include "components/sync/protocol/sync_entity.pb.h" #include "components/sync/protocol/sync_enums.pb.h" -#include "net/base/net_errors.h" #include "net/http/http_status_code.h" using syncer::GetModelTypeFromSpecifics; @@ -251,6 +247,7 @@ break; case sync_pb::ClientToServerMessage::COMMIT: last_commit_message_ = message; + OnWillCommit(); break; case sync_pb::ClientToServerMessage::CLEAR_SERVER_DATA: // Don't care. @@ -412,6 +409,7 @@ const ModelType model_type = entity->GetModelType(); + OnWillCommit(); loopback_server_->SaveEntity(std::move(entity)); // Notify observers so invalidations are mimic-ed. @@ -425,6 +423,8 @@ ModelType model_type = GetModelTypeFromSpecifics(wallet_entities[0].specifics()); DCHECK(model_type == syncer::AUTOFILL_WALLET_DATA); + + OnWillCommit(); wallet_entities_ = wallet_entities; const base::Time now = base::Time::Now(); @@ -452,6 +452,8 @@ ModelType model_type = GetModelTypeFromSpecifics(offer_entities[0].specifics()); DCHECK(model_type == syncer::AUTOFILL_WALLET_OFFER); + + OnWillCommit(); offer_entities_ = offer_entities; const base::Time now = base::Time::Now(); @@ -482,6 +484,7 @@ bool FakeServer::ModifyEntitySpecifics( const std::string& id, const sync_pb::EntitySpecifics& updated_specifics) { + OnWillCommit(); if (!loopback_server_->ModifyEntitySpecifics(id, updated_specifics)) { return false; } @@ -498,6 +501,7 @@ const std::string& id, const std::string& parent_id, const sync_pb::EntitySpecifics& updated_specifics) { + OnWillCommit(); if (!loopback_server_->ModifyBookmarkEntity(id, parent_id, updated_specifics)) { return false; @@ -513,6 +517,7 @@ void FakeServer::ClearServerData() { DCHECK(thread_checker_.CalledOnValidThread()); + OnWillCommit(); { base::ScopedAllowBlockingForTesting allow_blocking; loopback_server_->ClearServerData(); @@ -684,4 +689,10 @@ title.c_str(), request_counter_, body.c_str()))); } +void FakeServer::OnWillCommit() { + for (Observer& observer : observers_) { + observer.OnWillCommit(); + } +} + } // namespace fake_server
diff --git a/components/sync/test/fake_server/fake_server.h b/components/sync/test/fake_server/fake_server.h index e2079eb8..2b29e37 100644 --- a/components/sync/test/fake_server/fake_server.h +++ b/components/sync/test/fake_server/fake_server.h
@@ -27,7 +27,7 @@ #include "components/sync/protocol/client_commands.pb.h" #include "components/sync/protocol/sync.pb.h" #include "net/http/http_status_code.h" -#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" namespace switches { @@ -66,6 +66,12 @@ public: virtual ~Observer() = default; + // Called whenever a commit command is received by FakeServer. Note that + // Commit command may fail and hence it's not guaranteed that OnCommit() + // will be called. However, before any OnCommit() call there will be a + // corresponding OnWillCommit() call. + virtual void OnWillCommit() {} + // Called after FakeServer has processed a successful commit. The types // updated as part of the commit are passed in |committed_model_types|. virtual void OnCommit(const std::string& committer_invalidator_client_id, @@ -280,6 +286,9 @@ const std::string& title, const std::string& body); + // Notifies observers about an ongoing commit. + void OnWillCommit(); + // List used to implement LogForTestFailure(). std::vector<std::unique_ptr<testing::ScopedTrace>> gtest_scoped_traces_;
diff --git a/components/sync/trusted_vault/standalone_trusted_vault_backend.cc b/components/sync/trusted_vault/standalone_trusted_vault_backend.cc index ed9305ef..733c33d 100644 --- a/components/sync/trusted_vault/standalone_trusted_vault_backend.cc +++ b/components/sync/trusted_vault/standalone_trusted_vault_backend.cc
@@ -39,6 +39,7 @@ namespace { constexpr int kCurrentLocalTrustedVaultVersion = 1; +constexpr int kCurrentDeviceRegistrationVersion = 1; constexpr base::TimeDelta kVerifyDeviceRegistrationDelay = base::Seconds(10); sync_pb::LocalTrustedVault ReadEncryptedFile(const base::FilePath& file_path) { @@ -142,8 +143,7 @@ } void RecordVerifyRegistrationStatus( - StandaloneTrustedVaultBackend::TrustedVaultDownloadKeysStatusForUMA - status) { + TrustedVaultDownloadKeysStatusForUMA status) { base::UmaHistogramEnumeration( "Sync.TrustedVaultVerifyDeviceRegistrationState", status); } @@ -164,7 +164,7 @@ ~PendingTrustedRecoveryMethod() = default; // static -StandaloneTrustedVaultBackend::TrustedVaultDownloadKeysStatusForUMA +TrustedVaultDownloadKeysStatusForUMA StandaloneTrustedVaultBackend::GetDownloadKeysStatusForUMAFromResponse( TrustedVaultDownloadKeysStatus response_status) { switch (response_status) { @@ -367,14 +367,19 @@ if (registration_state.has_value() && !device_registration_state_recorded_to_uma_) { device_registration_state_recorded_to_uma_ = true; + base::UmaHistogramBoolean( + "Sync.TrustedVaultDeviceRegistered", + per_user_vault->local_device_registration_info().device_registered()); RecordTrustedVaultDeviceRegistrationState(*registration_state); - // If the local state indicates that the device is already registered, and - // behind a feature toggle, trigger a procedure to verify that the server - // has a consistent state (i.e. downloading of new keys should succeed but - // return no new keys). - if (*registration_state == - TrustedVaultDeviceRegistrationStateForUMA::kAlreadyRegistered && + // If the local state indicates that the device is already registered and + // there is no ongoing re-registration attempt, and behind a feature toggle, + // trigger a procedure to verify that the server has a consistent state + // (i.e. downloading of new keys should succeed but return no new keys). + if ((*registration_state == + TrustedVaultDeviceRegistrationStateForUMA::kAlreadyRegisteredV0 || + *registration_state == + TrustedVaultDeviceRegistrationStateForUMA::kAlreadyRegisteredV1) && base::FeatureList::IsEnabled( kSyncTrustedVaultVerifyDeviceRegistration)) { base::SequencedTaskRunnerHandle::Get()->PostDelayedTask( @@ -564,6 +569,16 @@ return last_added_recovery_method_public_key_for_testing_; } +void StandaloneTrustedVaultBackend::SetDeviceRegisteredVersionForTesting( + const std::string& gaia_id, + int version) { + sync_pb::LocalTrustedVaultPerUser* per_user_vault = FindUserVault(gaia_id); + DCHECK(per_user_vault); + per_user_vault->mutable_local_device_registration_info() + ->set_device_registered_version(version); + WriteToDisk(data_, file_path_); +} + void StandaloneTrustedVaultBackend::SetClockForTesting(base::Clock* clock) { clock_ = clock; } @@ -596,8 +611,17 @@ return absl::nullopt; } - if (per_user_vault->local_device_registration_info().device_registered()) { - return TrustedVaultDeviceRegistrationStateForUMA::kAlreadyRegistered; + if (per_user_vault->local_device_registration_info().device_registered() && + per_user_vault->local_device_registration_info() + .device_registered_version() == + kCurrentDeviceRegistrationVersion) { + static_assert(kCurrentDeviceRegistrationVersion == 1); + return TrustedVaultDeviceRegistrationStateForUMA::kAlreadyRegisteredV1; + } + + if (per_user_vault->local_device_registration_info().device_registered() && + !base::FeatureList::IsEnabled(kSyncTrustedVaultRedoDeviceRegistration)) { + return TrustedVaultDeviceRegistrationStateForUMA::kAlreadyRegisteredV0; } if (per_user_vault->keys_are_stale()) { @@ -660,6 +684,7 @@ return TrustedVaultDeviceRegistrationStateForUMA:: kAttemptingRegistrationWithPersistentAuthError; } + return had_generated_key_pair ? TrustedVaultDeviceRegistrationStateForUMA:: kAttemptingRegistrationWithExistingKeyPair : TrustedVaultDeviceRegistrationStateForUMA:: @@ -689,6 +714,8 @@ // client doesn't fully handled successful device registration before. per_user_vault->mutable_local_device_registration_info() ->set_device_registered(true); + per_user_vault->mutable_local_device_registration_info() + ->set_device_registered_version(kCurrentDeviceRegistrationVersion); WriteToDisk(data_, file_path_); return; case TrustedVaultRegistrationStatus::kLocalDataObsolete: @@ -791,6 +818,8 @@ // are available). per_user_vault->mutable_local_device_registration_info() ->set_device_registered(false); + per_user_vault->mutable_local_device_registration_info() + ->clear_device_registered_version(); WriteToDisk(data_, file_path_); break; } @@ -829,8 +858,7 @@ DCHECK(!ongoing_fetch_keys_callback_.is_null()); if (status_for_uma.has_value()) { - base::UmaHistogramEnumeration("Sync.TrustedVaultDownloadKeysStatus", - *status_for_uma); + RecordTrustedVaultDownloadKeysStatus(*status_for_uma); } const sync_pb::LocalTrustedVaultPerUser* per_user_vault =
diff --git a/components/sync/trusted_vault/standalone_trusted_vault_backend.h b/components/sync/trusted_vault/standalone_trusted_vault_backend.h index 87765169..31aba9096 100644 --- a/components/sync/trusted_vault/standalone_trusted_vault_backend.h +++ b/components/sync/trusted_vault/standalone_trusted_vault_backend.h
@@ -118,29 +118,10 @@ std::vector<uint8_t> GetLastAddedRecoveryMethodPublicKeyForTesting() const; - void SetClockForTesting(base::Clock* clock); + void SetDeviceRegisteredVersionForTesting(const std::string& gaia_id, + int version); - // These values are persisted to logs. Entries should not be renumbered and - // numeric values should never be reused. Exposed publicly for testing. - enum class TrustedVaultDownloadKeysStatusForUMA { - kSuccess = 0, - // Deprecated in favor of the more fine-grained buckets. - kDeprecatedMembershipNotFoundOrCorrupted = 1, - kNoNewKeys = 2, - kKeyProofsVerificationFailed = 3, - kAccessTokenFetchingFailure = 4, - kOtherError = 5, - kMemberNotFound = 6, - kMembershipNotFound = 7, - kMembershipCorrupted = 8, - kMembershipEmpty = 9, - kNoPrimaryAccount = 10, - kDeviceNotRegistered = 11, - kThrottledClientSide = 12, - kCorruptedLocalDeviceRegistration = 13, - kAborted = 14, - kMaxValue = kAborted - }; + void SetClockForTesting(base::Clock* clock); private: friend class base::RefCountedThreadSafe<StandaloneTrustedVaultBackend>;
diff --git a/components/sync/trusted_vault/standalone_trusted_vault_backend_unittest.cc b/components/sync/trusted_vault/standalone_trusted_vault_backend_unittest.cc index e6a483f..d698699 100644 --- a/components/sync/trusted_vault/standalone_trusted_vault_backend_unittest.cc +++ b/components/sync/trusted_vault/standalone_trusted_vault_backend_unittest.cc
@@ -23,6 +23,7 @@ #include "components/os_crypt/os_crypt_mocker.h" #include "components/signin/public/identity_manager/accounts_in_cookie_jar_info.h" #include "components/sync/base/features.h" +#include "components/sync/driver/trusted_vault_histograms.h" #include "components/sync/trusted_vault/proto_string_bytes_conversion.h" #include "components/sync/trusted_vault/securebox.h" #include "components/sync/trusted_vault/trusted_vault_connection.h" @@ -556,6 +557,9 @@ TrustedVaultDeviceRegistrationStateForUMA:: kAttemptingRegistrationWithNewKeyPair, /*expected_bucket_count=*/1); + histogram_tester.ExpectUniqueSample("Sync.TrustedVaultDeviceRegistered", + /*sample=*/false, + /*expected_bucket_count=*/1); // Pretend that the registration completed successfully. std::move(device_registration_callback) @@ -681,64 +685,6 @@ } TEST_F(StandaloneTrustedVaultBackendTest, - ShouldNotRegisterDeviceIfAlreadyRegistered) { - const CoreAccountInfo account_info = MakeAccountInfoWithGaiaId("user"); - const std::vector<uint8_t> kVaultKey = {1, 2, 3}; - const int kLastKeyVersion = 1; - - TrustedVaultConnection::RegisterAuthenticationFactorCallback - device_registration_callback; - ON_CALL(*connection(), - RegisterAuthenticationFactor( - Eq(account_info), ElementsAre(kVaultKey), kLastKeyVersion, _, - AuthenticationFactorType::kPhysicalDevice, - /*authentication_factor_type_hint=*/Eq(absl::nullopt), _)) - .WillByDefault( - [&](const CoreAccountInfo&, const std::vector<std::vector<uint8_t>>&, - int, const SecureBoxPublicKey& device_public_key, - AuthenticationFactorType, absl::optional<int>, - TrustedVaultConnection::RegisterAuthenticationFactorCallback - callback) { - device_registration_callback = std::move(callback); - return std::make_unique<TrustedVaultConnection::Request>(); - }); - - backend()->StoreKeys(account_info.gaia, {kVaultKey}, kLastKeyVersion); - backend()->SetPrimaryAccount(account_info, - /*has_persistent_auth_error=*/false); - ASSERT_FALSE(device_registration_callback.is_null()); - std::move(device_registration_callback) - .Run(TrustedVaultRegistrationStatus::kSuccess); - - // Now the device should be registered. - ASSERT_TRUE(backend() - ->GetDeviceRegistrationInfoForTesting(account_info.gaia) - .device_registered()); - - // Mimic a restart. The device should remain registered. - ResetBackend(); - backend()->ReadDataFromDisk(); - - ASSERT_TRUE(backend() - ->GetDeviceRegistrationInfoForTesting(account_info.gaia) - .device_registered()); - - // The device should not register again. - EXPECT_CALL(*connection(), RegisterAuthenticationFactor).Times(0); - EXPECT_CALL(*connection(), RegisterDeviceWithoutKeys).Times(0); - - base::HistogramTester histogram_tester; - backend()->SetPrimaryAccount(account_info, - /*has_persistent_auth_error=*/false); - - histogram_tester.ExpectUniqueSample( - "Sync.TrustedVaultDeviceRegistrationState", - /*sample=*/ - TrustedVaultDeviceRegistrationStateForUMA::kAlreadyRegistered, - /*expected_bucket_count=*/1); -} - -TEST_F(StandaloneTrustedVaultBackendTest, ShouldThrottleAndUnthrottleDeviceRegistration) { const CoreAccountInfo account_info = MakeAccountInfoWithGaiaId("user"); const std::vector<uint8_t> kVaultKey = {1, 2, 3}; @@ -964,9 +910,7 @@ histogram_tester.ExpectUniqueSample( "Sync.TrustedVaultDownloadKeysStatus", - /*sample=*/ - StandaloneTrustedVaultBackend::TrustedVaultDownloadKeysStatusForUMA:: - kSuccess, + /*sample=*/TrustedVaultDownloadKeysStatusForUMA::kSuccess, /*expected_bucket_count=*/1); } @@ -1010,9 +954,7 @@ /*last_key_version=*/0); histogram_tester.ExpectUniqueSample( "Sync.TrustedVaultDownloadKeysStatus", - /*sample=*/ - StandaloneTrustedVaultBackend::TrustedVaultDownloadKeysStatusForUMA:: - kOtherError, + /*sample=*/TrustedVaultDownloadKeysStatusForUMA::kOtherError, /*expected_bucket_count=*/1); download_keys_callback = TrustedVaultConnection::DownloadNewKeysCallback(); @@ -1095,6 +1037,179 @@ /*last_key_version=*/kServerConstantKeyVersion + 1); } +TEST_F(StandaloneTrustedVaultBackendTest, ShouldRedoDeviceRegistration) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature( + kSyncTrustedVaultRedoDeviceRegistration); + + const CoreAccountInfo account_info = MakeAccountInfoWithGaiaId("user"); + const std::vector<uint8_t> kVaultKey = {1, 2, 3}; + const int kLastKeyVersion = 1; + + std::vector<uint8_t> private_device_key = StoreKeysAndMimicDeviceRegistration( + {kVaultKey}, kLastKeyVersion, account_info); + // Mimic that device was registered before "redo registration" logic was + // introduced. + backend()->SetDeviceRegisteredVersionForTesting(account_info.gaia, + /*version=*/0); + + // Mimic restart to be able to test histogram recording. + ResetBackend(); + backend()->ReadDataFromDisk(); + + // Another device registration request should be issued upon setting the + // primary account. + TrustedVaultConnection::RegisterAuthenticationFactorCallback + device_registration_callback; + std::vector<uint8_t> serialized_public_device_key; + EXPECT_CALL(*connection(), + RegisterAuthenticationFactor( + Eq(account_info), + ElementsAre(GetConstantTrustedVaultKey(), kVaultKey), + kLastKeyVersion, _, AuthenticationFactorType::kPhysicalDevice, + /*authentication_factor_type_hint=*/Eq(absl::nullopt), _)) + .WillOnce([&](const CoreAccountInfo&, + const std::vector<std::vector<uint8_t>>&, int, + const SecureBoxPublicKey& device_public_key, + AuthenticationFactorType, absl::optional<int>, + TrustedVaultConnection::RegisterAuthenticationFactorCallback + callback) { + serialized_public_device_key = device_public_key.ExportToBytes(); + device_registration_callback = std::move(callback); + return std::make_unique<TrustedVaultConnection::Request>(); + }); + { + base::HistogramTester histogram_tester; + backend()->SetPrimaryAccount(account_info, + /*has_persistent_auth_error=*/false); + ASSERT_FALSE(device_registration_callback.is_null()); + histogram_tester.ExpectUniqueSample( + "Sync.TrustedVaultDeviceRegistrationState", + /*sample=*/ + TrustedVaultDeviceRegistrationStateForUMA:: + kAttemptingRegistrationWithExistingKeyPair, + /*expected_bucket_count=*/1); + histogram_tester.ExpectUniqueSample("Sync.TrustedVaultDeviceRegistered", + /*sample=*/true, + /*expected_bucket_count=*/1); + + // Pretend that the registration completed successfully. + std::move(device_registration_callback) + .Run(TrustedVaultRegistrationStatus::kSuccess); + + // Now the device reregistration should be completed. + sync_pb::LocalDeviceRegistrationInfo registration_info = + backend()->GetDeviceRegistrationInfoForTesting(account_info.gaia); + EXPECT_TRUE(registration_info.device_registered()); + EXPECT_THAT(registration_info.device_registered_version(), Eq(1)); + EXPECT_TRUE(registration_info.has_private_key_material()); + + // Ensure device key was reused. + EXPECT_THAT(ProtoStringToBytes(registration_info.private_key_material()), + Eq(private_device_key)); + EXPECT_THAT( + serialized_public_device_key, + Eq(SecureBoxKeyPair::CreateByPrivateKeyImport(private_device_key) + ->public_key() + .ExportToBytes())); + } + { + // Mimic the restart and verify that kAlreadyRegisteredV1 is recorded. + ResetBackend(); + backend()->ReadDataFromDisk(); + + base::HistogramTester histogram_tester; + backend()->SetPrimaryAccount(account_info, + /*has_persistent_auth_error=*/false); + histogram_tester.ExpectUniqueSample( + "Sync.TrustedVaultDeviceRegistrationState", + /*sample=*/ + TrustedVaultDeviceRegistrationStateForUMA::kAlreadyRegisteredV1, + /*expected_bucket_count=*/1); + histogram_tester.ExpectUniqueSample("Sync.TrustedVaultDeviceRegistered", + /*sample=*/true, + /*expected_bucket_count=*/1); + } +} + +TEST_F(StandaloneTrustedVaultBackendTest, + ShouldNotRedoDeviceRegistrationIfFeatureDisabled) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndDisableFeature( + kSyncTrustedVaultRedoDeviceRegistration); + + const CoreAccountInfo account_info = MakeAccountInfoWithGaiaId("user"); + const std::vector<uint8_t> kVaultKey = {1, 2, 3}; + const int kLastKeyVersion = 1; + + std::vector<uint8_t> private_device_key = StoreKeysAndMimicDeviceRegistration( + {kVaultKey}, kLastKeyVersion, account_info); + // Mimic that device was registered before "redo registration" logic was + // introduced. + backend()->SetDeviceRegisteredVersionForTesting(account_info.gaia, + /*version=*/0); + + // Mimic restart to be able to test histogram recording. + ResetBackend(); + backend()->ReadDataFromDisk(); + + // No registration attempt should be made, since device is already registered + // and "redo registration" logic is disabled. + EXPECT_CALL(*connection(), RegisterAuthenticationFactor).Times(0); + EXPECT_CALL(*connection(), RegisterDeviceWithoutKeys).Times(0); + + base::HistogramTester histogram_tester; + backend()->SetPrimaryAccount(account_info, + /*has_persistent_auth_error=*/false); + histogram_tester.ExpectUniqueSample( + "Sync.TrustedVaultDeviceRegistrationState", + /*sample=*/ + TrustedVaultDeviceRegistrationStateForUMA::kAlreadyRegisteredV0, + /*expected_bucket_count=*/1); + histogram_tester.ExpectUniqueSample("Sync.TrustedVaultDeviceRegistered", + /*sample=*/true, + /*expected_bucket_count=*/1); +} + +TEST_F(StandaloneTrustedVaultBackendTest, + ShouldRegisterWithRecentVersionAndNotRedoRegistration) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature( + kSyncTrustedVaultRedoDeviceRegistration); + + const CoreAccountInfo account_info = MakeAccountInfoWithGaiaId("user"); + const std::vector<uint8_t> kVaultKey = {1, 2, 3}; + const int kLastKeyVersion = 1; + + std::vector<uint8_t> private_device_key = StoreKeysAndMimicDeviceRegistration( + {kVaultKey}, kLastKeyVersion, account_info); + EXPECT_THAT(backend() + ->GetDeviceRegistrationInfoForTesting(account_info.gaia) + .device_registered_version(), + Eq(1)); + + // Mimic restart to be able to test histogram recording. + ResetBackend(); + backend()->ReadDataFromDisk(); + + // No registration attempt should be made, since device is already registered + // with version 1. + EXPECT_CALL(*connection(), RegisterAuthenticationFactor).Times(0); + EXPECT_CALL(*connection(), RegisterDeviceWithoutKeys).Times(0); + + base::HistogramTester histogram_tester; + backend()->SetPrimaryAccount(account_info, + /*has_persistent_auth_error=*/false); + histogram_tester.ExpectUniqueSample( + "Sync.TrustedVaultDeviceRegistrationState", + /*sample=*/ + TrustedVaultDeviceRegistrationStateForUMA::kAlreadyRegisteredV1, + /*expected_bucket_count=*/1); + histogram_tester.ExpectUniqueSample("Sync.TrustedVaultDeviceRegistered", + /*sample=*/true, + /*expected_bucket_count=*/1); +} + TEST_F(StandaloneTrustedVaultBackendTest, ShouldAddTrustedRecoveryMethod) { const std::vector<std::vector<uint8_t>> kVaultKeys = {{1, 2}, {1, 2, 3}}; const int kLastKeyVersion = 1; @@ -1281,9 +1396,7 @@ histogram_tester.ExpectUniqueSample( "Sync.TrustedVaultVerifyDeviceRegistrationState", - /*sample=*/ - StandaloneTrustedVaultBackend::TrustedVaultDownloadKeysStatusForUMA:: - kNoNewKeys, + /*sample=*/TrustedVaultDownloadKeysStatusForUMA::kNoNewKeys, /*expected_bucket_count=*/1); }
diff --git a/components/ukm/ukm_recorder_impl.cc b/components/ukm/ukm_recorder_impl.cc index 9cae3044..f0fa973 100644 --- a/components/ukm/ukm_recorder_impl.cc +++ b/components/ukm/ukm_recorder_impl.cc
@@ -37,7 +37,6 @@ namespace ukm { -COMPONENT_EXPORT(UKM_RECORDER) const base::Feature kUkmSamplingRateFeature{"UkmSamplingRate", base::FEATURE_DISABLED_BY_DEFAULT}; @@ -218,42 +217,6 @@ UkmRecorderImpl::~UkmRecorderImpl() = default; -// static -void UkmRecorderImpl::CreateFallbackSamplingTrial( - bool is_stable_channel, - base::FeatureList* feature_list) { - static const char kSampledGroup_Stable[] = "Sampled_NoSeed_Stable"; - static const char kSampledGroup_Other[] = "Sampled_NoSeed_Other"; - const char* sampled_group = kSampledGroup_Other; - int default_sampling = 1; // Sampling is 1-in-N; this is N. - - // Nothing is sampled out except for "stable" which omits almost everything - // in this configuration. This is done so that clients that fail to receive - // a configuration from the server do not bias aggregated results because - // of a relatively large number of records from them. - if (is_stable_channel) { - sampled_group = kSampledGroup_Stable; - default_sampling = 1000000; - } - - scoped_refptr<base::FieldTrial> trial( - base::FieldTrialList::FactoryGetFieldTrial( - kUkmSamplingRateFeature.name, 100, sampled_group, - base::FieldTrial::ONE_TIME_RANDOMIZED, nullptr)); - - // Everybody (100%) should have a sampling configuration. - std::map<std::string, std::string> params = { - {"_default_sampling", base::NumberToString(default_sampling)}}; - variations::AssociateVariationParams(trial->trial_name(), sampled_group, - params); - trial->AppendGroup(sampled_group, 100); - - // Setup the feature. - feature_list->RegisterFieldTrialOverride( - kUkmSamplingRateFeature.name, base::FeatureList::OVERRIDE_ENABLE_FEATURE, - trial.get()); -} - UkmRecorderImpl::EventAggregate::EventAggregate() = default; UkmRecorderImpl::EventAggregate::~EventAggregate() = default;
diff --git a/components/ukm/ukm_recorder_impl.h b/components/ukm/ukm_recorder_impl.h index 42f3f93..7a135dca 100644 --- a/components/ukm/ukm_recorder_impl.h +++ b/components/ukm/ukm_recorder_impl.h
@@ -40,6 +40,9 @@ class UkmTestHelper; class UkmUtilsForTest; +COMPONENT_EXPORT(UKM_RECORDER) +extern const base::Feature kUkmSamplingRateFeature; + namespace debug { class UkmDebugDataExtractor; } @@ -52,14 +55,6 @@ UkmRecorderImpl(); ~UkmRecorderImpl() override; - // Unconditionally attempts to create a field trial to control client side - // metrics/crash sampling to use as a fallback when one hasn't been - // provided. This is expected to occur on first-run on platforms that don't - // have first-run variations support. This should only be called when there is - // no existing field trial controlling the sampling feature. - static void CreateFallbackSamplingTrial(bool is_stable_channel, - base::FeatureList* feature_list); - // Enables/disables recording control if data is allowed to be collected. The // |extensions| flag separately controls recording of chrome-extension:// // URLs; this flag should reflect the "sync extensions" user setting.
diff --git a/components/user_notes/browser/user_note_service.cc b/components/user_notes/browser/user_note_service.cc index 62ae783..c400ffa4 100644 --- a/components/user_notes/browser/user_note_service.cc +++ b/components/user_notes/browser/user_note_service.cc
@@ -384,23 +384,37 @@ const std::vector<content::RenderFrameHost*>& all_frames, const content::RenderFrameHost* navigated_frame, UserNoteMetadataSnapshot metadata_snapshot) { - if (metadata_snapshot.IsEmpty()) { - // No notes to show. - return; - } - - // TODO(crbug.com/1313967): For now, automatically activate User Notes UI when - // the user navigates to a page with notes. Before launch though, this should - // be changed to a popup / notification that the user must interact with to - // launch the notes UI. DCHECK(all_frames.size() == 1u); + if (delegate_->IsFrameInActiveTab(all_frames[0])) { UserNotesUI* ui = delegate_->GetUICoordinatorForFrame(all_frames[0]); DCHECK(ui); - ui->Show(); + + // TODO(crbug.com/1313967): For now, always invalidate the UI if the tab is + // in the foreground. This is to fix edge cases around back/forward + // navigations, where the Page (and attached UserNoteManager) is kept alive + // in the BFCache. If the notes didn't change on disk by the time the user + // does a back/forward navigation, Invalidate() will never get called + // because there won't be any diff between the instances in the Page and the + // notes on disk. Ideally, Invalidate() should only be called if this is a + // back/forward navigation and the notes didn't change, but there's no way + // to know whether the notes changed until further down the callback stack. + // Since Invalidate() is cheap enough, always calling it here is considered + // an acceptable fix for now. + ui->Invalidate(); + + if (!metadata_snapshot.IsEmpty()) { + // TODO(crbug.com/1313967): For now, automatically activate User Notes UI + // when the user navigates to a page with notes. Before launch though, + // this should be changed to a popup / notification that the user must + // interact with to launch the notes UI. + ui->Show(); + } } - OnNoteMetadataFetched(all_frames, std::move(metadata_snapshot)); + if (!metadata_snapshot.IsEmpty()) { + OnNoteMetadataFetched(all_frames, std::move(metadata_snapshot)); + } } void UserNoteService::OnNoteMetadataFetched(
diff --git a/components/user_notes/browser/user_note_service.h b/components/user_notes/browser/user_note_service.h index e43cc0c3..ba351dc 100644 --- a/components/user_notes/browser/user_note_service.h +++ b/components/user_notes/browser/user_note_service.h
@@ -128,6 +128,8 @@ OnNoteMetadataFetchedForNavigationSomeNotesBackground); FRIEND_TEST_ALL_PREFIXES(UserNoteServiceTest, OnNoteMetadataFetchedForNavigationNoNotes); + FRIEND_TEST_ALL_PREFIXES(UserNoteServiceTest, + OnNoteMetadataFetchedForNavigationNoNotesBackground); FRIEND_TEST_ALL_PREFIXES(UserNoteServiceTest, OnNoteMetadataFetched); FRIEND_TEST_ALL_PREFIXES(UserNoteServiceTest, OnNoteModelsFetched); FRIEND_TEST_ALL_PREFIXES(UserNoteServiceTest, OnFrameChangesApplied);
diff --git a/components/user_notes/browser/user_note_service_unittest.cc b/components/user_notes/browser/user_note_service_unittest.cc index 5aa130b..ec3fbec 100644 --- a/components/user_notes/browser/user_note_service_unittest.cc +++ b/components/user_notes/browser/user_note_service_unittest.cc
@@ -558,7 +558,8 @@ } // After a navigation to a document that has user notes in the foreground, the -// service should request the notes UI to show itself. +// service should request the notes UI to show itself and fetch the notes +// metadata. // TODO(crbug.com/1313967): This test will need to be changed when notes UI is // no longer automatically shown on navigation. TEST_F(UserNoteServiceTest, OnNoteMetadataFetchedForNavigationSomeNotes) { @@ -573,7 +574,7 @@ // Configure UI mock. auto mock_ui = std::make_unique<MockUserNotesUI>(); - EXPECT_CALL(*mock_ui, Invalidate).Times(0); + EXPECT_CALL(*mock_ui, Invalidate).Times(1); EXPECT_CALL(*mock_ui, FocusNote).Times(0); EXPECT_CALL(*mock_ui, StartNoteCreation).Times(0); EXPECT_CALL(*mock_ui, Show).Times(1); @@ -633,13 +634,6 @@ EXPECT_EQ(ManagerCountForId(note_ids_[0]), 1u); EXPECT_TRUE(DoesManagerExistForId(note_ids_[0], manager)); - // Configure UI mock. - auto mock_ui = std::make_unique<MockUserNotesUI>(); - EXPECT_CALL(*mock_ui, Invalidate).Times(0); - EXPECT_CALL(*mock_ui, FocusNote).Times(0); - EXPECT_CALL(*mock_ui, StartNoteCreation).Times(0); - EXPECT_CALL(*mock_ui, Show).Times(0); - // Configure service delegate mock. EXPECT_CALL(*service_delegate_, GetAllFramesForUserNotes).Times(0); EXPECT_CALL(*service_delegate_, GetUICoordinatorForFrame(_)).Times(0); @@ -676,8 +670,9 @@ GetAllFramesInUse(), GetAllFramesInUse()[0], std::move(snapshot)); } -// After a navigation to a document that doesn't have user notes, the service -// should not request the notes UI to show itself. +// After a navigation to a document that doesn't have user notes but is in the +// active tab, the service should not request the notes UI to show itself, but +// should Invalidate the notes displayed in the UI. // TODO(crbug.com/1313967): This test will need to be changed when notes UI is // no longer automatically shown on navigation. TEST_F(UserNoteServiceTest, OnNoteMetadataFetchedForNavigationNoNotes) { @@ -692,15 +687,75 @@ // Configure UI mock. auto mock_ui = std::make_unique<MockUserNotesUI>(); - EXPECT_CALL(*mock_ui, Invalidate).Times(0); + EXPECT_CALL(*mock_ui, Invalidate).Times(1); EXPECT_CALL(*mock_ui, FocusNote).Times(0); EXPECT_CALL(*mock_ui, StartNoteCreation).Times(0); EXPECT_CALL(*mock_ui, Show).Times(0); // Configure service delegate mock. EXPECT_CALL(*service_delegate_, GetAllFramesForUserNotes).Times(0); + EXPECT_CALL(*service_delegate_, GetUICoordinatorForFrame(_)) + .Times(1) + .WillOnce(Invoke([&mock_ui](const content::RenderFrameHost* frame) { + return mock_ui.get(); + })); + EXPECT_CALL(*service_delegate_, IsFrameInActiveTab(_)) + .Times(1) + .WillOnce( + Invoke([](const content::RenderFrameHost* frame) { return true; })); + + // Configure storage mock. + EXPECT_CALL(*storage_, GetNoteMetadataForUrls).Times(0); + EXPECT_CALL(*storage_, GetNotesById).Times(0); + + // Configure service mock. + EXPECT_CALL(*mock_service_, OnNoteMetadataFetchedForNavigation) + .Times(1) + .WillOnce(Invoke(mock_service_.get(), + &MockUserNoteService:: + CallBaseClassOnNoteMetadataFetchedForNavigation)); + EXPECT_CALL(*mock_service_, OnNoteMetadataFetched).Times(0); + EXPECT_CALL(*mock_service_, OnNoteModelsFetched).Times(0); + EXPECT_CALL(*mock_service_, OnFrameChangesApplied).Times(0); + + // Create a non-empty metadata snapshot. + UserNoteMetadataSnapshot snapshot; + GURL url = + web_contents_list_[0]->GetPrimaryMainFrame()->GetLastCommittedURL(); + snapshot.AddEntry( + url, note_ids_[0], + std::make_unique<UserNoteMetadata>(base::Time::Now(), base::Time::Now(), + /*min_note_version=*/1)); + + // Simulate the service receiving the empty metadata snapshot after a + // navigation. + note_service_->OnNoteMetadataFetchedForNavigation( + GetAllFramesInUse(), GetAllFramesInUse()[0], UserNoteMetadataSnapshot()); +} + +// After a navigation to a document that doesn't have user notes, but isn't in +// the foreground, the service should not request the notes UI to show itself +// nor to Invalidate the notes. +// TODO(crbug.com/1313967): This test will need to be changed when notes UI is +// no longer automatically shown on navigation. +TEST_F(UserNoteServiceTest, + OnNoteMetadataFetchedForNavigationNoNotesBackground) { + // Initial setup. + UserNoteManager* manager = ConfigureNewManager(); + AddNewInstanceToManager(manager, note_ids_[0]); + + // Verify initial setup. + EXPECT_EQ(ModelMapSize(), 2u); + EXPECT_EQ(ManagerCountForId(note_ids_[0]), 1u); + EXPECT_TRUE(DoesManagerExistForId(note_ids_[0], manager)); + + // Configure service delegate mock. + EXPECT_CALL(*service_delegate_, GetAllFramesForUserNotes).Times(0); EXPECT_CALL(*service_delegate_, GetUICoordinatorForFrame(_)).Times(0); - EXPECT_CALL(*service_delegate_, IsFrameInActiveTab(_)).Times(0); + EXPECT_CALL(*service_delegate_, IsFrameInActiveTab(_)) + .Times(1) + .WillOnce( + Invoke([](const content::RenderFrameHost* frame) { return false; })); // Configure storage mock. EXPECT_CALL(*storage_, GetNoteMetadataForUrls).Times(0);
diff --git a/content/browser/accessibility/browser_accessibility.cc b/content/browser/accessibility/browser_accessibility.cc index 5c0b4d9..455b95d 100644 --- a/content/browser/accessibility/browser_accessibility.cc +++ b/content/browser/accessibility/browser_accessibility.cc
@@ -905,6 +905,10 @@ return node_->GetNameUTF16(); } +const std::string& BrowserAccessibility::GetDescription() const { + return GetStringAttribute(ax::mojom::StringAttribute::kDescription); +} + std::u16string BrowserAccessibility::GetHypertext() const { // Overloaded by platforms which require a hypertext accessibility text // implementation. @@ -1353,6 +1357,10 @@ return node_->GetNameFrom(); } +ax::mojom::DescriptionFrom BrowserAccessibility::GetDescriptionFrom() const { + return GetData().GetDescriptionFrom(); +} + const ui::AXTree::Selection BrowserAccessibility::GetUnignoredSelection() const { ui::AXTree::Selection selection =
diff --git a/content/browser/accessibility/browser_accessibility.h b/content/browser/accessibility/browser_accessibility.h index a09f84a4..f29af97 100644 --- a/content/browser/accessibility/browser_accessibility.h +++ b/content/browser/accessibility/browser_accessibility.h
@@ -446,6 +446,7 @@ bool HasAction(ax::mojom::Action action) const override; bool HasTextStyle(ax::mojom::TextStyle text_style) const override; ax::mojom::NameFrom GetNameFrom() const override; + ax::mojom::DescriptionFrom GetDescriptionFrom() const override; const ui::AXTree::Selection GetUnignoredSelection() const override; AXPosition CreatePositionAt( int offset, @@ -483,6 +484,7 @@ std::unique_ptr<ChildIterator> ChildrenEnd() override; const std::string& GetName() const override; + const std::string& GetDescription() const override; std::u16string GetHypertext() const override; const std::map<int, int>& GetHypertextOffsetToHyperlinkChildIndex() const override;
diff --git a/content/browser/accessibility/browser_accessibility_cocoa.mm b/content/browser/accessibility/browser_accessibility_cocoa.mm index fe29c05..fdfd9a0 100644 --- a/content/browser/accessibility/browser_accessibility_cocoa.mm +++ b/content/browser/accessibility/browser_accessibility_cocoa.mm
@@ -2640,21 +2640,6 @@ ax::mojom::Restriction::kDisabled; } -- (NSRect)accessibilityFrame { - if (![self instanceActive]) - return NSZeroRect; - - BrowserAccessibilityManager* manager = _owner->manager(); - auto rect = _owner->GetBoundsRect(ui::AXCoordinateSystem::kScreenDIPs, - ui::AXClippingBehavior::kClipped); - - // TODO(vmpstr): GetBoundsRect() call above should account for this instead. - auto result_rect = - ScaleToRoundedRect(rect, 1.f / manager->device_scale_factor()); - - return gfx::ScreenRectToNSRect(result_rect); -} - - (BOOL)isCheckable { if (![self instanceActive]) return NO;
diff --git a/content/browser/accessibility/browser_accessibility_state_impl.cc b/content/browser/accessibility/browser_accessibility_state_impl.cc index 018ba7f..9b95dd05 100644 --- a/content/browser/accessibility/browser_accessibility_state_impl.cc +++ b/content/browser/accessibility/browser_accessibility_state_impl.cc
@@ -137,6 +137,13 @@ void BrowserAccessibilityStateImpl::ResetAccessibilityMode() { ResetAccessibilityModeValue(); + // AXPlatformNode has its own AXMode. If we don't reset it when accessibility + // support is auto-disabled, the next time a screen reader is detected + // |AXPlatformNode::NotifyAddAXModeFlags| will return early due to the + // AXPlatformNode's AXMode being unchanged (kAXModeComplete). As a result, + // the observers are never notified and screen reader support fails to work. + ui::AXPlatformNode::SetAXMode(accessibility_mode_); + std::vector<WebContentsImpl*> web_contents_vector = WebContentsImpl::GetAllWebContents(); for (size_t i = 0; i < web_contents_vector.size(); ++i)
diff --git a/content/browser/accessibility/browser_accessibility_state_impl_unittest.cc b/content/browser/accessibility/browser_accessibility_state_impl_unittest.cc index 1d57574..703b3ea 100644 --- a/content/browser/accessibility/browser_accessibility_state_impl_unittest.cc +++ b/content/browser/accessibility/browser_accessibility_state_impl_unittest.cc
@@ -10,6 +10,7 @@ #include "content/public/test/browser_task_environment.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/accessibility/accessibility_features.h" +#include "ui/accessibility/platform/ax_platform_node.h" #include "ui/events/base_event_utils.h" namespace content { @@ -43,10 +44,12 @@ // Initially, accessibility should be disabled. EXPECT_FALSE(state_->IsAccessibleBrowser()); + EXPECT_EQ(ui::AXPlatformNode::GetAccessibilityMode(), ui::AXMode()); // Enable accessibility based on usage of accessibility APIs. state_->OnScreenReaderDetected(); EXPECT_TRUE(state_->IsAccessibleBrowser()); + EXPECT_EQ(ui::AXPlatformNode::GetAccessibilityMode(), ui::kAXModeComplete); // Send user input, wait 31 seconds, then send another user input event. // Don't simulate any accessibility APIs in that time. @@ -57,6 +60,7 @@ // Accessibility should now be disabled. EXPECT_FALSE(state_->IsAccessibleBrowser()); + EXPECT_EQ(ui::AXPlatformNode::GetAccessibilityMode(), ui::AXMode()); // A histogram should record that accessibility was disabled with // 3 input events. @@ -72,10 +76,12 @@ AccessibilityApiUsagePreventsAutoDisableAccessibility) { // Initially, accessibility should be disabled. EXPECT_FALSE(state_->IsAccessibleBrowser()); + EXPECT_EQ(ui::AXPlatformNode::GetAccessibilityMode(), ui::AXMode()); // Enable accessibility based on usage of accessibility APIs. state_->OnScreenReaderDetected(); EXPECT_TRUE(state_->IsAccessibleBrowser()); + EXPECT_EQ(ui::AXPlatformNode::GetAccessibilityMode(), ui::kAXModeComplete); // Send user input, wait 31 seconds, then send another user input event - // but simulate accessibility APIs in that time. @@ -87,6 +93,7 @@ // Accessibility should still be enabled. EXPECT_TRUE(state_->IsAccessibleBrowser()); + EXPECT_EQ(ui::AXPlatformNode::GetAccessibilityMode(), ui::kAXModeComplete); // Same test, but simulate accessibility API usage after the first // user input event, before the delay. @@ -98,22 +105,26 @@ // Accessibility should still be enabled. EXPECT_TRUE(state_->IsAccessibleBrowser()); + EXPECT_EQ(ui::AXPlatformNode::GetAccessibilityMode(), ui::kAXModeComplete); // Advance another 31 seconds and simulate another user input event; // now accessibility should be disabled. clock_.Advance(base::Seconds(31)); state_->OnUserInputEvent(); EXPECT_FALSE(state_->IsAccessibleBrowser()); + EXPECT_EQ(ui::AXPlatformNode::GetAccessibilityMode(), ui::AXMode()); } TEST_F(BrowserAccessibilityStateImplTest, AddAccessibilityModeFlagsPreventsAutoDisableAccessibility) { // Initially, accessibility should be disabled. EXPECT_FALSE(state_->IsAccessibleBrowser()); + EXPECT_EQ(ui::AXPlatformNode::GetAccessibilityMode(), ui::AXMode()); // Enable accessibility. state_->OnScreenReaderDetected(); EXPECT_TRUE(state_->IsAccessibleBrowser()); + EXPECT_EQ(ui::AXPlatformNode::GetAccessibilityMode(), ui::kAXModeComplete); // Send user input, wait 31 seconds, then send another user input event - // but add a new accessibility mode flag. @@ -125,6 +136,7 @@ // Accessibility should still be enabled. EXPECT_TRUE(state_->IsAccessibleBrowser()); + EXPECT_EQ(ui::AXPlatformNode::GetAccessibilityMode(), ui::kAXModeComplete); } } // namespace content
diff --git a/content/browser/accessibility/dump_accessibility_scripts_browsertest.cc b/content/browser/accessibility/dump_accessibility_scripts_browsertest.cc index e526bcb3..92c1d9a 100644 --- a/content/browser/accessibility/dump_accessibility_scripts_browsertest.cc +++ b/content/browser/accessibility/dump_accessibility_scripts_browsertest.cc
@@ -452,6 +452,10 @@ RunTypedTest<kMacMethods>("accessibility-column-header-ui-elements.html"); } +IN_PROC_BROWSER_TEST_P(DumpAccessibilityScriptTest, AccessibilityFrame) { + RunTypedTest<kMacMethods>("accessibility-frame.html"); +} + IN_PROC_BROWSER_TEST_P(DumpAccessibilityScriptTest, AccessibilityIsIgnored) { RunTypedTest<kMacMethods>("accessibility-is-ignored.html"); }
diff --git a/content/browser/devtools/devtools_instrumentation.cc b/content/browser/devtools/devtools_instrumentation.cc index 1f3988a1..faac4af 100644 --- a/content/browser/devtools/devtools_instrumentation.cc +++ b/content/browser/devtools/devtools_instrumentation.cc
@@ -925,6 +925,39 @@ return true; } +void OnPrefetchRequestWillBeSent(FrameTreeNode* frame_tree_node, + const std::string& request_id, + const GURL& initiator, + const network::ResourceRequest& request) { + auto timestamp = base::TimeTicks::Now(); + std::string frame_token = frame_tree_node->devtools_frame_token().ToString(); + DispatchToAgents(frame_tree_node, + &protocol::NetworkHandler::PrefetchRequestWillBeSent, + request_id, request, initiator, frame_token, timestamp); +} + +void OnPrefetchResponseReceived(FrameTreeNode* frame_tree_node, + const std::string& request_id, + const GURL& url, + const network::mojom::URLResponseHead& head) { + std::string frame_token = frame_tree_node->devtools_frame_token().ToString(); + + network::mojom::URLResponseHeadDevToolsInfoPtr head_info = + network::ExtractDevToolsInfo(head); + DispatchToAgents(frame_tree_node, &protocol::NetworkHandler::ResponseReceived, + request_id, request_id, url, + protocol::Network::ResourceTypeEnum::Prefetch, *head_info, + frame_token); +} +void OnPrefetchRequestComplete( + FrameTreeNode* frame_tree_node, + const std::string& request_id, + const network::URLLoaderCompletionStatus& status) { + DispatchToAgents(frame_tree_node, &protocol::NetworkHandler::LoadingComplete, + request_id, protocol::Network::ResourceTypeEnum::Prefetch, + status); +} + void OnNavigationRequestWillBeSent( const NavigationRequest& navigation_request) { // Note this intentionally deviates from the usual instrumentation signal
diff --git a/content/browser/devtools/devtools_instrumentation.h b/content/browser/devtools/devtools_instrumentation.h index efea374..89885a6 100644 --- a/content/browser/devtools/devtools_instrumentation.h +++ b/content/browser/devtools/devtools_instrumentation.h
@@ -142,6 +142,19 @@ target_factory_receiver, network::mojom::URLLoaderFactoryOverridePtr* factory_override); +void OnPrefetchRequestWillBeSent(FrameTreeNode* frame_tree_node, + const std::string& request_id, + const GURL& initiator, + const network::ResourceRequest& request); +void OnPrefetchResponseReceived(FrameTreeNode* frame_tree_node, + const std::string& request_id, + const GURL& url, + const network::mojom::URLResponseHead& head); +void OnPrefetchRequestComplete( + FrameTreeNode* frame_tree_node, + const std::string& request_id, + const network::URLLoaderCompletionStatus& status); + void OnResetNavigationRequest(NavigationRequest* navigation_request); void OnNavigationRequestWillBeSent(const NavigationRequest& navigation_request); void OnNavigationResponseReceived(
diff --git a/content/browser/devtools/protocol/network_handler.cc b/content/browser/devtools/protocol/network_handler.cc index e20033a7..ee6214c 100644 --- a/content/browser/devtools/protocol/network_handler.cc +++ b/content/browser/devtools/protocol/network_handler.cc
@@ -2031,6 +2031,51 @@ } // namespace +void NetworkHandler::PrefetchRequestWillBeSent( + const std::string& request_id, + const network::ResourceRequest& request, + const GURL& initiator_url, + Maybe<std::string> frame_token, + base::TimeTicks timestamp) { + if (!enabled_) + return; + + std::string url = request.url.is_valid() ? request.url.spec() : ""; + double current_ticks = timestamp.since_origin().InSecondsF(); + double current_wall_time = base::Time::Now().ToDoubleT(); + auto initiator = + Network::Initiator::Create() + .SetType(Network::Initiator::TypeEnum::Script) + .SetUrl(initiator_url.is_valid() ? initiator_url.spec() : "") + .Build(); + // TODO: for now redirect is empty + bool redirect_emitted_extra_info = false; + std::unique_ptr<Network::Response> redirect_response; + + auto request_info = + Network::Request::Create() + .SetUrl(url) + .SetMethod(request.method) + .SetHeaders(BuildRequestHeaders(request.headers, request.referrer)) + .SetInitialPriority(resourcePriority(request.priority)) + .SetReferrerPolicy(referrerPolicy(request.referrer_policy)) + .Build(); + + frontend_->RequestWillBeSent( + request_id, request_id, url, std::move(request_info), current_ticks, + current_wall_time, std::move(initiator), redirect_emitted_extra_info, + std::move(redirect_response), + std::string(Network::ResourceTypeEnum::Prefetch), std::move(frame_token), + request.has_user_gesture); + + // TODO: cookies, security status and full list of headers should be + // implemented. https://crbug.com/1315706. + frontend_->RequestWillBeSentExtraInfo( + request_id, BuildProtocolAssociatedCookies({}), + BuildRequestHeaders(request.headers, request.referrer), + GetConnectTiming(timestamp), MaybeBuildClientSecurityState({})); +} + void NetworkHandler::NavigationRequestWillBeSent( const NavigationRequest& nav_request, base::TimeTicks timestamp) { @@ -2298,7 +2343,6 @@ const network::URLLoaderCompletionStatus& status) { if (!enabled_) return; - if (status.error_code != net::OK) { frontend_->LoadingFailed( request_id,
diff --git a/content/browser/devtools/protocol/network_handler.h b/content/browser/devtools/protocol/network_handler.h index c343166..c5e7f264 100644 --- a/content/browser/devtools/protocol/network_handler.h +++ b/content/browser/devtools/protocol/network_handler.h
@@ -210,6 +210,11 @@ bool* disable_cache, absl::optional<std::vector<net::SourceStream::SourceType>>* accepted_stream_types); + void PrefetchRequestWillBeSent(const std::string& request_id, + const network::ResourceRequest& request, + const GURL& initiator_url, + Maybe<std::string> frame_token, + base::TimeTicks timestamp); void NavigationRequestWillBeSent(const NavigationRequest& nav_request, base::TimeTicks timestamp); void RequestSent(const std::string& request_id,
diff --git a/content/browser/file_system_access/file_system_access_file_handle_impl_unittest.cc b/content/browser/file_system_access/file_system_access_file_handle_impl_unittest.cc index 2c7038d..56d98f7 100644 --- a/content/browser/file_system_access/file_system_access_file_handle_impl_unittest.cc +++ b/content/browser/file_system_access/file_system_access_file_handle_impl_unittest.cc
@@ -30,6 +30,9 @@ #include "storage/browser/file_system/file_stream_reader.h" #include "storage/browser/quota/quota_manager_proxy.h" #include "storage/browser/test/async_file_test_helper.h" +#include "storage/browser/test/mock_quota_manager.h" +#include "storage/browser/test/mock_quota_manager_proxy.h" +#include "storage/browser/test/mock_special_storage_policy.h" #include "storage/browser/test/test_file_system_context.h" #include "storage/common/file_system/file_system_types.h" #include "testing/gtest/include/gtest/gtest.h" @@ -91,15 +94,21 @@ void SetupHelper(storage::FileSystemType type, bool is_incognito) { ASSERT_TRUE(dir_.CreateUniqueTempDir()); + quota_manager_ = base::MakeRefCounted<storage::MockQuotaManager>( + is_incognito, dir_.GetPath(), base::ThreadTaskRunnerHandle::Get(), + base::MakeRefCounted<storage::MockSpecialStoragePolicy>()); + quota_manager_proxy_ = base::MakeRefCounted<storage::MockQuotaManagerProxy>( + quota_manager_.get(), base::ThreadTaskRunnerHandle::Get()); + if (is_incognito) { file_system_context_ = storage::CreateIncognitoFileSystemContextForTesting( base::ThreadTaskRunnerHandle::Get(), - base::ThreadTaskRunnerHandle::Get(), - /*quota_manager_proxy=*/nullptr, dir_.GetPath()); + base::ThreadTaskRunnerHandle::Get(), quota_manager_proxy_.get(), + dir_.GetPath()); } else { file_system_context_ = storage::CreateFileSystemContextForTesting( - /*quota_manager_proxy=*/nullptr, dir_.GetPath()); + quota_manager_proxy_.get(), dir_.GetPath()); } test_file_url_ = file_system_context_->CreateCrackedFileSystemURL( @@ -134,6 +143,8 @@ BrowserTaskEnvironment task_environment_; base::ScopedTempDir dir_; + scoped_refptr<storage::MockQuotaManager> quota_manager_; + scoped_refptr<storage::MockQuotaManagerProxy> quota_manager_proxy_; scoped_refptr<storage::FileSystemContext> file_system_context_; scoped_refptr<ChromeBlobStorageContext> chrome_blob_context_; scoped_refptr<FileSystemAccessManagerImpl> manager_;
diff --git a/content/browser/gpu/gpu_process_host.cc b/content/browser/gpu/gpu_process_host.cc index 4be758a..9b29ab96d 100644 --- a/content/browser/gpu/gpu_process_host.cc +++ b/content/browser/gpu/gpu_process_host.cc
@@ -439,8 +439,8 @@ std::wstring log_file_path = logging::GetLogFileFullPath(); if (!log_file_path.empty()) { sandbox::ResultCode result = policy->AddRule( - sandbox::TargetPolicy::SUBSYS_FILES, - sandbox::TargetPolicy::FILES_ALLOW_ANY, log_file_path.c_str()); + sandbox::SubSystem::kFiles, sandbox::Semantics::kFilesAllowAny, + log_file_path.c_str()); if (result != sandbox::SBOX_ALL_OK) return false; }
diff --git a/content/browser/ppapi_plugin_sandboxed_process_launcher_delegate.cc b/content/browser/ppapi_plugin_sandboxed_process_launcher_delegate.cc index b027911..6e1d729 100644 --- a/content/browser/ppapi_plugin_sandboxed_process_launcher_delegate.cc +++ b/content/browser/ppapi_plugin_sandboxed_process_launcher_delegate.cc
@@ -25,8 +25,8 @@ // The Pepper process is as locked-down as a renderer except that it can // create the server side of Chrome pipes. sandbox::ResultCode result; - result = policy->AddRule(sandbox::TargetPolicy::SUBSYS_NAMED_PIPES, - sandbox::TargetPolicy::NAMEDPIPES_ALLOW_ANY, + result = policy->AddRule(sandbox::SubSystem::kNamedPipes, + sandbox::Semantics::kNamedPipesAllowAny, L"\\\\.\\pipe\\chrome.*"); if (result != sandbox::SBOX_ALL_OK) return false;
diff --git a/content/browser/preloading/prefetch/prefetch_container.cc b/content/browser/preloading/prefetch/prefetch_container.cc index a94e815..9f60ea5 100644 --- a/content/browser/preloading/prefetch/prefetch_container.cc +++ b/content/browser/preloading/prefetch/prefetch_container.cc
@@ -52,7 +52,8 @@ : referring_render_frame_host_id_(referring_render_frame_host_id), url_(url), prefetch_type_(prefetch_type), - prefetch_document_manager_(prefetch_document_manager) {} + prefetch_document_manager_(prefetch_document_manager), + request_id_(base::UnguessableToken::Create().ToString()) {} PrefetchContainer::~PrefetchContainer() = default;
diff --git a/content/browser/preloading/prefetch/prefetch_container.h b/content/browser/preloading/prefetch/prefetch_container.h index 9d9f05b..9dc7c87 100644 --- a/content/browser/preloading/prefetch/prefetch_container.h +++ b/content/browser/preloading/prefetch/prefetch_container.h
@@ -14,6 +14,7 @@ #include "content/browser/preloading/prefetch/prefetch_type.h" #include "content/common/content_export.h" #include "content/public/browser/global_routing_id.h" +#include "content/public/browser/speculation_host_delegate.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "url/gurl.h" @@ -123,6 +124,22 @@ std::unique_ptr<PrefetchedMainframeResponseContainer> ReleasePrefetchedResponse(); + // Returns request id to be used by DevTools + const std::string& RequestId() const { return request_id_; } + + // Sets DevTools observer + void SetDevToolsObserver( + base::WeakPtr<content::SpeculationHostDevToolsObserver> + devtools_observer) { + devtools_observer_ = std::move(devtools_observer); + } + + // Returns DevTool observer + const base::WeakPtr<SpeculationHostDevToolsObserver>& GetDevToolsObserver() + const { + return devtools_observer_; + } + private: // The ID of the render frame host that triggered the prefetch. GlobalRenderFrameHostId referring_render_frame_host_id_; @@ -185,6 +202,12 @@ // A callback that runs once |cookie_copy_status_| is set to |kCompleted|. base::OnceClosure on_cookie_copy_complete_callback_; + // Request identifier used by DevTools + std::string request_id_; + + // Weak pointer to DevTools observer + base::WeakPtr<SpeculationHostDevToolsObserver> devtools_observer_; + base::WeakPtrFactory<PrefetchContainer> weak_method_factory_{this}; };
diff --git a/content/browser/preloading/prefetch/prefetch_document_manager.cc b/content/browser/preloading/prefetch/prefetch_document_manager.cc index b0a24f0..814d7b6f 100644 --- a/content/browser/preloading/prefetch/prefetch_document_manager.cc +++ b/content/browser/preloading/prefetch/prefetch_document_manager.cc
@@ -52,7 +52,8 @@ } void PrefetchDocumentManager::ProcessCandidates( - std::vector<blink::mojom::SpeculationCandidatePtr>& candidates) { + std::vector<blink::mojom::SpeculationCandidatePtr>& candidates, + base::WeakPtr<SpeculationHostDevToolsObserver> devtools_observer) { // Filter out candidates that can be handled by |PrefetchService| and // determine the type of prefetch required. // TODO(https://crbug.com/1299059): Once this code becomes enabled by default @@ -91,12 +92,14 @@ candidates.erase(new_end, candidates.end()); for (const auto& prefetch : prefetches) { - PrefetchUrl(prefetch.first, prefetch.second); + PrefetchUrl(prefetch.first, prefetch.second, devtools_observer); } } -void PrefetchDocumentManager::PrefetchUrl(const GURL& url, - const PrefetchType& prefetch_type) { +void PrefetchDocumentManager::PrefetchUrl( + const GURL& url, + const PrefetchType& prefetch_type, + base::WeakPtr<SpeculationHostDevToolsObserver> devtools_observer) { // Skip any prefetches that have already been requested. auto prefetch_container_iter = all_prefetches_.find(url); if (prefetch_container_iter != all_prefetches_.end() && @@ -110,14 +113,17 @@ } // Create a new |PrefetchContainer| and take ownership of it - owned_prefetches_[url] = std::make_unique<PrefetchContainer>( + auto container = std::make_unique<PrefetchContainer>( render_frame_host().GetGlobalId(), url, prefetch_type, weak_method_factory_.GetWeakPtr()); - all_prefetches_[url] = owned_prefetches_[url]->GetWeakPtr(); + container->SetDevToolsObserver(std::move(devtools_observer)); + base::WeakPtr<PrefetchContainer> weak_container = container->GetWeakPtr(); + owned_prefetches_[url] = std::move(container); + all_prefetches_[url] = weak_container; // Send a reference of the new |PrefetchContainer| to |PrefetchService| to // start the prefetch process. - GetPrefetchService()->PrefetchUrl(owned_prefetches_[url]->GetWeakPtr()); + GetPrefetchService()->PrefetchUrl(weak_container); // TODO(https://crbug.com/1299059): Track metrics about the prefetches. }
diff --git a/content/browser/preloading/prefetch/prefetch_document_manager.h b/content/browser/preloading/prefetch/prefetch_document_manager.h index 709a888..84d770a5 100644 --- a/content/browser/preloading/prefetch/prefetch_document_manager.h +++ b/content/browser/preloading/prefetch/prefetch_document_manager.h
@@ -13,6 +13,7 @@ #include "content/browser/preloading/prefetch/prefetch_type.h" #include "content/common/content_export.h" #include "content/public/browser/document_user_data.h" +#include "content/public/browser/speculation_host_delegate.h" #include "content/public/browser/web_contents_observer.h" #include "third_party/blink/public/mojom/speculation_rules/speculation_rules.mojom.h" #include "url/gurl.h" @@ -42,10 +43,14 @@ // prefetched. Any candidates that can be prefetched are removed from // |candidates|, and a prefetch for the URL of the candidate is started. void ProcessCandidates( - std::vector<blink::mojom::SpeculationCandidatePtr>& candidates); + std::vector<blink::mojom::SpeculationCandidatePtr>& candidates, + base::WeakPtr<SpeculationHostDevToolsObserver> devtools_observer); // Starts the process to prefetch |url| with the given |prefetch_type|. - void PrefetchUrl(const GURL& url, const PrefetchType& prefetch_type); + void PrefetchUrl( + const GURL& url, + const PrefetchType& prefetch_type, + base::WeakPtr<SpeculationHostDevToolsObserver> devtools_observer); // Releases ownership of the |PrefetchContainer| associated with |url|. The // prefetch is removed from |owned_prefetches_|, but a pointer to it remains
diff --git a/content/browser/preloading/prefetch/prefetch_document_manager_unittest.cc b/content/browser/preloading/prefetch/prefetch_document_manager_unittest.cc index b7858eb..a786e57 100644 --- a/content/browser/preloading/prefetch/prefetch_document_manager_unittest.cc +++ b/content/browser/preloading/prefetch/prefetch_document_manager_unittest.cc
@@ -136,7 +136,8 @@ // Process the candidates with the |PrefetchDocumentManager| for the current // document. PrefetchDocumentManager::GetOrCreateForCurrentDocument(&GetPrimaryMainFrame()) - ->ProcessCandidates(candidates); + ->ProcessCandidates(candidates, /*devtools_observer=*/nullptr); + ; // Check that the candidates that should be prefetched were sent to // |PrefetchService|.
diff --git a/content/browser/preloading/prefetch/prefetch_service.cc b/content/browser/preloading/prefetch/prefetch_service.cc index f8e0b0a9..9307d21 100644 --- a/content/browser/preloading/prefetch/prefetch_service.cc +++ b/content/browser/preloading/prefetch/prefetch_service.cc
@@ -298,7 +298,7 @@ // If we have recently received a "retry-after" for the origin, then don't // send new prefetches. - if (delegate_ && delegate_->IsOriginOutsideRetryAfterWindow( + if (delegate_ && !delegate_->IsOriginOutsideRetryAfterWindow( prefetch_container->GetURL())) { std::move(result_callback) .Run(prefetch_container, false, @@ -581,6 +581,12 @@ request->trusted_params = trusted_params; request->site_for_cookies = trusted_params.isolation_info.site_for_cookies(); + const auto& devtools_observer = prefetch_container->GetDevToolsObserver(); + if (devtools_observer && !prefetch_container->IsDecoy()) { + devtools_observer->OnStartSinglePrefetch(prefetch_container->RequestId(), + *request); + } + net::NetworkTrafficAnnotationTag traffic_annotation = net::DefineNetworkTrafficAnnotation("speculation_rules_prefetch", R"( @@ -663,6 +669,18 @@ // Cancels current request. prefetch_container->ResetURLLoader(); + // Send DevTools event + const auto& devtools_observer = prefetch_container->GetDevToolsObserver(); + if (devtools_observer) { + devtools_observer->OnPrefetchResponseReceived( + prefetch_container->GetURL(), prefetch_container->RequestId(), + response_head); + + devtools_observer->OnPrefetchRequestComplete( + prefetch_container->RequestId(), + network::URLLoaderCompletionStatus{net::ERR_NOT_IMPLEMENTED}); + } + // Continue prefetching other URLs. Prefetch(); } @@ -691,6 +709,21 @@ "PrefetchProxy.Prefetch.Mainframe.NetError", std::abs(prefetch_container->GetLoader()->NetError())); + const auto& devtools_observer = prefetch_container->GetDevToolsObserver(); + if (devtools_observer) { + if (prefetch_container->GetLoader()->ResponseInfo()) { + devtools_observer->OnPrefetchResponseReceived( + prefetch_container->GetURL(), prefetch_container->RequestId(), + *prefetch_container->GetLoader()->ResponseInfo()); + } + + devtools_observer->OnPrefetchRequestComplete( + prefetch_container->RequestId(), + prefetch_container->GetLoader()->CompletionStatus().value_or( + network::URLLoaderCompletionStatus( + prefetch_container->GetLoader()->NetError()))); + } + if (prefetch_container->GetLoader()->NetError() != net::OK) { prefetch_container->SetPrefetchStatus( PrefetchStatus::kPrefetchFailedNetError);
diff --git a/content/browser/preloading/prefetch/prefetch_service_unittest.cc b/content/browser/preloading/prefetch/prefetch_service_unittest.cc index e93d28c5..454d2990 100644 --- a/content/browser/preloading/prefetch/prefetch_service_unittest.cc +++ b/content/browser/preloading/prefetch/prefetch_service_unittest.cc
@@ -60,7 +60,7 @@ .WillByDefault(testing::Return(GURL(kPrefetchProxyAddress))); ON_CALL(*this, GetAPIKey).WillByDefault(testing::Return(kApiKey)); ON_CALL(*this, IsOriginOutsideRetryAfterWindow(testing::_)) - .WillByDefault(testing::Return(false)); + .WillByDefault(testing::Return(true)); ON_CALL(*this, DisableDecoysBasedOnUserSettings) .WillByDefault(testing::Return(false)); ON_CALL(*this, IsSomePreloadingEnabled) @@ -194,7 +194,7 @@ const PrefetchType& prefetch_type) { PrefetchDocumentManager* prefetch_document_manager = PrefetchDocumentManager::GetOrCreateForCurrentDocument(main_rfh()); - prefetch_document_manager->PrefetchUrl(url, prefetch_type); + prefetch_document_manager->PrefetchUrl(url, prefetch_type, nullptr); } int RequestCount() { return test_url_loader_factory_.NumPending(); } @@ -939,7 +939,7 @@ EXPECT_CALL(*mock_prefetch_service_delegate, IsOriginOutsideRetryAfterWindow(GURL("https://example.com"))) .Times(1) - .WillOnce(testing::Return(true)); + .WillOnce(testing::Return(false)); MakePrefetchService(std::move(mock_prefetch_service_delegate));
diff --git a/content/browser/preloading/speculation_rules/speculation_host_impl.cc b/content/browser/preloading/speculation_rules/speculation_host_impl.cc index b336584..e1d2e855 100644 --- a/content/browser/preloading/speculation_rules/speculation_host_impl.cc +++ b/content/browser/preloading/speculation_rules/speculation_host_impl.cc
@@ -7,6 +7,7 @@ #include "base/containers/span.h" #include "base/ranges/algorithm.h" +#include "content/browser/devtools/devtools_instrumentation.h" #include "content/browser/preloading//preloading.h" #include "content/browser/preloading/prefetch/prefetch_document_manager.h" #include "content/browser/preloading/prefetch/prefetch_features.h" @@ -142,12 +143,13 @@ PrefetchDocumentManager::GetOrCreateForCurrentDocument( &render_frame_host()); - prefetch_document_manager->ProcessCandidates(candidates); + prefetch_document_manager->ProcessCandidates( + candidates, weak_ptr_factory_.GetWeakPtr()); } // Let `delegate_` process the candidates that it is interested in. if (delegate_) - delegate_->ProcessCandidates(candidates); + delegate_->ProcessCandidates(candidates, weak_ptr_factory_.GetWeakPtr()); ProcessCandidatesForPrerender(candidates); } @@ -301,4 +303,31 @@ } } +void SpeculationHostImpl::OnStartSinglePrefetch( + const std::string& request_id, + const network::ResourceRequest& request) { + auto* ftn = static_cast<RenderFrameHostImpl*>(&render_frame_host()) + ->frame_tree_node(); + devtools_instrumentation::OnPrefetchRequestWillBeSent( + ftn, request_id, render_frame_host().GetLastCommittedURL(), request); +} + +void SpeculationHostImpl::OnPrefetchResponseReceived( + const GURL& url, + const std::string& request_id, + const network::mojom::URLResponseHead& response) { + auto* ftn = static_cast<RenderFrameHostImpl*>(&render_frame_host()) + ->frame_tree_node(); + devtools_instrumentation::OnPrefetchResponseReceived(ftn, request_id, url, + response); +} + +void SpeculationHostImpl::OnPrefetchRequestComplete( + const std::string& request_id, + const network::URLLoaderCompletionStatus& status) { + auto* ftn = static_cast<RenderFrameHostImpl*>(&render_frame_host()) + ->frame_tree_node(); + devtools_instrumentation::OnPrefetchRequestComplete(ftn, request_id, status); +} + } // namespace content
diff --git a/content/browser/preloading/speculation_rules/speculation_host_impl.h b/content/browser/preloading/speculation_rules/speculation_host_impl.h index 888cfc44..dda00ee 100644 --- a/content/browser/preloading/speculation_rules/speculation_host_impl.h +++ b/content/browser/preloading/speculation_rules/speculation_host_impl.h
@@ -12,7 +12,6 @@ #include "content/public/browser/speculation_host_delegate.h" #include "content/public/browser/web_contents_observer.h" #include "mojo/public/cpp/bindings/pending_receiver.h" -#include "third_party/blink/public/mojom/speculation_rules/speculation_rules.mojom.h" namespace content { class RenderFrameHost; @@ -23,7 +22,8 @@ // third_party/blink/renderer/core/speculation_rules/README.md class CONTENT_EXPORT SpeculationHostImpl final : public content::DocumentService<blink::mojom::SpeculationHost>, - public WebContentsObserver { + public WebContentsObserver, + public SpeculationHostDevToolsObserver { public: // Creates and binds an instance of this per-frame. static void Bind( @@ -38,6 +38,17 @@ // WebContentsObserver implementation: void PrimaryPageChanged(Page& page) override; + // SpeculationHostDevToolsObserver implementation: + void OnStartSinglePrefetch(const std::string& request_id, + const network::ResourceRequest& request) override; + void OnPrefetchResponseReceived( + const GURL& url, + const std::string& request_id, + const network::mojom::URLResponseHead& response) override; + void OnPrefetchRequestComplete( + const std::string& request_id, + const network::URLLoaderCompletionStatus& status) override; + private: SpeculationHostImpl( RenderFrameHost& frame_host, @@ -61,6 +72,8 @@ std::vector<PrerenderInfo> started_prerenders_; base::WeakPtr<PrerenderHostRegistry> registry_; + + base::WeakPtrFactory<SpeculationHostImpl> weak_ptr_factory_{this}; }; } // namespace content
diff --git a/content/browser/preloading/speculation_rules/speculation_host_impl_unittest.cc b/content/browser/preloading/speculation_rules/speculation_host_impl_unittest.cc index bd25a44..7900841 100644 --- a/content/browser/preloading/speculation_rules/speculation_host_impl_unittest.cc +++ b/content/browser/preloading/speculation_rules/speculation_host_impl_unittest.cc
@@ -180,7 +180,10 @@ // SpeculationRulesDelegate implementation. void ProcessCandidates( - std::vector<blink::mojom::SpeculationCandidatePtr>& candidates) override { + std::vector<blink::mojom::SpeculationCandidatePtr>& candidates, + base::WeakPtr< + content::SpeculationHostDevToolsObserver> /*devtools_observer*/) + override { candidates.clear(); } };
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc index 11d427d..237e270 100644 --- a/content/browser/site_per_process_browsertest.cc +++ b/content/browser/site_per_process_browsertest.cc
@@ -112,6 +112,7 @@ #include "content/public/test/test_utils.h" #include "content/public/test/url_loader_interceptor.h" #include "content/shell/browser/shell.h" +#include "content/shell/common/main_frame_counter_test_impl.h" #include "content/shell/common/shell_switches.h" #include "content/test/content_browser_test_utils_internal.h" #include "content/test/did_commit_navigation_interceptor.h" @@ -195,6 +196,20 @@ namespace { +void VerifyChildProcessHasMainFrame( + mojo::Remote<mojom::MainFrameCounterTest>& main_frame_counter, + bool expected_state) { + main_frame_counter.FlushForTesting(); + base::RunLoop run_loop; + main_frame_counter->HasMainFrame(base::BindOnce( + [](base::RunLoop* loop, bool expected_state, bool has_main_frame) { + EXPECT_EQ(expected_state, has_main_frame); + loop->Quit(); + }, + &run_loop, expected_state)); + run_loop.Run(); +} + using CrashVisibility = CrossProcessFrameConnector::CrashVisibility; // Helper function to send a postMessage and wait for a reply message. The @@ -626,6 +641,17 @@ web_contents()->GetRenderWidgetHostViewsInWebContentsTree(); EXPECT_EQ(2U, views_set.size()); } + mojo::Remote<mojom::MainFrameCounterTest> main_frame_counter; + shell()->web_contents()->GetPrimaryMainFrame()->GetProcess()->BindReceiver( + main_frame_counter.BindNewPipeAndPassReceiver()); + + VerifyChildProcessHasMainFrame(main_frame_counter, true); + + mojo::Remote<mojom::MainFrameCounterTest> main_frame_counter_child; + rph->BindReceiver(main_frame_counter_child.BindNewPipeAndPassReceiver()); + + VerifyChildProcessHasMainFrame(main_frame_counter_child, false); + RenderFrameProxyHost* proxy_to_parent = child->render_manager()->GetProxyToParent(); EXPECT_TRUE(proxy_to_parent); @@ -672,6 +698,7 @@ EXPECT_NE(shell()->web_contents()->GetPrimaryMainFrame()->GetProcess(), child->current_frame_host()->GetProcess()); EXPECT_NE(rph, child->current_frame_host()->GetProcess()); + VerifyChildProcessHasMainFrame(main_frame_counter, true); { std::set<RenderWidgetHostViewBase*> views_set = web_contents()->GetRenderWidgetHostViewsInWebContentsTree(); @@ -696,6 +723,61 @@ DepictFrameTree(root)); } +// Ensure that processes for iframes correctly track whether or not they have a +// local main frame. +IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTest, + CrossSiteIframeMainFrameCount) { + GURL main_url(embedded_test_server()->GetURL( + "a.com", "/cross_site_iframe_factory.html?a(a,a,a(a,a))")); + EXPECT_TRUE(NavigateToURL(shell(), main_url)); + + FrameTreeNode* root = web_contents()->GetPrimaryFrameTree().root(); + + TestNavigationObserver observer(shell()->web_contents()); + + EXPECT_EQ( + " Site A\n" + " |--Site A\n" + " |--Site A\n" + " +--Site A\n" + " |--Site A\n" + " +--Site A\n" + "Where A = http://a.com/", + DepictFrameTree(root)); + + mojo::Remote<mojom::MainFrameCounterTest> main_frame_counter; + shell()->web_contents()->GetPrimaryMainFrame()->GetProcess()->BindReceiver( + main_frame_counter.BindNewPipeAndPassReceiver()); + VerifyChildProcessHasMainFrame(main_frame_counter, true); + + GURL url = embedded_test_server()->GetURL( + "b.com", "/cross_site_iframe_factory.html?b(a,a)"); + { + RenderFrameDeletedObserver deleted_observer( + root->child_at(2)->current_frame_host()); + EXPECT_TRUE(NavigateToURLFromRenderer(root->child_at(2), url)); + deleted_observer.WaitUntilDeleted(); + } + + EXPECT_EQ( + " Site A ------------ proxies for B\n" + " |--Site A ------- proxies for B\n" + " |--Site A ------- proxies for B\n" + " +--Site B ------- proxies for A\n" + " |--Site A -- proxies for B\n" + " +--Site A -- proxies for B\n" + "Where A = http://a.com/\n" + " B = http://b.com/", + DepictFrameTree(root)); + + VerifyChildProcessHasMainFrame(main_frame_counter, true); + + mojo::Remote<mojom::MainFrameCounterTest> main_frame_counter_child; + root->child_at(2)->current_frame_host()->GetProcess()->BindReceiver( + main_frame_counter_child.BindNewPipeAndPassReceiver()); + VerifyChildProcessHasMainFrame(main_frame_counter_child, false); +} + // Ensure that title updates affect the correct NavigationEntry after a new // subframe navigation with an out-of-process iframe. https://crbug.com/616609. IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTest, TitleAfterCrossSiteIframe) {
diff --git a/content/browser/utility_sandbox_delegate_win.cc b/content/browser/utility_sandbox_delegate_win.cc index 5f6847d..e3c1b29 100644 --- a/content/browser/utility_sandbox_delegate_win.cc +++ b/content/browser/utility_sandbox_delegate_win.cc
@@ -187,15 +187,12 @@ return false; // Allow file read. These should match IconLoader::GroupForFilepath(). - policy->AddRule(sandbox::TargetPolicy::SUBSYS_FILES, - sandbox::TargetPolicy::FILES_ALLOW_READONLY, - L"\\??\\*.exe"); - policy->AddRule(sandbox::TargetPolicy::SUBSYS_FILES, - sandbox::TargetPolicy::FILES_ALLOW_READONLY, - L"\\??\\*.dll"); - policy->AddRule(sandbox::TargetPolicy::SUBSYS_FILES, - sandbox::TargetPolicy::FILES_ALLOW_READONLY, - L"\\??\\*.ico"); + policy->AddRule(sandbox::SubSystem::kFiles, + sandbox::Semantics::kFilesAllowReadonly, L"\\??\\*.exe"); + policy->AddRule(sandbox::SubSystem::kFiles, + sandbox::Semantics::kFilesAllowReadonly, L"\\??\\*.dll"); + policy->AddRule(sandbox::SubSystem::kFiles, + sandbox::Semantics::kFilesAllowReadonly, L"\\??\\*.ico"); } if (sandbox_type_ == sandbox::mojom::Sandbox::kXrCompositing &&
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn index 71c71d58..2e89d1b 100644 --- a/content/common/BUILD.gn +++ b/content/common/BUILD.gn
@@ -154,6 +154,7 @@ ] public_deps = [ + ":main_frame_counter", ":mojo_bindings", "//cc", "//cc/ipc", @@ -395,6 +396,16 @@ } } +# this is used by content_browsertests as well, which we don't want to depend +# on the entire content/common. +source_set("main_frame_counter") { + sources = [ + "main_frame_counter.cc", + "main_frame_counter.h", + ] + deps = [ "//base:base" ] +} + if (is_linux || is_chromeos) { source_set("set_process_title_linux") { public = [ "set_process_title_linux.h" ]
diff --git a/content/common/main_frame_counter.cc b/content/common/main_frame_counter.cc new file mode 100644 index 0000000..08a19b9 --- /dev/null +++ b/content/common/main_frame_counter.cc
@@ -0,0 +1,30 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/common/main_frame_counter.h" +#include "base/check_op.h" + +namespace content { + +// static +size_t MainFrameCounter::main_frame_count_ = 0; + +// static +bool MainFrameCounter::has_main_frame() { + return main_frame_count_ > 0; +} + +// static +void MainFrameCounter::IncrementCount() { + main_frame_count_++; +} + +// static +void MainFrameCounter::DecrementCount() { + // If this check fails, we have miscounted somewhere. + DCHECK_GT(main_frame_count_, 0u); + main_frame_count_--; +} + +}; // namespace content
diff --git a/content/common/main_frame_counter.h b/content/common/main_frame_counter.h new file mode 100644 index 0000000..5fdf0dc0 --- /dev/null +++ b/content/common/main_frame_counter.h
@@ -0,0 +1,36 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_COMMON_MAIN_FRAME_COUNTER_H_ +#define CONTENT_COMMON_MAIN_FRAME_COUNTER_H_ + +#include <stddef.h> + +namespace content { + +// This should only be used from the Renderer process, but is placed in common +// so the Browser process can access it for testing only. +// +// This keeps track of how many main frames exist in the current Renderer +// process. +// +// This is for an ongoing experiment to reduce memory usage in Renderers that +// only contain subframes; it should be removed if the experiment does not +// end up shipping. See: crbug.com/1331368 for tracking. +class MainFrameCounter final { + public: + static bool has_main_frame(); + + private: + friend class RenderFrameImpl; + + static void IncrementCount(); + static void DecrementCount(); + + static size_t main_frame_count_; +}; + +} // namespace content + +#endif // CONTENT_COMMON_MAIN_FRAME_COUNTER_H_
diff --git a/content/common/partition_alloc_support.cc b/content/common/partition_alloc_support.cc index eafb934..8836c94 100644 --- a/content/common/partition_alloc_support.cc +++ b/content/common/partition_alloc_support.cc
@@ -25,6 +25,7 @@ #include "base/no_destructor.h" #include "base/time/time.h" #include "build/build_config.h" +#include "content/public/common/content_features.h" #include "content/public/common/content_switches.h" #if BUILDFLAG(IS_ANDROID) @@ -454,7 +455,7 @@ } } -void PartitionAllocSupport::OnForegrounded() { +void PartitionAllocSupport::OnForegrounded(bool has_main_frame) { #if defined(PA_THREAD_CACHE_SUPPORTED) && \ BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) { @@ -463,7 +464,10 @@ return; } - ::partition_alloc::ThreadCache::SetLargestCachedSize(largest_cached_size_); + if (!base::FeatureList::IsEnabled( + features::kLowerMemoryLimitForNonMainRenderers) || + has_main_frame) + ::partition_alloc::ThreadCache::SetLargestCachedSize(largest_cached_size_); #endif // defined(PA_THREAD_CACHE_SUPPORTED) && // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) }
diff --git a/content/common/partition_alloc_support.h b/content/common/partition_alloc_support.h index 21ceeca9..9da58fa 100644 --- a/content/common/partition_alloc_support.h +++ b/content/common/partition_alloc_support.h
@@ -47,7 +47,8 @@ void ReconfigureAfterFeatureListInit(const std::string& process_type); void ReconfigureAfterTaskRunnerInit(const std::string& process_type); - void OnForegrounded(); + // |has_main_frame| tells us if the renderer contains a main frame. + void OnForegrounded(bool has_main_frame); void OnBackgrounded(); static PartitionAllocSupport* Get() {
diff --git a/content/public/android/java/src/org/chromium/content/browser/GestureListenerManagerImpl.java b/content/public/android/java/src/org/chromium/content/browser/GestureListenerManagerImpl.java index 2e6dfd6..9be06fa 100644 --- a/content/public/android/java/src/org/chromium/content/browser/GestureListenerManagerImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/GestureListenerManagerImpl.java
@@ -44,6 +44,8 @@ GestureListenerManagerImpl::new; } + private static GestureListenerManagerImpl sInstanceForTesting; + private final WebContentsImpl mWebContents; private final ObserverList<GestureStateListener> mListeners; private final RewindableIterator<GestureStateListener> mIterator; @@ -72,11 +74,19 @@ * Creates one if not present. */ public static GestureListenerManagerImpl fromWebContents(WebContents webContents) { + if (sInstanceForTesting != null) return sInstanceForTesting; return ((WebContentsImpl) webContents) .getOrSetUserData( GestureListenerManagerImpl.class, UserDataFactoryLazyHolder.INSTANCE); } + // TODO(https://crbug.com/1340593): Mocking |#fromWebContents()| may be a better option, when + // available. + @VisibleForTesting + public static void setInstanceForTesting(GestureListenerManagerImpl instance) { + sInstanceForTesting = instance; + } + public GestureListenerManagerImpl(WebContents webContents) { mWebContents = (WebContentsImpl) webContents; mListeners = new ObserverList<GestureStateListener>();
diff --git a/content/public/browser/speculation_host_delegate.h b/content/public/browser/speculation_host_delegate.h index 23438ff..20e20d8 100644 --- a/content/public/browser/speculation_host_delegate.h +++ b/content/public/browser/speculation_host_delegate.h
@@ -6,9 +6,25 @@ #define CONTENT_PUBLIC_BROWSER_SPECULATION_HOST_DELEGATE_H_ #include "content/common/content_export.h" +#include "services/network/public/cpp/resource_request.h" +#include "services/network/public/cpp/url_loader_completion_status.h" +#include "services/network/public/mojom/url_response_head.mojom-forward.h" #include "third_party/blink/public/mojom/speculation_rules/speculation_rules.mojom.h" namespace content { +class CONTENT_EXPORT SpeculationHostDevToolsObserver { + public: + virtual void OnStartSinglePrefetch( + const std::string& request_id, + const network::ResourceRequest& request) = 0; + virtual void OnPrefetchResponseReceived( + const GURL& url, + const std::string& request_id, + const network::mojom::URLResponseHead& response) = 0; + virtual void OnPrefetchRequestComplete( + const std::string& request_id, + const network::URLLoaderCompletionStatus& status) = 0; +}; // Allow embedders to handle speculation candidates with their own strategies. // See third_party/blink/renderer/core/speculation_rules/README.md for more @@ -17,13 +33,13 @@ public: virtual ~SpeculationHostDelegate() = default; - // Called when the caller has encountered the given speculation candidates and - // gives this delegate a chance to take action on them. - // The caller may take action on `candidates` after this function returns. - // Therefore, the delegate should remove elements that it decided to take an - // action on. + // Called when the caller has encountered the given speculation candidates + // and gives this delegate a chance to take action on them. The caller may + // take action on `candidates` after this function returns. Therefore, the + // delegate should remove elements that it decided to take an action on. virtual void ProcessCandidates( - std::vector<blink::mojom::SpeculationCandidatePtr>& candidates) = 0; + std::vector<blink::mojom::SpeculationCandidatePtr>& candidates, + base::WeakPtr<SpeculationHostDevToolsObserver> devtools_observer) = 0; }; } // namespace content
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc index bf77771..174c874 100644 --- a/content/public/common/content_features.cc +++ b/content/public/common/content_features.cc
@@ -532,6 +532,11 @@ #endif }; +// Configures whether we set a lower limit for renderers that do not have a main +// frame, similar to the limit that is already done for backgrounded renderers. +const base::Feature kLowerMemoryLimitForNonMainRenderers{ + "LowerMemoryLimitForNonMainRenderers", base::FEATURE_DISABLED_BY_DEFAULT}; + // The MBI mode controls whether or not communication over the // AgentSchedulingGroup is ordered with respect to the render-process-global // legacy IPC channel, as well as the granularity of AgentSchedulingGroup
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h index ac96ec2..d266b07 100644 --- a/content/public/common/content_features.h +++ b/content/public/common/content_features.h
@@ -137,6 +137,7 @@ CONTENT_EXPORT extern const base::Feature kLazyInitializeMediaControls; CONTENT_EXPORT extern const base::Feature kLegacyWindowsDWriteFontFallback; CONTENT_EXPORT extern const base::Feature kLogJsConsoleMessages; +CONTENT_EXPORT extern const base::Feature kLowerMemoryLimitForNonMainRenderers; CONTENT_EXPORT extern const base::Feature kMBIMode; enum class MBIMode { // In this mode, the AgentSchedulingGroup will use the process-wide legacy IPC
diff --git a/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/util/DOMUtils.java b/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/util/DOMUtils.java index f4a762ee..0a6a900b 100644 --- a/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/util/DOMUtils.java +++ b/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/util/DOMUtils.java
@@ -225,6 +225,8 @@ /** * Click a DOM node by its id, scrolling it into view first. + * Warning: This method might cause flakiness in the tests + * See http://crbug.com/1327063 * @param webContents The WebContents in which the node lives. * @param nodeId The id of the node. */ @@ -499,12 +501,12 @@ } /** - * Returns the value of a given attribute of type {@code valueType} as a {@code T}. + * Returns the value of a given attribute of type {@code valueType} as a {@code T} or null. * @param attributeName The attribute to return the value from. * @param webContents The WebContents in which the node lives. * @param nodeId The id of the node. * @param valueType The type of the value to read. - * @return the attributes' value. + * @return the attributes' value or null if there is no attribute with such attributeName. */ public static <T> T getNodeAttribute(String attributeName, final WebContents webContents, String nodeId, Class<T> valueType) throws InterruptedException, TimeoutException { @@ -512,17 +514,32 @@ sb.append("(function() {"); sb.append(" var node = document.getElementById('" + nodeId + "');"); sb.append(" if (!node) return null;"); - sb.append(" return [ node.getAttribute('" + attributeName + "') ];"); + sb.append(" var nodeAttr = node.getAttribute('" + attributeName + "');"); + sb.append(" if (!nodeAttr) return null;"); + sb.append(" return [ nodeAttr ];"); sb.append("})();"); String jsonText = JavaScriptUtils.executeJavaScriptAndWaitForResult(webContents, sb.toString()); - Assert.assertFalse("Failed to retrieve contents for " + nodeId, - jsonText.trim().equalsIgnoreCase("null")); + if (jsonText.trim().equalsIgnoreCase("null")) { + return null; + } return readValue(jsonText, valueType); } /** + * Click a DOM node by its id using a js MouseEvent with a fake gesture. + * This function is more reliable than {@link #clickNode(WebContents, String)}, + * but it doesn't simulate a screen touch. + * @param webContents The WebContents in which the node lives. + * @param nodeId The id of the node. + */ + public static void clickNodeWithJavaScript(WebContents webContents, String nodeId) { + WebContentsUtils.evaluateJavaScriptWithUserGesture( + webContents, createScriptToClickNode(nodeId), null); + } + + /** * Returns the next value of type {@code valueType} as a {@code T}. * @param jsonText The unparsed json text. * @param valueType The type of the value to read. @@ -667,5 +684,10 @@ return new Rect(bounds[0], bounds[1], bounds[0] + bounds[2], bounds[1] + bounds[3]); } + private static String createScriptToClickNode(String nodeId) { + String script = "document.getElementById('" + nodeId + "').click();"; + return script; + } + private static native int nativeGetTopControlsShrinkBlinkHeight(WebContents webContents); }
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index 609edf8..130f5285 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -58,6 +58,7 @@ #include "content/common/debug_utils.h" #include "content/common/frame.mojom.h" #include "content/common/frame_messages.mojom.h" +#include "content/common/main_frame_counter.h" #include "content/common/navigation_client.mojom.h" #include "content/common/navigation_gesture.h" #include "content/common/navigation_params_utils.h" @@ -1860,6 +1861,9 @@ web_media_stream_device_observer_.reset(); + if (initialized_ && is_main_frame_) + MainFrameCounter::DecrementCount(); + base::trace_event::TraceLog::GetInstance()->RemoveProcessLabel(routing_id_); g_routing_id_frame_map.Get().erase(routing_id_); agent_scheduling_group_.RemoveRoute(routing_id_); @@ -1868,6 +1872,8 @@ void RenderFrameImpl::Initialize(blink::WebFrame* parent) { initialized_ = true; is_main_frame_ = !parent; + if (is_main_frame_) + MainFrameCounter::IncrementCount(); TRACE_EVENT1("navigation,rail", "RenderFrameImpl::Initialize", "routing_id", routing_id_);
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc index a793222..028c190 100644 --- a/content/renderer/render_thread_impl.cc +++ b/content/renderer/render_thread_impl.cc
@@ -66,6 +66,7 @@ #include "content/child/runtime_features.h" #include "content/common/buildflags.h" #include "content/common/content_constants_internal.h" +#include "content/common/main_frame_counter.h" #include "content/common/partition_alloc_support.h" #include "content/common/process_visibility_tracker.h" #include "content/common/pseudonymization_salt.h" @@ -76,6 +77,7 @@ #include "content/public/common/gpu_stream_constants.h" #include "content/public/common/url_constants.h" #include "content/public/renderer/content_renderer_client.h" +#include "content/public/renderer/render_frame.h" #include "content/public/renderer/render_thread_observer.h" #include "content/renderer/agent_scheduling_group.h" #include "content/renderer/browser_exposed_renderer_interfaces.h" @@ -1660,7 +1662,8 @@ void RenderThreadImpl::OnRendererForegrounded() { main_thread_scheduler_->SetRendererBackgrounded(false); discardable_memory_allocator_->OnForegrounded(); - internal::PartitionAllocSupport::Get()->OnForegrounded(); + internal::PartitionAllocSupport::Get()->OnForegrounded( + MainFrameCounter::has_main_frame()); process_foregrounded_count_++; }
diff --git a/content/shell/BUILD.gn b/content/shell/BUILD.gn index 0322e7a..4f4abaae 100644 --- a/content/shell/BUILD.gn +++ b/content/shell/BUILD.gn
@@ -150,6 +150,8 @@ "browser/shell_speech_recognition_manager_delegate.h", "browser/shell_web_contents_view_delegate.h", "browser/shell_web_contents_view_delegate_creator.h", + "common/main_frame_counter_test_impl.cc", + "common/main_frame_counter_test_impl.h", "common/power_monitor_test_impl.cc", "common/power_monitor_test_impl.h", "common/shell_content_client.cc", @@ -251,6 +253,7 @@ "//components/web_cache/renderer", "//content:content_resources", "//content:dev_ui_content_resources", + "//content/common:main_frame_counter", "//content/public/common", "//content/test:content_test_mojo_bindings", "//content/test:test_support", @@ -850,7 +853,10 @@ } mojom("content_browsertests_mojom") { - sources = [ "common/power_monitor_test.mojom" ] + sources = [ + "common/main_frame_counter_test.mojom", + "common/power_monitor_test.mojom", + ] public_deps = [ "//sandbox/policy/mojom" ] }
diff --git a/content/shell/common/main_frame_counter_test.mojom b/content/shell/common/main_frame_counter_test.mojom new file mode 100644 index 0000000..683ff22 --- /dev/null +++ b/content/shell/common/main_frame_counter_test.mojom
@@ -0,0 +1,13 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +module content.mojom; + +// This interface is only for the sake of browser test to query the number of +// main frames in a remote child process. +interface MainFrameCounterTest { + // Returns whether or not the renderer this is called on has a local main + // frame. + HasMainFrame() => (bool has_main_frame); +};
diff --git a/content/shell/common/main_frame_counter_test_impl.cc b/content/shell/common/main_frame_counter_test_impl.cc new file mode 100644 index 0000000..fb557f1 --- /dev/null +++ b/content/shell/common/main_frame_counter_test_impl.cc
@@ -0,0 +1,30 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/shell/common/main_frame_counter_test_impl.h" +#include "base/no_destructor.h" +#include "content/common/main_frame_counter.h" +#include "mojo/public/cpp/bindings/receiver.h" + +namespace content { + +MainFrameCounterTestImpl* GetMainFrameCounterTestImpl() { + static base::NoDestructor<MainFrameCounterTestImpl> instance; + return instance.get(); +} + +MainFrameCounterTestImpl::MainFrameCounterTestImpl() = default; +MainFrameCounterTestImpl::~MainFrameCounterTestImpl() = default; + +// static +void MainFrameCounterTestImpl::Bind( + mojo::PendingReceiver<mojom::MainFrameCounterTest> receiver) { + GetMainFrameCounterTestImpl()->receiver_.Bind(std::move(receiver)); +} + +void MainFrameCounterTestImpl::HasMainFrame(HasMainFrameCallback callback) { + std::move(callback).Run(MainFrameCounter::has_main_frame()); +} + +}; // namespace content
diff --git a/content/shell/common/main_frame_counter_test_impl.h b/content/shell/common/main_frame_counter_test_impl.h new file mode 100644 index 0000000..0ab65b7 --- /dev/null +++ b/content/shell/common/main_frame_counter_test_impl.h
@@ -0,0 +1,27 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_SHELL_COMMON_MAIN_FRAME_COUNTER_TEST_IMPL_H_ +#define CONTENT_SHELL_COMMON_MAIN_FRAME_COUNTER_TEST_IMPL_H_ + +#include "content/shell/common/main_frame_counter_test.mojom.h" +#include "mojo/public/cpp/bindings/receiver.h" + +namespace content { + +class MainFrameCounterTestImpl final : public mojom::MainFrameCounterTest { + public: + MainFrameCounterTestImpl(); + ~MainFrameCounterTestImpl() override; + static void Bind(mojo::PendingReceiver<mojom::MainFrameCounterTest> receiver); + + void HasMainFrame(HasMainFrameCallback) override; + + private: + mojo::Receiver<mojom::MainFrameCounterTest> receiver_{this}; +}; + +}; // namespace content + +#endif // CONTENT_SHELL_COMMON_MAIN_FRAME_COUNTER_TEST_IMPL_H_
diff --git a/content/shell/renderer/shell_content_renderer_client.cc b/content/shell/renderer/shell_content_renderer_client.cc index 0194e1ca..b1970c5 100644 --- a/content/shell/renderer/shell_content_renderer_client.cc +++ b/content/shell/renderer/shell_content_renderer_client.cc
@@ -14,6 +14,7 @@ #include "components/cdm/renderer/external_clear_key_key_system_properties.h" #include "components/web_cache/renderer/web_cache_impl.h" #include "content/public/test/test_service.mojom.h" +#include "content/shell/common/main_frame_counter_test_impl.h" #include "content/shell/common/power_monitor_test_impl.h" #include "content/shell/common/shell_switches.h" #include "content/shell/renderer/shell_render_frame_observer.h" @@ -138,6 +139,8 @@ binders->Add( base::BindRepeating(&PowerMonitorTestImpl::MakeSelfOwnedReceiver), base::ThreadTaskRunnerHandle::Get()); + binders->Add(base::BindRepeating(&MainFrameCounterTestImpl::Bind), + base::ThreadTaskRunnerHandle::Get()); binders->Add(base::BindRepeating(&web_cache::WebCacheImpl::BindReceiver, base::Unretained(web_cache_impl_.get())), base::ThreadTaskRunnerHandle::Get());
diff --git a/content/test/data/accessibility/mac/methods/accessibility-frame-expected.txt b/content/test/data/accessibility/mac/methods/accessibility-frame-expected.txt new file mode 100644 index 0000000..3eca3d7d --- /dev/null +++ b/content/test/data/accessibility/mac/methods/accessibility-frame-expected.txt
@@ -0,0 +1,4 @@ +// Only test the size attribute of accessibility frame because testing the +// position results in flakey tests. +div.accessibilityFrame.size={w: 85, h: 18} +clipped.accessibilityFrame.size={w: 80, h: 36}
diff --git a/content/test/data/accessibility/mac/methods/accessibility-frame.html b/content/test/data/accessibility/mac/methods/accessibility-frame.html new file mode 100644 index 0000000..1deeb75 --- /dev/null +++ b/content/test/data/accessibility/mac/methods/accessibility-frame.html
@@ -0,0 +1,14 @@ +<!-- +@SCRIPT: + // Only test the size attribute of accessibility frame because testing the + // position results in flakey tests. + div.accessibilityFrame.size + clipped.accessibilityFrame.size +--> +<!DOCTYPE html> +<div id="div" style="position: absolute; top: 10px; left: 10px;"> + This is a test. +</div> +<div id="clipped" style="position: absolute; top: 40px; left: 10px; width: 10ch; overflow: clip;"> + This is a clipped test. +</div>
diff --git a/content/test/data/attribution_reporting/interop/event_level_trigger_filter_data.json b/content/test/data/attribution_reporting/interop/event_level_trigger_filter_data.json new file mode 100644 index 0000000..51618814 --- /dev/null +++ b/content/test/data/attribution_reporting/interop/event_level_trigger_filter_data.json
@@ -0,0 +1,271 @@ +{ + "description": "First matched event trigger data is attributed", + "input": { + "sources": [ + { + "timestamp": "1643235573000", + "registration_request": { + "source_origin": "https://source.test", + "attribution_src_url": "https://reporter.test/register-source", + "source_type": "navigation" + }, + "responses": [{ + "url": "https://reporter.test/register-source", + "response": { + "Attribution-Reporting-Register-Source": { + "destination": "https://destination.test", + "source_event_id": "123", + "filter_data": { + "product": ["123", "456"], + "geo": [] + } + } + } + }] + }, + { + "timestamp": "1643235573000", + "registration_request": { + "source_origin": "https://source.test", + "attribution_src_url": "https://reporter.test/register-source", + "source_type": "event" + }, + "responses": [{ + "url": "https://reporter.test/register-source", + "response": { + "Attribution-Reporting-Register-Source": { + "destination": "https://another-destination.test", + "source_event_id": "456" + } + } + }] + } + ], + "triggers": [ + { + "timestamp": "1643235574000", + "registration_request": { + "attribution_src_url": "https://reporter.test/register-trigger", + "destination_origin": "https://destination.test" + }, + "responses": [{ + "url": "https://reporter.test/register-trigger", + "response": { + "Attribution-Reporting-Register-Trigger": { + "event_trigger_data": [ + { + "trigger_data": "1", + "filters": { + "product": [], + "source_type": ["navigation"] + } + }, + { + "trigger_data": "2", + "filters": { + "geo": [], + "source_type": ["event"] + } + }, + { + "trigger_data": "3", + "filters": { + "product": ["123"], + "geo": [], + "source_type": ["navigation"], + "campaign": ["example"] + } + }, + { + "trigger_data": "4", + "filters": { + "product": ["123"], + "geo": [], + "source_type": ["navigation"], + "campaign": ["example"] + } + } + ] + } + } + }] + }, + { + "timestamp": "1643235575000", + "registration_request": { + "attribution_src_url": "https://reporter.test/register-trigger", + "destination_origin": "https://destination.test" + }, + "responses": [{ + "url": "https://reporter.test/register-trigger", + "response": { + "Attribution-Reporting-Register-Trigger": { + "event_trigger_data": [ + { + "trigger_data": "1", + "not_filters": { + "geo": [], + "source_type": ["event"] + } + }, + { + "trigger_data": "2", + "not_filters": { + "product": [], + "source_type": ["navigation"] + } + }, + { + "trigger_data": "5", + "not_filters": { + "product": [], + "geo": ["US"], + "source_type": ["event"], + "campaign": [] + } + }, + { + "trigger_data": "4", + "not_filters": { + "product": [], + "geo": ["US"], + "source_type": ["event"], + "campaign": [] + } + } + ] + } + } + }] + }, + { + "timestamp": "1643235576000", + "registration_request": { + "attribution_src_url": "https://reporter.test/register-trigger", + "destination_origin": "https://destination.test" + }, + "responses": [{ + "url": "https://reporter.test/register-trigger", + "response": { + "Attribution-Reporting-Register-Trigger": { + "event_trigger_data": [ + { + "trigger_data": "1", + "filters": { + "source_type": ["navigation"] + }, + "not_filters": { + "product": ["123"] + } + }, + { + "trigger_data": "2", + "filters": { + "source_type": ["event"] + }, + "not_filters": { + "product": ["789"] + } + }, + { + "trigger_data": "6", + "filters": { + "source_type": ["navigation"] + }, + "not_filters": { + "product": ["789"] + } + }, + { + "trigger_data": "7", + "filters": { + "source_type": ["navigation"] + }, + "not_filters": { + "product": ["789"] + } + } + ] + } + } + }] + }, + { + "timestamp": "1643235577000", + "registration_request": { + "attribution_src_url": "https://reporter.test/register-trigger", + "destination_origin": "https://another-destination.test" + }, + "responses": [{ + "url": "https://reporter.test/register-trigger", + "response": { + "Attribution-Reporting-Register-Trigger": { + "event_trigger_data": [ + { + "trigger_data": "0", + "filters": { + "source_type": ["navigation"] + } + }, + { + "trigger_data": "1", + "filters": { + "source_type": ["event"] + } + } + ] + } + } + }] + } + ] + }, + "output": { + "event_level_results": [ + { + "payload": { + "attribution_destination": "https://destination.test", + "randomized_trigger_rate": 0.0024, + "source_event_id": "123", + "source_type": "navigation", + "trigger_data": "3" + }, + "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", + "report_time": "1643408373000" + }, + { + "payload": { + "attribution_destination": "https://destination.test", + "randomized_trigger_rate": 0.0024, + "source_event_id": "123", + "source_type": "navigation", + "trigger_data": "5" + }, + "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", + "report_time": "1643408373000" + }, + { + "payload": { + "attribution_destination": "https://destination.test", + "randomized_trigger_rate": 0.0024, + "source_event_id": "123", + "source_type": "navigation", + "trigger_data": "6" + }, + "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", + "report_time": "1643408373000" + }, + { + "payload": { + "attribution_destination": "https://another-destination.test", + "randomized_trigger_rate": 0.0000025, + "source_event_id": "456", + "source_type": "event", + "trigger_data": "1" + }, + "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", + "report_time": "1645831173000" + } + ] + } +}
diff --git a/content/test/data/attribution_reporting/interop/event_trigger_data.json b/content/test/data/attribution_reporting/interop/event_trigger_data.json deleted file mode 100644 index f116213..0000000 --- a/content/test/data/attribution_reporting/interop/event_trigger_data.json +++ /dev/null
@@ -1,84 +0,0 @@ -{ - "description": "First matched event trigger data is attributed", - "input": { - "sources": [ - { - "timestamp": "1643235573000", - "registration_request": { - "source_origin": "https://source.test", - "attribution_src_url": "https://reporter.test/register-source", - "source_type": "navigation" - }, - "responses": [{ - "url": "https://reporter.test/register-source", - "response": { - "Attribution-Reporting-Register-Source": { - "destination": "https://destination.test", - "source_event_id": "123", - "filter_data": { - "product": ["123"] - } - } - } - }] - } - ], - "triggers": [ - { - "timestamp": "1643235574000", - "registration_request": { - "attribution_src_url": "https://reporter.test/register-trigger", - "destination_origin": "https://destination.test" - }, - "responses": [{ - "url": "https://reporter.test/register-trigger", - "response": { - "Attribution-Reporting-Register-Trigger": { - "event_trigger_data": [ - { - "trigger_data": "1", - "filters": { - "product": ["456"] - } - }, - { - "trigger_data": "2", - "not_filters": { - "product": ["123"] - } - }, - { - "trigger_data": "3", - "filters": { - "product": ["123"] - } - }, - { - "trigger_data": "4", - "filters": { - "product": ["123"] - } - } - ] - } - } - }] - } - ] - }, - "output": { - "event_level_results": [ - { - "payload": { - "attribution_destination": "https://destination.test", - "randomized_trigger_rate": 0.0024, - "source_event_id": "123", - "source_type": "navigation", - "trigger_data": "3" - }, - "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643408373000" - } - ] - } -}
diff --git a/content/web_test/browser/web_test_content_browser_client.cc b/content/web_test/browser/web_test_content_browser_client.cc index e757a73..d6dd69c5 100644 --- a/content/web_test/browser/web_test_content_browser_client.cc +++ b/content/web_test/browser/web_test_content_browser_client.cc
@@ -595,8 +595,8 @@ std::vector<std::string> font_files = switches::GetSideloadFontFiles(); for (std::vector<std::string>::const_iterator i(font_files.begin()); i != font_files.end(); ++i) { - policy->AddRule(sandbox::TargetPolicy::SUBSYS_FILES, - sandbox::TargetPolicy::FILES_ALLOW_READONLY, + policy->AddRule(sandbox::SubSystem::kFiles, + sandbox::Semantics::kFilesAllowReadonly, base::UTF8ToWide(*i).c_str()); } }
diff --git a/crypto/rsa_private_key.cc b/crypto/rsa_private_key.cc index abe9b528..ad923b41 100644 --- a/crypto/rsa_private_key.cc +++ b/crypto/rsa_private_key.cc
@@ -59,7 +59,7 @@ // static std::unique_ptr<RSAPrivateKey> RSAPrivateKey::CreateFromKey(EVP_PKEY* key) { DCHECK(key); - if (EVP_PKEY_type(key->type) != EVP_PKEY_RSA) + if (EVP_PKEY_id(key) != EVP_PKEY_RSA) return nullptr; std::unique_ptr<RSAPrivateKey> copy(new RSAPrivateKey); copy->key_ = bssl::UpRef(key);
diff --git a/device/fido/win/fake_webauthn_api.cc b/device/fido/win/fake_webauthn_api.cc index abe8e79..456126f 100644 --- a/device/fido/win/fake_webauthn_api.cc +++ b/device/fido/win/fake_webauthn_api.cc
@@ -4,6 +4,7 @@ #include "device/fido/win/fake_webauthn_api.h" +#include <memory> #include <string> #include "base/check.h" @@ -25,10 +26,17 @@ struct FakeWinWebAuthnApi::CredentialInfoList { WEBAUTHN_CREDENTIAL_DETAILS_LIST credential_details_list; std::vector<WEBAUTHN_CREDENTIAL_DETAILS*> win_credentials; - std::vector<CredentialInfo> credentials; + std::vector<std::unique_ptr<CredentialInfo>> credentials; }; struct FakeWinWebAuthnApi::CredentialInfo { + // This structure contains pointers to itself and thus + // must not be moved in memory. + CredentialInfo() = default; + CredentialInfo(CredentialInfo&&) = delete; + CredentialInfo& operator=(CredentialInfo&&) = delete; + CredentialInfo& operator=(const CredentialInfo&) = delete; + WEBAUTHN_CREDENTIAL_DETAILS details; std::vector<uint8_t> credential_id; @@ -45,6 +53,13 @@ }; struct FakeWinWebAuthnApi::WebAuthnAssertionEx { + // This structure contains pointers to itself and thus + // must not be moved in memory. + WebAuthnAssertionEx() = default; + WebAuthnAssertionEx(WebAuthnAssertionEx&&) = delete; + WebAuthnAssertionEx& operator=(WebAuthnAssertionEx&&) = delete; + WebAuthnAssertionEx& operator=(const WebAuthnAssertionEx&) = delete; + std::vector<uint8_t> credential_id; std::vector<uint8_t> authenticator_data; std::vector<uint8_t> signature; @@ -177,9 +192,9 @@ } DCHECK(!credential_id.empty()); - WebAuthnAssertionEx result; - result.credential_id = fido_parsing_utils::Materialize(credential_id); - result.authenticator_data = + auto result = std::make_unique<WebAuthnAssertionEx>(); + result->credential_id = fido_parsing_utils::Materialize(credential_id); + result->authenticator_data = AuthenticatorData( registration->application_parameter, /*user_present=*/true, @@ -192,39 +207,39 @@ // Create the assertion signature. std::vector<uint8_t> sign_data; - fido_parsing_utils::Append(&sign_data, result.authenticator_data); + fido_parsing_utils::Append(&sign_data, result->authenticator_data); fido_parsing_utils::Append( &sign_data, crypto::SHA256Hash({client_data->pbClientDataJSON, client_data->cbClientDataJSON})); - result.signature = + result->signature = registration->private_key->Sign({sign_data.data(), sign_data.size()}); // Fill in the WEBAUTHN_ASSERTION struct returned to the caller. - result.assertion = {}; - result.assertion.dwVersion = 1; - result.assertion.cbAuthenticatorData = result.authenticator_data.size(); - result.assertion.pbAuthenticatorData = reinterpret_cast<PBYTE>( - const_cast<uint8_t*>(result.authenticator_data.data())); + result->assertion = {}; + result->assertion.dwVersion = 1; + result->assertion.cbAuthenticatorData = result->authenticator_data.size(); + result->assertion.pbAuthenticatorData = reinterpret_cast<PBYTE>( + const_cast<uint8_t*>(result->authenticator_data.data())); - result.assertion.cbSignature = result.signature.size(); - result.assertion.pbSignature = result.signature.data(); - result.assertion.Credential = {}; - result.assertion.Credential.dwVersion = 1; - result.assertion.Credential.cbId = result.credential_id.size(); - result.assertion.Credential.pbId = result.credential_id.data(); - result.assertion.Credential.pwszCredentialType = + result->assertion.cbSignature = result->signature.size(); + result->assertion.pbSignature = result->signature.data(); + result->assertion.Credential = {}; + result->assertion.Credential.dwVersion = 1; + result->assertion.Credential.cbId = result->credential_id.size(); + result->assertion.Credential.pbId = result->credential_id.data(); + result->assertion.Credential.pwszCredentialType = WEBAUTHN_CREDENTIAL_TYPE_PUBLIC_KEY; // TODO(martinkr): Return a user entity for requests with empty allow lists. // (Though the CTAP2.0 spec allows that to be omitted if only a single // credential matched.) - result.assertion.pbUserId = nullptr; - result.assertion.cbUserId = 0; + result->assertion.pbUserId = nullptr; + result->assertion.cbUserId = 0; // The real API hands out results in naked pointers and asks callers // to call FreeAssertion() when they're done. We maintain ownership // of the pointees in |returned_assertions_|. + *assertion_ptr = &result->assertion; returned_assertions_.push_back(std::move(result)); - *assertion_ptr = &returned_assertions_.back().assertion; return S_OK; } @@ -242,7 +257,10 @@ if (result_override_ != S_OK) { return result_override_; } - returned_credential_lists_.emplace_back(); + returned_credential_lists_.emplace_back( + std::make_unique<CredentialInfoList>()); + CredentialInfoList& credential_list = + *returned_credential_lists_.back().get(); for (const auto& registration : registrations_) { if (!registration.second.is_resident) { continue; @@ -254,17 +272,18 @@ } } - returned_credential_lists_.back().credentials.emplace_back(CredentialInfo({ - .credential_id = registration.first, - .rp_id = base::UTF8ToUTF16(registration.second.rp->id), - .rp_name = base::UTF8ToUTF16(registration.second.rp->name.value_or("")), - .user_id = registration.second.user->id, - .user_name = - base::UTF8ToUTF16(registration.second.user->name.value_or("")), - .user_display_name = base::UTF8ToUTF16( - registration.second.user->display_name.value_or("")), - })); - auto& credential = returned_credential_lists_.back().credentials.back(); + credential_list.credentials.emplace_back( + std::make_unique<CredentialInfo>()); + auto& credential = *credential_list.credentials.back().get(); + credential.credential_id = registration.first; + credential.rp_id = base::UTF8ToUTF16(registration.second.rp->id); + credential.rp_name = + base::UTF8ToUTF16(registration.second.rp->name.value_or("")); + credential.user_id = registration.second.user->id; + credential.user_name = + base::UTF8ToUTF16(registration.second.user->name.value_or("")); + credential.user_display_name = + base::UTF8ToUTF16(registration.second.user->display_name.value_or("")); if (registration.second.rp->icon_url) { credential.rp_icon = base::UTF8ToUTF16(registration.second.rp->icon_url->spec()); @@ -299,19 +318,16 @@ }; } - for (auto& credential : returned_credential_lists_.back().credentials) { - returned_credential_lists_.back().win_credentials.push_back( - &credential.details); + for (auto& credential : credential_list.credentials) { + credential_list.win_credentials.push_back(&credential->details); } - returned_credential_lists_.back().credential_details_list = { - .cCredentialDetails = static_cast<DWORD>( - returned_credential_lists_.back().win_credentials.size()), - .ppCredentialDetails = - returned_credential_lists_.back().win_credentials.data(), + credential_list.credential_details_list = { + .cCredentialDetails = + static_cast<DWORD>(credential_list.win_credentials.size()), + .ppCredentialDetails = credential_list.win_credentials.data(), }; - *credentials = &returned_credential_lists_.back().credential_details_list; - return returned_credential_lists_.back().credentials.empty() ? NTE_NOT_FOUND - : S_OK; + *credentials = &credential_list.credential_details_list; + return credential_list.credentials.empty() ? NTE_NOT_FOUND : S_OK; } HRESULT FakeWinWebAuthnApi::DeletePlatformCredential( @@ -362,7 +378,7 @@ void FakeWinWebAuthnApi::FreeAssertion(PWEBAUTHN_ASSERTION assertion) { for (auto it = returned_assertions_.begin(); it != returned_assertions_.end(); ++it) { - if (assertion != &it->assertion) { + if (assertion != &(*it)->assertion) { continue; } returned_assertions_.erase(it); @@ -375,7 +391,7 @@ PWEBAUTHN_CREDENTIAL_DETAILS_LIST credentials) { for (auto it = returned_credential_lists_.begin(); it != returned_credential_lists_.end(); ++it) { - if (credentials != &it->credential_details_list) { + if (credentials != &(*it)->credential_details_list) { continue; } returned_credential_lists_.erase(it);
diff --git a/device/fido/win/fake_webauthn_api.h b/device/fido/win/fake_webauthn_api.h index f12a650..3f55e526 100644 --- a/device/fido/win/fake_webauthn_api.h +++ b/device/fido/win/fake_webauthn_api.h
@@ -115,10 +115,10 @@ std::vector<WEBAUTHN_CREDENTIAL_ATTESTATION> returned_attestations_; // Owns assertions returned by AuthenticatorGetAssertion(). - std::vector<WebAuthnAssertionEx> returned_assertions_; + std::vector<std::unique_ptr<WebAuthnAssertionEx>> returned_assertions_; // Owns lists of credentials returned by GetPlatformCredentialList(). - std::vector<CredentialInfoList> returned_credential_lists_; + std::vector<std::unique_ptr<CredentialInfoList>> returned_credential_lists_; std:: map<std::vector<uint8_t>, RegistrationData, fido_parsing_utils::RangeLess>
diff --git a/device/gamepad/gamepad_device_linux.cc b/device/gamepad/gamepad_device_linux.cc index 28c49b4..3e7cf17 100644 --- a/device/gamepad/gamepad_device_linux.cc +++ b/device/gamepad/gamepad_device_linux.cc
@@ -75,8 +75,9 @@ unsigned long evbit[BITS_TO_LONGS(EV_MAX)]; unsigned long ffbit[BITS_TO_LONGS(FF_MAX)]; - if (HANDLE_EINTR(ioctl(fd.get(), EVIOCGBIT(0, EV_MAX), evbit)) < 0 || - HANDLE_EINTR(ioctl(fd.get(), EVIOCGBIT(EV_FF, FF_MAX), ffbit)) < 0) { + if (HANDLE_EINTR(ioctl(fd.get(), EVIOCGBIT(0, sizeof(evbit)), evbit)) < 0 || + HANDLE_EINTR(ioctl(fd.get(), EVIOCGBIT(EV_FF, sizeof(ffbit)), ffbit)) < + 0) { return false; } @@ -99,8 +100,9 @@ size_t found_special_keys = 0; has_special_key->clear(); - if (HANDLE_EINTR(ioctl(fd.get(), EVIOCGBIT(0, EV_MAX), evbit)) < 0 || - HANDLE_EINTR(ioctl(fd.get(), EVIOCGBIT(EV_KEY, KEY_MAX), keybit)) < 0) { + if (HANDLE_EINTR(ioctl(fd.get(), EVIOCGBIT(0, sizeof(evbit)), evbit)) < 0 || + HANDLE_EINTR(ioctl(fd.get(), EVIOCGBIT(EV_KEY, sizeof(keybit)), keybit)) < + 0) { return 0; }
diff --git a/docs/process_model_and_site_isolation.md b/docs/process_model_and_site_isolation.md index 513a620..0c7e4cb 100644 --- a/docs/process_model_and_site_isolation.md +++ b/docs/process_model_and_site_isolation.md
@@ -322,13 +322,15 @@ limit, and instead relies on the OS to discard processes. * **Aggressive Reuse**: For some cases (including on Android), Chromium will aggressively look for existing same-site processes to reuse even before - reaching the process limit. Out-of-process iframes (OOPIFs) use this - approach, such that an `example.com` iframe in a cross-site page will be - placed in an existing `example.com` process (in any browsing context group), - even if the process limit has not been reached. This keeps the process - count lower, based on the assumption that most iframes are less resource - demanding than top-level documents. Similarly, ServiceWorkers are generally - placed in the same process as a document that is likely to rely on them. + reaching the process limit. Out-of-process iframes (OOPIFs) and [fenced + frames](https://developer.chrome.com/en/docs/privacy-sandbox/fenced-frame/) + use this approach, such that an `example.com` iframe in a cross-site page + will be placed in an existing `example.com` process (in any browsing context + group), even if the process limit has not been reached. This keeps the + process count lower, based on the assumption that most iframes/fenced frames + are less resource demanding than top-level documents. Similarly, + ServiceWorkers are generally placed in the same process as a document that + is likely to rely on them. * **Extensions**: Chromium ensures that extensions do not share a process with each other or with web pages, but also that a large number of extensions will not consume the entire soft process limit, forcing same-site web pages
diff --git a/docs/ui/create/examples/login_dialog.md b/docs/ui/create/examples/login_dialog.md index 0b20b6d..cd280920 100644 --- a/docs/ui/create/examples/login_dialog.md +++ b/docs/ui/create/examples/login_dialog.md
@@ -94,7 +94,7 @@ views::BubbleBorder::Arrow anchor_position) : BubbleDialogDelegateView(anchor_view, anchor_position) { ... - const LayoutProvider* provider = LayoutProvider::Get(); + const LayoutProvider* provider = LayoutProvider::Get(); set_margins(provider->GetDialogInsetsForContentType( views::DialogContentType::kControl, views::DialogContentType::kControl)); const int related_control_padding = @@ -106,11 +106,11 @@ ->AddColumn(views::LayoutAlignment::kStart, views::LayoutAlignment::kStretch, views::TableLayout::kFixedSize, - views::TableLayout::kUsePreferred, 0, 0) + views::TableLayout::ColumnSize::kUsePreferred, 0, 0) .AddPaddingColumn(TableLayout::kFixedSize, label_padding) .AddColumn(views::LayoutAlignment::kStretch, views::LayoutAlignment::kStretch, 1.0f, - views::TableLayout::kUsePreferred, 0, 0) + views::TableLayout::ColumnSize::kUsePreferred, 0, 0) .AddRows(1, views::TableLayout::kFixedSize) .AddPaddingRow(TableLayout::kFixedSize, related_control_padding) .AddRows(1, views::TableLayout::kFixedSize); @@ -134,8 +134,8 @@ #include <string> #include "ui/views/controls/label.h" -#include "ui/views/layout/table_layout.h" #include "ui/views/layout/layout_provider.h" +#include "ui/views/layout/table_layout.h" ... namespace { @@ -253,8 +253,8 @@ private: LoginBubbleDialogView(View* anchor_view, - BubbleBorder::Arrow anchor_position, - OnSubmitCallback accept_callback); + BubbleBorder::Arrow anchor_position, + OnSubmitCallback accept_callback); ... } ``` @@ -393,6 +393,8 @@ #include "ui/views/controls/textfield/textfield.h" #include "ui/views/controls/textfield/textfield_controller.h" +namespace views::examples { + class LoginBubbleDialogView : public BubbleDialogDelegateView, public TextfieldController { public: @@ -418,6 +420,8 @@ Textfield* password_ = nullptr; }; +} // namespace views::examples + #endif // LOGIN_BUBBLE_DIALOG_EXAMPLE_H_ ``` @@ -442,6 +446,8 @@ #include "ui/views/layout/table_layout.h" #include "ui/views/layout/layout_provider.h" +namespace views::examples { + namespace { // Adds a label textfield pair to the login dialog's layout. @@ -503,24 +509,24 @@ const LayoutProvider* provider = LayoutProvider::Get(); set_margins(provider->GetDialogInsetsForContentType( - views::DialogContentType::kControl, views::DialogContentType::kControl)); + DialogContentType::kControl, DialogContentType::kControl)); const int related_control_padding = - provider->GetDistanceMetric(views::DISTANCE_RELATED_CONTROL_VERTICAL); + provider->GetDistanceMetric(DISTANCE_RELATED_CONTROL_VERTICAL); const int label_padding = - provider->GetDistanceMetric(views::DISTANCE_RELATED_LABEL_HORIZONTAL); + provider->GetDistanceMetric(DISTANCE_RELATED_LABEL_HORIZONTAL); - SetLayoutManager(std::make_unique<views::TableLayout>()) - ->AddColumn(views::LayoutAlignment::kStart, - views::LayoutAlignment::kStretch, - views::TableLayout::kFixedSize, - views::TableLayout::kUsePreferred, 0, 0) + SetLayoutManager(std::make_unique<TableLayout>()) + ->AddColumn(LayoutAlignment::kStart, + LayoutAlignment::kStretch, + TableLayout::kFixedSize, + TableLayout::ColumnSize::kUsePreferred, 0, 0) .AddPaddingColumn(TableLayout::kFixedSize, label_padding) - .AddColumn(views::LayoutAlignment::kStretch, - views::LayoutAlignment::kStretch, 1.0f, - views::TableLayout::kUsePreferred, 0, 0) - .AddRows(1, views::TableLayout::kFixedSize) + .AddColumn(LayoutAlignment::kStretch, + LayoutAlignment::kStretch, 1.0f, + TableLayout::ColumnSize::kUsePreferred, 0, 0) + .AddRows(1, TableLayout::kFixedSize) .AddPaddingRow(TableLayout::kFixedSize, related_control_padding) - .AddRows(1, views::TableLayout::kFixedSize); + .AddRows(1, TableLayout::kFixedSize); username_ = AddFormRow(this, @@ -533,8 +539,7 @@ password_->SetTextInputType(ui::TEXT_INPUT_TYPE_PASSWORD); } -} // namespace examples -} // namespace views +} // namespace views::examples ``` The generated UI would be:
diff --git a/extensions/common/api/automation.idl b/extensions/common/api/automation.idl index 89203f3..d04b69a 100644 --- a/extensions/common/api/automation.idl +++ b/extensions/common/api/automation.idl
@@ -475,6 +475,7 @@ enum DescriptionFromType { ariaDescription, + attributeExplicitlyEmpty, buttonLabel, popupElement, relatedElement,
diff --git a/gpu/BUILD.gn b/gpu/BUILD.gn index 9fa43bc..3e867cf8 100644 --- a/gpu/BUILD.gn +++ b/gpu/BUILD.gn
@@ -561,6 +561,7 @@ "command_buffer/service/shader_translator_cache_unittest.cc", "command_buffer/service/shader_translator_unittest.cc", "command_buffer/service/shared_context_state_unittest.cc", + "command_buffer/service/shared_image_backing_compound_unittest.cc", "command_buffer/service/sync_point_manager_unittest.cc", "command_buffer/service/texture_manager_unittest.cc", "command_buffer/service/transfer_buffer_manager_unittest.cc",
diff --git a/gpu/command_buffer/common/shared_image_usage.cc b/gpu/command_buffer/common/shared_image_usage.cc index a0415c6..d61741c 100644 --- a/gpu/command_buffer/common/shared_image_usage.cc +++ b/gpu/command_buffer/common/shared_image_usage.cc
@@ -8,6 +8,11 @@ namespace gpu { +bool IsValidClientUsage(uint32_t usage) { + constexpr int32_t kClientMax = (LAST_CLIENT_USAGE << 1) - 1; + return 0 < usage && usage <= kClientMax; +} + std::string CreateLabelForSharedImageUsage(uint32_t usage) { if (!usage) return ""; @@ -68,6 +73,9 @@ if (usage & SHARED_IMAGE_USAGE_RASTER_DELEGATED_COMPOSITING) { label += "|RasterDelegatedCompositing"; } + if (usage & SHARED_IMAGE_USAGE_CPU_UPLOAD) { + label += "|CpuUpload"; + } DCHECK(!label.empty());
diff --git a/gpu/command_buffer/common/shared_image_usage.h b/gpu/command_buffer/common/shared_image_usage.h index ea0a49d9..5721ac3 100644 --- a/gpu/command_buffer/common/shared_image_usage.h +++ b/gpu/command_buffer/common/shared_image_usage.h
@@ -59,8 +59,20 @@ // set a single (duplicated) fence for bunch of tiles instead of having the SI // framework creating fences for each single message when write access ends. SHARED_IMAGE_USAGE_RASTER_DELEGATED_COMPOSITING = 1 << 16, + + // Start service side only usage flags after this entry. They must be larger + // than `LAST_CLIENT_USAGE`. + LAST_CLIENT_USAGE = SHARED_IMAGE_USAGE_RASTER_DELEGATED_COMPOSITING, + + // Image will have pixels uploaded from CPU. The backing must implement + // `UploadFromMemory()` if it supports this usage. Clients should specify + // SHARED_IMAGE_USAGE_CPU_WRITE if they need to write pixels to the image. + SHARED_IMAGE_USAGE_CPU_UPLOAD = 1 << 17, }; +// Returns true if usage is a valid client usage. +GPU_EXPORT bool IsValidClientUsage(uint32_t usage); + // Create a string to label SharedImageUsage. GPU_EXPORT std::string CreateLabelForSharedImageUsage(uint32_t usage);
diff --git a/gpu/command_buffer/service/BUILD.gn b/gpu/command_buffer/service/BUILD.gn index a3b2a4f..ac352df1 100644 --- a/gpu/command_buffer/service/BUILD.gn +++ b/gpu/command_buffer/service/BUILD.gn
@@ -226,6 +226,8 @@ "shared_context_state.h", "shared_image_backing.cc", "shared_image_backing.h", + "shared_image_backing_compound.cc", + "shared_image_backing_compound.h", "shared_image_backing_factory.cc", "shared_image_backing_factory.h", "shared_image_backing_factory_gl_common.cc",
diff --git a/gpu/command_buffer/service/external_vk_image_factory.cc b/gpu/command_buffer/service/external_vk_image_factory.cc index c4ebf06..85a8d19 100644 --- a/gpu/command_buffer/service/external_vk_image_factory.cc +++ b/gpu/command_buffer/service/external_vk_image_factory.cc
@@ -167,9 +167,12 @@ if (gmb_type != gfx::EMPTY_BUFFER && !CanImportGpuMemoryBuffer(gmb_type)) { return false; } + // TODO(crbug.com/969114): Not all shared image factory implementations // support concurrent read/write usage. - if (usage & SHARED_IMAGE_USAGE_CONCURRENT_READ_WRITE) { + constexpr uint32_t kInvalidUsages = + SHARED_IMAGE_USAGE_CONCURRENT_READ_WRITE | SHARED_IMAGE_USAGE_CPU_UPLOAD; + if (usage & kInvalidUsages) { return false; } if (thread_safe) {
diff --git a/gpu/command_buffer/service/shared_image_backing.cc b/gpu/command_buffer/service/shared_image_backing.cc index b0705ef..132747c 100644 --- a/gpu/command_buffer/service/shared_image_backing.cc +++ b/gpu/command_buffer/service/shared_image_backing.cc
@@ -4,12 +4,14 @@ #include "gpu/command_buffer/service/shared_image_backing.h" +#include "base/notreached.h" #include "build/build_config.h" +#include "components/viz/common/resources/resource_format_utils.h" #include "gpu/command_buffer/service/memory_tracking.h" #include "gpu/command_buffer/service/shared_context_state.h" #include "gpu/command_buffer/service/shared_image_factory.h" #include "gpu/command_buffer/service/shared_image_representation.h" -#include "gpu/command_buffer/service/texture_manager.h" +#include "third_party/skia/include/core/SkColorSpace.h" namespace gpu { namespace { @@ -42,6 +44,8 @@ return "SharedImageVideo"; case SharedImageBackingType::kWrappedSkImage: return "WrappedSkImage"; + case SharedImageBackingType::kCompound: + return "SharedImageBackingCompound"; } NOTREACHED(); }; @@ -79,10 +83,22 @@ have_context_ = false; } +SkImageInfo SharedImageBacking::AsSkImageInfo() const { + return SkImageInfo::Make(size_.width(), size_.height(), + viz::ResourceFormatToClosestSkColorType( + /*gpu_compositing=*/true, format_), + alpha_type_, color_space_.ToSkColorSpace()); +} + bool SharedImageBacking::CopyToGpuMemoryBuffer() { return false; } +bool SharedImageBacking::UploadFromMemory(const SkPixmap& pixmap) { + NOTREACHED(); + return false; +} + bool SharedImageBacking::PresentSwapChain() { return false; }
diff --git a/gpu/command_buffer/service/shared_image_backing.h b/gpu/command_buffer/service/shared_image_backing.h index fbf5d74..3d234026 100644 --- a/gpu/command_buffer/service/shared_image_backing.h +++ b/gpu/command_buffer/service/shared_image_backing.h
@@ -20,6 +20,7 @@ #include "gpu/gpu_gles2_export.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/skia/include/core/SkImageInfo.h" +#include "third_party/skia/include/core/SkPixmap.h" #include "third_party/skia/include/gpu/GrTypes.h" #include "ui/gfx/color_space.h" #include "ui/gfx/geometry/rect.h" @@ -68,7 +69,8 @@ kRawDraw = 9, kSharedMemory = 10, kVideo = 11, - kWrappedSkImage = 12 + kWrappedSkImage = 12, + kCompound = 13, }; // Represents the actual storage (GL texture, VkImage, GMB) for a SharedImage. @@ -99,6 +101,9 @@ bool is_thread_safe() const { return !!lock_; } void OnContextLost(); + // Creates SkImageInfo matching backing size, format, alpha and color space. + SkImageInfo AsSkImageInfo() const; + // Concrete functions to manage a ref count. void AddRef(SharedImageRepresentation* representation); void ReleaseRef(SharedImageRepresentation* representation); @@ -131,6 +136,10 @@ virtual void Update(std::unique_ptr<gfx::GpuFence> in_fence) = 0; + // Uploads pixels from memory into GPU texture. Backings must implement this + // if they support `SHARED_IMAGE_USAGE_CPU_UPLOAD`. + virtual bool UploadFromMemory(const SkPixmap& pixmap); + // Copy from the backing's GPU texture to its GpuMemoryBuffer if present. This // is needed on Windows where the renderer process can only create shared // memory GMBs and an explicit copy is needed. Returns true on success. @@ -170,6 +179,8 @@ protected: // Used by SharedImageManager. friend class SharedImageManager; + friend class SharedImageBackingCompound; + virtual std::unique_ptr<SharedImageRepresentationGLTexture> ProduceGLTexture( SharedImageManager* manager, MemoryTypeTracker* tracker);
diff --git a/gpu/command_buffer/service/shared_image_backing_compound.cc b/gpu/command_buffer/service/shared_image_backing_compound.cc new file mode 100644 index 0000000..aa22ab0f --- /dev/null +++ b/gpu/command_buffer/service/shared_image_backing_compound.cc
@@ -0,0 +1,485 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "gpu/command_buffer/service/shared_image_backing_compound.h" + +#include "base/logging.h" +#include "base/memory/scoped_refptr.h" +#include "base/trace_event/process_memory_dump.h" +#include "components/viz/common/resources/resource_format.h" +#include "components/viz/common/resources/resource_format_utils.h" +#include "gpu/command_buffer/common/gpu_memory_buffer_support.h" +#include "gpu/command_buffer/common/mailbox.h" +#include "gpu/command_buffer/common/shared_image_usage.h" +#include "gpu/command_buffer/service/memory_tracking.h" +#include "gpu/command_buffer/service/shared_context_state.h" +#include "gpu/command_buffer/service/shared_image_backing_compound.h" +#include "gpu/command_buffer/service/shared_image_backing_factory.h" +#include "gpu/command_buffer/service/shared_image_backing_shared_memory.h" +#include "gpu/command_buffer/service/shared_image_manager.h" +#include "gpu/command_buffer/service/shared_image_representation.h" +#include "gpu/command_buffer/service/shared_memory_region_wrapper.h" +#include "third_party/skia/include/core/SkAlphaType.h" +#include "third_party/skia/include/core/SkPromiseImageTexture.h" +#include "ui/gfx/buffer_format_util.h" +#include "ui/gfx/buffer_types.h" +#include "ui/gfx/color_space.h" +#include "ui/gfx/geometry/size.h" +#include "ui/gfx/gpu_memory_buffer.h" + +namespace gpu { +namespace { + +bool IsValidSharedMemoryBufferFormat(const gfx::Size& size, + gfx::BufferFormat buffer_format, + gfx::BufferPlane plane) { + if (!gpu::IsImageSizeValidForGpuMemoryBufferFormat(size, buffer_format)) { + DLOG(ERROR) << "Invalid image size for format."; + return false; + } + if (gfx::NumberOfPlanesForLinearBufferFormat(buffer_format) != 1) { + DLOG(ERROR) << "Invalid image format."; + return false; + } + if (plane != gfx::BufferPlane::DEFAULT) { + DLOG(ERROR) << "Invalid plane " << gfx::BufferPlaneToString(plane); + return false; + } + + return true; +} + +} // namespace + +// Wrapped representation types are not in the anonymous namespace because they +// need to be friend classes to real representations to access protected +// virtual functions. +class WrappedGLTextureRepresentation + : public SharedImageRepresentationGLTexture { + public: + WrappedGLTextureRepresentation( + SharedImageManager* manager, + SharedImageBacking* backing, + MemoryTypeTracker* tracker, + std::unique_ptr<SharedImageRepresentationGLTexture> wrapped) + : SharedImageRepresentationGLTexture(manager, backing, tracker), + wrapped_(std::move(wrapped)) { + DCHECK(wrapped_); + } + + SharedImageBackingCompound* compound_backing() { + return static_cast<SharedImageBackingCompound*>(backing()); + } + + // SharedImageRepresentationGLTexture implementation. + bool BeginAccess(GLenum mode) final { + AccessMode access_mode = + mode == kReadAccessMode ? AccessMode::kRead : AccessMode::kWrite; + compound_backing()->NotifyBeginAccess(SharedImageAccessStream::kGL, + access_mode); + return wrapped_->BeginAccess(mode); + } + + void EndAccess() final { wrapped_->EndAccess(); } + + gpu::TextureBase* GetTextureBase() final { + return wrapped_->GetTextureBase(); + } + + bool SupportsMultipleConcurrentReadAccess() final { + return wrapped_->SupportsMultipleConcurrentReadAccess(); + } + + gles2::Texture* GetTexture() final { return wrapped_->GetTexture(); } + + private: + std::unique_ptr<SharedImageRepresentationGLTexture> wrapped_; +}; + +class WrappedGLTexturePassthroughRepresentation + : public SharedImageRepresentationGLTexturePassthrough { + public: + WrappedGLTexturePassthroughRepresentation( + SharedImageManager* manager, + SharedImageBacking* backing, + MemoryTypeTracker* tracker, + std::unique_ptr<SharedImageRepresentationGLTexturePassthrough> wrapped) + : SharedImageRepresentationGLTexturePassthrough(manager, + backing, + tracker), + wrapped_(std::move(wrapped)) { + DCHECK(wrapped_); + } + + SharedImageBackingCompound* compound_backing() { + return static_cast<SharedImageBackingCompound*>(backing()); + } + + // SharedImageRepresentationGLTexturePassthrough implementation. + bool BeginAccess(GLenum mode) final { + AccessMode access_mode = + mode == kReadAccessMode ? AccessMode::kRead : AccessMode::kWrite; + compound_backing()->NotifyBeginAccess(SharedImageAccessStream::kGL, + access_mode); + return wrapped_->BeginAccess(mode); + } + void EndAccess() final { wrapped_->EndAccess(); } + + gpu::TextureBase* GetTextureBase() final { + return wrapped_->GetTextureBase(); + } + + bool SupportsMultipleConcurrentReadAccess() final { + return wrapped_->SupportsMultipleConcurrentReadAccess(); + } + + const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough() + final { + return wrapped_->GetTexturePassthrough(); + } + + private: + std::unique_ptr<SharedImageRepresentationGLTexturePassthrough> wrapped_; +}; + +class WrappedSkiaRepresentation : public SharedImageRepresentationSkia { + public: + WrappedSkiaRepresentation( + SharedImageManager* manager, + SharedImageBacking* backing, + MemoryTypeTracker* tracker, + std::unique_ptr<SharedImageRepresentationSkia> wrapped) + : SharedImageRepresentationSkia(manager, backing, tracker), + wrapped_(std::move(wrapped)) { + DCHECK(wrapped_); + } + + SharedImageBackingCompound* compound_backing() { + return static_cast<SharedImageBackingCompound*>(backing()); + } + + // SharedImageRepresentationSkia implementation. + bool SupportsMultipleConcurrentReadAccess() final { + return wrapped_->SupportsMultipleConcurrentReadAccess(); + } + + sk_sp<SkSurface> BeginWriteAccess( + int final_msaa_count, + const SkSurfaceProps& surface_props, + std::vector<GrBackendSemaphore>* begin_semaphores, + std::vector<GrBackendSemaphore>* end_semaphores, + std::unique_ptr<GrBackendSurfaceMutableState>* end_state) final { + compound_backing()->NotifyBeginAccess(SharedImageAccessStream::kSkia, + AccessMode::kWrite); + return wrapped_->BeginWriteAccess(final_msaa_count, surface_props, + begin_semaphores, end_semaphores, + end_state); + } + sk_sp<SkSurface> BeginWriteAccess( + int final_msaa_count, + const SkSurfaceProps& surface_props, + std::vector<GrBackendSemaphore>* begin_semaphores, + std::vector<GrBackendSemaphore>* end_semaphores) final { + compound_backing()->NotifyBeginAccess(SharedImageAccessStream::kSkia, + AccessMode::kWrite); + return wrapped_->BeginWriteAccess(final_msaa_count, surface_props, + begin_semaphores, end_semaphores); + } + sk_sp<SkPromiseImageTexture> BeginWriteAccess( + std::vector<GrBackendSemaphore>* begin_semaphores, + std::vector<GrBackendSemaphore>* end_semaphores, + std::unique_ptr<GrBackendSurfaceMutableState>* end_state) final { + compound_backing()->NotifyBeginAccess(SharedImageAccessStream::kSkia, + AccessMode::kWrite); + return wrapped_->BeginWriteAccess(begin_semaphores, end_semaphores, + end_state); + } + void EndWriteAccess(sk_sp<SkSurface> surface) final { + wrapped_->EndWriteAccess(std::move(surface)); + } + + sk_sp<SkPromiseImageTexture> BeginReadAccess( + std::vector<GrBackendSemaphore>* begin_semaphores, + std::vector<GrBackendSemaphore>* end_semaphores, + std::unique_ptr<GrBackendSurfaceMutableState>* end_state) final { + compound_backing()->NotifyBeginAccess(SharedImageAccessStream::kSkia, + AccessMode::kRead); + return wrapped_->BeginReadAccess(begin_semaphores, end_semaphores, + end_state); + } + sk_sp<SkPromiseImageTexture> BeginReadAccess( + std::vector<GrBackendSemaphore>* begin_semaphores, + std::vector<GrBackendSemaphore>* end_semaphores) final { + compound_backing()->NotifyBeginAccess(SharedImageAccessStream::kSkia, + AccessMode::kRead); + return wrapped_->BeginReadAccess(begin_semaphores, end_semaphores); + } + void EndReadAccess() final { wrapped_->EndReadAccess(); } + + private: + std::unique_ptr<SharedImageRepresentationSkia> wrapped_; +}; + +class WrappedDawnRepresentation : public SharedImageRepresentationDawn { + public: + WrappedDawnRepresentation( + SharedImageManager* manager, + SharedImageBacking* backing, + MemoryTypeTracker* tracker, + std::unique_ptr<SharedImageRepresentationDawn> wrapped) + : SharedImageRepresentationDawn(manager, backing, tracker), + wrapped_(std::move(wrapped)) { + DCHECK(wrapped_); + } + + SharedImageBackingCompound* compound_backing() { + return static_cast<SharedImageBackingCompound*>(backing()); + } + + // SharedImageRepresentationDawn implementation. + WGPUTexture BeginAccess(WGPUTextureUsage webgpu_usage) final { + AccessMode access_mode = + webgpu_usage & kWriteUsage ? AccessMode::kWrite : AccessMode::kRead; + compound_backing()->NotifyBeginAccess(SharedImageAccessStream::kDawn, + access_mode); + return wrapped_->BeginAccess(webgpu_usage); + } + void EndAccess() final { wrapped_->EndAccess(); } + + private: + std::unique_ptr<SharedImageRepresentationDawn> wrapped_; +}; + +class WrappedOverlayRepresentation : public SharedImageRepresentationOverlay { + public: + WrappedOverlayRepresentation( + SharedImageManager* manager, + SharedImageBacking* backing, + MemoryTypeTracker* tracker, + std::unique_ptr<SharedImageRepresentationOverlay> wrapped) + : SharedImageRepresentationOverlay(manager, backing, tracker), + wrapped_(std::move(wrapped)) { + DCHECK(wrapped_); + } + + SharedImageBackingCompound* compound_backing() { + return static_cast<SharedImageBackingCompound*>(backing()); + } + + // SharedImageRepresentationOverlay implementation. + bool BeginReadAccess(gfx::GpuFenceHandle& acquire_fence) final { + compound_backing()->NotifyBeginAccess(SharedImageAccessStream::kOverlay, + AccessMode::kRead); + + return wrapped_->BeginReadAccess(acquire_fence); + } + void EndReadAccess(gfx::GpuFenceHandle release_fence) final { + return wrapped_->EndReadAccess(std::move(release_fence)); + } + gl::GLImage* GetGLImage() final { return wrapped_->GetGLImage(); } + + private: + std::unique_ptr<SharedImageRepresentationOverlay> wrapped_; +}; + +// static +std::unique_ptr<SharedImageBacking> +SharedImageBackingCompound::CreateSharedMemory( + SharedImageBackingFactory* gpu_backing_factory, + const Mailbox& mailbox, + gfx::GpuMemoryBufferHandle handle, + gfx::BufferFormat buffer_format, + gfx::BufferPlane plane, + SurfaceHandle surface_handle, + const gfx::Size& size, + const gfx::ColorSpace& color_space, + GrSurfaceOrigin surface_origin, + SkAlphaType alpha_type, + uint32_t usage) { + if (!IsValidSharedMemoryBufferFormat(size, buffer_format, plane)) + return nullptr; + + viz::ResourceFormat format = viz::GetResourceFormat(buffer_format); + SharedMemoryRegionWrapper shm_wrapper; + if (!shm_wrapper.Initialize(handle, size, format)) { + DLOG(ERROR) << "Failed to create SharedMemoryRegionWrapper"; + return nullptr; + } + + auto shm_backing = std::make_unique<SharedImageBackingSharedMemory>( + gpu::Mailbox(), format, size, color_space, surface_origin, alpha_type, + SHARED_IMAGE_USAGE_CPU_WRITE, std::move(shm_wrapper)); + + auto gpu_backing = gpu_backing_factory->CreateSharedImage( + gpu::Mailbox(), format, surface_handle, size, color_space, surface_origin, + alpha_type, usage | SHARED_IMAGE_USAGE_CPU_UPLOAD, + /*is_thread_safe=*/false); + if (!gpu_backing) { + DLOG(ERROR) << "Failed to create GPU backing"; + return nullptr; + } + + return std::make_unique<SharedImageBackingCompound>( + mailbox, format, size, color_space, surface_origin, alpha_type, usage, + std::move(shm_backing), std::move(gpu_backing)); +} + +SharedImageBackingCompound::SharedImageBackingCompound( + const Mailbox& mailbox, + viz::ResourceFormat format, + const gfx::Size& size, + const gfx::ColorSpace& color_space, + GrSurfaceOrigin surface_origin, + SkAlphaType alpha_type, + uint32_t usage, + std::unique_ptr<SharedImageBackingSharedMemory> shm_backing, + std::unique_ptr<SharedImageBacking> gpu_backing) + : SharedImageBacking(mailbox, + format, + size, + color_space, + surface_origin, + alpha_type, + usage, + gpu_backing->estimated_size(), + /*is_thread_safe=*/false), + shm_backing_(std::move(shm_backing)), + gpu_backing_(std::move(gpu_backing)) { + DCHECK(gpu_backing_); + DCHECK(shm_backing_); + DCHECK_EQ(size, gpu_backing_->size()); + DCHECK_EQ(size, shm_backing_->size()); + + // First access will write pixels from shared memory backing to GPU backing + // clearing it. + shm_has_update_ = true; + SetClearedRect(gfx::Rect(size)); +} + +SharedImageBackingCompound::~SharedImageBackingCompound() = default; + +void SharedImageBackingCompound::NotifyBeginAccess( + SharedImageAccessStream stream, + RepresentationAccessMode mode) { + // Compound backings don't support CPU access directly or copying + // from GPU back to CPU yet. Also no support for VAAPI. + DCHECK_NE(stream, SharedImageAccessStream::kMemory); + DCHECK_NE(stream, SharedImageAccessStream::kVaapi); + + // TODO(kylechar): Keep track of access to the compound backing as we + // only want to update a backing if it's not currently being accessed. + + if (shm_has_update_) { + auto& wrapper = + static_cast<SharedImageBackingSharedMemory*>(shm_backing_.get()) + ->shared_memory_wrapper(); + DCHECK(wrapper.IsValid()); + + SkPixmap pixmap(shm_backing_->AsSkImageInfo(), wrapper.GetMemory(), + wrapper.GetStride()); + + if (gpu_backing_->UploadFromMemory(pixmap)) { + shm_has_update_ = false; + } else { + DLOG(ERROR) << "Failed to upload from shared memory to GPU backing"; + } + } +} + +SharedImageBackingType SharedImageBackingCompound::GetType() const { + return SharedImageBackingType::kCompound; +} + +void SharedImageBackingCompound::Update( + std::unique_ptr<gfx::GpuFence> in_fence) { + DCHECK(!in_fence); + shm_has_update_ = true; +} + +bool SharedImageBackingCompound::ProduceLegacyMailbox( + MailboxManager* mailbox_manager) { + return gpu_backing_->ProduceLegacyMailbox(mailbox_manager); +} + +gfx::Rect SharedImageBackingCompound::ClearedRect() const { + return gpu_backing_->ClearedRect(); +} + +void SharedImageBackingCompound::SetClearedRect(const gfx::Rect& cleared_rect) { + // Shared memory backing doesn't track cleared rect. + gpu_backing_->SetClearedRect(cleared_rect); +} + +std::unique_ptr<SharedImageRepresentationDawn> +SharedImageBackingCompound::ProduceDawn(SharedImageManager* manager, + MemoryTypeTracker* tracker, + WGPUDevice device, + WGPUBackendType backend_type) { + auto real_rep = + gpu_backing_->ProduceDawn(manager, tracker, device, backend_type); + if (!real_rep) + return nullptr; + + return std::make_unique<WrappedDawnRepresentation>(manager, this, tracker, + std::move(real_rep)); +} + +std::unique_ptr<SharedImageRepresentationGLTexture> +SharedImageBackingCompound::ProduceGLTexture(SharedImageManager* manager, + MemoryTypeTracker* tracker) { + auto real_rep = gpu_backing_->ProduceGLTexture(manager, tracker); + if (!real_rep) + return nullptr; + + return std::make_unique<WrappedGLTextureRepresentation>( + manager, this, tracker, std::move(real_rep)); +} + +std::unique_ptr<SharedImageRepresentationGLTexturePassthrough> +SharedImageBackingCompound::ProduceGLTexturePassthrough( + SharedImageManager* manager, + MemoryTypeTracker* tracker) { + auto real_rep = gpu_backing_->ProduceGLTexturePassthrough(manager, tracker); + if (!real_rep) + return nullptr; + + return std::make_unique<WrappedGLTexturePassthroughRepresentation>( + manager, this, tracker, std::move(real_rep)); +} + +std::unique_ptr<SharedImageRepresentationSkia> +SharedImageBackingCompound::ProduceSkia( + SharedImageManager* manager, + MemoryTypeTracker* tracker, + scoped_refptr<SharedContextState> context_state) { + auto real_rep = + gpu_backing_->ProduceSkia(manager, tracker, std::move(context_state)); + if (!real_rep) + return nullptr; + + return std::make_unique<WrappedSkiaRepresentation>(manager, this, tracker, + std::move(real_rep)); +} + +std::unique_ptr<SharedImageRepresentationOverlay> +SharedImageBackingCompound::ProduceOverlay(SharedImageManager* manager, + MemoryTypeTracker* tracker) { + auto real_rep = gpu_backing_->ProduceOverlay(manager, tracker); + if (!real_rep) + return nullptr; + + return std::make_unique<WrappedOverlayRepresentation>(manager, this, tracker, + std::move(real_rep)); +} + +void SharedImageBackingCompound::OnMemoryDump( + const std::string& dump_name, + base::trace_event::MemoryAllocatorDump* dump, + base::trace_event::ProcessMemoryDump* pmd, + uint64_t client_tracing_id) { + shm_backing_.get()->OnMemoryDump(dump_name, dump, pmd, client_tracing_id); + gpu_backing_->OnMemoryDump(dump_name, dump, pmd, client_tracing_id); +} + +} // namespace gpu
diff --git a/gpu/command_buffer/service/shared_image_backing_compound.h b/gpu/command_buffer/service/shared_image_backing_compound.h new file mode 100644 index 0000000..34f2fbd --- /dev/null +++ b/gpu/command_buffer/service/shared_image_backing_compound.h
@@ -0,0 +1,123 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef GPU_COMMAND_BUFFER_SERVICE_SHARED_IMAGE_BACKING_COMPOUND_H_ +#define GPU_COMMAND_BUFFER_SERVICE_SHARED_IMAGE_BACKING_COMPOUND_H_ + +#include "base/memory/scoped_refptr.h" +#include "components/viz/common/resources/resource_format.h" +#include "gpu/command_buffer/common/mailbox.h" +#include "gpu/command_buffer/service/mailbox_manager.h" +#include "gpu/command_buffer/service/memory_tracking.h" +#include "gpu/command_buffer/service/shared_image_backing.h" +#include "gpu/command_buffer/service/shared_image_backing_shared_memory.h" +#include "gpu/command_buffer/service/shared_image_manager.h" +#include "gpu/command_buffer/service/shared_image_representation.h" +#include "gpu/command_buffer/service/shared_memory_region_wrapper.h" +#include "gpu/gpu_gles2_export.h" +#include "gpu/ipc/common/surface_handle.h" +#include "ui/gfx/color_space.h" +#include "ui/gfx/geometry/size.h" + +namespace gpu { + +class SharedImageBackingFactory; + +// TODO(kylechar): Merge with SharedImageBackingOzone::AccessStream enum. +enum class SharedImageAccessStream { + kSkia, + kOverlay, + kGL, + kDawn, + kMemory, + kVaapi +}; + +// A compound backing that combines a shared memory backing and real GPU +// backing. The real GPU backing must implement `UploadFromMemory()` and not +// have it's own shared memory segment. +// TODO(crbug.com/1293509): Support multiple GPU backings. +class GPU_GLES2_EXPORT SharedImageBackingCompound : public SharedImageBacking { + public: + // Creates a backing that contains a shared memory backing and GPU backing + // provided by `gpu_backing_factory`. + static std::unique_ptr<SharedImageBacking> CreateSharedMemory( + SharedImageBackingFactory* gpu_backing_factory, + const Mailbox& mailbox, + gfx::GpuMemoryBufferHandle handle, + gfx::BufferFormat buffer_format, + gfx::BufferPlane plane, + SurfaceHandle surface_handle, + const gfx::Size& size, + const gfx::ColorSpace& color_space, + GrSurfaceOrigin surface_origin, + SkAlphaType alpha_type, + uint32_t usage); + + SharedImageBackingCompound( + const Mailbox& mailbox, + viz::ResourceFormat format, + const gfx::Size& size, + const gfx::ColorSpace& color_space, + GrSurfaceOrigin surface_origin, + SkAlphaType alpha_type, + uint32_t usage, + std::unique_ptr<SharedImageBackingSharedMemory> shm_backing, + std::unique_ptr<SharedImageBacking> gpu_backing); + + ~SharedImageBackingCompound() override; + + // Called by wrapped representations before access. This will update + // the backing that is going to be accessed if most recent pixels are in + // a different backing. + void NotifyBeginAccess(SharedImageAccessStream stream, + RepresentationAccessMode mode); + + // SharedImageBacking implementation. + SharedImageBackingType GetType() const override; + void Update(std::unique_ptr<gfx::GpuFence> in_fence) override; + bool ProduceLegacyMailbox(MailboxManager* mailbox_manager) override; + gfx::Rect ClearedRect() const override; + void SetClearedRect(const gfx::Rect& cleared_rect) override; + + protected: + // SharedImageBacking implementation. + std::unique_ptr<SharedImageRepresentationDawn> ProduceDawn( + SharedImageManager* manager, + MemoryTypeTracker* tracker, + WGPUDevice device, + WGPUBackendType backend_type) override; + std::unique_ptr<SharedImageRepresentationGLTexture> ProduceGLTexture( + SharedImageManager* manager, + MemoryTypeTracker* tracker) override; + std::unique_ptr<SharedImageRepresentationGLTexturePassthrough> + ProduceGLTexturePassthrough(SharedImageManager* manager, + MemoryTypeTracker* tracker) override; + std::unique_ptr<SharedImageRepresentationSkia> ProduceSkia( + SharedImageManager* manager, + MemoryTypeTracker* tracker, + scoped_refptr<SharedContextState> context_state) override; + std::unique_ptr<SharedImageRepresentationOverlay> ProduceOverlay( + SharedImageManager* manager, + MemoryTypeTracker* tracker) override; + + private: + friend class CompoundImageBackingTest; + + void OnMemoryDump(const std::string& dump_name, + base::trace_event::MemoryAllocatorDump* dump, + base::trace_event::ProcessMemoryDump* pmd, + uint64_t client_tracing_id) override; + + std::unique_ptr<SharedImageBacking> shm_backing_; + std::unique_ptr<SharedImageBacking> gpu_backing_; + + // This will be true when shared memory backing has newer pixels than GPU + // backing. + bool shm_has_update_ = false; +}; + +} // namespace gpu + +#endif // GPU_COMMAND_BUFFER_SERVICE_SHARED_IMAGE_BACKING_COMPOUND_H_
diff --git a/gpu/command_buffer/service/shared_image_backing_compound_unittest.cc b/gpu/command_buffer/service/shared_image_backing_compound_unittest.cc new file mode 100644 index 0000000..107a7ec --- /dev/null +++ b/gpu/command_buffer/service/shared_image_backing_compound_unittest.cc
@@ -0,0 +1,214 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "gpu/command_buffer/service/shared_image_backing_compound.h" + +#include "gpu/command_buffer/common/shared_image_usage.h" +#include "gpu/command_buffer/service/memory_tracking.h" +#include "gpu/command_buffer/service/mocks.h" +#include "gpu/command_buffer/service/shared_context_state.h" +#include "gpu/command_buffer/service/shared_image_backing.h" +#include "gpu/command_buffer/service/shared_image_backing_factory.h" +#include "gpu/command_buffer/service/shared_image_manager.h" +#include "gpu/command_buffer/service/test_shared_image_backing.h" +#include "gpu/ipc/common/gpu_memory_buffer_impl_shared_memory.h" +#include "gpu/ipc/common/surface_handle.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/skia/include/core/SkAlphaType.h" +#include "third_party/skia/include/gpu/GrBackendSemaphore.h" +#include "third_party/skia/include/gpu/GrTypes.h" +#include "ui/gfx/buffer_types.h" + +namespace gpu { +namespace { + +class TestSharedImageBackingFactory : public SharedImageBackingFactory { + public: + // SharedImageBackingFactory implementation. + std::unique_ptr<SharedImageBacking> CreateSharedImage( + const Mailbox& mailbox, + viz::ResourceFormat format, + SurfaceHandle surface_handle, + const gfx::Size& size, + const gfx::ColorSpace& color_space, + GrSurfaceOrigin surface_origin, + SkAlphaType alpha_type, + uint32_t usage, + bool is_thread_safe) override { + return std::make_unique<TestSharedImageBacking>(mailbox, format, size, + color_space, surface_origin, + alpha_type, usage, 0); + } + std::unique_ptr<SharedImageBacking> CreateSharedImage( + const Mailbox& mailbox, + viz::ResourceFormat format, + const gfx::Size& size, + const gfx::ColorSpace& color_space, + GrSurfaceOrigin surface_origin, + SkAlphaType alpha_type, + uint32_t usage, + base::span<const uint8_t> pixel_data) override { + return nullptr; + } + std::unique_ptr<SharedImageBacking> CreateSharedImage( + const Mailbox& mailbox, + int client_id, + gfx::GpuMemoryBufferHandle handle, + gfx::BufferFormat format, + gfx::BufferPlane plane, + SurfaceHandle surface_handle, + const gfx::Size& size, + const gfx::ColorSpace& color_space, + GrSurfaceOrigin surface_origin, + SkAlphaType alpha_type, + uint32_t usage) override { + return nullptr; + } + bool IsSupported(uint32_t usage, + viz::ResourceFormat format, + bool thread_safe, + gfx::GpuMemoryBufferType gmb_type, + GrContextType gr_context_type, + bool* allow_legacy_mailbox, + bool is_pixel_used) override { + return true; + } +}; + +} // namespace + +class CompoundImageBackingTest : public testing::Test { + public: + TestSharedImageBacking* GetGpuBacking(SharedImageBackingCompound* backing) { + auto* gpu_backing = backing->gpu_backing_.get(); + DCHECK_EQ(gpu_backing->GetType(), SharedImageBackingType::kTest); + return static_cast<TestSharedImageBacking*>(gpu_backing); + } + + // Create a compound backing containing shared memory + GPU backing. + std::unique_ptr<SharedImageBacking> CreateCompoundBacking() { + constexpr gfx::Size size(100, 100); + constexpr gfx::BufferFormat buffer_format = gfx::BufferFormat::RGBA_8888; + constexpr gfx::BufferUsage buffer_usage = + gfx::BufferUsage::SCANOUT_CPU_READ_WRITE; + + gfx::GpuMemoryBufferHandle handle = + GpuMemoryBufferImplSharedMemory::CreateGpuMemoryBuffer( + static_cast<gfx::GpuMemoryBufferId>(1), size, buffer_format, + buffer_usage); + + return SharedImageBackingCompound::CreateSharedMemory( + &test_factory_, Mailbox::GenerateForSharedImage(), std::move(handle), + buffer_format, gfx::BufferPlane::DEFAULT, kNullSurfaceHandle, size, + gfx::ColorSpace(), kBottomLeft_GrSurfaceOrigin, kOpaque_SkAlphaType, + SHARED_IMAGE_USAGE_DISPLAY); + } + + protected: + SharedImageManager manager_; + TestSharedImageBackingFactory test_factory_; + gles2::MockMemoryTracker mock_memory_tracker_; + MemoryTypeTracker tracker_{&mock_memory_tracker_}; +}; + +TEST_F(CompoundImageBackingTest, References) { + auto backing = CreateCompoundBacking(); + + auto* compound_backing = + static_cast<SharedImageBackingCompound*>(backing.get()); + EXPECT_NE(compound_backing, nullptr); + + auto* gpu_backing = GetGpuBacking(compound_backing); + + // The compound backing hasn't been added to the manager yet so it should + // have zero references. + EXPECT_FALSE(compound_backing->HasAnyRefs()); + EXPECT_FALSE(gpu_backing->HasAnyRefs()); + + auto factory_rep = manager_.Register(std::move(backing), &tracker_); + + // After register compound backing it should have a reference. The GPU + // backing should never have any reference as it's owned by the compound + // backing and isn't reference counted. + EXPECT_TRUE(compound_backing->HasAnyRefs()); + EXPECT_FALSE(gpu_backing->HasAnyRefs()); + + auto overlay_rep = + manager_.ProduceOverlay(compound_backing->mailbox(), &tracker_); + + // GPU backing still shouldn't have any references after a wrapped + // representation is created. + EXPECT_TRUE(compound_backing->HasAnyRefs()); + EXPECT_FALSE(gpu_backing->HasAnyRefs()); + + overlay_rep.reset(); + EXPECT_TRUE(compound_backing->HasAnyRefs()); + + // All the backings will be destroyed after this point. + factory_rep.reset(); +} + +TEST_F(CompoundImageBackingTest, UploadOnAccess) { + auto backing = CreateCompoundBacking(); + auto* compound_backing = + static_cast<SharedImageBackingCompound*>(backing.get()); + auto* gpu_backing = GetGpuBacking(compound_backing); + + auto factory_rep = manager_.Register(std::move(backing), &tracker_); + + // The compound backing hasn't been accessed yet. + EXPECT_FALSE(gpu_backing->GetUploadFromMemoryCalledAndReset()); + + auto overlay_rep = + manager_.ProduceOverlay(compound_backing->mailbox(), &tracker_); + + // First access should trigger upload from memory to GPU. + overlay_rep->BeginScopedReadAccess(false); + EXPECT_TRUE(gpu_backing->GetUploadFromMemoryCalledAndReset()); + + // Second access shouldn't trigger upload since no shared memory updates + // happened. + overlay_rep->BeginScopedReadAccess(false); + EXPECT_FALSE(gpu_backing->GetUploadFromMemoryCalledAndReset()); + + // Notify compound backing of shared memory update. Next access should + // trigger a new upload. + compound_backing->Update(nullptr); + overlay_rep->BeginScopedReadAccess(false); + EXPECT_TRUE(gpu_backing->GetUploadFromMemoryCalledAndReset()); + + // Test that GLTexturePassthrough access causes upload. + auto gl_passthrough_rep = manager_.ProduceGLTexturePassthrough( + compound_backing->mailbox(), &tracker_); + compound_backing->Update(nullptr); + gl_passthrough_rep->BeginScopedAccess( + 0, SharedImageRepresentation::AllowUnclearedAccess::kNo); + EXPECT_TRUE(gpu_backing->GetUploadFromMemoryCalledAndReset()); + + // Test that GLTexture access causes upload. + auto gl_rep = + manager_.ProduceGLTexture(compound_backing->mailbox(), &tracker_); + compound_backing->Update(nullptr); + gl_rep->BeginScopedAccess( + 0, SharedImageRepresentation::AllowUnclearedAccess::kNo); + EXPECT_TRUE(gpu_backing->GetUploadFromMemoryCalledAndReset()); + + // Test that both read and write access by Skia triggers upload. + std::vector<GrBackendSemaphore> begin_semaphores; + std::vector<GrBackendSemaphore> end_semaphores; + auto skia_rep = + manager_.ProduceSkia(compound_backing->mailbox(), &tracker_, nullptr); + + compound_backing->Update(nullptr); + skia_rep->BeginScopedWriteAccess( + &begin_semaphores, &end_semaphores, + SharedImageRepresentation::AllowUnclearedAccess::kNo); + EXPECT_TRUE(gpu_backing->GetUploadFromMemoryCalledAndReset()); + + compound_backing->Update(nullptr); + skia_rep->BeginScopedReadAccess(&begin_semaphores, &end_semaphores); + EXPECT_TRUE(gpu_backing->GetUploadFromMemoryCalledAndReset()); +} + +} // namespace gpu
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.cc b/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.cc index 759ec64..2a3c93d 100644 --- a/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.cc +++ b/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.cc
@@ -740,7 +740,9 @@ } // TODO(crbug.com/969114): Not all shared image factory implementations // support concurrent read/write usage. - if (usage & SHARED_IMAGE_USAGE_CONCURRENT_READ_WRITE) { + constexpr uint32_t kInvalidUsage = + SHARED_IMAGE_USAGE_CONCURRENT_READ_WRITE | SHARED_IMAGE_USAGE_CPU_UPLOAD; + if (usage & kInvalidUsage) { return false; } if (!IsFormatSupported(format)) {
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_angle_vulkan.cc b/gpu/command_buffer/service/shared_image_backing_factory_angle_vulkan.cc index aabbf84..88ee4203 100644 --- a/gpu/command_buffer/service/shared_image_backing_factory_angle_vulkan.cc +++ b/gpu/command_buffer/service/shared_image_backing_factory_angle_vulkan.cc
@@ -17,7 +17,6 @@ #include "gpu/command_buffer/service/shared_image_backing_gl_common.h" #include "gpu/command_buffer/service/shared_image_backing_gl_image.h" #include "gpu/command_buffer/service/shared_image_representation.h" -#include "gpu/command_buffer/service/shared_memory_region_wrapper.h" #include "gpu/command_buffer/service/skia_utils.h" #include "gpu/vulkan/vulkan_device_queue.h" #include "gpu/vulkan/vulkan_fence_helper.h" @@ -136,23 +135,6 @@ return true; } - bool InitializeFromGMB( - const SharedImageBackingFactoryAngleVulkan::FormatInfo& format_info, - gfx::GpuMemoryBufferHandle handle) { - SharedMemoryRegionWrapper shared_memory_wrapper; - if (!shared_memory_wrapper.Initialize(handle, size(), format())) - return false; - - if (!Initialize(format_info, {})) - return false; - - shared_memory_wrapper_ = std::move(shared_memory_wrapper); - Update(nullptr); - SetCleared(); - - return true; - } - protected: // SharedImageBacking implementation. SharedImageBackingType GetType() const override { @@ -164,9 +146,18 @@ return false; } + bool UploadFromMemory(const SkPixmap& pixmap) override { + PrepareBackendTexture(); + DCHECK(backend_texture_.isValid()); + + bool result = gr_context()->updateBackendTexture(backend_texture_, pixmap); + DCHECK(result); + SyncImageLayoutFromBackendTexture(); + return result; + } + void Update(std::unique_ptr<gfx::GpuFence> in_fence) override { - DCHECK(!in_fence); - need_copy_pixels_from_shm_ = true; + NOTREACHED(); } void OnMemoryDump(const std::string& dump_name, @@ -230,8 +221,6 @@ return false; } - // Sync pixels data from SHM to VkImage - CopyPixelsFromSHMIfNecessary(); // Need to submit recorded work in skia's command buffer to the GPU. // TODO(penghuang): only call submit() if it is necessary. gr_context()->submit(); @@ -260,8 +249,6 @@ ++gl_reads_in_process_; if (gl_reads_in_process_ == 1) { // For the first GL access. - // Sync pixels data from SHM to VkImage - CopyPixelsFromSHMIfNecessary(); // Need to submit recorded work in skia's command buffer to the GPU. // TODO(penghuang): only call submit() if it is necessary. gr_context()->submit(); @@ -354,8 +341,6 @@ LOG(DFATAL) << "The backing is being written by Skia"; return false; } - // Sync pixels data from SHM to VkImage - CopyPixelsFromSHMIfNecessary(); PrepareBackendTexture(); is_skia_write_in_process_ = true; return true; @@ -374,8 +359,6 @@ if (skia_reads_in_process_ == 0) { // The first skia access. if (gl_reads_in_process_ == 0) { - // Sync pixels data from SHM to VkImage - CopyPixelsFromSHMIfNecessary(); } else { if (!gl::GLContext::GetCurrent()) context_state_->MakeCurrent(/*surface=*/nullptr, /*needs_gl=*/true); @@ -454,28 +437,12 @@ } void WritePixels(const base::span<const uint8_t>& pixel_data, size_t stride) { - PrepareBackendTexture(); - DCHECK(backend_texture_.isValid()); - auto info = SkImageInfo::Make(size().width(), size().height(), ResourceFormatToClosestSkColorType( /*gpu_compositing=*/true, format()), kOpaque_SkAlphaType); SkPixmap pixmap(info, pixel_data.data(), stride); - auto result = gr_context()->updateBackendTexture(backend_texture_, pixmap); - DCHECK(result); - SyncImageLayoutFromBackendTexture(); - } - - void CopyPixelsFromSHMIfNecessary() { - if (need_copy_pixels_from_shm_) { - // Set need_copy_pixels_from_shm_ to false before call WritePixels(), - // because it will call BeginAccessSkia() which will call - // CopyPixelsFromSHMIfNecessary() again. - need_copy_pixels_from_shm_ = false; - WritePixels(shared_memory_wrapper_.GetMemoryAsSpan(), - shared_memory_wrapper_.GetStride()); - } + UploadFromMemory(pixmap); } GrDirectContext* gr_context() { return context_state_->gr_context(); } @@ -490,8 +457,6 @@ bool is_gl_write_in_process_ = false; int skia_reads_in_process_ = 0; int gl_reads_in_process_ = 0; - SharedMemoryRegionWrapper shared_memory_wrapper_; - bool need_copy_pixels_from_shm_ = false; }; class AngleVulkanBacking::SkiaRepresentation @@ -671,32 +636,8 @@ GrSurfaceOrigin surface_origin, SkAlphaType alpha_type, uint32_t usage) { - if (plane != gfx::BufferPlane::DEFAULT) { - LOG(DFATAL) << "Invalid plane"; - return nullptr; - } - - if (!gpu::IsImageSizeValidForGpuMemoryBufferFormat(size, buffer_format)) { - LOG(DFATAL) << "Invalid image size for format."; - return nullptr; - } - - auto format = viz::GetResourceFormat(buffer_format); - - const FormatInfo& format_info = format_info_[format]; - if (!CanCreateSharedImage(size, /*pixel_data=*/{}, format_info, - GL_TEXTURE_2D)) { - return nullptr; - } - - auto backing = std::make_unique<AngleVulkanBacking>( - context_state_, mailbox, format, size, color_space, surface_origin, - alpha_type, usage); - - if (!backing->InitializeFromGMB(format_info, std::move(handle))) - return nullptr; - - return backing; + NOTREACHED(); + return nullptr; } bool SharedImageBackingFactoryAngleVulkan::CanUseAngleVulkanBacking( @@ -712,7 +653,7 @@ #endif SHARED_IMAGE_USAGE_GLES2 | SHARED_IMAGE_USAGE_GLES2_FRAMEBUFFER_HINT | SHARED_IMAGE_USAGE_RASTER | SHARED_IMAGE_USAGE_DISPLAY | - SHARED_IMAGE_USAGE_OOP_RASTERIZATION; + SHARED_IMAGE_USAGE_OOP_RASTERIZATION | SHARED_IMAGE_USAGE_CPU_UPLOAD; if (usage & ~kSupportedUsages) return false; @@ -738,12 +679,8 @@ if (thread_safe) return false; - switch (gmb_type) { - case gfx::EMPTY_BUFFER: - case gfx::SHARED_MEMORY_BUFFER: - break; - default: - return false; + if (gmb_type != gfx::EMPTY_BUFFER) { + return false; } *allow_legacy_mailbox = false;
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_d3d.cc b/gpu/command_buffer/service/shared_image_backing_factory_d3d.cc index b2808f2..0c319628 100644 --- a/gpu/command_buffer/service/shared_image_backing_factory_d3d.cc +++ b/gpu/command_buffer/service/shared_image_backing_factory_d3d.cc
@@ -582,7 +582,9 @@ } // TODO(crbug.com/969114): Not all shared image factory implementations // support concurrent read/write usage. - if (usage & SHARED_IMAGE_USAGE_CONCURRENT_READ_WRITE) { + constexpr uint32_t kInvalidUsage = + SHARED_IMAGE_USAGE_CONCURRENT_READ_WRITE | SHARED_IMAGE_USAGE_CPU_UPLOAD; + if (usage & kInvalidUsage) { return false; }
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_egl.cc b/gpu/command_buffer/service/shared_image_backing_factory_egl.cc index 7b7c119e..ac05f62 100644 --- a/gpu/command_buffer/service/shared_image_backing_factory_egl.cc +++ b/gpu/command_buffer/service/shared_image_backing_factory_egl.cc
@@ -105,10 +105,10 @@ (usage & SHARED_IMAGE_USAGE_RASTER))) { return false; } - if ((usage & SHARED_IMAGE_USAGE_WEBGPU) || - (usage & SHARED_IMAGE_USAGE_VIDEO_DECODE) || - (usage & SHARED_IMAGE_USAGE_SCANOUT)) { - // return false if it needs interop factory + constexpr uint32_t kInvalidUsage = + SHARED_IMAGE_USAGE_WEBGPU | SHARED_IMAGE_USAGE_VIDEO_DECODE | + SHARED_IMAGE_USAGE_SCANOUT | SHARED_IMAGE_USAGE_CPU_UPLOAD; + if (usage & kInvalidUsage) { return false; } *allow_legacy_mailbox = false;
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_gl_image.cc b/gpu/command_buffer/service/shared_image_backing_factory_gl_image.cc index b8a146e..1907e3c 100644 --- a/gpu/command_buffer/service/shared_image_backing_factory_gl_image.cc +++ b/gpu/command_buffer/service/shared_image_backing_factory_gl_image.cc
@@ -266,6 +266,9 @@ (!for_shared_memory_gmbs_ && gmb_type == gfx::SHARED_MEMORY_BUFFER)) { return false; } + if (usage & SHARED_IMAGE_USAGE_CPU_UPLOAD) { + return false; + } #if BUILDFLAG(IS_MAC) // On macOS, there is no separate interop factory. Any GpuMemoryBuffer-backed // image can be used with both OpenGL and Metal
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_gl_texture.cc b/gpu/command_buffer/service/shared_image_backing_factory_gl_texture.cc index 78cfa5e..49851c4 100644 --- a/gpu/command_buffer/service/shared_image_backing_factory_gl_texture.cc +++ b/gpu/command_buffer/service/shared_image_backing_factory_gl_texture.cc
@@ -135,6 +135,14 @@ return false; } + constexpr uint32_t kInvalidUsages = SHARED_IMAGE_USAGE_VIDEO_DECODE | + SHARED_IMAGE_USAGE_SCANOUT | + SHARED_IMAGE_USAGE_CPU_UPLOAD; + + if (usage & kInvalidUsages) { + return false; + } + // Doesn't support contexts other than GL for OOPR Canvas if (gr_context_type != GrContextType::kGL && ((usage & SHARED_IMAGE_USAGE_DISPLAY) || @@ -154,12 +162,6 @@ #endif } - // Needs interop factory - if ((usage & SHARED_IMAGE_USAGE_VIDEO_DECODE) || - (usage & SHARED_IMAGE_USAGE_SCANOUT)) { - return false; - } - *allow_legacy_mailbox = gr_context_type == GrContextType::kGL; return true; }
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_ozone.cc b/gpu/command_buffer/service/shared_image_backing_factory_ozone.cc index b8ed63c..2cb0d5c5 100644 --- a/gpu/command_buffer/service/shared_image_backing_factory_ozone.cc +++ b/gpu/command_buffer/service/shared_image_backing_factory_ozone.cc
@@ -128,10 +128,15 @@ if (!backing) { return nullptr; } - if (!pixel_data.empty() && - !backing->WritePixels(pixel_data, shared_context_state_.get(), format, - size, alpha_type)) { - return nullptr; + if (!pixel_data.empty()) { + SkImageInfo info = SkImageInfo::Make(size.width(), size.height(), + ResourceFormatToClosestSkColorType( + /*gpu_compositing=*/true, format), + alpha_type); + SkPixmap pixmap(info, pixel_data.data(), info.minRowBytes()); + + if (!backing->UploadFromMemory(pixmap)) + return nullptr; } return backing; @@ -150,48 +155,27 @@ GrSurfaceOrigin surface_origin, SkAlphaType alpha_type, uint32_t usage) { - viz::ResourceFormat format = viz::GetResourceFormat(buffer_format); - std::unique_ptr<SharedImageBackingOzone> backing; - if (handle.type == gfx::NATIVE_PIXMAP) { - ui::SurfaceFactoryOzone* surface_factory = - ui::OzonePlatform::GetInstance()->GetSurfaceFactoryOzone(); - scoped_refptr<gfx::NativePixmap> pixmap = - surface_factory->CreateNativePixmapFromHandle( - surface_handle, size, buffer_format, - std::move(handle.native_pixmap_handle)); - if (!pixmap) { - return nullptr; - } + DCHECK_EQ(handle.type, gfx::NATIVE_PIXMAP); - const gfx::Size plane_size = gpu::GetPlaneSize(plane, size); - const viz::ResourceFormat plane_format = - viz::GetResourceFormat(GetPlaneBufferFormat(plane, buffer_format)); - backing = std::make_unique<SharedImageBackingOzone>( - mailbox, plane_format, plane, plane_size, color_space, surface_origin, - alpha_type, usage, shared_context_state_.get(), std::move(pixmap), - dawn_procs_, workarounds_); - backing->SetCleared(); - } else if (handle.type == gfx::SHARED_MEMORY_BUFFER) { - SharedMemoryRegionWrapper shm_wrapper; - if (!shm_wrapper.Initialize(handle, size, format)) { - return nullptr; - } - - backing = CreateSharedImageInternal(mailbox, format, surface_handle, size, - color_space, surface_origin, alpha_type, - usage); - if (!backing) { - return nullptr; - } - if (!backing->WritePixels(shm_wrapper.GetMemoryAsSpan(), - shared_context_state_.get(), format, size, - alpha_type)) { - DLOG(ERROR) << "Failed to write pixels for shared memory."; - return nullptr; - } - backing->SetSharedMemoryWrapper(std::move(shm_wrapper)); + ui::SurfaceFactoryOzone* surface_factory = + ui::OzonePlatform::GetInstance()->GetSurfaceFactoryOzone(); + scoped_refptr<gfx::NativePixmap> pixmap = + surface_factory->CreateNativePixmapFromHandle( + surface_handle, size, buffer_format, + std::move(handle.native_pixmap_handle)); + if (!pixmap) { + return nullptr; } + const gfx::Size plane_size = gpu::GetPlaneSize(plane, size); + const viz::ResourceFormat plane_format = + viz::GetResourceFormat(GetPlaneBufferFormat(plane, buffer_format)); + auto backing = std::make_unique<SharedImageBackingOzone>( + mailbox, plane_format, plane, plane_size, color_space, surface_origin, + alpha_type, usage, shared_context_state_.get(), std::move(pixmap), + dawn_procs_, workarounds_); + backing->SetCleared(); + return backing; } @@ -203,8 +187,7 @@ GrContextType gr_context_type, bool* allow_legacy_mailbox, bool is_pixel_used) { - if (gmb_type != gfx::EMPTY_BUFFER && gmb_type != gfx::NATIVE_PIXMAP && - gmb_type != gfx::SHARED_MEMORY_BUFFER) { + if (gmb_type != gfx::EMPTY_BUFFER && gmb_type != gfx::NATIVE_PIXMAP) { return false; }
diff --git a/gpu/command_buffer/service/shared_image_backing_ozone.cc b/gpu/command_buffer/service/shared_image_backing_ozone.cc index 3cb8649..ad5fffa3 100644 --- a/gpu/command_buffer/service/shared_image_backing_ozone.cc +++ b/gpu/command_buffer/service/shared_image_backing_ozone.cc
@@ -136,26 +136,11 @@ } void SharedImageBackingOzone::Update(std::unique_ptr<gfx::GpuFence> in_fence) { - if (shared_memory_wrapper_.IsValid()) { - DCHECK(!in_fence); - if (context_state_->context_lost()) - return; - - DCHECK(context_state_->IsCurrent(nullptr)); - if (!WritePixels(shared_memory_wrapper_.GetMemoryAsSpan(), - context_state_.get(), format(), size(), alpha_type())) { - DLOG(ERROR) << "Failed to write pixels."; - } - } else if (in_fence) { + if (in_fence) { external_write_fence_ = in_fence->GetGpuFenceHandle().Clone(); } } -void SharedImageBackingOzone::SetSharedMemoryWrapper( - SharedMemoryRegionWrapper wrapper) { - shared_memory_wrapper_ = std::move(wrapper); -} - bool SharedImageBackingOzone::ProduceLegacyMailbox( MailboxManager* mailbox_manager) { NOTREACHED(); @@ -326,21 +311,16 @@ return !has_pending_va_writes_; } -bool SharedImageBackingOzone::WritePixels( - base::span<const uint8_t> pixel_data, - SharedContextState* const shared_context_state, - viz::ResourceFormat format, - const gfx::Size& size, - SkAlphaType alpha_type) { - auto representation = - ProduceSkia(nullptr, shared_context_state->memory_type_tracker(), - shared_context_state); +bool SharedImageBackingOzone::UploadFromMemory(const SkPixmap& pixmap) { + DCHECK(!pixmap.info().isEmpty()); - SkImageInfo info = SkImageInfo::Make(size.width(), size.height(), - ResourceFormatToClosestSkColorType( - /*gpu_compositing=*/true, format), - alpha_type); - SkPixmap sk_pixmap(info, pixel_data.data(), info.minRowBytes()); + if (context_state_->context_lost()) + return false; + + DCHECK(context_state_->IsCurrent(nullptr)); + + auto representation = ProduceSkia( + nullptr, context_state_->memory_type_tracker(), context_state_); std::vector<GrBackendSemaphore> begin_semaphores; std::vector<GrBackendSemaphore> end_semaphores; @@ -353,20 +333,21 @@ return false; } if (!begin_semaphores.empty()) { - bool result = shared_context_state->gr_context()->wait( + bool result = context_state_->gr_context()->wait( begin_semaphores.size(), begin_semaphores.data(), /*deleteSemaphoresAfterWait=*/false); DCHECK(result); } - DCHECK_EQ(size, representation->size()); - bool written = shared_context_state->gr_context()->updateBackendTexture( - dest_scoped_access->promise_image_texture()->backendTexture(), &sk_pixmap, + DCHECK_EQ(size(), representation->size()); + bool written = context_state_->gr_context()->updateBackendTexture( + dest_scoped_access->promise_image_texture()->backendTexture(), &pixmap, /*numLevels=*/1, representation->surface_origin(), nullptr, nullptr); - FlushAndSubmitIfNecessary(std::move(end_semaphores), shared_context_state); + FlushAndSubmitIfNecessary(std::move(end_semaphores), context_state_.get()); if (written && !representation->IsCleared()) { - representation->SetClearedRect(gfx::Rect(info.width(), info.height())); + representation->SetClearedRect( + gfx::Rect(pixmap.info().width(), pixmap.info().height())); } return written; }
diff --git a/gpu/command_buffer/service/shared_image_backing_ozone.h b/gpu/command_buffer/service/shared_image_backing_ozone.h index c76cf4f..1319fc7 100644 --- a/gpu/command_buffer/service/shared_image_backing_ozone.h +++ b/gpu/command_buffer/service/shared_image_backing_ozone.h
@@ -20,7 +20,6 @@ #include "gpu/command_buffer/service/shared_image_backing.h" #include "gpu/command_buffer/service/shared_image_manager.h" #include "gpu/command_buffer/service/shared_image_representation.h" -#include "gpu/command_buffer/service/shared_memory_region_wrapper.h" #include "gpu/config/gpu_driver_bug_workarounds.h" #include "gpu/ipc/common/surface_handle.h" #include "ui/gfx/buffer_types.h" @@ -60,14 +59,9 @@ // gpu::SharedImageBacking: SharedImageBackingType GetType() const override; void Update(std::unique_ptr<gfx::GpuFence> in_fence) override; + bool UploadFromMemory(const SkPixmap& pixmap) override; bool ProduceLegacyMailbox(MailboxManager* mailbox_manager) override; scoped_refptr<gfx::NativePixmap> GetNativePixmap() override; - bool WritePixels(base::span<const uint8_t> pixel_data, - SharedContextState* const shared_context_state, - viz::ResourceFormat format, - const gfx::Size& size, - SkAlphaType alpha_type); - void SetSharedMemoryWrapper(SharedMemoryRegionWrapper wrapper); enum class AccessStream { kGL, kVulkan, kWebGPU, kOverlay, kLast }; @@ -131,8 +125,6 @@ gfx::GpuFenceHandle write_fence_; base::flat_map<AccessStream, gfx::GpuFenceHandle> read_fences_; AccessStream last_write_stream_; - // Set for shared memory GMB. - SharedMemoryRegionWrapper shared_memory_wrapper_; scoped_refptr<SharedContextState> context_state_; const GpuDriverBugWorkarounds workarounds_; };
diff --git a/gpu/command_buffer/service/shared_image_backing_shared_memory.cc b/gpu/command_buffer/service/shared_image_backing_shared_memory.cc index 95e0ef7c..3723939 100644 --- a/gpu/command_buffer/service/shared_image_backing_shared_memory.cc +++ b/gpu/command_buffer/service/shared_image_backing_shared_memory.cc
@@ -36,16 +36,6 @@ return estimated_size; } -SkImageInfo MakeSkImageInfo(const gfx::Size& size, - viz::ResourceFormat format, - SkAlphaType alpha_type, - const gfx::ColorSpace& color_space) { - return SkImageInfo::Make(size.width(), size.height(), - ResourceFormatToClosestSkColorType( - /*gpu_compositing=*/true, format), - alpha_type, color_space.ToSkColorSpace()); -} - class SharedImageRepresentationMemorySharedMemory : public SharedImageRepresentationMemory { public: @@ -56,13 +46,9 @@ protected: SkPixmap BeginReadAccess() override { - SkImageInfo info = - MakeSkImageInfo(shared_image_shared_memory()->size(), - shared_image_shared_memory()->format(), - shared_image_shared_memory()->alpha_type(), - shared_image_shared_memory()->color_space()); return SkPixmap( - info, shared_image_shared_memory()->shared_memory_wrapper().GetMemory(), + backing()->AsSkImageInfo(), + shared_image_shared_memory()->shared_memory_wrapper().GetMemory(), shared_image_shared_memory()->shared_memory_wrapper().GetStride()); }
diff --git a/gpu/command_buffer/service/shared_image_factory.cc b/gpu/command_buffer/service/shared_image_factory.cc index 61f63cb..174f008 100644 --- a/gpu/command_buffer/service/shared_image_factory.cc +++ b/gpu/command_buffer/service/shared_image_factory.cc
@@ -22,6 +22,7 @@ #include "gpu/command_buffer/service/service_utils.h" #include "gpu/command_buffer/service/shared_context_state.h" #include "gpu/command_buffer/service/shared_image_backing.h" +#include "gpu/command_buffer/service/shared_image_backing_compound.h" #include "gpu/command_buffer/service/shared_image_backing_factory_gl_image.h" #include "gpu/command_buffer/service/shared_image_backing_factory_gl_texture.h" #include "gpu/command_buffer/service/shared_image_backing_factory_raw_draw.h" @@ -458,7 +459,7 @@ uint32_t usage) { bool allow_legacy_mailbox = false; auto* factory = GetFactoryByUsage(usage, format, &allow_legacy_mailbox, - /*is_pixel_used=*/false); + /*is_pixel_used=*/false, gfx::EMPTY_BUFFER); if (!factory) return false; @@ -527,20 +528,28 @@ GrSurfaceOrigin surface_origin, SkAlphaType alpha_type, uint32_t usage) { - // TODO(piman): depending on handle.type, choose platform-specific backing - // factory, e.g. SharedImageBackingFactoryAHB. bool allow_legacy_mailbox = false; auto resource_format = viz::GetResourceFormat(format); + gfx::GpuMemoryBufferType gmb_type = handle.type; + + bool use_compound = false; auto* factory = GetFactoryByUsage(usage, resource_format, &allow_legacy_mailbox, - /*is_pixel_used=*/false, handle.type); + /*is_pixel_used=*/false, gmb_type, &use_compound); if (!factory) return false; - gfx::GpuMemoryBufferType gmb_type = handle.type; - auto backing = factory->CreateSharedImage( - mailbox, client_id, std::move(handle), format, plane, surface_handle, - size, color_space, surface_origin, alpha_type, usage); + std::unique_ptr<SharedImageBacking> backing; + if (use_compound) { + backing = SharedImageBackingCompound::CreateSharedMemory( + factory, mailbox, std::move(handle), format, plane, surface_handle, + size, color_space, surface_origin, alpha_type, usage); + } else { + backing = factory->CreateSharedImage( + mailbox, client_id, std::move(handle), format, plane, surface_handle, + size, color_space, surface_origin, alpha_type, usage); + } + if (backing) { DVLOG(1) << "CreateSharedImage[" << backing->GetName() << "] from handle size=" << size.ToString() @@ -750,7 +759,8 @@ viz::ResourceFormat format, bool* allow_legacy_mailbox, bool is_pixel_used, - gfx::GpuMemoryBufferType gmb_type) { + gfx::GpuMemoryBufferType gmb_type, + bool* use_compound_backing) { if (backing_factory_for_testing_) return backing_factory_for_testing_; @@ -760,6 +770,16 @@ gr_context_type_, allow_legacy_mailbox, is_pixel_used)) { return factory.get(); + } else if (use_compound_backing && gmb_type == gfx::SHARED_MEMORY_BUFFER) { + // Check if backing type supports CPU upload with no buffer handle so it + // can be used with a compound backing instead. + if (factory->IsSupported(usage | SHARED_IMAGE_USAGE_CPU_UPLOAD, format, + share_between_threads, gfx::EMPTY_BUFFER, + gr_context_type_, allow_legacy_mailbox, + is_pixel_used)) { + *use_compound_backing = true; + return factory.get(); + } } }
diff --git a/gpu/command_buffer/service/shared_image_factory.h b/gpu/command_buffer/service/shared_image_factory.h index 82aabc3..23d40163 100644 --- a/gpu/command_buffer/service/shared_image_factory.h +++ b/gpu/command_buffer/service/shared_image_factory.h
@@ -143,12 +143,18 @@ private: bool IsSharedBetweenThreads(uint32_t usage); + + // If `use_compound_backing` is not null and `gmb_type` is + // gfx::SHARED_MEMORY_BUFFER then we'll see if factory can be used with a + // compound backing. This is temporary until all backing types support + // compound backings. SharedImageBackingFactory* GetFactoryByUsage( uint32_t usage, viz::ResourceFormat format, bool* allow_legacy_mailbox, bool is_pixel_used, - gfx::GpuMemoryBufferType gmb_type = gfx::EMPTY_BUFFER); + gfx::GpuMemoryBufferType gmb_type, + bool* use_compound_backing = nullptr); raw_ptr<MailboxManager> mailbox_manager_; raw_ptr<SharedImageManager> shared_image_manager_;
diff --git a/gpu/command_buffer/service/shared_image_representation.cc b/gpu/command_buffer/service/shared_image_representation.cc index 76e8da0..306ce3d 100644 --- a/gpu/command_buffer/service/shared_image_representation.cc +++ b/gpu/command_buffer/service/shared_image_representation.cc
@@ -27,7 +27,9 @@ // TODO(hitawala): Rewrite the reference counting so that // SharedImageRepresentation does not need manager and manager attaches to // backing in Register(). - if (manager_) { + // If mailbox is zero this is owned by a compound backing and not reference + // counted. + if (manager_ && !backing_->mailbox().IsZero()) { backing_->AddRef(this); } } @@ -37,7 +39,9 @@ // error is. CHECK(!has_scoped_access_) << "Destroying a SharedImageRepresentation with " "outstanding Scoped*Access objects."; - if (manager_) { + // If mailbox is zero this is owned by a compound backing and not reference + // counted. + if (manager_ && !backing_->mailbox().IsZero()) { manager_->OnRepresentationDestroyed(backing_->mailbox(), this); } } @@ -56,8 +60,7 @@ UpdateClearedStateOnBeginAccess(); - constexpr GLenum kReadAccess = 0x8AF6; - if (mode == kReadAccess) + if (mode == kReadAccessMode) backing()->OnReadSucceeded(); else backing()->OnWriteSucceeded(); @@ -361,9 +364,6 @@ if (!texture) return nullptr; - constexpr auto kWriteUsage = - WGPUTextureUsage_CopyDst | WGPUTextureUsage_RenderAttachment; - if (usage & kWriteUsage) { backing()->OnWriteSucceeded(); } else {
diff --git a/gpu/command_buffer/service/shared_image_representation.h b/gpu/command_buffer/service/shared_image_representation.h index 0db2311..b377901 100644 --- a/gpu/command_buffer/service/shared_image_representation.h +++ b/gpu/command_buffer/service/shared_image_representation.h
@@ -66,6 +66,8 @@ // api. class GPU_GLES2_EXPORT SharedImageRepresentation { public: + using AccessMode = RepresentationAccessMode; + // Used by derived classes. enum class AllowUnclearedAccess { kYes, kNo }; @@ -165,6 +167,8 @@ class GPU_GLES2_EXPORT SharedImageRepresentationGLTextureBase : public SharedImageRepresentation { public: + static constexpr GLenum kReadAccessMode = 0x8AF6; + class ScopedAccess : public ScopedAccessBase<SharedImageRepresentationGLTextureBase> { public: @@ -220,6 +224,8 @@ gpu::TextureBase* GetTextureBase() override; protected: + friend class WrappedGLTextureRepresentation; + void UpdateClearedStateOnBeginAccess() override; void UpdateClearedStateOnEndAccess() override; }; @@ -237,6 +243,9 @@ GetTexturePassthrough() = 0; gpu::TextureBase* GetTextureBase() override; + + private: + friend class WrappedGLTexturePassthroughRepresentation; }; class GPU_GLES2_EXPORT SharedImageRepresentationSkia @@ -317,6 +326,8 @@ virtual bool SupportsMultipleConcurrentReadAccess(); protected: + friend class WrappedSkiaRepresentation; + // Begin the write access. The implementations should insert semaphores into // begin_semaphores vector which client will wait on before writing the // backing. The ownership of begin_semaphores is not passed to client. @@ -368,6 +379,9 @@ class GPU_GLES2_EXPORT SharedImageRepresentationDawn : public SharedImageRepresentation { public: + static constexpr uint32_t kWriteUsage = + WGPUTextureUsage_CopyDst | WGPUTextureUsage_RenderAttachment; + SharedImageRepresentationDawn(SharedImageManager* manager, SharedImageBacking* backing, MemoryTypeTracker* tracker) @@ -397,6 +411,8 @@ AllowUnclearedAccess allow_uncleared); private: + friend class WrappedDawnRepresentation; + // This can return null in case of a Dawn validation error, for example if // usage is invalid. virtual WGPUTexture BeginAccess(WGPUTextureUsage usage) = 0; @@ -450,6 +466,8 @@ std::unique_ptr<ScopedReadAccess> BeginScopedReadAccess(bool needs_gl_image); protected: + friend class WrappedOverlayRepresentation; + // Notifies the backing that an access will start. Returns false if there is a // conflict. Otherwise, returns true and: // - Set a gpu fence to |acquire_fence| that should be waited on before the @@ -576,6 +594,8 @@ std::unique_ptr<ScopedWriteAccess> BeginScopedWriteAccess(); private: + friend class WrappedVaapiRepresentation; + raw_ptr<VaapiDependencies> vaapi_deps_; virtual void EndAccess() = 0; virtual void BeginAccess() = 0;
diff --git a/gpu/command_buffer/service/test_shared_image_backing.cc b/gpu/command_buffer/service/test_shared_image_backing.cc index 21011c8..441a816 100644 --- a/gpu/command_buffer/service/test_shared_image_backing.cc +++ b/gpu/command_buffer/service/test_shared_image_backing.cc
@@ -208,6 +208,10 @@ glDeleteTextures(1, &service_id_); } +bool TestSharedImageBacking::GetUploadFromMemoryCalledAndReset() { + return std::exchange(upload_from_memory_called_, false); +} + SharedImageBackingType TestSharedImageBacking::GetType() const { return SharedImageBackingType::kTest; } @@ -220,6 +224,11 @@ texture_->SetLevelClearedRect(texture_->target(), 0, cleared_rect); } +bool TestSharedImageBacking::UploadFromMemory(const SkPixmap& pixmap) { + upload_from_memory_called_ = true; + return true; +} + bool TestSharedImageBacking::ProduceLegacyMailbox( MailboxManager* mailbox_manager) { return false;
diff --git a/gpu/command_buffer/service/test_shared_image_backing.h b/gpu/command_buffer/service/test_shared_image_backing.h index 7a3c32b..0d9ea6a 100644 --- a/gpu/command_buffer/service/test_shared_image_backing.h +++ b/gpu/command_buffer/service/test_shared_image_backing.h
@@ -35,11 +35,14 @@ GLuint texture_id); ~TestSharedImageBacking() override; + bool GetUploadFromMemoryCalledAndReset(); + // SharedImageBacking implementation. SharedImageBackingType GetType() const override; gfx::Rect ClearedRect() const override; void SetClearedRect(const gfx::Rect& cleared_rect) override; void Update(std::unique_ptr<gfx::GpuFence> in_fence) override {} + bool UploadFromMemory(const SkPixmap& pixmap) override; bool ProduceLegacyMailbox(MailboxManager* mailbox_manager) override; void OnMemoryDump(const std::string& dump_name, base::trace_event::MemoryAllocatorDump* dump, @@ -79,6 +82,8 @@ raw_ptr<gles2::Texture> texture_ = nullptr; scoped_refptr<gles2::TexturePassthrough> texture_passthrough_; bool can_access_ = true; + + bool upload_from_memory_called_ = false; }; } // namespace gpu
diff --git a/gpu/command_buffer/service/wrapped_sk_image.cc b/gpu/command_buffer/service/wrapped_sk_image.cc index a137535..4138d5a 100644 --- a/gpu/command_buffer/service/wrapped_sk_image.cc +++ b/gpu/command_buffer/service/wrapped_sk_image.cc
@@ -27,7 +27,6 @@ #include "gpu/command_buffer/service/shared_context_state.h" #include "gpu/command_buffer/service/shared_image_backing.h" #include "gpu/command_buffer/service/shared_image_representation.h" -#include "gpu/command_buffer/service/shared_memory_region_wrapper.h" #include "gpu/command_buffer/service/skia_utils.h" #include "gpu/config/gpu_finch_features.h" #include "skia/buildflags.h" @@ -159,23 +158,17 @@ } void Update(std::unique_ptr<gfx::GpuFence> in_fence) override { - if (shared_memory_wrapper_.IsValid()) { - DCHECK(!in_fence); + NOTREACHED(); + } - if (context_state_->context_lost()) - return; + bool UploadFromMemory(const SkPixmap& pixmap) override { + if (context_state_->context_lost()) + return false; - DCHECK(context_state_->IsCurrent(nullptr)); + DCHECK(context_state_->IsCurrent(nullptr)); - SkImageInfo info = MakeSkImageInfo(size(), format()); - SkPixmap pixmap(info, shared_memory_wrapper_.GetMemory(), - shared_memory_wrapper_.GetStride()); - - if (!context_state_->gr_context()->updateBackendTexture( - backend_texture_, &pixmap, /*numLevels=*/1, nullptr, nullptr)) { - DLOG(ERROR) << "Failed to update WrappedSkImage texture"; - } - } + return context_state_->gr_context()->updateBackendTexture( + backend_texture_, &pixmap, /*numLevels=*/1, nullptr, nullptr); } void OnMemoryDump(const std::string& dump_name, @@ -252,20 +245,12 @@ sk_sp<SkPromiseImageTexture> promise_texture() { return promise_texture_; } - const SharedMemoryRegionWrapper& shared_memory_wrapper() { - return shared_memory_wrapper_; - } - protected: std::unique_ptr<SharedImageRepresentationSkia> ProduceSkia( SharedImageManager* manager, MemoryTypeTracker* tracker, scoped_refptr<SharedContextState> context_state) override; - std::unique_ptr<SharedImageRepresentationMemory> ProduceMemory( - SharedImageManager* manager, - MemoryTypeTracker* tracker) override; - private: friend class gpu::raster::WrappedSkImageFactory; class RepresentationSkia; @@ -365,24 +350,12 @@ return true; } - bool InitializeWithGMB(SharedMemoryRegionWrapper shm_wrapper) { - if (InitializeWithData(shm_wrapper.GetMemoryAsSpan(), - shm_wrapper.GetStride())) { - shared_memory_wrapper_ = std::move(shm_wrapper); - return true; - } - return false; - } - scoped_refptr<SharedContextState> context_state_; GrBackendTexture backend_texture_; sk_sp<SkPromiseImageTexture> promise_texture_; int surface_msaa_count_ = 0; - // Set for shared memory GMB. - SharedMemoryRegionWrapper shared_memory_wrapper_; - uint64_t tracing_id_ = 0; scoped_refptr<base::SingleThreadTaskRunner> task_runner_; }; @@ -455,29 +428,6 @@ scoped_refptr<SharedContextState> context_state_; }; -class WrappedSkImage::RepresentationMemory - : public SharedImageRepresentationMemory { - public: - RepresentationMemory(SharedImageManager* manager, - SharedImageBacking* backing, - MemoryTypeTracker* tracker) - : SharedImageRepresentationMemory(manager, backing, tracker) {} - - protected: - SkPixmap BeginReadAccess() override { - SkImageInfo info = MakeSkImageInfo(wrapped_sk_image()->size(), - wrapped_sk_image()->format()); - return SkPixmap(info, - wrapped_sk_image()->shared_memory_wrapper().GetMemory(), - wrapped_sk_image()->shared_memory_wrapper().GetStride()); - } - - private: - WrappedSkImage* wrapped_sk_image() { - return static_cast<WrappedSkImage*>(backing()); - } -}; - } // namespace WrappedSkImageFactory::WrappedSkImageFactory( @@ -550,47 +500,8 @@ GrSurfaceOrigin surface_origin, SkAlphaType alpha_type, uint32_t usage) { - DCHECK_EQ(handle.type, gfx::SHARED_MEMORY_BUFFER); - - if (!gpu::IsImageSizeValidForGpuMemoryBufferFormat(size, buffer_format)) { - DLOG(ERROR) << "Invalid image size for format."; - return nullptr; - } - - if (gfx::NumberOfPlanesForLinearBufferFormat(buffer_format) != 1) { - DLOG(ERROR) << "Invalid image format."; - return nullptr; - } - if (plane != gfx::BufferPlane::DEFAULT) { - DLOG(ERROR) << "Invalid plane " << gfx::BufferPlaneToString(plane); - return nullptr; - } - - viz::ResourceFormat format = viz::GetResourceFormat(buffer_format); - - // The Skia API to handle compressed texture is limited and not compatible - // with updating the texture or custom strides. - DCHECK_NE(format, viz::ResourceFormat::ETC1); - - SharedMemoryRegionWrapper shm_wrapper; - if (!shm_wrapper.Initialize(handle, size, format)) - return nullptr; - - auto info = MakeSkImageInfo(size, format); - auto texture = std::make_unique<WrappedSkImage>( - base::PassKey<WrappedSkImageFactory>(), mailbox, format, size, - color_space, surface_origin, alpha_type, usage, info.computeMinByteSize(), - context_state_, /*is_thread_safe=*/context_state_->GrContextIsVulkan() && - is_drdc_enabled_); - if (!texture->InitializeWithGMB(std::move(shm_wrapper))) - return nullptr; - - return texture; -} - -bool WrappedSkImageFactory::CanImportGpuMemoryBuffer( - gfx::GpuMemoryBufferType memory_buffer_type) { - return memory_buffer_type == gfx::SHARED_MEMORY_BUFFER; + NOTREACHED(); + return nullptr; } bool WrappedSkImageFactory::CanUseWrappedSkImage( @@ -598,9 +509,9 @@ GrContextType gr_context_type) const { // Ignore for mipmap usage. usage &= ~SHARED_IMAGE_USAGE_MIPMAP; - auto kWrappedSkImageUsage = SHARED_IMAGE_USAGE_DISPLAY | - SHARED_IMAGE_USAGE_RASTER | - SHARED_IMAGE_USAGE_OOP_RASTERIZATION; + auto kWrappedSkImageUsage = + SHARED_IMAGE_USAGE_DISPLAY | SHARED_IMAGE_USAGE_RASTER | + SHARED_IMAGE_USAGE_OOP_RASTERIZATION | SHARED_IMAGE_USAGE_CPU_UPLOAD; return (usage & kWrappedSkImageUsage) && !(usage & ~kWrappedSkImageUsage); } @@ -634,7 +545,7 @@ if (!CanUseWrappedSkImage(usage, gr_context_type)) { return false; } - if (gmb_type != gfx::EMPTY_BUFFER && !CanImportGpuMemoryBuffer(gmb_type)) { + if (gmb_type != gfx::EMPTY_BUFFER) { return false; } @@ -653,14 +564,5 @@ std::move(context_state)); } -std::unique_ptr<SharedImageRepresentationMemory> WrappedSkImage::ProduceMemory( - SharedImageManager* manager, - MemoryTypeTracker* tracker) { - if (!shared_memory_wrapper_.IsValid()) - return nullptr; - - return std::make_unique<RepresentationMemory>(manager, this, tracker); -} - } // namespace raster } // namespace gpu
diff --git a/gpu/command_buffer/service/wrapped_sk_image.h b/gpu/command_buffer/service/wrapped_sk_image.h index cb790862..ee656f5 100644 --- a/gpu/command_buffer/service/wrapped_sk_image.h +++ b/gpu/command_buffer/service/wrapped_sk_image.h
@@ -72,7 +72,6 @@ bool is_pixel_used) override; private: - bool CanImportGpuMemoryBuffer(gfx::GpuMemoryBufferType memory_buffer_type); bool CanUseWrappedSkImage(uint32_t usage, GrContextType gr_context_type) const;
diff --git a/gpu/ipc/client/client_shared_image_interface.cc b/gpu/ipc/client/client_shared_image_interface.cc index 7626daa..b33f8ea7 100644 --- a/gpu/ipc/client/client_shared_image_interface.cc +++ b/gpu/ipc/client/client_shared_image_interface.cc
@@ -5,6 +5,7 @@ #include "gpu/ipc/client/client_shared_image_interface.h" #include "build/build_config.h" +#include "gpu/command_buffer/common/shared_image_usage.h" #include "gpu/ipc/client/shared_image_interface_proxy.h" #include "ui/gfx/gpu_fence.h" #include "ui/gfx/gpu_memory_buffer.h" @@ -87,6 +88,7 @@ uint32_t usage, gpu::SurfaceHandle surface_handle) { DCHECK_EQ(surface_handle, kNullSurfaceHandle); + DCHECK(gpu::IsValidClientUsage(usage)); return AddMailbox(proxy_->CreateSharedImage( format, size, color_space, surface_origin, alpha_type, usage)); } @@ -99,6 +101,7 @@ SkAlphaType alpha_type, uint32_t usage, base::span<const uint8_t> pixel_data) { + DCHECK(gpu::IsValidClientUsage(usage)); return AddMailbox(proxy_->CreateSharedImage(format, size, color_space, surface_origin, alpha_type, usage, pixel_data)); @@ -112,6 +115,7 @@ GrSurfaceOrigin surface_origin, SkAlphaType alpha_type, uint32_t usage) { + DCHECK(gpu::IsValidClientUsage(usage)); return AddMailbox(proxy_->CreateSharedImage( gpu_memory_buffer, gpu_memory_buffer_manager, plane, color_space, surface_origin, alpha_type, usage)); @@ -123,6 +127,7 @@ GpuMemoryBufferManager* gpu_memory_buffer_manager, uint32_t usage) { DCHECK_EQ(gpu_memory_buffer->GetType(), gfx::DXGI_SHARED_HANDLE); + DCHECK(gpu::IsValidClientUsage(usage)); auto mailboxes = proxy_->CreateSharedImageVideoPlanes( gpu_memory_buffer, gpu_memory_buffer_manager, usage); for (const auto& mailbox : mailboxes) { @@ -145,6 +150,7 @@ GrSurfaceOrigin surface_origin, SkAlphaType alpha_type, uint32_t usage) { + DCHECK(gpu::IsValidClientUsage(usage)); auto mailboxes = proxy_->CreateSwapChain(format, size, color_space, surface_origin, alpha_type, usage); AddMailbox(mailboxes.front_buffer);
diff --git a/gpu/ipc/shared_image_interface_in_process.cc b/gpu/ipc/shared_image_interface_in_process.cc index a0305e67..2435582 100644 --- a/gpu/ipc/shared_image_interface_in_process.cc +++ b/gpu/ipc/shared_image_interface_in_process.cc
@@ -9,6 +9,7 @@ #include "base/synchronization/waitable_event.h" #include "build/build_config.h" #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h" +#include "gpu/command_buffer/common/shared_image_usage.h" #include "gpu/command_buffer/common/sync_token.h" #include "gpu/command_buffer/service/mailbox_manager.h" #include "gpu/command_buffer/service/shared_image_factory.h" @@ -193,6 +194,7 @@ SkAlphaType alpha_type, uint32_t usage, gpu::SurfaceHandle surface_handle) { + DCHECK(gpu::IsValidClientUsage(usage)); auto mailbox = Mailbox::GenerateForSharedImage(); { base::AutoLock lock(lock_); @@ -247,6 +249,7 @@ SkAlphaType alpha_type, uint32_t usage, base::span<const uint8_t> pixel_data) { + DCHECK(gpu::IsValidClientUsage(usage)); auto mailbox = Mailbox::GenerateForSharedImage(); std::vector<uint8_t> pixel_data_copy(pixel_data.begin(), pixel_data.end()); { @@ -303,6 +306,7 @@ GrSurfaceOrigin surface_origin, SkAlphaType alpha_type, uint32_t usage) { + DCHECK(gpu::IsValidClientUsage(usage)); DCHECK(gpu_memory_buffer->GetType() == gfx::NATIVE_PIXMAP || gpu_memory_buffer->GetType() == gfx::ANDROID_HARDWARE_BUFFER || gpu_memory_buffer_manager);
diff --git a/ios/build/bots/scripts/file_util_test.py b/ios/build/bots/scripts/file_util_test.py index 7808300..09b6cde0 100755 --- a/ios/build/bots/scripts/file_util_test.py +++ b/ios/build/bots/scripts/file_util_test.py
@@ -1,4 +1,4 @@ -#!/usr/bin/env vpython +#!/usr/bin/env vpython3 # Copyright 2020 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/ios/build/bots/scripts/gtest_utils_test.py b/ios/build/bots/scripts/gtest_utils_test.py index f61981b..a21d693 100755 --- a/ios/build/bots/scripts/gtest_utils_test.py +++ b/ios/build/bots/scripts/gtest_utils_test.py
@@ -1,4 +1,4 @@ -#!/usr/bin/env vpython +#!/usr/bin/env vpython3 # Copyright 2021 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/ios/build/bots/scripts/iossim_util_test.py b/ios/build/bots/scripts/iossim_util_test.py index e358020..e82a62d9 100755 --- a/ios/build/bots/scripts/iossim_util_test.py +++ b/ios/build/bots/scripts/iossim_util_test.py
@@ -1,4 +1,4 @@ -#!/usr/bin/env vpython +#!/usr/bin/env vpython3 # Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/ios/build/bots/scripts/result_sink_util_test.py b/ios/build/bots/scripts/result_sink_util_test.py index a64b391..a07ec30c 100755 --- a/ios/build/bots/scripts/result_sink_util_test.py +++ b/ios/build/bots/scripts/result_sink_util_test.py
@@ -1,4 +1,4 @@ -#!/usr/bin/env vpython +#!/usr/bin/env vpython3 # Copyright 2020 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/ios/build/bots/scripts/run.py b/ios/build/bots/scripts/run.py index fdc060c6..6e03d61 100755 --- a/ios/build/bots/scripts/run.py +++ b/ios/build/bots/scripts/run.py
@@ -1,4 +1,4 @@ -#!/usr/bin/env vpython +#!/usr/bin/env vpython3 # Copyright 2016 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/ios/build/bots/scripts/run_test.py b/ios/build/bots/scripts/run_test.py index 9cdf523..cada592d 100755 --- a/ios/build/bots/scripts/run_test.py +++ b/ios/build/bots/scripts/run_test.py
@@ -1,4 +1,4 @@ -#!/usr/bin/env vpython +#!/usr/bin/env vpython3 # Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/ios/build/bots/scripts/shard_util_test.py b/ios/build/bots/scripts/shard_util_test.py index 24bd534..a168957a1 100755 --- a/ios/build/bots/scripts/shard_util_test.py +++ b/ios/build/bots/scripts/shard_util_test.py
@@ -1,4 +1,4 @@ -#!/usr/bin/env vpython +#!/usr/bin/env vpython3 # Copyright 2020 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/ios/build/bots/scripts/test_apps_test.py b/ios/build/bots/scripts/test_apps_test.py index 77a6505a..763857e 100755 --- a/ios/build/bots/scripts/test_apps_test.py +++ b/ios/build/bots/scripts/test_apps_test.py
@@ -1,4 +1,4 @@ -#!/usr/bin/env vpython +#!/usr/bin/env vpython3 # Copyright 2020 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/ios/build/bots/scripts/test_result_util_test.py b/ios/build/bots/scripts/test_result_util_test.py index 0ce29ea..0d16258 100755 --- a/ios/build/bots/scripts/test_result_util_test.py +++ b/ios/build/bots/scripts/test_result_util_test.py
@@ -1,4 +1,4 @@ -#!/usr/bin/env vpython +#!/usr/bin/env vpython3 # Copyright 2021 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/ios/build/bots/scripts/test_runner_test.py b/ios/build/bots/scripts/test_runner_test.py index 66b0c864..3d4512f 100755 --- a/ios/build/bots/scripts/test_runner_test.py +++ b/ios/build/bots/scripts/test_runner_test.py
@@ -1,4 +1,4 @@ -#!/usr/bin/env vpython +#!/usr/bin/env vpython3 # Copyright 2016 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/ios/build/bots/scripts/wpr_runner_test.py b/ios/build/bots/scripts/wpr_runner_test.py index b66e74e..2218ad8 100755 --- a/ios/build/bots/scripts/wpr_runner_test.py +++ b/ios/build/bots/scripts/wpr_runner_test.py
@@ -1,4 +1,4 @@ -#!/usr/bin/env vpython +#!/usr/bin/env vpython3 # Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/ios/build/bots/scripts/xcode_log_parser_test.py b/ios/build/bots/scripts/xcode_log_parser_test.py index c5ba761..9be7dfc9 100755 --- a/ios/build/bots/scripts/xcode_log_parser_test.py +++ b/ios/build/bots/scripts/xcode_log_parser_test.py
@@ -1,4 +1,4 @@ -#!/usr/bin/env vpython +#!/usr/bin/env vpython3 # Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/ios/build/bots/scripts/xcode_util_test.py b/ios/build/bots/scripts/xcode_util_test.py index c20230f8..76d4097 100755 --- a/ios/build/bots/scripts/xcode_util_test.py +++ b/ios/build/bots/scripts/xcode_util_test.py
@@ -1,4 +1,4 @@ -#!/usr/bin/env vpython +#!/usr/bin/env vpython3 # Copyright 2021 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/ios/build/bots/scripts/xcodebuild_runner_test.py b/ios/build/bots/scripts/xcodebuild_runner_test.py index 45ba8de..32d750a 100755 --- a/ios/build/bots/scripts/xcodebuild_runner_test.py +++ b/ios/build/bots/scripts/xcodebuild_runner_test.py
@@ -1,4 +1,4 @@ -#!/usr/bin/env vpython +#!/usr/bin/env vpython3 # Copyright 2018 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/ios/chrome/app/main_controller.mm b/ios/chrome/app/main_controller.mm index 82a2e59..f081039 100644 --- a/ios/chrome/app/main_controller.mm +++ b/ios/chrome/app/main_controller.mm
@@ -88,6 +88,7 @@ #import "ios/chrome/browser/metrics/incognito_usage_app_state_agent.h" #import "ios/chrome/browser/metrics/window_configuration_recorder.h" #import "ios/chrome/browser/omaha/omaha_service.h" +#import "ios/chrome/browser/passwords/password_manager_util_ios.h" #include "ios/chrome/browser/pref_names.h" #import "ios/chrome/browser/screenshot/screenshot_metrics_recorder.h" #import "ios/chrome/browser/search_engines/extension_search_engine_data_updater.h" @@ -1334,10 +1335,15 @@ syncer::SyncService* syncService = SyncServiceFactory::GetForBrowserState(browserState); - if (syncService) { + // Only use the fallback to the Google server when fetching favicons for + // normal encryption synced users because they are the only users who + // consented to share data to Google. The other types of synced users did not. + BOOL isPasswordSyncEnabled = + password_manager_util::IsPasswordSyncNormalEncryptionEnabled(syncService); + if (isPasswordSyncEnabled) { UpdateFaviconsStorage( IOSChromeFaviconLoaderFactory::GetForBrowserState(browserState), - syncService->IsSyncFeatureEnabled()); + /*sync_enabled=*/isPasswordSyncEnabled); } } #endif
diff --git a/ios/chrome/app/spotlight/base_spotlight_manager.mm b/ios/chrome/app/spotlight/base_spotlight_manager.mm index efe9646..1de1e9a 100644 --- a/ios/chrome/app/spotlight/base_spotlight_manager.mm +++ b/ios/chrome/app/spotlight/base_spotlight_manager.mm
@@ -58,8 +58,8 @@ [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:kFallbackRoundedCorner]; [rounded fill]; - UIFont* font = [MDCTypography headlineFont]; - font = [font fontWithSize:(kFallbackIconSize / 2)]; + UIFont* font = [UIFont systemFontOfSize:(kFallbackIconSize / 2) + weight:UIFontWeightRegular]; CGRect textRect = CGRectMake(0, (kFallbackIconSize - [font lineHeight]) / 2, kFallbackIconSize, [font lineHeight]); NSMutableParagraphStyle* paragraphStyle =
diff --git a/ios/chrome/app/theme/default_300_percent/settings_info_24.png b/ios/chrome/app/theme/default_300_percent/settings_info_24.png deleted file mode 100644 index a81eeb9..0000000 --- a/ios/chrome/app/theme/default_300_percent/settings_info_24.png +++ /dev/null Binary files differ
diff --git a/ios/chrome/app/theme/ios_theme_resources.grd b/ios/chrome/app/theme/ios_theme_resources.grd index 0204b85..3c92155 100644 --- a/ios/chrome/app/theme/ios_theme_resources.grd +++ b/ios/chrome/app/theme/ios_theme_resources.grd
@@ -32,7 +32,6 @@ <structure type="chrome_scaled_image" name="IDR_IOS_INFOBAR_TRANSLATE" file="infobar_translate.png" /> <structure type="chrome_scaled_image" name="IDR_IOS_OMNIBOX_KEYBOARD_VIEW_APPEND" file="omnibox/append_ios.png" /> <structure type="chrome_scaled_image" name="IDR_IOS_PROMO_INFO" file="promo_info.png" /> - <structure type="chrome_scaled_image" name="IDR_IOS_SETTINGS_INFO_24" file="settings_info_24.png" /> </structures> </release> </grit>
diff --git a/ios/chrome/browser/passwords/BUILD.gn b/ios/chrome/browser/passwords/BUILD.gn index 0b37491..5952bd5 100644 --- a/ios/chrome/browser/passwords/BUILD.gn +++ b/ios/chrome/browser/passwords/BUILD.gn
@@ -25,6 +25,8 @@ "password_controller.mm", "password_manager_log_router_factory.cc", "password_manager_log_router_factory.h", + "password_manager_util_ios.cc", + "password_manager_util_ios.h", "password_store_observer_bridge.h", "password_store_observer_bridge.mm", "password_tab_helper.h",
diff --git a/ios/chrome/browser/passwords/notify_auto_signin_view_controller.mm b/ios/chrome/browser/passwords/notify_auto_signin_view_controller.mm index 962a9b9..ed3ddc7 100644 --- a/ios/chrome/browser/passwords/notify_auto_signin_view_controller.mm +++ b/ios/chrome/browser/passwords/notify_auto_signin_view_controller.mm
@@ -110,7 +110,10 @@ // View containing "Signing in as ..." text. UILabel* textView = [[UILabel alloc] init]; textView.translatesAutoresizingMaskIntoConstraints = NO; - UIFont* font = [MDCTypography body1Font]; + const CGFloat kBody1FontSize = 14.0; + const UIFontWeight kBody1FontWeight = UIFontWeightRegular; + UIFont* font = [UIFont systemFontOfSize:kBody1FontSize + weight:kBody1FontWeight]; textView.text = l10n_util::GetNSStringF(IDS_MANAGE_PASSWORDS_AUTO_SIGNIN_TITLE, base::SysNSStringToUTF16(_username));
diff --git a/ios/chrome/browser/passwords/password_manager_util_ios.cc b/ios/chrome/browser/passwords/password_manager_util_ios.cc new file mode 100644 index 0000000..33c3a849 --- /dev/null +++ b/ios/chrome/browser/passwords/password_manager_util_ios.cc
@@ -0,0 +1,18 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/passwords/password_manager_util_ios.h" + +#include "components/password_manager/core/browser/password_manager_util.h" +#include "components/sync/driver/sync_service.h" + +namespace password_manager_util { + +bool IsPasswordSyncNormalEncryptionEnabled( + const syncer::SyncService* sync_service) { + return password_manager_util::GetPasswordSyncState(sync_service) == + password_manager::SyncState::kSyncingNormalEncryption; +} + +} // namespace password_manager_util
diff --git a/ios/chrome/browser/passwords/password_manager_util_ios.h b/ios/chrome/browser/passwords/password_manager_util_ios.h new file mode 100644 index 0000000..054dc73 --- /dev/null +++ b/ios/chrome/browser/passwords/password_manager_util_ios.h
@@ -0,0 +1,23 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_PASSWORDS_PASSWORD_MANAGER_UTIL_IOS_H_ +#define IOS_CHROME_BROWSER_PASSWORDS_PASSWORD_MANAGER_UTIL_IOS_H_ + +#include "components/sync/driver/sync_service.h" + +namespace syncer { +class SyncService; +} + +namespace password_manager_util { + +// Returns true if the user is syncing passwords to Google Account with normal +// encryption. +bool IsPasswordSyncNormalEncryptionEnabled( + const syncer::SyncService* sync_service); + +} // namespace password_manager_util + +#endif // IOS_CHROME_COMMON_UI_UTIL_PASSWORD_MANAGER_UTIL_IOS_H_
diff --git a/ios/chrome/browser/providers/branded_images/chromium_branded_images.mm b/ios/chrome/browser/providers/branded_images/chromium_branded_images.mm index 4995bf7..bb14eff 100644 --- a/ios/chrome/browser/providers/branded_images/chromium_branded_images.mm +++ b/ios/chrome/browser/providers/branded_images/chromium_branded_images.mm
@@ -16,16 +16,6 @@ UIImage* GetBrandedImage(BrandedImage branded_image) { switch (branded_image) { - case BrandedImage::kClearBrowsingDataAccountActivity: { - ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); - return rb.GetNativeImageNamed(IDR_IOS_SETTINGS_INFO_24).ToUIImage(); - } - - case BrandedImage::kClearBrowsingDataSiteData: { - ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); - return rb.GetNativeImageNamed(IDR_IOS_SETTINGS_INFO_24).ToUIImage(); - } - case BrandedImage::kWhatsNewLogo: { ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); return rb.GetNativeImageNamed(IDR_IOS_PROMO_INFO).ToUIImage();
diff --git a/ios/chrome/browser/ui/authentication/signed_in_accounts_view_controller.mm b/ios/chrome/browser/ui/authentication/signed_in_accounts_view_controller.mm index be7ec10..f009a29 100644 --- a/ios/chrome/browser/ui/authentication/signed_in_accounts_view_controller.mm +++ b/ios/chrome/browser/ui/authentication/signed_in_accounts_view_controller.mm
@@ -280,7 +280,10 @@ _titleLabel.text = l10n_util::GetNSString(IDS_IOS_SIGNED_IN_ACCOUNTS_VIEW_TITLE); _titleLabel.textColor = [UIColor colorNamed:kTextPrimaryColor]; - _titleLabel.font = [MDCTypography headlineFont]; + const CGFloat kHeadlineFontSize = 24.0; + const UIFontWeight kHeadlineFontWeight = UIFontWeightRegular; + _titleLabel.font = [UIFont systemFontOfSize:kHeadlineFontSize + weight:kHeadlineFontWeight]; _titleLabel.translatesAutoresizingMaskIntoConstraints = NO; [self.view addSubview:_titleLabel]; @@ -296,7 +299,10 @@ l10n_util::GetNSString(IDS_IOS_SIGNED_IN_ACCOUNTS_VIEW_INFO); _infoLabel.numberOfLines = 0; _infoLabel.textColor = [UIColor colorNamed:kTextSecondaryColor]; - _infoLabel.font = [MDCTypography body1Font]; + const CGFloat kBody1FontSize = 14.0; + const UIFontWeight kBody1FontWeight = UIFontWeightRegular; + _infoLabel.font = [UIFont systemFontOfSize:kBody1FontSize + weight:kBody1FontWeight]; _infoLabel.translatesAutoresizingMaskIntoConstraints = NO; [self.view addSubview:_infoLabel];
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_shortcut_tile_view.mm b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_shortcut_tile_view.mm index 13535cd..a330cd7 100644 --- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_shortcut_tile_view.mm +++ b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_shortcut_tile_view.mm
@@ -113,7 +113,10 @@ [_countLabel.heightAnchor constraintEqualToAnchor:_countLabel.widthAnchor], ]]; - _countLabel.font = [MDCTypography captionFont]; + const CGFloat kCaptionFontSize = 12.0; + const UIFontWeight kCaptionFontWeight = UIFontWeightRegular; + _countLabel.font = [UIFont systemFontOfSize:kCaptionFontSize + weight:kCaptionFontWeight]; AddSameCenterConstraints(_countLabel, _countContainer); } return _countLabel;
diff --git a/ios/chrome/browser/ui/download/download_manager_view_controller.mm b/ios/chrome/browser/ui/download/download_manager_view_controller.mm index 5b1473c..3eb6fea7 100644 --- a/ios/chrome/browser/ui/download/download_manager_view_controller.mm +++ b/ios/chrome/browser/ui/download/download_manager_view_controller.mm
@@ -474,7 +474,10 @@ if (!_statusLabel) { _statusLabel = [[UILabel alloc] initWithFrame:CGRectZero]; _statusLabel.translatesAutoresizingMaskIntoConstraints = NO; - _statusLabel.font = [MDCTypography body1Font]; + const CGFloat kBody1FontSize = 14.0; + const UIFontWeight kBody1FontWeight = UIFontWeightRegular; + _statusLabel.font = [UIFont systemFontOfSize:kBody1FontSize + weight:kBody1FontWeight]; _statusLabel.lineBreakMode = NSLineBreakByTruncatingMiddle; [_statusLabel setContentCompressionResistancePriority:UILayoutPriorityDefaultLow @@ -490,7 +493,10 @@ _actionButton = [UIButton buttonWithType:UIButtonTypeCustom]; _actionButton.translatesAutoresizingMaskIntoConstraints = NO; _actionButton.exclusiveTouch = YES; - _actionButton.titleLabel.font = [MDCTypography buttonFont]; + const CGFloat kButtonFontSize = 14.0; + const UIFontWeight kButtonFontWeight = UIFontWeightMedium; + _actionButton.titleLabel.font = [UIFont systemFontOfSize:kButtonFontSize + weight:kButtonFontWeight]; [_actionButton setTitleColor:[UIColor colorNamed:kBlueColor] forState:UIControlStateNormal]; @@ -510,7 +516,10 @@ _installDriveButton = [UIButton buttonWithType:UIButtonTypeCustom]; _installDriveButton.translatesAutoresizingMaskIntoConstraints = NO; _installDriveButton.exclusiveTouch = YES; - _installDriveButton.titleLabel.font = [MDCTypography buttonFont]; + const CGFloat kButtonFontSize = 14.0; + const UIFontWeight kButtonFontWeight = UIFontWeightMedium; + _installDriveButton.titleLabel.font = + [UIFont systemFontOfSize:kButtonFontSize weight:kButtonFontWeight]; [_installDriveButton setTitleColor:[UIColor colorNamed:kBlueColor] forState:UIControlStateNormal]; @@ -540,7 +549,10 @@ if (!_installDriveLabel) { _installDriveLabel = [[UILabel alloc] initWithFrame:CGRectZero]; _installDriveLabel.translatesAutoresizingMaskIntoConstraints = NO; - _installDriveLabel.font = [MDCTypography body1Font]; + const CGFloat kBody1FontSize = 14.0; + const UIFontWeight kBody1FontWeight = UIFontWeightRegular; + _installDriveLabel.font = [UIFont systemFontOfSize:kBody1FontSize + weight:kBody1FontWeight]; _installDriveLabel.text = l10n_util::GetNSString(IDS_IOS_DOWNLOAD_MANAGER_GOOGLE_DRIVE); [_installDriveLabel sizeToFit];
diff --git a/ios/chrome/browser/ui/first_run/BUILD.gn b/ios/chrome/browser/ui/first_run/BUILD.gn index 8d2e8558..967ac756 100644 --- a/ios/chrome/browser/ui/first_run/BUILD.gn +++ b/ios/chrome/browser/ui/first_run/BUILD.gn
@@ -163,10 +163,8 @@ "//ios/chrome/app/strings", "//ios/chrome/browser/browser_state", "//ios/chrome/browser/ui/icons", - "//ios/chrome/browser/ui/material_components", "//ios/chrome/browser/ui/util", "//ios/chrome/common/ui/colors", - "//ios/third_party/material_components_ios", "//ios/web/common:web_view_creation_util", ] }
diff --git a/ios/chrome/browser/ui/first_run/static_file_view_controller.mm b/ios/chrome/browser/ui/first_run/static_file_view_controller.mm index b61597a..49f19113 100644 --- a/ios/chrome/browser/ui/first_run/static_file_view_controller.mm +++ b/ios/chrome/browser/ui/first_run/static_file_view_controller.mm
@@ -6,12 +6,9 @@ #import <WebKit/WebKit.h> -#import <MaterialComponents/MDCAppBarViewController.h> - #include "base/check.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/ui/icons/chrome_icon.h" -#import "ios/chrome/browser/ui/material_components/utils.h" #include "ios/chrome/browser/ui/util/rtl_geometry.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #import "ios/web/common/web_view_creation_util.h" @@ -27,8 +24,6 @@ BOOL _headerLaidOutForRTL; // The web view used to display the static content. WKWebView* _webView; - // The header. - MDCAppBarViewController* _appBarViewController; } // Called when the back button is pressed. @@ -44,17 +39,12 @@ DCHECK(URL); self = [super init]; if (self) { - _appBarViewController = [[MDCAppBarViewController alloc] init]; _browserState = browserState; _URL = URL; } return self; } -- (void)dealloc { - [_webView scrollView].delegate = nil; -} - #pragma mark - UIViewController - (void)viewDidLoad { @@ -73,33 +63,19 @@ [_webView setBackgroundColor:[UIColor colorNamed:kPrimaryBackgroundColor]]; [self.view addSubview:_webView]; - ConfigureAppBarViewControllerWithCardStyle(_appBarViewController); - _appBarViewController.headerView.trackingScrollView = [_webView scrollView]; - [_webView scrollView].delegate = _appBarViewController; - - // Add the app bar at the end. - [self addChildViewController:_appBarViewController]; - // Match the width of the parent view. - CGRect frame = _appBarViewController.view.frame; - frame.origin.x = 0; - frame.size.width = - _appBarViewController.parentViewController.view.bounds.size.width; - _appBarViewController.view.frame = frame; - [self.view addSubview:_appBarViewController.view]; - [_appBarViewController didMoveToParentViewController:self]; - - // Create a custom Back bar button item, as Material Navigation Bar deprecated - // the back arrow with a shaft. + // Create a custom Back bar button item. self.navigationItem.leftBarButtonItem = [ChromeIcon templateBarButtonItemWithImage:[ChromeIcon backIcon] target:self action:@selector(back)]; + [self.navigationController setNavigationBarHidden:NO animated:YES]; } #pragma mark - Actions - (void)back { [self.navigationController popViewControllerAnimated:YES]; + [self.navigationController setNavigationBarHidden:YES animated:YES]; } @end
diff --git a/ios/chrome/browser/ui/settings/password/password_issues_mediator.mm b/ios/chrome/browser/ui/settings/password/password_issues_mediator.mm index 885b255..d6dca69 100644 --- a/ios/chrome/browser/ui/settings/password/password_issues_mediator.mm +++ b/ios/chrome/browser/ui/settings/password/password_issues_mediator.mm
@@ -9,6 +9,7 @@ #import "ios/chrome/browser/favicon/favicon_loader.h" #import "ios/chrome/browser/net/crurl.h" #include "ios/chrome/browser/passwords/password_check_observer_bridge.h" +#import "ios/chrome/browser/passwords/password_manager_util_ios.h" #import "ios/chrome/browser/ui/settings/password/password_issue_with_form.h" #import "ios/chrome/browser/ui/settings/password/password_issues_consumer.h" #import "ios/chrome/common/ui/favicon/favicon_constants.h" @@ -129,10 +130,11 @@ - (void)faviconForURL:(CrURL*)URL completion:(void (^)(FaviconAttributes*))completion { syncer::SyncService* syncService = self.syncService; - const BOOL isSyncEnabled = syncService && syncService->IsSyncFeatureEnabled(); - self.faviconLoader->FaviconForPageUrl(URL.gurl, kDesiredMediumFaviconSizePt, - kMinFaviconSizePt, isSyncEnabled, - completion); + BOOL isPasswordSyncEnabled = + password_manager_util::IsPasswordSyncNormalEncryptionEnabled(syncService); + self.faviconLoader->FaviconForPageUrl( + URL.gurl, kDesiredMediumFaviconSizePt, kMinFaviconSizePt, + /*fallback_to_google_server=*/isPasswordSyncEnabled, completion); } @end
diff --git a/ios/chrome/browser/ui/settings/password/passwords_mediator.mm b/ios/chrome/browser/ui/settings/password/passwords_mediator.mm index ff98f94..3e950896 100644 --- a/ios/chrome/browser/ui/settings/password/passwords_mediator.mm +++ b/ios/chrome/browser/ui/settings/password/passwords_mediator.mm
@@ -14,6 +14,7 @@ #import "ios/chrome/browser/favicon/favicon_loader.h" #import "ios/chrome/browser/net/crurl.h" #include "ios/chrome/browser/passwords/password_check_observer_bridge.h" +#import "ios/chrome/browser/passwords/password_manager_util_ios.h" #import "ios/chrome/browser/passwords/save_passwords_consumer.h" #import "ios/chrome/browser/signin/authentication_service.h" #include "ios/chrome/browser/sync/sync_observer_bridge.h" @@ -375,10 +376,11 @@ - (void)faviconForURL:(CrURL*)URL completion:(void (^)(FaviconAttributes*))completion { syncer::SyncService* syncService = self.syncService; - const BOOL isSyncEnabled = syncService && syncService->IsSyncFeatureEnabled(); - self.faviconLoader->FaviconForPageUrl(URL.gurl, kDesiredMediumFaviconSizePt, - kMinFaviconSizePt, isSyncEnabled, - completion); + BOOL isPasswordSyncEnabled = + password_manager_util::IsPasswordSyncNormalEncryptionEnabled(syncService); + self.faviconLoader->FaviconForPageUrl( + URL.gurl, kDesiredMediumFaviconSizePt, kMinFaviconSizePt, + /*fallback_to_google_server=*/isPasswordSyncEnabled, completion); } #pragma mark - IdentityManagerObserverBridgeDelegate
diff --git a/ios/public/provider/chrome/browser/branded_images/branded_images_api.h b/ios/public/provider/chrome/browser/branded_images/branded_images_api.h index e37016f..31e5609 100644 --- a/ios/public/provider/chrome/browser/branded_images/branded_images_api.h +++ b/ios/public/provider/chrome/browser/branded_images/branded_images_api.h
@@ -12,14 +12,6 @@ // Enumeration corresponding to the different branded images. enum class BrandedImage { - // The image to use for the "account and activity" item on the clear - // browsing data settings screen. - kClearBrowsingDataAccountActivity, - - // The image to use for the "account and activity" item on the clear - // browsing data settings screen. - kClearBrowsingDataSiteData, - // The image corresponding to the application logo for the what's new // promo. kWhatsNewLogo,
diff --git a/ios/web_view/internal/sync/cwv_trusted_vault_utils.mm b/ios/web_view/internal/sync/cwv_trusted_vault_utils.mm index e352fea..ebc8a704 100644 --- a/ios/web_view/internal/sync/cwv_trusted_vault_utils.mm +++ b/ios/web_view/internal/sync/cwv_trusted_vault_utils.mm
@@ -16,7 +16,7 @@ switch (state) { case CWVTrustedVaultStateAlreadyRegistered: return syncer::TrustedVaultDeviceRegistrationStateForUMA:: - kAlreadyRegistered; + kAlreadyRegisteredV0; case CWVTrustedVaultStateLocalKeysAreStale: return syncer::TrustedVaultDeviceRegistrationStateForUMA:: kLocalKeysAreStale;
diff --git a/media/base/win/dxgi_device_manager.cc b/media/base/win/dxgi_device_manager.cc index 8c0ec0d8..b83e31c 100644 --- a/media/base/win/dxgi_device_manager.cc +++ b/media/base/win/dxgi_device_manager.cc
@@ -91,18 +91,16 @@ CHROME_LUID luid) : mf_dxgi_device_manager_(std::move(mf_dxgi_device_manager)), d3d_device_reset_token_(d3d_device_reset_token), - luid_(luid) {} + luid_(luid) { + DETACH_FROM_SEQUENCE(sequence_checker_); +} DXGIDeviceManager::~DXGIDeviceManager() = default; HRESULT DXGIDeviceManager::ResetDevice( Microsoft::WRL::ComPtr<ID3D11Device>& d3d_device) { - base::AutoLock lock(lock_); - return ResetDevice_Locked(d3d_device); -} + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); -HRESULT DXGIDeviceManager::ResetDevice_Locked( - Microsoft::WRL::ComPtr<ID3D11Device>& d3d_device) { constexpr uint32_t kDeviceFlags = D3D11_CREATE_DEVICE_VIDEO_SUPPORT | D3D11_CREATE_DEVICE_BGRA_SUPPORT; const D3D_FEATURE_LEVEL kFeatureLevels[] = { @@ -154,11 +152,12 @@ HRESULT DXGIDeviceManager::CheckDeviceRemovedAndGetDevice( Microsoft::WRL::ComPtr<ID3D11Device>* new_device) { - base::AutoLock lock(lock_); - Microsoft::WRL::ComPtr<ID3D11Device> device = GetDevice_Locked(); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + Microsoft::WRL::ComPtr<ID3D11Device> device = GetDevice(); HRESULT hr = device ? device->GetDeviceRemovedReason() : MF_E_UNEXPECTED; if (FAILED(hr)) { - HRESULT reset_hr = ResetDevice_Locked(device); + HRESULT reset_hr = ResetDevice(device); if (FAILED(reset_hr)) { LOG(ERROR) << "Failed to recreate the device: " << logging::SystemErrorCodeToString(reset_hr); @@ -203,11 +202,8 @@ } Microsoft::WRL::ComPtr<ID3D11Device> DXGIDeviceManager::GetDevice() { - base::AutoLock lock(lock_); - return GetDevice_Locked(); -} + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); -Microsoft::WRL::ComPtr<ID3D11Device> DXGIDeviceManager::GetDevice_Locked() { DXGIDeviceScopedHandle device_handle(mf_dxgi_device_manager_.Get()); return device_handle.GetDevice(); } @@ -218,11 +214,12 @@ } void DXGIDeviceManager::OnGpuInfoUpdate(CHROME_LUID luid) { - base::AutoLock lock(lock_); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (luid.HighPart != luid_.HighPart || luid.LowPart != luid_.LowPart) { luid_ = luid; Microsoft::WRL::ComPtr<ID3D11Device> device; - ResetDevice_Locked(device); + ResetDevice(device); } }
diff --git a/media/base/win/dxgi_device_manager.h b/media/base/win/dxgi_device_manager.h index 3fdca34..8cc3b45 100644 --- a/media/base/win/dxgi_device_manager.h +++ b/media/base/win/dxgi_device_manager.h
@@ -11,7 +11,7 @@ #include "base/memory/ref_counted.h" #include "base/memory/scoped_refptr.h" -#include "base/synchronization/lock.h" +#include "base/sequence_checker.h" #include "base/thread_annotations.h" #include "media/base/win/mf_util_export.h" @@ -46,7 +46,7 @@ // Associates a new D3D device with the DXGI Device Manager // returns it in the parameter, which can't be nullptr. - HRESULT ResetDevice(Microsoft::WRL::ComPtr<ID3D11Device>& d3d_device); + virtual HRESULT ResetDevice(Microsoft::WRL::ComPtr<ID3D11Device>& d3d_device); // Checks if the local device was removed, recreates it if needed. // Returns DeviceRemovedReason HRESULT value. @@ -65,7 +65,7 @@ Microsoft::WRL::ComPtr<IMFMediaSource> media_source); // Directly access D3D device stored in DXGI device manager - Microsoft::WRL::ComPtr<ID3D11Device> GetDevice(); + virtual Microsoft::WRL::ComPtr<ID3D11Device> GetDevice(); Microsoft::WRL::ComPtr<IMFDXGIDeviceManager> GetMFDXGIDeviceManager(); @@ -79,20 +79,11 @@ CHROME_LUID luid); virtual ~DXGIDeviceManager(); - virtual HRESULT ResetDevice_Locked( - Microsoft::WRL::ComPtr<ID3D11Device>& d3d_device) - EXCLUSIVE_LOCKS_REQUIRED(lock_); - - virtual Microsoft::WRL::ComPtr<ID3D11Device> GetDevice_Locked() - EXCLUSIVE_LOCKS_REQUIRED(lock_); - - // TODO(1342872): remove this lock by changing VideoCaptureDeviceWinMF - // threading model and posting OnGpuInfoUpdate calls so that DxgiDeviceMAnager - // is used from the same sequence. - base::Lock lock_; Microsoft::WRL::ComPtr<IMFDXGIDeviceManager> mf_dxgi_device_manager_; UINT d3d_device_reset_token_ = 0; - CHROME_LUID luid_ GUARDED_BY(lock_) = {0, 0}; + CHROME_LUID luid_ = {0, 0}; + + SEQUENCE_CHECKER(sequence_checker_); }; } // namespace media
diff --git a/media/capture/video/win/gpu_memory_buffer_tracker_unittest.cc b/media/capture/video/win/gpu_memory_buffer_tracker_unittest.cc index 99420c9..7b3184b 100644 --- a/media/capture/video/win/gpu_memory_buffer_tracker_unittest.cc +++ b/media/capture/video/win/gpu_memory_buffer_tracker_unittest.cc
@@ -38,7 +38,7 @@ // Associates a new D3D device with the DXGI Device Manager // returns it in the parameter, which can't be nullptr. - HRESULT ResetDevice_Locked( + HRESULT ResetDevice( Microsoft::WRL::ComPtr<ID3D11Device>& d3d_device) override { mock_d3d_device_ = new MockD3D11Device(); d3d_device = mock_d3d_device_; @@ -46,7 +46,7 @@ } // Directly access D3D device stored in DXGI device manager - Microsoft::WRL::ComPtr<ID3D11Device> GetDevice_Locked() override { + Microsoft::WRL::ComPtr<ID3D11Device> GetDevice() override { Microsoft::WRL::ComPtr<ID3D11Device> device; mock_d3d_device_.As(&device); return device;
diff --git a/media/capture/video/win/video_capture_device_factory_win.cc b/media/capture/video/win/video_capture_device_factory_win.cc index d1bfddc..0008fd1 100644 --- a/media/capture/video/win/video_capture_device_factory_win.cc +++ b/media/capture/video/win/video_capture_device_factory_win.cc
@@ -370,7 +370,8 @@ } if (outcome == MFSourceOutcome::kSuccess) { auto device = std::make_unique<VideoCaptureDeviceMFWin>( - device_descriptor, std::move(source), dxgi_device_manager_); + device_descriptor, std::move(source), dxgi_device_manager_, + base::ThreadTaskRunnerHandle::Get()); DVLOG(1) << " MediaFoundation Device: " << device_descriptor.display_name(); if (device->Init())
diff --git a/media/capture/video/win/video_capture_device_mf_win.cc b/media/capture/video/win/video_capture_device_mf_win.cc index fcbc0d1d..37aa8fc 100644 --- a/media/capture/video/win/video_capture_device_mf_win.cc +++ b/media/capture/video/win/video_capture_device_mf_win.cc
@@ -675,8 +675,7 @@ ComPtr<IMFMediaBuffer> buffer; sample->GetBufferByIndex(i, &buffer); if (buffer) { - observer_->OnIncomingCapturedData(buffer.Get(), reference_time, - timestamp); + observer_->OnIncomingCapturedData(buffer, reference_time, timestamp); } else { observer_->OnFrameDropped( VideoCaptureFrameDropReason:: @@ -894,17 +893,20 @@ VideoCaptureDeviceMFWin::VideoCaptureDeviceMFWin( const VideoCaptureDeviceDescriptor& device_descriptor, ComPtr<IMFMediaSource> source, - scoped_refptr<DXGIDeviceManager> dxgi_device_manager) + scoped_refptr<DXGIDeviceManager> dxgi_device_manager, + scoped_refptr<base::SequencedTaskRunner> main_thread_task_runner) : VideoCaptureDeviceMFWin(device_descriptor, source, std::move(dxgi_device_manager), - nullptr) {} + nullptr, + std::move(main_thread_task_runner)) {} VideoCaptureDeviceMFWin::VideoCaptureDeviceMFWin( const VideoCaptureDeviceDescriptor& device_descriptor, ComPtr<IMFMediaSource> source, scoped_refptr<DXGIDeviceManager> dxgi_device_manager, - ComPtr<IMFCaptureEngine> engine) + ComPtr<IMFCaptureEngine> engine, + scoped_refptr<base::SequencedTaskRunner> main_thread_task_runner) : device_descriptor_(device_descriptor), create_mf_photo_callback_(base::BindRepeating(&CreateMFPhotoCallback)), is_initialized_(false), @@ -922,7 +924,8 @@ // We never want to reset |capture_error_|. capture_error_(base::WaitableEvent::ResetPolicy::MANUAL, base::WaitableEvent::InitialState::NOT_SIGNALED), - dxgi_device_manager_(std::move(dxgi_device_manager)) { + dxgi_device_manager_(std::move(dxgi_device_manager)), + main_thread_task_runner_(std::move(main_thread_task_runner)) { DETACH_FROM_SEQUENCE(sequence_checker_); } @@ -999,24 +1002,6 @@ const VideoCaptureParams& params, std::unique_ptr<VideoCaptureDevice::Client> client) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - bool success = false; - { - base::AutoLock lock(lock_); - success = AllocateAndStartLocked(params, std::move(client)); - } - // Do not hold the lock while waiting. - if (success) { - HRESULT hr = WaitOnCaptureEvent(MF_CAPTURE_ENGINE_PREVIEW_STARTED); - if (SUCCEEDED(hr)) { - base::AutoLock lock(lock_); - is_started_ = true; - } - } -} - -bool VideoCaptureDeviceMFWin::AllocateAndStartLocked( - const VideoCaptureParams& params, - std::unique_ptr<VideoCaptureDevice::Client> client) { params_ = params; client_ = std::move(client); DCHECK_EQ(false, is_started_); @@ -1024,7 +1009,7 @@ if (!engine_) { OnError(VideoCaptureError::kWinMediaFoundationEngineIsNull, FROM_HERE, E_FAIL); - return false; + return; } ComPtr<IMFCaptureSource> source; @@ -1032,14 +1017,14 @@ if (FAILED(hr)) { OnError(VideoCaptureError::kWinMediaFoundationEngineGetSourceFailed, FROM_HERE, hr); - return false; + return; } hr = FillCapabilities(source.Get(), true, &photo_capabilities_); if (FAILED(hr)) { OnError(VideoCaptureError::kWinMediaFoundationFillPhotoCapabilitiesFailed, FROM_HERE, hr); - return false; + return; } if (!photo_capabilities_.empty()) { @@ -1052,13 +1037,13 @@ if (FAILED(hr)) { OnError(VideoCaptureError::kWinMediaFoundationFillVideoCapabilitiesFailed, FROM_HERE, hr); - return false; + return; } if (video_capabilities.empty()) { OnError(VideoCaptureError::kWinMediaFoundationNoVideoCapabilityFound, FROM_HERE, "No video capability found"); - return false; + return; } const CapabilityWin best_match_video_capability = @@ -1071,7 +1056,7 @@ OnError( VideoCaptureError::kWinMediaFoundationGetAvailableDeviceMediaTypeFailed, FROM_HERE, hr); - return false; + return; } hr = source->SetCurrentDeviceMediaType( @@ -1080,7 +1065,7 @@ OnError( VideoCaptureError::kWinMediaFoundationSetCurrentDeviceMediaTypeFailed, FROM_HERE, hr); - return false; + return; } ComPtr<IMFCaptureSink> sink; @@ -1088,7 +1073,7 @@ if (FAILED(hr)) { OnError(VideoCaptureError::kWinMediaFoundationEngineGetSinkFailed, FROM_HERE, hr); - return false; + return; } ComPtr<IMFCapturePreviewSink> preview_sink; @@ -1097,14 +1082,14 @@ OnError(VideoCaptureError:: kWinMediaFoundationSinkQueryCapturePreviewInterfaceFailed, FROM_HERE, hr); - return false; + return; } hr = preview_sink->RemoveAllStreams(); if (FAILED(hr)) { OnError(VideoCaptureError::kWinMediaFoundationSinkRemoveAllStreamsFailed, FROM_HERE, hr); - return false; + return; } ComPtr<IMFMediaType> sink_video_media_type; @@ -1113,7 +1098,7 @@ OnError( VideoCaptureError::kWinMediaFoundationCreateSinkVideoMediaTypeFailed, FROM_HERE, hr); - return false; + return; } hr = ConvertToVideoSinkMediaType( @@ -1124,7 +1109,7 @@ OnError( VideoCaptureError::kWinMediaFoundationConvertToVideoSinkMediaTypeFailed, FROM_HERE, hr); - return false; + return; } DWORD dw_sink_stream_index = 0; @@ -1134,7 +1119,7 @@ if (FAILED(hr)) { OnError(VideoCaptureError::kWinMediaFoundationSinkAddStreamFailed, FROM_HERE, hr); - return false; + return; } hr = preview_sink->SetSampleCallback(dw_sink_stream_index, @@ -1142,7 +1127,7 @@ if (FAILED(hr)) { OnError(VideoCaptureError::kWinMediaFoundationSinkSetSampleCallbackFailed, FROM_HERE, hr); - return false; + return; } // Note, that it is not sufficient to wait for @@ -1160,12 +1145,19 @@ if (FAILED(hr)) { OnError(VideoCaptureError::kWinMediaFoundationEngineStartPreviewFailed, FROM_HERE, hr); - return false; + return; + } + + hr = WaitOnCaptureEvent(MF_CAPTURE_ENGINE_PREVIEW_STARTED); + if (FAILED(hr)) { + return; } selected_video_capability_ = std::make_unique<CapabilityWin>(best_match_video_capability); + is_started_ = true; + base::UmaHistogramEnumeration( "Media.VideoCapture.Win.Device.InternalPixelFormat", best_match_video_capability.source_pixel_format, @@ -1178,36 +1170,25 @@ "Media.VideoCapture.Win.Device.RequestedPixelFormat", params.requested_format.pixel_format, media::VideoPixelFormat::PIXEL_FORMAT_MAX); - - return true; } void VideoCaptureDeviceMFWin::StopAndDeAllocate() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); HRESULT hr = E_FAIL; - { - base::AutoLock lock(lock_); - - if (is_started_ && engine_) { - hr = engine_->StopPreview(); - } + if (is_started_ && engine_) { + hr = engine_->StopPreview(); } - // Do not hold the lock while waiting. if (SUCCEEDED(hr)) { WaitOnCaptureEvent(MF_CAPTURE_ENGINE_PREVIEW_STOPPED); } - { - base::AutoLock lock(lock_); - is_started_ = false; - client_.reset(); - } + is_started_ = false; + client_.reset(); } void VideoCaptureDeviceMFWin::TakePhoto(TakePhotoCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - base::AutoLock lock(lock_); if (!is_started_) return; @@ -1567,21 +1548,23 @@ void VideoCaptureDeviceMFWin::OnUtilizationReport( media::VideoCaptureFeedback feedback) { - base::AutoLock lock(lock_); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); last_feedback_ = feedback; } void VideoCaptureDeviceMFWin::OnIncomingCapturedData( - IMFMediaBuffer* buffer, + Microsoft::WRL::ComPtr<IMFMediaBuffer> buffer, base::TimeTicks reference_time, base::TimeDelta timestamp) { - VideoCaptureFrameDropReason frame_drop_reason = - VideoCaptureFrameDropReason::kNone; - OnIncomingCapturedDataInternal(buffer, reference_time, timestamp, - frame_drop_reason); - if (frame_drop_reason != VideoCaptureFrameDropReason::kNone) { - OnFrameDropped(frame_drop_reason); - } + // This is called on IMFCaptureEngine thread. + // To serialize all access to this class we post to the task + // runner which is used for Video capture service API calls + // (E.g. DeallocateAndStop). + main_thread_task_runner_->PostTask( + FROM_HERE, + base::BindOnce(&VideoCaptureDeviceMFWin::OnIncomingCapturedDataInternal, + weak_factory_.GetWeakPtr(), std::move(buffer), + reference_time, timestamp)); } HRESULT VideoCaptureDeviceMFWin::DeliverTextureToClient( @@ -1606,6 +1589,13 @@ return hr; } + if (texture_device.Get() != dxgi_device_manager_->GetDevice().Get()) { + // Main device has changed while IMFCaptureEngine was producing current + // texture. Change may happen either due to device removal or due to adapter + // change signalled via OnGpuInfoUpdate. + return MF_E_UNEXPECTED; + } + gfx::Size texture_size; VideoPixelFormat pixel_format; GetTextureSizeAndFormat(texture, texture_size, pixel_format); @@ -1682,11 +1672,10 @@ } void VideoCaptureDeviceMFWin::OnIncomingCapturedDataInternal( - IMFMediaBuffer* buffer, + Microsoft::WRL::ComPtr<IMFMediaBuffer> buffer, base::TimeTicks reference_time, - base::TimeDelta timestamp, - VideoCaptureFrameDropReason& frame_drop_reason) { - base::AutoLock lock(lock_); + base::TimeDelta timestamp) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); SendOnStartedIfNotYetSent(); @@ -1709,7 +1698,7 @@ if (dxgi_device_manager_ && selected_video_capability_->supported_format.pixel_format == PIXEL_FORMAT_NV12 && - SUCCEEDED(GetTextureFromMFBuffer(buffer, &texture))) { + SUCCEEDED(GetTextureFromMFBuffer(buffer.Get(), &texture))) { HRESULT hr = DeliverTextureToClient(texture.Get(), reference_time, timestamp); DLOG_IF_FAILED_WITH_HRESULT("Failed to deliver D3D11 texture to client.", @@ -1722,11 +1711,12 @@ return; } - ScopedBufferLock locked_buffer(buffer); + ScopedBufferLock locked_buffer(buffer.Get()); if (!locked_buffer.data()) { LOG(ERROR) << "Locked buffer delivered nullptr"; - frame_drop_reason = VideoCaptureFrameDropReason:: - kWinMediaFoundationLockingBufferDelieveredNullptr; + OnFrameDroppedInternal( + VideoCaptureFrameDropReason:: + kWinMediaFoundationLockingBufferDelieveredNullptr); return; } @@ -1767,7 +1757,19 @@ void VideoCaptureDeviceMFWin::OnFrameDropped( VideoCaptureFrameDropReason reason) { - base::AutoLock lock(lock_); + // This is called on IMFCaptureEngine thread. + // To serialize all access to this class we post to the task + // runner which is used for Video capture service API calls + // (E.g. DeallocateAndStop). + main_thread_task_runner_->PostTask( + FROM_HERE, + base::BindOnce(&VideoCaptureDeviceMFWin::OnFrameDroppedInternal, + weak_factory_.GetWeakPtr(), reason)); +} + +void VideoCaptureDeviceMFWin::OnFrameDroppedInternal( + VideoCaptureFrameDropReason reason) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); SendOnStartedIfNotYetSent(); @@ -1786,22 +1788,32 @@ // When MF_CAPTURE_ENGINE_ERROR is returned the captureengine object is no // longer valid. if (capture_event_guid == MF_CAPTURE_ENGINE_ERROR || FAILED(hr)) { + // Safe to access this on a potentially different sequence, as + // this thread is write only and there is a barrier synchronization due + // to |capture_error_| event. last_error_hr_ = hr; capture_error_.Signal(); // There should always be a valid error hr = SUCCEEDED(hr) ? E_UNEXPECTED : hr; - } else { - if (capture_event_guid == MF_CAPTURE_ENGINE_INITIALIZED) { - capture_initialize_.Signal(); - } else if (capture_event_guid == MF_CAPTURE_ENGINE_PREVIEW_STOPPED) { - capture_stopped_.Signal(); - } else if (capture_event_guid == MF_CAPTURE_ENGINE_PREVIEW_STARTED) { - capture_started_.Signal(); - } - return; - } + // This is called on IMFCaptureEngine thread. + // To serialize all access to this class we post to the task + // runner which is used for Video capture service API calls + // (E.g. DeallocateAndStop). + main_thread_task_runner_->PostTask( + FROM_HERE, base::BindOnce(&VideoCaptureDeviceMFWin::ProcessEventError, + weak_factory_.GetWeakPtr(), hr)); - base::AutoLock lock(lock_); + } else if (capture_event_guid == MF_CAPTURE_ENGINE_INITIALIZED) { + capture_initialize_.Signal(); + } else if (capture_event_guid == MF_CAPTURE_ENGINE_PREVIEW_STOPPED) { + capture_stopped_.Signal(); + } else if (capture_event_guid == MF_CAPTURE_ENGINE_PREVIEW_STARTED) { + capture_started_.Signal(); + } +} + +void VideoCaptureDeviceMFWin::ProcessEventError(HRESULT hr) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (hr == DXGI_ERROR_DEVICE_REMOVED && dxgi_device_manager_ != nullptr) { // Removed device can happen for external reasons. @@ -1827,7 +1839,7 @@ if ((!try_d3d_path || recreated_d3d_device) && RecreateMFSource() && Init()) { - AllocateAndStartLocked(params_, std::move(client_)); + AllocateAndStart(params_, std::move(client_)); // If AllocateAndStart fails somehow, OnError() will be called // internally. Therefore, it's safe to always override |hr| here. hr = S_OK; @@ -1860,6 +1872,8 @@ void VideoCaptureDeviceMFWin::OnError(VideoCaptureError error, const Location& from_here, const char* message) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (!client_.get()) return; @@ -1868,6 +1882,8 @@ } void VideoCaptureDeviceMFWin::SendOnStartedIfNotYetSent() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (!client_ || has_sent_on_started_to_client_) return; has_sent_on_started_to_client_ = true; @@ -1875,6 +1891,8 @@ } HRESULT VideoCaptureDeviceMFWin::WaitOnCaptureEvent(GUID capture_event_guid) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + HRESULT hr = S_OK; HANDLE events[] = {nullptr, capture_error_.handle()}; @@ -1912,6 +1930,8 @@ } bool VideoCaptureDeviceMFWin::RecreateMFSource() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + const bool is_sensor_api = device_descriptor_.capture_api == VideoCaptureApi::WIN_MEDIA_FOUNDATION_SENSOR; ComPtr<IMFAttributes> attributes;
diff --git a/media/capture/video/win/video_capture_device_mf_win.h b/media/capture/video/win/video_capture_device_mf_win.h index 207cae25..671e2186 100644 --- a/media/capture/video/win/video_capture_device_mf_win.h +++ b/media/capture/video/win/video_capture_device_mf_win.h
@@ -22,6 +22,7 @@ #include "base/containers/queue.h" #include "base/sequence_checker.h" #include "base/synchronization/waitable_event.h" +#include "base/task/sequenced_task_runner.h" #include "media/base/win/dxgi_device_manager.h" #include "media/capture/capture_export.h" #include "media/capture/video/video_capture_device.h" @@ -52,12 +53,14 @@ explicit VideoCaptureDeviceMFWin( const VideoCaptureDeviceDescriptor& device_descriptor, Microsoft::WRL::ComPtr<IMFMediaSource> source, - scoped_refptr<DXGIDeviceManager> dxgi_device_manager); + scoped_refptr<DXGIDeviceManager> dxgi_device_manager, + scoped_refptr<base::SequencedTaskRunner> main_thread_task_runner); explicit VideoCaptureDeviceMFWin( const VideoCaptureDeviceDescriptor& device_descriptor, Microsoft::WRL::ComPtr<IMFMediaSource> source, scoped_refptr<DXGIDeviceManager> dxgi_device_manager, - Microsoft::WRL::ComPtr<IMFCaptureEngine> engine); + Microsoft::WRL::ComPtr<IMFCaptureEngine> engine, + scoped_refptr<base::SequencedTaskRunner> main_thread_task_runner); VideoCaptureDeviceMFWin(const VideoCaptureDeviceMFWin&) = delete; VideoCaptureDeviceMFWin& operator=(const VideoCaptureDeviceMFWin&) = delete; @@ -79,7 +82,7 @@ void OnUtilizationReport(media::VideoCaptureFeedback feedback) override; // Captured new video data. - void OnIncomingCapturedData(IMFMediaBuffer* buffer, + void OnIncomingCapturedData(Microsoft::WRL::ComPtr<IMFMediaBuffer> buffer, base::TimeTicks reference_time, base::TimeDelta timestamp); void OnFrameDropped(VideoCaptureFrameDropReason reason); @@ -140,17 +143,14 @@ HRESULT WaitOnCaptureEvent(GUID capture_event_guid); HRESULT DeliverTextureToClient(ID3D11Texture2D* texture, base::TimeTicks reference_time, - base::TimeDelta timestamp) - EXCLUSIVE_LOCKS_REQUIRED(lock_); + base::TimeDelta timestamp); void OnIncomingCapturedDataInternal( - IMFMediaBuffer* buffer, + Microsoft::WRL::ComPtr<IMFMediaBuffer> buffer, base::TimeTicks reference_time, - base::TimeDelta timestamp, - VideoCaptureFrameDropReason& frame_drop_reason); + base::TimeDelta timestamp); bool RecreateMFSource(); - bool AllocateAndStartLocked( - const VideoCaptureParams& params, - std::unique_ptr<VideoCaptureDevice::Client> client); + void OnFrameDroppedInternal(VideoCaptureFrameDropReason reason); + void ProcessEventError(HRESULT hr); VideoCaptureDeviceDescriptor device_descriptor_; CreateMFPhotoCallbackCB create_mf_photo_callback_; @@ -159,11 +159,6 @@ int max_retry_count_; int retry_delay_in_ms_; - // Guards the below variables from concurrent access between methods running - // on |sequence_checker_| and calls to OnIncomingCapturedData() and OnEvent() - // made by MediaFoundation on threads outside of our control. - base::Lock lock_; - std::unique_ptr<VideoCaptureDevice::Client> client_; Microsoft::WRL::ComPtr<IMFMediaSource> source_; Microsoft::WRL::ComPtr<IAMCameraControl> camera_control_; @@ -189,9 +184,18 @@ VideoCaptureParams params_; int num_restarts_ = 0; + // Main thread task runner, used to serialize work triggered by + // IMFCaptureEngine callbacks (OnEvent, OnSample) and work triggered + // by video capture service API calls (Init, AllocateAndStart, + // StopAndDeallocate) This can be left as nullptr in test environment where + // callbacks are called from the same thread as API methods. + scoped_refptr<base::SequencedTaskRunner> main_thread_task_runner_; + media::VideoCaptureFeedback last_feedback_; SEQUENCE_CHECKER(sequence_checker_); + + base::WeakPtrFactory<VideoCaptureDeviceMFWin> weak_factory_{this}; }; } // namespace media
diff --git a/media/capture/video/win/video_capture_device_mf_win_unittest.cc b/media/capture/video/win/video_capture_device_mf_win_unittest.cc index 92a22dc..2b0cfa18 100644 --- a/media/capture/video/win/video_capture_device_mf_win_unittest.cc +++ b/media/capture/video/win/video_capture_device_mf_win_unittest.cc
@@ -13,6 +13,7 @@ #include "base/bind.h" #include "base/callback_helpers.h" #include "base/task/thread_pool.h" +#include "base/test/bind.h" #include "base/test/task_environment.h" #include "base/win/scoped_handle.h" #include "base/win/windows_version.h" @@ -630,6 +631,44 @@ bool expect_mf_dxgi_device_manager_attribute_ = false; }; +class MockDXGIDeviceManager : public DXGIDeviceManager { + public: + MockDXGIDeviceManager( + Microsoft::WRL::ComPtr<IMFDXGIDeviceManager> mf_dxgi_device_manager, + UINT reset_tocken) + : DXGIDeviceManager(std::move(mf_dxgi_device_manager), + reset_tocken, + CHROME_LUID{0, 0}) { + Microsoft::WRL::ComPtr<ID3D11Device> d3d_device; + DXGIDeviceManager::ResetDevice(d3d_device); + ON_CALL(*this, DoResetDevice) + .WillByDefault([this](Microsoft::WRL::ComPtr<ID3D11Device>* device) { + return DXGIDeviceManager::ResetDevice(*device); + }); + ON_CALL(*this, DoGetDevice).WillByDefault([this]() { + return DXGIDeviceManager::GetDevice(); + }); + } + + virtual HRESULT ResetDevice( + Microsoft::WRL::ComPtr<ID3D11Device>& d3d_device) override { + return DoResetDevice(&d3d_device); + } + + MOCK_METHOD1(DoResetDevice, HRESULT(Microsoft::WRL::ComPtr<ID3D11Device>*)); + + virtual Microsoft::WRL::ComPtr<ID3D11Device> GetDevice() { + return DoGetDevice(); + } + + MOCK_METHOD0(DoGetDevice, Microsoft::WRL::ComPtr<ID3D11Device>(void)); + + private: + ~MockDXGIDeviceManager() override = default; + + scoped_refptr<DXGIDeviceManager> dxgi_device_manager_; +}; + class StubMFMediaType : public MockInterface<IMFMediaType> { public: StubMFMediaType(GUID major_type, @@ -1032,10 +1071,12 @@ engine_(new MockMFCaptureEngine()), client_(new MockClient()), image_capture_client_(new MockImageCaptureClient()), + task_runner_(task_environment_.GetMainThreadTaskRunner()), device_(new VideoCaptureDeviceMFWin(descriptor_, media_source_, nullptr, - engine_)), + engine_, + task_runner_)), capture_source_(new MockMFCaptureSource()), capture_preview_sink_(new MockCapturePreviewSink()), media_foundation_supported_( @@ -1051,7 +1092,10 @@ nullptr); EXPECT_CALL(*(engine_.Get()), OnCorrectInitializeQueued()); - EXPECT_TRUE(device_->Init()); + task_runner_->PostTask(FROM_HERE, base::BindLambdaForTesting([&] { + EXPECT_TRUE(device_->Init()); + })); + task_environment_.RunUntilIdle(); EXPECT_CALL(*(engine_.Get()), DoGetSource()) .WillRepeatedly(Invoke([this]() { this->capture_source_->AddRef(); @@ -1311,13 +1355,14 @@ Microsoft::WRL::ComPtr<MockMFCaptureEngine> engine_; std::unique_ptr<MockClient> client_; scoped_refptr<MockImageCaptureClient> image_capture_client_; + base::test::TaskEnvironment task_environment_; + scoped_refptr<base::SequencedTaskRunner> task_runner_; std::unique_ptr<VideoCaptureDeviceMFWin> device_; VideoCaptureFormat last_format_; scoped_refptr<MockMFCaptureSource> capture_source_; scoped_refptr<MockCapturePreviewSink> capture_preview_sink_; - base::test::TaskEnvironment task_environment_; - scoped_refptr<DXGIDeviceManager> dxgi_device_manager_; + scoped_refptr<MockDXGIDeviceManager> dxgi_device_manager_; private: const bool media_foundation_supported_; @@ -1334,9 +1379,18 @@ EXPECT_CALL(*client_, OnStarted()); EXPECT_CALL(*(engine_.Get()), OnStopPreview()); - device_->AllocateAndStart(VideoCaptureParams(), std::move(client_)); + task_runner_->PostTask(FROM_HERE, base::BindLambdaForTesting([&] { + device_->AllocateAndStart(VideoCaptureParams(), + std::move(client_)); + })); + task_environment_.RunUntilIdle(); + capture_preview_sink_->sample_callback->OnSample(nullptr); - device_->StopAndDeAllocate(); + task_environment_.RunUntilIdle(); + + task_runner_->PostTask(FROM_HERE, base::BindLambdaForTesting( + [&] { device_->StopAndDeAllocate(); })); + task_environment_.RunUntilIdle(); } // Expects device's |camera_rotation_| to be populated after first OnSample(). @@ -1349,11 +1403,17 @@ EXPECT_CALL(*(engine_.Get()), OnStartPreview()); EXPECT_CALL(*client_, OnStarted()); - device_->AllocateAndStart(VideoCaptureParams(), std::move(client_)); + task_runner_->PostTask(FROM_HERE, base::BindLambdaForTesting([&] { + device_->AllocateAndStart(VideoCaptureParams(), + std::move(client_)); + })); + task_environment_.RunUntilIdle(); + // Create a valid IMFSample to use with the callback. Microsoft::WRL::ComPtr<IMFSample> test_sample = CreateEmptySampleWithBuffer(kMFSampleBufferLength, 0); capture_preview_sink_->sample_callback->OnSample(test_sample.Get()); + task_environment_.RunUntilIdle(); EXPECT_TRUE(device_->camera_rotation().has_value()); } @@ -1370,9 +1430,16 @@ scoped_refptr<MockMFMediaEvent> media_event_error = new MockMFMediaEvent(); EXPECT_CALL(*media_event_error, DoGetStatus()).WillRepeatedly(Return(E_FAIL)); - device_->AllocateAndStart(VideoCaptureParams(), std::move(client_)); + task_runner_->PostTask(FROM_HERE, base::BindLambdaForTesting([&] { + device_->AllocateAndStart(VideoCaptureParams(), + std::move(client_)); + })); + task_environment_.RunUntilIdle(); + capture_preview_sink_->sample_callback->OnSample(nullptr); + task_environment_.RunUntilIdle(); engine_->event_callback->OnEvent(media_event_error.get()); + task_environment_.RunUntilIdle(); } // Expects Init to fail due to OnError() event @@ -1388,7 +1455,7 @@ std::unique_ptr<VideoCaptureDeviceMFWin> device = std::make_unique<VideoCaptureDeviceMFWin>( descriptor, media_source, - /*mf_dxgi_device_manager=*/nullptr, engine); + /*mf_dxgi_device_manager=*/nullptr, engine, task_runner_); EXPECT_CALL(*(engine.Get()), OnInitEventGuid).WillOnce([]() { return MF_CAPTURE_ENGINE_INITIALIZED; @@ -1400,7 +1467,11 @@ EXPECT_CALL(*(engine.Get()), OnCorrectInitializeQueued()); - EXPECT_FALSE(device->Init()); + task_runner_->PostTask(FROM_HERE, base::BindLambdaForTesting([&device] { + EXPECT_FALSE(device->Init()); + })); + + task_environment_.RunUntilIdle(); } // Expects Init to succeed but MF_CAPTURE_ENGINE_INITIALIZED fired before @@ -1417,7 +1488,7 @@ std::unique_ptr<VideoCaptureDeviceMFWin> device = std::make_unique<VideoCaptureDeviceMFWin>( descriptor, media_source, - /*mf_dxgi_device_manager=*/nullptr, engine); + /*mf_dxgi_device_manager=*/nullptr, engine, task_runner_); EXPECT_CALL(*(engine.Get()), OnInitEventGuid).WillOnce([]() { return MF_CAPTURE_ENGINE_INITIALIZED; @@ -1428,7 +1499,10 @@ EXPECT_CALL(*(engine.Get()), OnCorrectInitializeQueued()); - EXPECT_TRUE(device->Init()); + task_runner_->PostTask(FROM_HERE, base::BindLambdaForTesting([&device] { + EXPECT_TRUE(device->Init()); + })); + task_environment_.RunUntilIdle(); } // Send MFVideoCallback::OnEvent when VideoCaptureDeviceMFWin has been destroyed @@ -1445,7 +1519,7 @@ std::unique_ptr<VideoCaptureDeviceMFWin> device = std::make_unique<VideoCaptureDeviceMFWin>( descriptor, media_source, - /*mf_dxgi_device_manager=*/nullptr, engine); + /*mf_dxgi_device_manager=*/nullptr, engine, task_runner_); EXPECT_CALL(*(engine.Get()), OnInitEventGuid).WillOnce([]() { return MF_CAPTURE_ENGINE_INITIALIZED; @@ -1453,7 +1527,11 @@ EXPECT_CALL(*(engine.Get()), OnCorrectInitializeQueued()); - EXPECT_TRUE(device->Init()); + task_runner_->PostTask(FROM_HERE, base::BindLambdaForTesting([&device] { + EXPECT_TRUE(device->Init()); + })); + + task_environment_.RunUntilIdle(); // Force ~VideoCaptureDeviceMFWin() which will invalidate // MFVideoCallback::observer_ @@ -1461,6 +1539,7 @@ // Send event to MFVideoCallback::OnEvent engine->FireCaptureEvent(MF_CAPTURE_ENGINE_ERROR, MF_E_VIDEO_RECORDING_DEVICE_INVALIDATED); + task_environment_.RunUntilIdle(); } // Send random event before MF_CAPTURE_ENGINE_STOPPED @@ -1476,7 +1555,7 @@ new MockMFCaptureEngine(); auto device = std::make_unique<VideoCaptureDeviceMFWin>( descriptor, media_source, - /*mf_dxgi_device_manager=*/nullptr, engine); + /*mf_dxgi_device_manager=*/nullptr, engine, task_runner_); EXPECT_CALL(*(engine.Get()), OnInitEventGuid).WillOnce([]() { return MF_CAPTURE_ENGINE_INITIALIZED; @@ -1484,7 +1563,11 @@ EXPECT_CALL(*(engine.Get()), OnCorrectInitializeQueued()); - EXPECT_TRUE(device->Init()); + task_runner_->PostTask(FROM_HERE, base::BindLambdaForTesting([&device] { + EXPECT_TRUE(device->Init()); + })); + + task_environment_.RunUntilIdle(); PrepareMFDeviceWithOneVideoStream(MFVideoFormat_I420); @@ -1494,7 +1577,12 @@ VideoCaptureFormat format(gfx::Size(640, 480), 30, media::PIXEL_FORMAT_NV12); VideoCaptureParams video_capture_params; video_capture_params.requested_format = format; - device_->AllocateAndStart(video_capture_params, std::move(client_)); + + task_runner_->PostTask(FROM_HERE, base::BindLambdaForTesting([&] { + device_->AllocateAndStart(video_capture_params, + std::move(client_)); + })); + task_environment_.RunUntilIdle(); // Send an arbitrary event before stopping the preview. EXPECT_CALL(*(engine_.Get()), OnStopPreview()).WillRepeatedly([&]() { @@ -1502,7 +1590,11 @@ }); capture_preview_sink_->sample_callback->OnSample(nullptr); - device_->StopAndDeAllocate(); + task_environment_.RunUntilIdle(); + + task_runner_->PostTask(FROM_HERE, base::BindLambdaForTesting( + [&] { device_->StopAndDeAllocate(); })); + task_environment_.RunUntilIdle(); } // Allocates device with flaky methods failing with MF_E_INVALIDREQUEST and @@ -1555,8 +1647,15 @@ EXPECT_CALL(*(engine_.Get()), OnStartPreview()); EXPECT_CALL(*client_, OnStarted()); - device_->AllocateAndStart(VideoCaptureParams(), std::move(client_)); + + task_runner_->PostTask(FROM_HERE, base::BindLambdaForTesting([&] { + device_->AllocateAndStart(VideoCaptureParams(), + std::move(client_)); + })); + task_environment_.RunUntilIdle(); + mock_sink->sample_callback->OnSample(nullptr); + task_environment_.RunUntilIdle(); } // Allocates device with methods always failing with MF_E_INVALIDREQUEST and @@ -1569,7 +1668,12 @@ .WillRepeatedly(Return(MF_E_INVALIDREQUEST)); EXPECT_CALL(*client_, OnError(_, _, _)); - device_->AllocateAndStart(VideoCaptureParams(), std::move(client_)); + + task_runner_->PostTask(FROM_HERE, base::BindLambdaForTesting([&] { + device_->AllocateAndStart(VideoCaptureParams(), + std::move(client_)); + })); + task_environment_.RunUntilIdle(); } TEST_F(VideoCaptureDeviceMFWinTest, @@ -1595,11 +1699,17 @@ scoped_refptr<MockMFMediaEvent> media_event_error = new MockMFMediaEvent(); EXPECT_CALL(*media_event_error, DoGetStatus()).WillRepeatedly(Return(E_FAIL)); - device_->AllocateAndStart(VideoCaptureParams(), std::move(client_)); + task_runner_->PostTask(FROM_HERE, base::BindLambdaForTesting([&] { + device_->AllocateAndStart(VideoCaptureParams(), + std::move(client_)); + })); + task_environment_.RunUntilIdle(); + // Even if the device is busy, MediaFoundation sends // MF_CAPTURE_ENGINE_PREVIEW_STARTED before sending an error event. engine_->event_callback->OnEvent(media_event_preview_started.get()); engine_->event_callback->OnEvent(media_event_error.get()); + task_environment_.RunUntilIdle(); } // Given an |IMFCaptureSource| offering a video stream without photo stream to @@ -1614,8 +1724,14 @@ EXPECT_CALL(*(engine_.Get()), OnStartPreview()); EXPECT_CALL(*client_, OnStarted()); - device_->AllocateAndStart(VideoCaptureParams(), std::move(client_)); + task_runner_->PostTask(FROM_HERE, base::BindLambdaForTesting([&] { + device_->AllocateAndStart(VideoCaptureParams(), + std::move(client_)); + })); + task_environment_.RunUntilIdle(); + capture_preview_sink_->sample_callback->OnSample(nullptr); + task_environment_.RunUntilIdle(); VideoCaptureDevice::GetPhotoStateCallback get_photo_state_callback = base::BindOnce(&MockImageCaptureClient::DoOnGetPhotoState, @@ -1644,8 +1760,14 @@ EXPECT_CALL(*(engine_.Get()), OnStartPreview()); EXPECT_CALL(*client_, OnStarted()); - device_->AllocateAndStart(VideoCaptureParams(), std::move(client_)); + task_runner_->PostTask(FROM_HERE, base::BindLambdaForTesting([&] { + device_->AllocateAndStart(VideoCaptureParams(), + std::move(client_)); + })); + task_environment_.RunUntilIdle(); + capture_preview_sink_->sample_callback->OnSample(nullptr); + task_environment_.RunUntilIdle(); VideoCaptureDevice::GetPhotoStateCallback get_photo_state_callback = base::BindOnce(&MockImageCaptureClient::DoOnGetPhotoState, @@ -1797,8 +1919,14 @@ EXPECT_CALL(*(engine_.Get()), OnTakePhoto()); - device_->AllocateAndStart(VideoCaptureParams(), std::move(client_)); + task_runner_->PostTask(FROM_HERE, base::BindLambdaForTesting([&] { + device_->AllocateAndStart(VideoCaptureParams(), + std::move(client_)); + })); + task_environment_.RunUntilIdle(); + capture_preview_sink_->sample_callback->OnSample(nullptr); + task_environment_.RunUntilIdle(); VideoCaptureDevice::TakePhotoCallback take_photo_callback = base::BindOnce( &MockImageCaptureClient::DoOnPhotoTaken, image_capture_client_); device_->TakePhoto(std::move(take_photo_callback)); @@ -1858,8 +1986,15 @@ VideoCaptureFormat format(gfx::Size(640, 480), 30, media::PIXEL_FORMAT_Y16); VideoCaptureParams video_capture_params; video_capture_params.requested_format = format; - device_->AllocateAndStart(video_capture_params, std::move(client_)); + + task_runner_->PostTask(FROM_HERE, base::BindLambdaForTesting([&] { + device_->AllocateAndStart(video_capture_params, + std::move(client_)); + })); + task_environment_.RunUntilIdle(); + capture_preview_sink_->sample_callback->OnSample(nullptr); + task_environment_.RunUntilIdle(); } class VideoCaptureDeviceMFWinTestWithDXGI : public VideoCaptureDeviceMFWinTest { @@ -1868,7 +2003,13 @@ if (ShouldSkipD3D11Test()) GTEST_SKIP(); - dxgi_device_manager_ = DXGIDeviceManager::Create(CHROME_LUID{0, 0}); + Microsoft::WRL::ComPtr<IMFDXGIDeviceManager> mf_dxgi_device_manager; + UINT d3d_device_reset_token = 0; + HRESULT hr = MFCreateDXGIDeviceManager(&d3d_device_reset_token, + &mf_dxgi_device_manager); + ASSERT_TRUE(SUCCEEDED(hr)); + dxgi_device_manager_ = new MockDXGIDeviceManager( + std::move(mf_dxgi_device_manager), d3d_device_reset_token); VideoCaptureDeviceMFWinTest::SetUp(); } }; @@ -1917,8 +2058,15 @@ VideoCaptureFormat format(gfx::Size(640, 480), 30, media::PIXEL_FORMAT_NV12); VideoCaptureParams video_capture_params; video_capture_params.requested_format = format; - device_->AllocateAndStart(video_capture_params, std::move(client_)); + + task_runner_->PostTask(FROM_HERE, base::BindLambdaForTesting([&] { + device_->AllocateAndStart(video_capture_params, + std::move(client_)); + })); + task_environment_.RunUntilIdle(); + capture_preview_sink_->sample_callback->OnSample(nullptr); + task_environment_.RunUntilIdle(); } TEST_F(VideoCaptureDeviceMFWinTestWithDXGI, EnsureNoFakeNV12MediaType) { @@ -1946,8 +2094,15 @@ VideoCaptureFormat format(gfx::Size(640, 480), 30, media::PIXEL_FORMAT_NV12); VideoCaptureParams video_capture_params; video_capture_params.requested_format = format; - device_->AllocateAndStart(video_capture_params, std::move(client_)); + + task_runner_->PostTask(FROM_HERE, base::BindLambdaForTesting([&] { + device_->AllocateAndStart(video_capture_params, + std::move(client_)); + })); + task_environment_.RunUntilIdle(); + capture_preview_sink_->sample_callback->OnSample(nullptr); + task_environment_.RunUntilIdle(); } TEST_F(VideoCaptureDeviceMFWinTestWithDXGI, DeliverGMBCaptureBuffers) { @@ -1975,6 +2130,9 @@ Microsoft::WRL::ComPtr<MockD3D11Device> mock_device(new MockD3D11Device()); + EXPECT_CALL(*dxgi_device_manager_.get(), DoGetDevice) + .WillOnce(Return(mock_device)); + // Create mock source texture (to be provided to capture device from MF // capture API) D3D11_TEXTURE2D_DESC mock_desc = {}; @@ -2027,7 +2185,12 @@ VideoCaptureFormat format(expected_size, 30, media::PIXEL_FORMAT_NV12); VideoCaptureParams video_capture_params; video_capture_params.requested_format = format; - device_->AllocateAndStart(video_capture_params, std::move(client_)); + + task_runner_->PostTask(FROM_HERE, base::BindLambdaForTesting([&] { + device_->AllocateAndStart(video_capture_params, + std::move(client_)); + })); + task_environment_.RunUntilIdle(); // Create MF sample and provide to sample callback on capture device Microsoft::WRL::ComPtr<IMFSample> sample; @@ -2039,6 +2202,7 @@ EXPECT_TRUE(SUCCEEDED(sample->AddBuffer(dxgi_buffer.Get()))); capture_preview_sink_->sample_callback->OnSample(sample.Get()); + task_environment_.RunUntilIdle(); } } // namespace media
diff --git a/media/gpu/test/BUILD.gn b/media/gpu/test/BUILD.gn index fd3666e..d0d079c 100644 --- a/media/gpu/test/BUILD.gn +++ b/media/gpu/test/BUILD.gn
@@ -85,14 +85,14 @@ static_library("video_player") { testonly = true sources = [ + "video_player/decoder_listener.cc", + "video_player/decoder_listener.h", "video_player/decoder_wrapper.cc", "video_player/decoder_wrapper.h", "video_player/frame_renderer_dummy.cc", "video_player/frame_renderer_dummy.h", "video_player/test_vda_video_decoder.cc", "video_player/test_vda_video_decoder.h", - "video_player/video_player.cc", - "video_player/video_player.h", ] deps = [ ":test_helpers",
diff --git a/media/gpu/test/video_player/video_player.cc b/media/gpu/test/video_player/decoder_listener.cc similarity index 66% rename from media/gpu/test/video_player/video_player.cc rename to media/gpu/test/video_player/decoder_listener.cc index ef93dab..59805b56 100644 --- a/media/gpu/test/video_player/video_player.cc +++ b/media/gpu/test/video_player/decoder_listener.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "media/gpu/test/video_player/video_player.h" +#include "media/gpu/test/video_player/decoder_listener.h" #include "base/bind.h" #include "base/memory/ptr_util.h" @@ -17,21 +17,21 @@ namespace { // Get the name of the specified video player |event|. -const char* EventName(VideoPlayerEvent event) { +const char* EventName(DecoderListener::Event event) { switch (event) { - case VideoPlayerEvent::kInitialized: + case DecoderListener::Event::kInitialized: return "Initialized"; - case VideoPlayerEvent::kFrameDecoded: + case DecoderListener::Event::kFrameDecoded: return "FrameDecoded"; - case VideoPlayerEvent::kFlushing: + case DecoderListener::Event::kFlushing: return "Flushing"; - case VideoPlayerEvent::kFlushDone: + case DecoderListener::Event::kFlushDone: return "FlushDone"; - case VideoPlayerEvent::kResetting: + case DecoderListener::Event::kResetting: return "Resetting"; - case VideoPlayerEvent::kResetDone: + case DecoderListener::Event::kResetDone: return "ResetDone"; - case VideoPlayerEvent::kConfigInfo: + case DecoderListener::Event::kConfigInfo: return "ConfigInfo"; default: return "Unknown"; @@ -39,7 +39,7 @@ } } // namespace -VideoPlayer::~VideoPlayer() { +DecoderListener::~DecoderListener() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DVLOGF(4); @@ -47,22 +47,22 @@ } // static -std::unique_ptr<VideoPlayer> VideoPlayer::Create( +std::unique_ptr<DecoderListener> DecoderListener::Create( const DecoderWrapperConfig& config, std::unique_ptr<FrameRendererDummy> frame_renderer, std::vector<std::unique_ptr<VideoFrameProcessor>> frame_processors) { - return base::WrapUnique(new VideoPlayer(config, std::move(frame_renderer), - std::move(frame_processors))); + return base::WrapUnique(new DecoderListener(config, std::move(frame_renderer), + std::move(frame_processors))); } -void VideoPlayer::SetEventWaitTimeout(base::TimeDelta timeout) { +void DecoderListener::SetEventWaitTimeout(base::TimeDelta timeout) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DVLOGF(4); event_timeout_ = timeout; } -bool VideoPlayer::Initialize(const Video* video) { +bool DecoderListener::Initialize(const Video* video) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(video); DVLOGF(4); @@ -70,21 +70,21 @@ decoder_wrapper_->Initialize(video); // Wait until the video decoder is initialized. - if (!WaitForEvent(VideoPlayerEvent::kInitialized)) + if (!WaitForEvent(Event::kInitialized)) return false; return true; } -void VideoPlayer::Play() { +void DecoderListener::Play() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DVLOGF(4); // Play until the end of the video. - PlayUntil(VideoPlayerEvent::kNumEvents); + PlayUntil(Event::kNumEvents); } -void VideoPlayer::PlayUntil(VideoPlayerEvent event) { +void DecoderListener::PlayUntil(Event event) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DVLOGF(4); @@ -92,21 +92,21 @@ decoder_wrapper_->Play(); } -void VideoPlayer::Reset() { +void DecoderListener::Reset() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DVLOGF(4); decoder_wrapper_->Reset(); } -void VideoPlayer::Flush() { +void DecoderListener::Flush() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DVLOGF(4); decoder_wrapper_->Flush(); } -bool VideoPlayer::WaitForEvent(VideoPlayerEvent sought_event, size_t times) { +bool DecoderListener::WaitForEvent(Event sought_event, size_t times) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_GE(times, 1u); DVLOGF(4) << "Event: " << EventName(sought_event); @@ -137,60 +137,60 @@ } } -bool VideoPlayer::WaitForFlushDone() { - return WaitForEvent(VideoPlayerEvent::kFlushDone); +bool DecoderListener::WaitForFlushDone() { + return WaitForEvent(Event::kFlushDone); } -bool VideoPlayer::WaitForResetDone() { - return WaitForEvent(VideoPlayerEvent::kResetDone); +bool DecoderListener::WaitForResetDone() { + return WaitForEvent(Event::kResetDone); } -bool VideoPlayer::WaitForFrameDecoded(size_t times) { - return WaitForEvent(VideoPlayerEvent::kFrameDecoded, times); +bool DecoderListener::WaitForFrameDecoded(size_t times) { + return WaitForEvent(Event::kFrameDecoded, times); } -size_t VideoPlayer::GetEventCount(VideoPlayerEvent event) const { +size_t DecoderListener::GetEventCount(Event event) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); base::AutoLock auto_lock(event_lock_); return video_player_event_counts_[static_cast<size_t>(event)]; } -bool VideoPlayer::WaitForFrameProcessors() { +bool DecoderListener::WaitForFrameProcessors() { return decoder_wrapper_->WaitForFrameProcessors(); } -void VideoPlayer::WaitForRenderer() { +void DecoderListener::WaitForRenderer() { decoder_wrapper_->WaitForRenderer(); } -size_t VideoPlayer::GetFlushDoneCount() const { - return GetEventCount(VideoPlayerEvent::kFlushDone); +size_t DecoderListener::GetFlushDoneCount() const { + return GetEventCount(Event::kFlushDone); } -size_t VideoPlayer::GetResetDoneCount() const { - return GetEventCount(VideoPlayerEvent::kResetDone); +size_t DecoderListener::GetResetDoneCount() const { + return GetEventCount(Event::kResetDone); } -size_t VideoPlayer::GetFrameDecodedCount() const { - return GetEventCount(VideoPlayerEvent::kFrameDecoded); +size_t DecoderListener::GetFrameDecodedCount() const { + return GetEventCount(Event::kFrameDecoded); } -VideoPlayer::VideoPlayer( +DecoderListener::DecoderListener( const DecoderWrapperConfig& config, std::unique_ptr<FrameRendererDummy> frame_renderer, std::vector<std::unique_ptr<VideoFrameProcessor>> frame_processors) : decoder_wrapper_(DecoderWrapper::Create( // base::Unretained is safe here because |decoder_wrapper_| is fully // owned. - base::BindRepeating(&VideoPlayer::NotifyEvent, + base::BindRepeating(&DecoderListener::NotifyEvent, base::Unretained(this)), std::move(frame_renderer), std::move(frame_processors), config)), event_cv_(&event_lock_) {} -bool VideoPlayer::NotifyEvent(VideoPlayerEvent event) { +bool DecoderListener::NotifyEvent(Event event) { base::AutoLock auto_lock(event_lock_); video_player_events_.push(event); video_player_event_counts_[static_cast<size_t>(event)]++;
diff --git a/media/gpu/test/video_player/video_player.h b/media/gpu/test/video_player/decoder_listener.h similarity index 75% rename from media/gpu/test/video_player/video_player.h rename to media/gpu/test/video_player/decoder_listener.h index 253f1eb..299ebbf 100644 --- a/media/gpu/test/video_player/video_player.h +++ b/media/gpu/test/video_player/decoder_listener.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MEDIA_GPU_TEST_VIDEO_PLAYER_VIDEO_PLAYER_H_ -#define MEDIA_GPU_TEST_VIDEO_PLAYER_VIDEO_PLAYER_H_ +#ifndef MEDIA_GPU_TEST_VIDEO_PLAYER_DECODER_LISTENER_H_ +#define MEDIA_GPU_TEST_VIDEO_PLAYER_DECODER_LISTENER_H_ #include <limits.h> #include <memory> @@ -31,32 +31,31 @@ // Default timeout used when waiting for events. constexpr base::TimeDelta kDefaultEventWaitTimeout = base::Seconds(30); -enum class VideoPlayerEvent : size_t { - kInitialized, - kFrameDecoded, - kFlushing, - kFlushDone, - kResetting, - kResetDone, - kConfigInfo, // A config info was encountered in an H.264/HEVC video stream. - kNewBuffersRequested, - kNumEvents, -}; - -// The video player provides a framework to build video decode accelerator tests -// upon. It provides methods to manipulate video playback, and wait for specific -// events to occur. -class VideoPlayer { +// This class provides methods to manipulate video playback and wait for +// specific events to occur. +class DecoderListener { public: - using EventCallback = base::RepeatingCallback<bool(VideoPlayerEvent)>; + enum class Event : size_t { + kInitialized, + kFrameDecoded, + kFlushing, + kFlushDone, + kResetting, + kResetDone, + kConfigInfo, // A config info was encountered in an H.264/HEVC video + // stream. + kNewBuffersRequested, + kNumEvents, + }; + using EventCallback = base::RepeatingCallback<bool(Event)>; - VideoPlayer(const VideoPlayer&) = delete; - VideoPlayer& operator=(const VideoPlayer&) = delete; + DecoderListener(const DecoderListener&) = delete; + DecoderListener& operator=(const DecoderListener&) = delete; - ~VideoPlayer(); + ~DecoderListener(); // Create an instance of this class. Must be Initialize()d before use. - static std::unique_ptr<VideoPlayer> Create( + static std::unique_ptr<DecoderListener> Create( const DecoderWrapperConfig& config, std::unique_ptr<FrameRendererDummy> frame_renderer, std::vector<std::unique_ptr<VideoFrameProcessor>> frame_processors = {}); @@ -79,7 +78,7 @@ void Play(); // Play the video asynchronously. Automatically pause decoding when |event| // occurs. - void PlayUntil(VideoPlayerEvent event); + void PlayUntil(Event event); // Reset the decoder to the beginning of the video stream. void Reset(); // Flush the decoder. @@ -89,7 +88,7 @@ // occurred since last calling this function will be taken into account. All // events with different types will be consumed. Will return false if the // specified timeout is exceeded while waiting for the events. - bool WaitForEvent(VideoPlayerEvent event, size_t times = 1); + bool WaitForEvent(Event event, size_t times = 1); // Helper function to wait for a FlushDone event. bool WaitForFlushDone(); // Helper function to wait for a ResetDone event. @@ -98,7 +97,7 @@ bool WaitForFrameDecoded(size_t times); // Get the number of times the specified event occurred. - size_t GetEventCount(VideoPlayerEvent event) const; + size_t GetEventCount(Event event) const; // Helper function to get the number of ResetDone events thrown. size_t GetResetDoneCount() const; // Helper function to get the number of FlushDone events thrown. @@ -107,14 +106,14 @@ size_t GetFrameDecodedCount() const; private: - VideoPlayer( + DecoderListener( const DecoderWrapperConfig& config, std::unique_ptr<FrameRendererDummy> frame_renderer, std::vector<std::unique_ptr<VideoFrameProcessor>> frame_processors); // Notify the video player an event has occurred (e.g. frame decoded). Returns // whether |decoder_wrapper_| should continue decoding frames. - bool NotifyEvent(VideoPlayerEvent event); + bool NotifyEvent(Event event); std::unique_ptr<DecoderWrapper> decoder_wrapper_; @@ -124,13 +123,13 @@ base::ConditionVariable event_cv_; // NotifyEvent() will store events here for WaitForEvent() to process. - base::queue<VideoPlayerEvent> video_player_events_ GUARDED_BY(event_lock_); + base::queue<Event> video_player_events_ GUARDED_BY(event_lock_); size_t video_player_event_counts_[static_cast<size_t>( - VideoPlayerEvent::kNumEvents)] GUARDED_BY(event_lock_){}; + Event::kNumEvents)] GUARDED_BY(event_lock_){}; // Set by PlayUntil() to automatically pause decoding once this event occurs. - absl::optional<VideoPlayerEvent> play_until_; + absl::optional<Event> play_until_; SEQUENCE_CHECKER(sequence_checker_); }; @@ -138,4 +137,4 @@ } // namespace test } // namespace media -#endif // MEDIA_GPU_TEST_VIDEO_PLAYER_VIDEO_PLAYER_H_ +#endif // MEDIA_GPU_TEST_VIDEO_PLAYER_DECODER_LISTENER_H_
diff --git a/media/gpu/test/video_player/decoder_wrapper.cc b/media/gpu/test/video_player/decoder_wrapper.cc index 9dd432d..066ee2f 100644 --- a/media/gpu/test/video_player/decoder_wrapper.cc +++ b/media/gpu/test/video_player/decoder_wrapper.cc
@@ -47,7 +47,7 @@ } // namespace DecoderWrapper::DecoderWrapper( - const VideoPlayer::EventCallback& event_cb, + const DecoderListener::EventCallback& event_cb, std::unique_ptr<FrameRendererDummy> renderer, std::vector<std::unique_ptr<VideoFrameProcessor>> frame_processors, const DecoderWrapperConfig& config) @@ -87,7 +87,7 @@ // static std::unique_ptr<DecoderWrapper> DecoderWrapper::Create( - const VideoPlayer::EventCallback& event_cb, + const DecoderListener::EventCallback& event_cb, std::unique_ptr<FrameRendererDummy> frame_renderer, std::vector<std::unique_ptr<VideoFrameProcessor>> frame_processors, const DecoderWrapperConfig& config) { @@ -299,7 +299,7 @@ // Throw event when we encounter a config info in a H.264/HEVC stream. if (has_config_info) - FireEvent(VideoPlayerEvent::kConfigInfo); + FireEvent(DecoderListener::Event::kConfigInfo); } void DecoderWrapper::FlushTask() { @@ -314,7 +314,7 @@ weak_this_, worker_task_runner_, &DecoderWrapper::OnFlushDoneTask); decoder_->Decode(DecoderBuffer::CreateEOSBuffer(), std::move(flush_done_cb)); - FireEvent(VideoPlayerEvent::kFlushing); + FireEvent(DecoderListener::Event::kFlushing); } void DecoderWrapper::ResetTask() { @@ -329,7 +329,7 @@ decoder_->Reset(base::BindOnce( CallbackThunk<decltype(&DecoderWrapper::OnResetDoneTask)>, weak_this_, worker_task_runner_, &DecoderWrapper::OnResetDoneTask)); - FireEvent(VideoPlayerEvent::kResetting); + FireEvent(DecoderListener::Event::kResetting); } void DecoderWrapper::OnDecoderInitializedTask(DecoderStatus status) { @@ -339,7 +339,7 @@ ASSERT_TRUE(status.is_ok()) << "Initializing decoder failed"; state_ = DecoderWrapperState::kIdle; - FireEvent(VideoPlayerEvent::kInitialized); + FireEvent(DecoderListener::Event::kInitialized); } void DecoderWrapper::OnDecodeDoneTask(DecoderStatus status) { @@ -382,7 +382,7 @@ // Notify the test a frame has been decoded. We should only do this after // scheduling the frame to be processed, so calling WaitForFrameProcessors() // after receiving this event will always guarantee the frame to be processed. - FireEvent(VideoPlayerEvent::kFrameDecoded); + FireEvent(DecoderListener::Event::kFrameDecoded); current_frame_index_++; } @@ -395,7 +395,7 @@ // might keep in preparation of the next stream of video frames. frame_renderer_->RenderFrame(VideoFrame::CreateEOSFrame()); state_ = DecoderWrapperState::kIdle; - FireEvent(VideoPlayerEvent::kFlushDone); + FireEvent(DecoderListener::Event::kFlushDone); } void DecoderWrapper::OnResetDoneTask() { @@ -409,16 +409,16 @@ frame_renderer_->RenderFrame(VideoFrame::CreateEOSFrame()); state_ = DecoderWrapperState::kIdle; - FireEvent(VideoPlayerEvent::kResetDone); + FireEvent(DecoderListener::Event::kResetDone); } bool DecoderWrapper::OnResolutionChangedTask() { DCHECK_CALLED_ON_VALID_SEQUENCE(worker_sequence_checker_); - return FireEvent(VideoPlayerEvent::kNewBuffersRequested); + return FireEvent(DecoderListener::Event::kNewBuffersRequested); } -bool DecoderWrapper::FireEvent(VideoPlayerEvent event) { +bool DecoderWrapper::FireEvent(DecoderListener::Event event) { DCHECK_CALLED_ON_VALID_SEQUENCE(worker_sequence_checker_); bool continue_decoding = event_cb_.Run(event);
diff --git a/media/gpu/test/video_player/decoder_wrapper.h b/media/gpu/test/video_player/decoder_wrapper.h index c311e11f..fbcf261 100644 --- a/media/gpu/test/video_player/decoder_wrapper.h +++ b/media/gpu/test/video_player/decoder_wrapper.h
@@ -18,7 +18,7 @@ #include "media/base/decoder_status.h" #include "media/base/video_decoder.h" #include "media/base/video_decoder_config.h" -#include "media/gpu/test/video_player/video_player.h" +#include "media/gpu/test/video_player/decoder_listener.h" namespace media { @@ -63,7 +63,7 @@ // whenever an event occurs (e.g. frame decoded) and should be thread-safe. // The produced DecoderWrapper must be Initialize()d before being used. static std::unique_ptr<DecoderWrapper> Create( - const VideoPlayer::EventCallback& event_cb, + const DecoderListener::EventCallback& event_cb, std::unique_ptr<FrameRendererDummy> frame_renderer, std::vector<std::unique_ptr<VideoFrameProcessor>> frame_processors, const DecoderWrapperConfig& config); @@ -100,7 +100,7 @@ }; DecoderWrapper( - const VideoPlayer::EventCallback& event_cb, + const DecoderListener::EventCallback& event_cb, std::unique_ptr<FrameRendererDummy> renderer, std::vector<std::unique_ptr<VideoFrameProcessor>> frame_processors, const DecoderWrapperConfig& config); @@ -135,12 +135,12 @@ // Fires the specified event, and returns true if the caller should continue // decoding. - bool FireEvent(VideoPlayerEvent event); + bool FireEvent(DecoderListener::Event event); SEQUENCE_CHECKER(parent_sequence_checker_); SEQUENCE_CHECKER(worker_sequence_checker_); - VideoPlayer::EventCallback event_cb_; + DecoderListener::EventCallback event_cb_; std::unique_ptr<FrameRendererDummy> frame_renderer_; std::vector<std::unique_ptr<VideoFrameProcessor>> frame_processors_;
diff --git a/media/gpu/video_decode_accelerator_perf_tests.cc b/media/gpu/video_decode_accelerator_perf_tests.cc index ff05d8a..0d83e252 100644 --- a/media/gpu/video_decode_accelerator_perf_tests.cc +++ b/media/gpu/video_decode_accelerator_perf_tests.cc
@@ -16,9 +16,9 @@ #include "media/base/test_data_util.h" #include "media/gpu/buildflags.h" #include "media/gpu/test/video.h" +#include "media/gpu/test/video_player/decoder_listener.h" #include "media/gpu/test/video_player/decoder_wrapper.h" #include "media/gpu/test/video_player/frame_renderer_dummy.h" -#include "media/gpu/test/video_player/video_player.h" #include "media/gpu/test/video_player/video_player_test_environment.h" #include "sandbox/linux/services/resource_limits.h" #include "testing/gtest/include/gtest/gtest.h" @@ -331,9 +331,10 @@ // which the video player will simulate rendering frames, if 0 no rendering is // simulated. The |vsync_rate| is used during simulated rendering, if 0 Vsync // is disabled. - std::unique_ptr<VideoPlayer> CreateVideoPlayer(const Video* video, - uint32_t render_frame_rate = 0, - uint32_t vsync_rate = 0) { + std::unique_ptr<DecoderListener> CreateDecoderListener( + const Video* video, + uint32_t render_frame_rate = 0, + uint32_t vsync_rate = 0) { LOG_ASSERT(video); // Create dummy frame renderer, simulates rendering at specified frame rate. @@ -357,8 +358,8 @@ config.implementation = g_env->GetDecoderImplementation(); config.linear_output = g_env->ShouldOutputLinearBuffers(); - auto video_player = VideoPlayer::Create(config, std::move(frame_renderer), - std::move(frame_processors)); + auto video_player = DecoderListener::Create( + config, std::move(frame_renderer), std::move(frame_processors)); LOG_ASSERT(video_player); LOG_ASSERT(video_player->Initialize(video)); @@ -377,7 +378,7 @@ // will decode a video as fast as possible, and gives an idea about the maximum // output of the decoder. TEST_F(VideoDecoderTest, MeasureUncappedPerformance) { - auto tvp = CreateVideoPlayer(g_env->Video()); + auto tvp = CreateDecoderListener(g_env->Video()); performance_evaluator_->StartMeasuring(); tvp->Play(); @@ -393,7 +394,8 @@ // will simulate rendering the video at its actual frame rate, and will // calculate the number of frames that were dropped. Vsync is enabled at 60 FPS. TEST_F(VideoDecoderTest, MeasureCappedPerformance) { - auto tvp = CreateVideoPlayer(g_env->Video(), g_env->Video()->FrameRate(), 60); + auto tvp = + CreateDecoderListener(g_env->Video(), g_env->Video()->FrameRate(), 60); performance_evaluator_->StartMeasuring(); tvp->Play(); @@ -419,9 +421,9 @@ constexpr size_t kNumConcurrentDecoders = 10; - std::vector<std::unique_ptr<VideoPlayer>> players(kNumConcurrentDecoders); + std::vector<std::unique_ptr<DecoderListener>> players(kNumConcurrentDecoders); for (auto&& player : players) { - player = CreateVideoPlayer(g_env->Video()); + player = CreateDecoderListener(g_env->Video()); // Increase the timeout for older machines that cannot decode as // efficiently. player->SetEventWaitTimeout(kMultipleDecodersTimeout);
diff --git a/media/gpu/video_decode_accelerator_tests.cc b/media/gpu/video_decode_accelerator_tests.cc index f1b62eb..e1fadd7 100644 --- a/media/gpu/video_decode_accelerator_tests.cc +++ b/media/gpu/video_decode_accelerator_tests.cc
@@ -20,9 +20,9 @@ #include "media/gpu/test/video.h" #include "media/gpu/test/video_frame_file_writer.h" #include "media/gpu/test/video_frame_validator.h" +#include "media/gpu/test/video_player/decoder_listener.h" #include "media/gpu/test/video_player/decoder_wrapper.h" #include "media/gpu/test/video_player/frame_renderer_dummy.h" -#include "media/gpu/test/video_player/video_player.h" #include "media/gpu/test/video_player/video_player_test_environment.h" #include "media/gpu/test/video_test_helpers.h" #include "media/media_buildflags.h" @@ -114,7 +114,7 @@ // Video decode test class. Performs setup and teardown for each single test. class VideoDecoderTest : public ::testing::Test { public: - std::unique_ptr<VideoPlayer> CreateVideoPlayer( + std::unique_ptr<DecoderListener> CreateDecoderListener( const Video* video, DecoderWrapperConfig config = DecoderWrapperConfig(), std::unique_ptr<FrameRendererDummy> frame_renderer = @@ -182,8 +182,8 @@ config.implementation = g_env->GetDecoderImplementation(); config.linear_output = g_env->ShouldOutputLinearBuffers(); - auto video_player = VideoPlayer::Create(config, std::move(frame_renderer), - std::move(frame_processors)); + auto video_player = DecoderListener::Create( + config, std::move(frame_renderer), std::move(frame_processors)); LOG_ASSERT(video_player); LOG_ASSERT(video_player->Initialize(video)); @@ -277,7 +277,7 @@ // Play video from start to end. Wait for the kFlushDone event at the end of the // stream, that notifies us all frames have been decoded. TEST_F(VideoDecoderTest, FlushAtEndOfStream) { - auto tvp = CreateVideoPlayer(g_env->Video()); + auto tvp = CreateDecoderListener(g_env->Video()); tvp->Play(); EXPECT_TRUE(tvp->WaitForFlushDone()); @@ -289,7 +289,7 @@ // Flush the decoder immediately after initialization. TEST_F(VideoDecoderTest, FlushAfterInitialize) { - auto tvp = CreateVideoPlayer(g_env->Video()); + auto tvp = CreateDecoderListener(g_env->Video()); tvp->Flush(); EXPECT_TRUE(tvp->WaitForFlushDone()); @@ -303,7 +303,7 @@ // Reset the decoder immediately after initialization. TEST_F(VideoDecoderTest, ResetAfterInitialize) { - auto tvp = CreateVideoPlayer(g_env->Video()); + auto tvp = CreateDecoderListener(g_env->Video()); tvp->Reset(); EXPECT_TRUE(tvp->WaitForResetDone()); @@ -318,7 +318,7 @@ // Reset the decoder when the middle of the stream is reached. TEST_F(VideoDecoderTest, ResetMidStream) { - auto tvp = CreateVideoPlayer(g_env->Video()); + auto tvp = CreateDecoderListener(g_env->Video()); tvp->Play(); EXPECT_TRUE(tvp->WaitForFrameDecoded(g_env->Video()->NumFrames() / 2)); @@ -341,7 +341,7 @@ // Reset the decoder when the end of the stream is reached. TEST_F(VideoDecoderTest, ResetEndOfStream) { - auto tvp = CreateVideoPlayer(g_env->Video()); + auto tvp = CreateDecoderListener(g_env->Video()); tvp->Play(); EXPECT_TRUE(tvp->WaitForFlushDone()); @@ -360,7 +360,7 @@ // Reset the decoder immediately when the end-of-stream flush starts, without // waiting for a kFlushDone event. TEST_F(VideoDecoderTest, ResetBeforeFlushDone) { - auto tvp = CreateVideoPlayer(g_env->Video()); + auto tvp = CreateDecoderListener(g_env->Video()); // Reset when a kFlushing event is received. tvp->Play(); @@ -387,10 +387,10 @@ g_env->Video()->Codec() != media::VideoCodec::kHEVC) GTEST_SKIP(); - auto tvp = CreateVideoPlayer(g_env->Video()); + auto tvp = CreateDecoderListener(g_env->Video()); - tvp->PlayUntil(VideoPlayerEvent::kConfigInfo); - EXPECT_TRUE(tvp->WaitForEvent(VideoPlayerEvent::kConfigInfo)); + tvp->PlayUntil(DecoderListener::Event::kConfigInfo); + EXPECT_TRUE(tvp->WaitForEvent(DecoderListener::Event::kConfigInfo)); tvp->Reset(); EXPECT_TRUE(tvp->WaitForResetDone()); size_t numFramesDecoded = tvp->GetFrameDecodedCount(); @@ -401,7 +401,7 @@ EXPECT_EQ(tvp->GetFlushDoneCount(), 1u); EXPECT_EQ(tvp->GetFrameDecodedCount(), numFramesDecoded + g_env->Video()->NumFrames()); - EXPECT_GE(tvp->GetEventCount(VideoPlayerEvent::kConfigInfo), 1u); + EXPECT_GE(tvp->GetEventCount(DecoderListener::Event::kConfigInfo), 1u); EXPECT_TRUE(tvp->WaitForFrameProcessors()); } @@ -409,10 +409,10 @@ if (g_env->GetDecoderImplementation() != DecoderImplementation::kVDVDA) GTEST_SKIP(); - auto tvp = CreateVideoPlayer(g_env->Video()); + auto tvp = CreateDecoderListener(g_env->Video()); - tvp->PlayUntil(VideoPlayerEvent::kNewBuffersRequested); - EXPECT_TRUE(tvp->WaitForEvent(VideoPlayerEvent::kNewBuffersRequested)); + tvp->PlayUntil(DecoderListener::Event::kNewBuffersRequested); + EXPECT_TRUE(tvp->WaitForEvent(DecoderListener::Event::kNewBuffersRequested)); // TODO(b/192523692): Add a new test case that continues passing input buffers // between the resolution change has been aborted and resetting the decoder. @@ -434,7 +434,7 @@ TEST_F(VideoDecoderTest, FlushAtEndOfStream_MultipleOutstandingDecodes) { DecoderWrapperConfig config; config.max_outstanding_decode_requests = 4; - auto tvp = CreateVideoPlayer(g_env->Video(), config); + auto tvp = CreateDecoderListener(g_env->Video(), config); tvp->Play(); EXPECT_TRUE(tvp->WaitForFlushDone()); @@ -449,10 +449,10 @@ // The minimal number of concurrent decoders we expect to be supported. constexpr size_t kMinSupportedConcurrentDecoders = 3; - std::vector<std::unique_ptr<VideoPlayer>> tvps( + std::vector<std::unique_ptr<DecoderListener>> tvps( kMinSupportedConcurrentDecoders); for (size_t i = 0; i < kMinSupportedConcurrentDecoders; ++i) - tvps[i] = CreateVideoPlayer(g_env->Video()); + tvps[i] = CreateDecoderListener(g_env->Video()); for (size_t i = 0; i < kMinSupportedConcurrentDecoders; ++i) tvps[i]->Play(); @@ -470,8 +470,8 @@ // video's configuration (e.g. codec and resolution). The test only verifies // initialization and doesn't decode the video. TEST_F(VideoDecoderTest, Initialize) { - auto tvp = CreateVideoPlayer(g_env->Video()); - EXPECT_EQ(tvp->GetEventCount(VideoPlayerEvent::kInitialized), 1u); + auto tvp = CreateDecoderListener(g_env->Video()); + EXPECT_EQ(tvp->GetEventCount(DecoderListener::Event::kInitialized), 1u); } // Test video decoder re-initialization. Re-initialization is only supported by @@ -482,12 +482,12 @@ GTEST_SKIP(); // Create and initialize the video decoder. - auto tvp = CreateVideoPlayer(g_env->Video()); - EXPECT_EQ(tvp->GetEventCount(VideoPlayerEvent::kInitialized), 1u); + auto tvp = CreateDecoderListener(g_env->Video()); + EXPECT_EQ(tvp->GetEventCount(DecoderListener::Event::kInitialized), 1u); // Re-initialize the video decoder, without having played the video. EXPECT_TRUE(tvp->Initialize(g_env->Video())); - EXPECT_EQ(tvp->GetEventCount(VideoPlayerEvent::kInitialized), 2u); + EXPECT_EQ(tvp->GetEventCount(DecoderListener::Event::kInitialized), 2u); // Play the video from start to end. tvp->Play(); @@ -498,7 +498,7 @@ // Try re-initializing the video decoder again. EXPECT_TRUE(tvp->Initialize(g_env->Video())); - EXPECT_EQ(tvp->GetEventCount(VideoPlayerEvent::kInitialized), 3u); + EXPECT_EQ(tvp->GetEventCount(DecoderListener::Event::kInitialized), 3u); } // Create a video decoder and immediately destroy it without initializing. The @@ -508,7 +508,7 @@ TEST_F(VideoDecoderTest, DestroyBeforeInitialize) { DecoderWrapperConfig config = DecoderWrapperConfig(); config.implementation = g_env->GetDecoderImplementation(); - auto tvp = VideoPlayer::Create(config, FrameRendererDummy::Create()); + auto tvp = DecoderListener::Create(config, FrameRendererDummy::Create()); EXPECT_NE(tvp, nullptr); }
diff --git a/mojo/public/tools/mojom/check_stable_mojom_compatibility.py b/mojo/public/tools/mojom/check_stable_mojom_compatibility.py index ac024ed..d91dc14 100755 --- a/mojo/public/tools/mojom/check_stable_mojom_compatibility.py +++ b/mojo/public/tools/mojom/check_stable_mojom_compatibility.py
@@ -40,6 +40,8 @@ transitive closure of a mojom's input dependencies all at once. """ + translate.is_running_backwards_compatibility_check_hack = True + # First build a map of all files covered by the delta affected_files = set() old_files = {}
diff --git a/mojo/public/tools/mojom/check_stable_mojom_compatibility_unittest.py b/mojo/public/tools/mojom/check_stable_mojom_compatibility_unittest.py index a5ba72f..41539a11 100755 --- a/mojo/public/tools/mojom/check_stable_mojom_compatibility_unittest.py +++ b/mojo/public/tools/mojom/check_stable_mojom_compatibility_unittest.py
@@ -321,3 +321,19 @@ [Stable] struct T { foo.S s; }; """) ]) + + def testNewEnumDefault(self): + # Should be backwards compatible since it does not affect the wire format. + # This specific case also checks that the backwards compatibility checker + # does not throw an error due to the older version of the enum not + # specifying [Default]. + self.assertBackwardCompatible([ + Change('foo/foo.mojom', + old='[Extensible] enum E { One };', + new='[Extensible] enum E { [Default] One };') + ]) + self.assertBackwardCompatible([ + Change('foo/foo.mojom', + old='[Extensible] enum E { [Default] One, Two, };', + new='[Extensible] enum E { One, [Default] Two, };') + ])
diff --git a/mojo/public/tools/mojom/mojom/generate/translate.py b/mojo/public/tools/mojom/mojom/generate/translate.py index b6437924..0fb231d 100644 --- a/mojo/public/tools/mojom/mojom/generate/translate.py +++ b/mojo/public/tools/mojom/mojom/generate/translate.py
@@ -18,6 +18,312 @@ from mojom.parse import ast +is_running_backwards_compatibility_check_hack = False + +### DO NOT ADD ENTRIES TO THIS LIST. ### +_EXTENSIBLE_ENUMS_MISSING_DEFAULT = ( + 'x:arc.keymaster.mojom.Algorithm', + 'x:arc.keymaster.mojom.Digest', + 'x:arc.keymaster.mojom.SignatureResult', + 'x:arc.mojom.AccessibilityActionType', + 'x:arc.mojom.AccessibilityBooleanProperty', + 'x:arc.mojom.AccessibilityEventIntListProperty', + 'x:arc.mojom.AccessibilityEventIntProperty', + 'x:arc.mojom.AccessibilityEventStringProperty', + 'x:arc.mojom.AccessibilityEventType', + 'x:arc.mojom.AccessibilityFilterType', + 'x:arc.mojom.AccessibilityIntListProperty', + 'x:arc.mojom.AccessibilityIntProperty', + 'x:arc.mojom.AccessibilityLiveRegionType', + 'x:arc.mojom.AccessibilityNotificationStateType', + 'x:arc.mojom.AccessibilityRangeType', + 'x:arc.mojom.AccessibilitySelectionMode', + 'x:arc.mojom.AccessibilityStringListProperty', + 'x:arc.mojom.AccessibilityStringProperty', + 'x:arc.mojom.AccessibilityWindowBooleanProperty', + 'x:arc.mojom.AccessibilityWindowIntListProperty', + 'x:arc.mojom.AccessibilityWindowIntProperty', + 'x:arc.mojom.AccessibilityWindowStringProperty', + 'x:arc.mojom.AccessibilityWindowType', + 'x:arc.mojom.AccountCheckStatus', + 'x:arc.mojom.AccountUpdateType', + 'x:arc.mojom.ActionType', + 'x:arc.mojom.Algorithm', + 'x:arc.mojom.AndroidIdSource', + 'x:arc.mojom.AnrSource', + 'x:arc.mojom.AnrType', + 'x:arc.mojom.AppDiscoveryRequestState', + 'x:arc.mojom.AppKillType', + 'x:arc.mojom.AppPermission', + 'x:arc.mojom.AppPermissionGroup', + 'x:arc.mojom.AppReinstallState', + 'x:arc.mojom.AppShortcutItemType', + 'x:arc.mojom.ArcAuthCodeStatus', + 'x:arc.mojom.ArcClipboardDragDropEvent', + 'x:arc.mojom.ArcCorePriAbiMigEvent', + 'x:arc.mojom.ArcDnsQuery', + 'x:arc.mojom.ArcImageCopyPasteCompatAction', + 'x:arc.mojom.ArcNetworkError', + 'x:arc.mojom.ArcNetworkEvent', + 'x:arc.mojom.ArcNotificationEvent', + 'x:arc.mojom.ArcNotificationExpandState', + 'x:arc.mojom.ArcNotificationPriority', + 'x:arc.mojom.ArcNotificationRemoteInputState', + 'x:arc.mojom.ArcNotificationShownContents', + 'x:arc.mojom.ArcNotificationStyle', + 'x:arc.mojom.ArcNotificationType', + 'x:arc.mojom.ArcPipEvent', + 'x:arc.mojom.ArcResizeLockState', + 'x:arc.mojom.ArcSignInSuccess', + 'x:arc.mojom.ArcTimerResult', + 'x:arc.mojom.AudioSwitch', + 'x:arc.mojom.BluetoothAclState', + 'x:arc.mojom.BluetoothAdapterState', + 'x:arc.mojom.BluetoothAdvertisingDataType', + 'x:arc.mojom.BluetoothBondState', + 'x:arc.mojom.BluetoothDeviceType', + 'x:arc.mojom.BluetoothDiscoveryState', + 'x:arc.mojom.BluetoothGattDBAttributeType', + 'x:arc.mojom.BluetoothGattStatus', + 'x:arc.mojom.BluetoothPropertyType', + 'x:arc.mojom.BluetoothScanMode', + 'x:arc.mojom.BluetoothSdpAttributeType', + 'x:arc.mojom.BluetoothSocketType', + 'x:arc.mojom.BluetoothStatus', + 'x:arc.mojom.BootType', + 'x:arc.mojom.CaptionTextShadowType', + 'x:arc.mojom.ChangeType', + 'x:arc.mojom.ChromeAccountType', + 'x:arc.mojom.ChromeApp', + 'x:arc.mojom.ChromePage', + 'x:arc.mojom.ClockId', + 'x:arc.mojom.CloudProvisionFlowError', + 'x:arc.mojom.CommandResultType', + 'x:arc.mojom.CompanionLibApiId', + 'x:arc.mojom.ConnectionStateType', + 'x:arc.mojom.ContentChangeType', + 'x:arc.mojom.CpuRestrictionState', + 'x:arc.mojom.CursorCoordinateSpace', + 'x:arc.mojom.DataRestoreStatus', + 'x:arc.mojom.DecoderStatus', + 'x:arc.mojom.DeviceType', + 'x:arc.mojom.Digest', + 'x:arc.mojom.DisplayWakeLockType', + 'x:arc.mojom.EapMethod', + 'x:arc.mojom.EapPhase2Method', + 'x:arc.mojom.FileSelectorEventType', + 'x:arc.mojom.GMSCheckInError', + 'x:arc.mojom.GMSSignInError', + 'x:arc.mojom.GeneralSignInError', + 'x:arc.mojom.GetNetworksRequestType', + 'x:arc.mojom.HalPixelFormat', + 'x:arc.mojom.IPAddressType', + 'x:arc.mojom.InstallErrorReason', + 'x:arc.mojom.KeyFormat', + 'x:arc.mojom.KeyManagement', + 'x:arc.mojom.KeyPurpose', + 'x:arc.mojom.KeymasterError', + 'x:arc.mojom.MainAccountHashMigrationStatus', + 'x:arc.mojom.MainAccountResolutionStatus', + 'x:arc.mojom.ManagementChangeStatus', + 'x:arc.mojom.ManagementState', + 'x:arc.mojom.MessageCenterVisibility', + 'x:arc.mojom.MetricsType', + 'x:arc.mojom.MountEvent', + 'x:arc.mojom.NativeBridgeType', + 'x:arc.mojom.NetworkResult', + 'x:arc.mojom.NetworkType', + 'x:arc.mojom.OemCryptoAlgorithm', + 'x:arc.mojom.OemCryptoCipherMode', + 'x:arc.mojom.OemCryptoHdcpCapability', + 'x:arc.mojom.OemCryptoLicenseType', + 'x:arc.mojom.OemCryptoPrivateKey', + 'x:arc.mojom.OemCryptoProvisioningMethod', + 'x:arc.mojom.OemCryptoResult', + 'x:arc.mojom.OemCryptoRsaPaddingScheme', + 'x:arc.mojom.OemCryptoUsageEntryStatus', + 'x:arc.mojom.Padding', + 'x:arc.mojom.PaiFlowState', + 'x:arc.mojom.PatternType', + 'x:arc.mojom.PressureLevel', + 'x:arc.mojom.PrintColorMode', + 'x:arc.mojom.PrintContentType', + 'x:arc.mojom.PrintDuplexMode', + 'x:arc.mojom.PrinterStatus', + 'x:arc.mojom.ProcessState', + 'x:arc.mojom.PurchaseState', + 'x:arc.mojom.ReauthReason', + 'x:arc.mojom.ScaleFactor', + 'x:arc.mojom.SecurityType', + 'x:arc.mojom.SegmentStyle', + 'x:arc.mojom.SelectFilesActionType', + 'x:arc.mojom.SetNativeChromeVoxResponse', + 'x:arc.mojom.ShareFiles', + 'x:arc.mojom.ShowPackageInfoPage', + 'x:arc.mojom.SpanType', + 'x:arc.mojom.SupportedLinkChangeSource', + 'x:arc.mojom.TetheringClientState', + 'x:arc.mojom.TextInputType', + 'x:arc.mojom.TtsEventType', + 'x:arc.mojom.VideoCodecProfile', + 'x:arc.mojom.VideoDecodeAccelerator.Result', + 'x:arc.mojom.VideoEncodeAccelerator.Error', + 'x:arc.mojom.VideoFrameStorageType', + 'x:arc.mojom.VideoPixelFormat', + 'x:arc.mojom.WakefulnessMode', + 'x:arc.mojom.WebApkInstallResult', + 'x:ash.ime.mojom.InputFieldType', + 'x:ash.ime.mojom.PersonalizationMode', + 'x:blink.mojom.ScrollRestorationType', + 'x:chrome_cleaner.mojom.PromptAcceptance', + 'x:chromeos.cdm.mojom.CdmKeyStatus', + 'x:chromeos.cdm.mojom.CdmMessageType', + 'x:chromeos.cdm.mojom.CdmSessionType', + 'x:chromeos.cdm.mojom.DecryptStatus', + 'x:chromeos.cdm.mojom.EmeInitDataType', + 'x:chromeos.cdm.mojom.EncryptionScheme', + 'x:chromeos.cdm.mojom.HdcpVersion', + 'x:chromeos.cdm.mojom.OutputProtection.LinkType', + 'x:chromeos.cdm.mojom.OutputProtection.ProtectionType', + 'x:chromeos.cdm.mojom.PromiseException', + 'x:chromeos.cfm.mojom.EnqueuePriority', + 'x:chromeos.cfm.mojom.LoggerErrorCode', + 'x:chromeos.cfm.mojom.LoggerState', + 'x:chromeos.cros_healthd.mojom.CryptoAlgorithm', + 'x:chromeos.cros_healthd.mojom.EncryptionState', + 'x:chromeos.language.mojom.FeatureId', + 'x:chromeos.machine_learning.mojom.AnnotationUsecase', + 'x:chromeos.machine_learning.mojom.BuiltinModelId', + 'x:chromeos.machine_learning.mojom.CreateGraphExecutorResult', + 'x:chromeos.machine_learning.mojom.DocumentScannerResultStatus', + 'x:chromeos.machine_learning.mojom.EndpointReason', + 'x:chromeos.machine_learning.mojom.EndpointerType', + 'x:chromeos.machine_learning.mojom.ExecuteResult', + 'x:chromeos.machine_learning.mojom.GrammarCheckerResult.Status', + 'x:chromeos.machine_learning.mojom.HandwritingRecognizerResult.Status', + 'x:chromeos.machine_learning.mojom.LoadHandwritingModelResult', + 'x:chromeos.machine_learning.mojom.LoadModelResult', + 'x:chromeos.machine_learning.mojom.Rotation', + 'x:chromeos.network_config.mojom.ConnectionStateType', + 'x:chromeos.network_config.mojom.DeviceStateType', + 'x:chromeos.network_config.mojom.IPConfigType', + 'x:chromeos.network_config.mojom.NetworkType', + 'x:chromeos.network_config.mojom.OncSource', + 'x:chromeos.network_config.mojom.PolicySource', + 'x:chromeos.network_config.mojom.PortalState', + 'x:chromeos.network_diagnostics.mojom.ArcDnsResolutionProblem', + 'x:chromeos.network_diagnostics.mojom.ArcHttpProblem', + 'x:chromeos.network_diagnostics.mojom.ArcPingProblem', + 'x:chromeos.network_diagnostics.mojom.CaptivePortalProblem', + 'x:chromeos.network_diagnostics.mojom.DnsLatencyProblem', + 'x:chromeos.network_diagnostics.mojom.DnsResolutionProblem', + 'x:chromeos.network_diagnostics.mojom.DnsResolverPresentProblem', + 'x:chromeos.network_diagnostics.mojom.GatewayCanBePingedProblem', + 'x:chromeos.network_diagnostics.mojom.HasSecureWiFiConnectionProblem', + 'x:chromeos.network_diagnostics.mojom.HttpFirewallProblem', + 'x:chromeos.network_diagnostics.mojom.HttpsFirewallProblem', + 'x:chromeos.network_diagnostics.mojom.HttpsLatencyProblem', + 'x:chromeos.network_diagnostics.mojom.LanConnectivityProblem', + 'x:chromeos.network_diagnostics.mojom.RoutineType', + 'x:chromeos.network_diagnostics.mojom.RoutineVerdict', + 'x:chromeos.network_diagnostics.mojom.SignalStrengthProblem', + 'x:chromeos.network_diagnostics.mojom.VideoConferencingProblem', + 'x:chromeos.network_health.mojom.NetworkState', + 'x:chromeos.wilco_dtc_supportd.mojom.WilcoDtcSupportdEvent', + 'x:chromeos.wilco_dtc_supportd.mojom.WilcoDtcSupportdWebRequestHttpMethod', + 'x:chromeos.wilco_dtc_supportd.mojom.WilcoDtcSupportdWebRequestStatus', + 'x:cros.mojom.CameraClientType', + 'x:cros.mojom.CameraMetadataSectionStart', + 'x:cros.mojom.CameraMetadataTag', + 'x:cros.mojom.HalPixelFormat', + 'x:crosapi.mojom.AccountAdditionResult.Status', + 'x:crosapi.mojom.AccountType', + 'x:crosapi.mojom.AllowedPaths', + 'x:crosapi.mojom.BrowserAppInstanceType', + 'x:crosapi.mojom.CreationResult', + 'x:crosapi.mojom.DeviceAccessResultCode', + 'x:crosapi.mojom.DeviceMode', + 'x:crosapi.mojom.DlpRestrictionLevel', + 'x:crosapi.mojom.ExoImeSupport', + 'x:crosapi.mojom.FullscreenVisibility', + 'x:crosapi.mojom.GoogleServiceAuthError.InvalidGaiaCredentialsReason', + 'x:crosapi.mojom.GoogleServiceAuthError.State', + 'x:crosapi.mojom.IsInstallableResult', + 'x:crosapi.mojom.KeyTag', + 'x:crosapi.mojom.KeystoreSigningAlgorithmName', + 'x:crosapi.mojom.KeystoreType', + 'x:crosapi.mojom.LacrosFeedbackSource', + 'x:crosapi.mojom.MemoryPressureLevel', + 'x:crosapi.mojom.MetricsReportingManaged', + 'x:crosapi.mojom.NotificationType', + 'x:crosapi.mojom.OndeviceHandwritingSupport', + 'x:crosapi.mojom.OpenResult', + 'x:crosapi.mojom.PolicyDomain', + 'x:crosapi.mojom.RegistrationCodeType', + 'x:crosapi.mojom.ScaleFactor', + 'x:crosapi.mojom.SearchResult.OptionalBool', + 'x:crosapi.mojom.SelectFileDialogType', + 'x:crosapi.mojom.SelectFileResult', + 'x:crosapi.mojom.SharesheetResult', + 'x:crosapi.mojom.TouchEventType', + 'x:crosapi.mojom.VideoRotation', + 'x:crosapi.mojom.WallpaperLayout', + 'x:crosapi.mojom.WebAppInstallResultCode', + 'x:crosapi.mojom.WebAppUninstallResultCode', + 'x:device.mojom.HidBusType', + 'x:device.mojom.WakeLockReason', + 'x:device.mojom.WakeLockType', + 'x:drivefs.mojom.DialogReason.Type', + 'x:drivefs.mojom.DriveError.Type', + 'x:drivefs.mojom.DriveFsDelegate.ExtensionConnectionStatus', + 'x:drivefs.mojom.FileMetadata.CanPinStatus', + 'x:drivefs.mojom.FileMetadata.Type', + 'x:drivefs.mojom.ItemEventReason', + 'x:drivefs.mojom.MirrorPathStatus', + 'x:drivefs.mojom.MirrorSyncStatus', + 'x:drivefs.mojom.QueryParameters.SortField', + 'x:fuzz.mojom.FuzzEnum', + 'x:media.mojom.FillLightMode', + 'x:media.mojom.MeteringMode', + 'x:media.mojom.PowerLineFrequency', + 'x:media.mojom.RedEyeReduction', + 'x:media.mojom.ResolutionChangePolicy', + 'x:media.mojom.VideoCaptureApi', + 'x:media.mojom.VideoCaptureBufferType', + 'x:media.mojom.VideoCaptureError', + 'x:media.mojom.VideoCaptureFrameDropReason', + 'x:media.mojom.VideoCapturePixelFormat', + 'x:media.mojom.VideoCaptureTransportType', + 'x:media.mojom.VideoFacingMode', + 'x:media_session.mojom.AudioFocusType', + 'x:media_session.mojom.CameraState', + 'x:media_session.mojom.EnforcementMode', + 'x:media_session.mojom.MediaAudioVideoState', + 'x:media_session.mojom.MediaImageBitmapColorType', + 'x:media_session.mojom.MediaPictureInPictureState', + 'x:media_session.mojom.MediaPlaybackState', + 'x:media_session.mojom.MediaSession.SuspendType', + 'x:media_session.mojom.MediaSessionAction', + 'x:media_session.mojom.MediaSessionImageType', + 'x:media_session.mojom.MediaSessionInfo.SessionState', + 'x:media_session.mojom.MicrophoneState', + 'x:ml.model_loader.mojom.ComputeResult', + 'x:ml.model_loader.mojom.CreateModelLoaderResult', + 'x:ml.model_loader.mojom.LoadModelResult', + 'x:mojo.test.AnExtensibleEnum', + 'x:mojo.test.EnumB', + 'x:mojo.test.ExtensibleEmptyEnum', + 'x:mojo.test.enum_default_unittest.mojom.ExtensibleEnumWithoutDefault', + 'x:network.mojom.WebSandboxFlags', + 'x:payments.mojom.BillingResponseCode', + 'x:payments.mojom.CreateDigitalGoodsResponseCode', + 'x:payments.mojom.ItemType', + 'x:printing.mojom.PrinterType', + 'x:ui.mojom.KeyboardCode', +) +### DO NOT ADD ENTRIES TO THIS LIST. ### + + def _DuplicateName(values): """Returns the 'mojom_name' of the first entry in |values| whose 'mojom_name' has already been encountered. If there are no duplicates, returns None.""" @@ -626,11 +932,18 @@ for field in enum.fields: if field.default: if not enum.extensible: - raise Exception('Non-extensible enums may not specify a default') - if enum.default_field is not None: raise Exception( - 'Only one enumerator value may be specified as the default') + f'Non-extensible enum {enum.spec} may not specify a default') + if enum.default_field is not None: + raise Exception(f'Multiple [Default] enumerators in enum {enum.spec}') enum.default_field = field + # While running the backwards compatibility check, ignore errors because the + # old version of the enum might not specify [Default]. + if (enum.extensible and enum.default_field is None + and enum.spec not in _EXTENSIBLE_ENUMS_MISSING_DEFAULT + and not is_running_backwards_compatibility_check_hack): + raise Exception( + f'Extensible enum {enum.spec} must specify a [Default] enumerator') module.kinds[enum.spec] = enum
diff --git a/net/cert/ct_log_verifier.cc b/net/cert/ct_log_verifier.cc index 34d1080..f231491f 100644 --- a/net/cert/ct_log_verifier.cc +++ b/net/cert/ct_log_verifier.cc
@@ -283,7 +283,7 @@ // Right now, only RSASSA-PKCS1v15 with SHA-256 and ECDSA with SHA-256 are // supported. - switch (EVP_PKEY_type(public_key_->type)) { + switch (EVP_PKEY_id(public_key_)) { case EVP_PKEY_RSA: hash_algorithm_ = ct::DigitallySigned::HASH_ALGO_SHA256; signature_algorithm_ = ct::DigitallySigned::SIG_ALGO_RSA;
diff --git a/net/cert/internal/trust_store_chrome.cc b/net/cert/internal/trust_store_chrome.cc index 926c1207..6b824d6 100644 --- a/net/cert/internal/trust_store_chrome.cc +++ b/net/cert/internal/trust_store_chrome.cc
@@ -73,10 +73,12 @@ for (const auto& cert_info : certs) { bssl::UniquePtr<CRYPTO_BUFFER> cert; if (certs_are_static) { - // TODO(mattm,hchao): When the component updater is implemented, ensure - // the static data crypto_buffers for the compiled-in roots are kept - // alive, so that roots from the component updater data will de-dupe - // against them. + // TODO(mattm,hchao): Ensure the static data crypto_buffers for the + // compiled-in roots are kept alive, so that roots from the component + // updater data will de-dupe against them. This currently works if the + // new components roots are the same as the compiled in roots, but + // fails if a component update drops a root and then the next component + // update readds the root without a restart. cert = x509_util::CreateCryptoBufferFromStaticDataUnsafe( cert_info.root_cert_der); } else { @@ -86,8 +88,6 @@ auto parsed = ParsedCertificate::Create( std::move(cert), x509_util::DefaultParseCertificateOptions(), &errors); DCHECK(parsed); - // TODO(hchao): Figure out how to fail gracefully when the Chrome Root Store - // gets a bad component update. trust_store_.AddTrustAnchor(parsed); } version_ = version; @@ -130,4 +130,20 @@ return kRootStoreVersion; } +ParsedCertificateList CompiledChromeRootStoreAnchors() { + ParsedCertificateList parsed_cert_list; + for (const auto& cert_info : kChromeRootCertList) { + bssl::UniquePtr<CRYPTO_BUFFER> cert = + x509_util::CreateCryptoBufferFromStaticDataUnsafe( + cert_info.root_cert_der); + CertErrors errors; + auto parsed = ParsedCertificate::Create( + std::move(cert), x509_util::DefaultParseCertificateOptions(), &errors); + DCHECK(parsed); + parsed_cert_list.push_back(parsed); + } + + return parsed_cert_list; +} + } // namespace net
diff --git a/net/cert/internal/trust_store_chrome.h b/net/cert/internal/trust_store_chrome.h index 5f59e2c..48835f8 100644 --- a/net/cert/internal/trust_store_chrome.h +++ b/net/cert/internal/trust_store_chrome.h
@@ -89,6 +89,10 @@ // binary. NET_EXPORT int64_t CompiledChromeRootStoreVersion(); +// Returns the anchors of the Chrome Root Store that were compiled into the +// binary. +NET_EXPORT ParsedCertificateList CompiledChromeRootStoreAnchors(); + } // namespace net #endif // NET_CERT_INTERNAL_TRUST_STORE_CHROME_H_
diff --git a/net/cert/x509_certificate.cc b/net/cert/x509_certificate.cc index c04dd56..290dba8 100644 --- a/net/cert/x509_certificate.cc +++ b/net/cert/x509_certificate.cc
@@ -621,7 +621,7 @@ if (!pkey) return; - switch (pkey->type) { + switch (EVP_PKEY_id(pkey.get())) { case EVP_PKEY_RSA: *type = kPublicKeyTypeRSA; break;
diff --git a/net/dns/record_rdata.cc b/net/dns/record_rdata.cc index f5c7b68..4b655a7 100644 --- a/net/dns/record_rdata.cc +++ b/net/dns/record_rdata.cc
@@ -326,7 +326,8 @@ reader.ReadPiece(&opt_data, opt_data_size))) { return nullptr; } - rdata->opts_.emplace_back(opt_code, opt_data); + + rdata->opts_.emplace(opt_code, Opt(opt_code, opt_data)); } return rdata; @@ -357,18 +358,16 @@ writer.WriteBytes(opt_data.data(), opt_data.size()); DCHECK(success); - opts_.push_back(opt); + opts_.emplace(opt.code(), opt); } void OptRecordRdata::AddOpts(const OptRecordRdata& other) { buf_.insert(buf_.end(), other.buf_.begin(), other.buf_.end()); - opts_.insert(opts_.end(), other.opts_.begin(), other.opts_.end()); + opts_.insert(other.opts_.begin(), other.opts_.end()); } bool OptRecordRdata::ContainsOptCode(uint16_t opt_code) const { - return std::any_of( - opts_.begin(), opts_.end(), - [=](const OptRecordRdata::Opt& opt) { return opt.code() == opt_code; }); + return opts_.find(opt_code) != opts_.end(); } OptRecordRdata::Opt::Opt(uint16_t code, base::StringPiece data)
diff --git a/net/dns/record_rdata.h b/net/dns/record_rdata.h index 6aae981d..c7507670 100644 --- a/net/dns/record_rdata.h +++ b/net/dns/record_rdata.h
@@ -7,6 +7,7 @@ #include <stdint.h> +#include <map> #include <memory> #include <string> #include <vector> @@ -265,17 +266,19 @@ uint16_t Type() const override; const std::vector<char>& buf() const { return buf_; } + const std::multimap<uint16_t, Opt>& opts() { return opts_; } - const std::vector<Opt>& opts() const { return opts_; } void AddOpt(const Opt& opt); // Add all Opts from |other| to |this|. void AddOpts(const OptRecordRdata& other); + // Checks if an Opt with the specified opt_code is in opts_. bool ContainsOptCode(uint16_t opt_code) const; private: - std::vector<Opt> opts_; + // Opt objects are stored in a multimap; key is the opt code. + std::multimap<uint16_t, Opt> opts_; std::vector<char> buf_; };
diff --git a/net/dns/record_rdata_unittest.cc b/net/dns/record_rdata_unittest.cc index 2f27a63..fbd5e26f 100644 --- a/net/dns/record_rdata_unittest.cc +++ b/net/dns/record_rdata_unittest.cc
@@ -260,12 +260,16 @@ std::unique_ptr<OptRecordRdata> rdata_obj = OptRecordRdata::Create(rdata_strpiece, parser); + ASSERT_THAT(rdata_obj, NotNull()); ASSERT_THAT(rdata_obj->opts(), SizeIs(2)); - ASSERT_EQ(1, rdata_obj->opts()[0].code()); - ASSERT_EQ("\xde\xad", rdata_obj->opts()[0].data()); - ASSERT_EQ(255, rdata_obj->opts()[1].code()); - ASSERT_EQ("\xde\xad\xbe\xef", rdata_obj->opts()[1].data()); + + EXPECT_THAT( + rdata_obj->opts(), + testing::UnorderedElementsAre( + std::make_pair(1, OptRecordRdata::Opt(1, "\xde\xad")), + std::make_pair(255, OptRecordRdata::Opt(255, "\xde\xad\xbe\xef")))); + ASSERT_TRUE(rdata_obj->IsEqual(rdata_obj.get())); }
diff --git a/net/http/transport_security_state_static.pins b/net/http/transport_security_state_static.pins index 5132cb8..6fb0f728 100644 --- a/net/http/transport_security_state_static.pins +++ b/net/http/transport_security_state_static.pins
@@ -43,9 +43,9 @@ # hash function for preloaded entries again (we have already done so once). # -# Last updated: 2022-07-14 12:54 UTC +# Last updated: 2022-07-15 12:55 UTC PinsListTimestamp -1657803288 +1657889712 TestSPKI sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff --git a/remoting/host/it2me/it2me_host.cc b/remoting/host/it2me/it2me_host.cc index c771803..a4f01cd 100644 --- a/remoting/host/it2me/it2me_host.cc +++ b/remoting/host/it2me/it2me_host.cc
@@ -385,7 +385,7 @@ if (policies->GetList(policy::key::kRemoteAccessHostDomainList, &host_domain_list)) { std::vector<std::string> host_domain_list_vector; - for (const auto& value : host_domain_list->GetListDeprecated()) { + for (const auto& value : host_domain_list->GetList()) { host_domain_list_vector.push_back(value.GetString()); } UpdateHostDomainListPolicy(std::move(host_domain_list_vector)); @@ -395,7 +395,7 @@ if (policies->GetList(policy::key::kRemoteAccessHostClientDomainList, &client_domain_list)) { std::vector<std::string> client_domain_list_vector; - for (const auto& value : client_domain_list->GetListDeprecated()) { + for (const auto& value : client_domain_list->GetList()) { client_domain_list_vector.push_back(value.GetString()); } UpdateClientDomainListPolicy(std::move(client_domain_list_vector));
diff --git a/remoting/host/it2me/it2me_native_messaging_host.cc b/remoting/host/it2me/it2me_native_messaging_host.cc index df70b8d7..6d140e0f 100644 --- a/remoting/host/it2me/it2me_native_messaging_host.cc +++ b/remoting/host/it2me/it2me_native_messaging_host.cc
@@ -182,11 +182,12 @@ // No need to forward to the elevated process since no internal state is set. - base::Value features(base::Value::Type::LIST); + base::Value::List features; features.Append(kFeatureAccessTokenAuth); features.Append(kFeatureDelegatedSignaling); - ProcessNativeMessageHelloResponse(*response, std::move(features)); + ProcessNativeMessageHelloResponse(*response, + base::Value(std::move(features))); SendMessageToClient(std::move(response)); }
diff --git a/remoting/host/it2me/it2me_native_messaging_host_ash.cc b/remoting/host/it2me/it2me_native_messaging_host_ash.cc index 697156b..3f5fa46 100644 --- a/remoting/host/it2me/it2me_native_messaging_host_ash.cc +++ b/remoting/host/it2me/it2me_native_messaging_host_ash.cc
@@ -110,18 +110,18 @@ connected_callback_ = std::move(connected_callback); disconnected_callback_ = std::move(disconnected_callback); - base::Value message(base::Value::Type::DICTIONARY); - message.SetStringKey(kMessageType, kConnectMessage); + base::Value::Dict message; + message.Set(kMessageType, kConnectMessage); - message.SetStringKey(kUserName, params->user_name); - message.SetStringKey(kAuthServiceWithToken, params->oauth_access_token); - message.SetBoolKey(kSuppressUserDialogs, - ShouldSuppressUserDialog(*params, enterprise_params)); - message.SetBoolKey(kSuppressNotifications, - ShouldSuppressNotifications(*params, enterprise_params)); - message.SetBoolKey(kTerminateUponInput, - ShouldTerminateUponInput(*params, enterprise_params)); - message.SetBoolKey(kIsEnterpriseAdminUser, enterprise_params.has_value()); + message.Set(kUserName, params->user_name); + message.Set(kAuthServiceWithToken, params->oauth_access_token); + message.Set(kSuppressUserDialogs, + ShouldSuppressUserDialog(*params, enterprise_params)); + message.Set(kSuppressNotifications, + ShouldSuppressNotifications(*params, enterprise_params)); + message.Set(kTerminateUponInput, + ShouldTerminateUponInput(*params, enterprise_params)); + message.Set(kIsEnterpriseAdminUser, enterprise_params.has_value()); std::string message_json; base::JSONWriter::Write(message, &message_json); @@ -130,8 +130,8 @@ void It2MeNativeMessageHostAsh::Disconnect() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - base::Value message(base::Value::Type::DICTIONARY); - message.SetStringKey(kMessageType, kDisconnectMessage); + base::Value::Dict message; + message.Set(kMessageType, kDisconnectMessage); std::string message_json; base::JSONWriter::Write(message, &message_json);
diff --git a/remoting/host/it2me/it2me_native_messaging_host_lacros.cc b/remoting/host/it2me/it2me_native_messaging_host_lacros.cc index ba97d13..ee2a5fcc 100644 --- a/remoting/host/it2me/it2me_native_messaging_host_lacros.cc +++ b/remoting/host/it2me/it2me_native_messaging_host_lacros.cc
@@ -92,13 +92,12 @@ void ProcessHello(int message_id); void ProcessConnect(int message_id, base::Value message); void ProcessDisconnect(int message_id); - void SendMessageToClient(base::Value message) const; + void SendMessageToClient(base::Value::Dict message) const; void SendErrorAndExit(const protocol::ErrorCode error_code, int message_id = kInvalidMessageId) const; - void HandleHostStateChange( - It2MeHostState state, - base::Value message = base::Value(base::Value::Type::DICTIONARY)); + void HandleHostStateChange(It2MeHostState state, + base::Value::Dict message = base::Value::Dict()); SEQUENCE_CHECKER(sequence_checker_); @@ -188,9 +187,9 @@ const std::string& access_code, base::TimeDelta lifetime) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - base::Value message(base::Value::Type::DICTIONARY); - message.SetStringKey(kAccessCode, access_code); - message.SetIntKey(kAccessCodeLifetime, lifetime.InSeconds()); + base::Value::Dict message; + message.Set(kAccessCode, access_code); + message.Set(kAccessCodeLifetime, static_cast<int>(lifetime.InSeconds())); HandleHostStateChange(It2MeHostState::kReceivedAccessCode, std::move(message)); } @@ -203,17 +202,17 @@ void It2MeNativeMessagingHostLacros::OnHostStateConnected( const std::string& remote_username) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - base::Value message(base::Value::Type::DICTIONARY); - message.SetStringKey(kClient, remote_username); + base::Value::Dict message; + message.Set(kClient, remote_username); HandleHostStateChange(It2MeHostState::kConnected, std::move(message)); } void It2MeNativeMessagingHostLacros::OnHostStateDisconnected( const absl::optional<std::string>& disconnect_reason) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - base::Value message(base::Value::Type::DICTIONARY); + base::Value::Dict message; if (disconnect_reason.has_value()) { - message.SetStringKey(kDisconnectReason, disconnect_reason.value()); + message.Set(kDisconnectReason, disconnect_reason.value()); } HandleHostStateChange(It2MeHostState::kDisconnected, std::move(message)); } @@ -221,12 +220,11 @@ void It2MeNativeMessagingHostLacros::OnNatPolicyChanged( mojom::NatPolicyStatePtr policy_state) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - base::Value message(base::Value::Type::DICTIONARY); - message.SetStringKey(kMessageType, kNatPolicyChangedMessage); - message.SetBoolKey(kNatPolicyChangedMessageNatEnabled, - policy_state->nat_enabled); - message.SetBoolKey(kNatPolicyChangedMessageRelayEnabled, - policy_state->relay_enabled); + base::Value::Dict message; + message.Set(kMessageType, kNatPolicyChangedMessage); + message.Set(kNatPolicyChangedMessageNatEnabled, policy_state->nat_enabled); + message.Set(kNatPolicyChangedMessageRelayEnabled, + policy_state->relay_enabled); SendMessageToClient(std::move(message)); } @@ -240,8 +238,8 @@ void It2MeNativeMessagingHostLacros::OnPolicyError() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - base::Value response(base::Value::Type::DICTIONARY); - response.SetStringKey(kMessageType, kPolicyErrorMessage); + base::Value::Dict response; + response.Set(kMessageType, kPolicyErrorMessage); SendMessageToClient(std::move(response)); client_->CloseChannel(std::string()); } @@ -253,38 +251,36 @@ void It2MeNativeMessagingHostLacros::HandleHostStateChange( It2MeHostState state, - base::Value message) { - DCHECK(message.is_dict()); - - message.SetStringKey(kMessageType, kHostStateChangedMessage); + base::Value::Dict message) { + message.Set(kMessageType, kHostStateChangedMessage); switch (state) { case It2MeHostState::kStarting: - message.SetStringKey(kState, kHostStateStarting); + message.Set(kState, kHostStateStarting); break; case It2MeHostState::kRequestedAccessCode: - message.SetStringKey(kState, kHostStateRequestedAccessCode); + message.Set(kState, kHostStateRequestedAccessCode); break; case It2MeHostState::kReceivedAccessCode: - message.SetStringKey(kState, kHostStateReceivedAccessCode); + message.Set(kState, kHostStateReceivedAccessCode); break; case It2MeHostState::kConnecting: - message.SetStringKey(kState, kHostStateConnecting); + message.Set(kState, kHostStateConnecting); break; case It2MeHostState::kConnected: - message.SetStringKey(kState, kHostStateConnected); + message.Set(kState, kHostStateConnected); break; case It2MeHostState::kDisconnected: - message.SetStringKey(kState, kHostStateDisconnected); + message.Set(kState, kHostStateDisconnected); break; case It2MeHostState::kInvalidDomainError: - message.SetStringKey(kState, kHostStateDomainError); + message.Set(kState, kHostStateDomainError); break; default: @@ -322,11 +318,11 @@ support_host_observer_.Bind(std::move(mojo_response->get_observer())); - base::Value response(base::Value::Type::DICTIONARY); - response.SetStringKey(kMessageType, kConnectResponse); + base::Value::Dict response; + response.Set(kMessageType, kConnectResponse); if (response_id != kInvalidMessageId) { - response.SetIntKey(kMessageId, response_id); + response.Set(kMessageId, response_id); } SendMessageToClient(std::move(response)); @@ -341,19 +337,19 @@ return; } - base::Value response(base::Value::Type::DICTIONARY); - response.SetStringKey(kMessageType, kHelloResponse); + base::Value::Dict response; + response.Set(kMessageType, kHelloResponse); if (message_id != kInvalidMessageId) { - response.SetIntKey(kMessageId, message_id); + response.Set(kMessageId, message_id); } - response.SetStringKey(kHostVersion, host_details_.get()->host_version); + response.Set(kHostVersion, host_details_.get()->host_version); - std::vector<base::Value> features; + base::Value::List features; for (const auto& feature : host_details_.get()->supported_features) { - features.emplace_back(base::Value(feature)); + features.Append(feature); } - response.SetKey(kSupportedFeatures, base::Value(std::move(features))); + response.Set(kSupportedFeatures, std::move(features)); SendMessageToClient(std::move(response)); } @@ -368,7 +364,7 @@ mojom::SupportSessionParamsPtr session_params = mojom::SupportSessionParams::New(); - const std::string* user_name = message.FindStringKey(kUserName); + const std::string* user_name = message.GetDict().FindString(kUserName); if (!user_name) { SendErrorAndExit(protocol::ErrorCode::INCOMPATIBLE_PROTOCOL, message_id); return; @@ -376,7 +372,7 @@ session_params->user_name = *user_name; const std::string* access_token = - message.FindStringKey(kAuthServiceWithToken); + message.GetDict().FindString(kAuthServiceWithToken); if (!access_token) { SendErrorAndExit(protocol::ErrorCode::INCOMPATIBLE_PROTOCOL, message_id); return; @@ -406,18 +402,18 @@ // will cause a message to be sent to the client so it can update its UI. HandleHostStateChange(It2MeHostState::kDisconnected); - base::Value response(base::Value::Type::DICTIONARY); - response.SetStringKey(kMessageType, kDisconnectResponse); + base::Value::Dict response; + response.Set(kMessageType, kDisconnectResponse); if (message_id != kInvalidMessageId) { - response.SetIntKey(kMessageId, message_id); + response.Set(kMessageId, message_id); } SendMessageToClient(std::move(response)); } void It2MeNativeMessagingHostLacros::SendMessageToClient( - base::Value message) const { + base::Value::Dict message) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); std::string message_json; base::JSONWriter::Write(message, &message_json); @@ -428,14 +424,14 @@ const protocol::ErrorCode error_code, int message_id) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - base::Value message(base::Value::Type::DICTIONARY); + base::Value::Dict message; - message.SetStringKey(kMessageType, kErrorMessage); + message.Set(kMessageType, kErrorMessage); if (message_id != kInvalidMessageId) { - message.SetIntKey(kMessageId, message_id); + message.Set(kMessageId, message_id); } - message.SetStringKey(kErrorMessageCode, ErrorCodeToString(error_code)); - message.SetStringKey(kErrorMessageDescription, ErrorCodeToString(error_code)); + message.Set(kErrorMessageCode, ErrorCodeToString(error_code)); + message.Set(kErrorMessageDescription, ErrorCodeToString(error_code)); SendMessageToClient(std::move(message));
diff --git a/sandbox/policy/win/sandbox_win.cc b/sandbox/policy/win/sandbox_win.cc index f83aa27..7246e7e 100644 --- a/sandbox/policy/win/sandbox_win.cc +++ b/sandbox/policy/win/sandbox_win.cc
@@ -164,7 +164,7 @@ bool AddDirectory(int path, const wchar_t* sub_dir, bool children, - TargetPolicy::Semantics access, + Semantics access, TargetPolicy* policy) { base::FilePath directory; if (!base::PathService::Get(path, &directory)) @@ -174,8 +174,8 @@ directory = base::MakeAbsoluteFilePath(directory.Append(sub_dir)); ResultCode result; - result = policy->AddRule(TargetPolicy::SUBSYS_FILES, access, - directory.value().c_str()); + result = + policy->AddRule(SubSystem::kFiles, access, directory.value().c_str()); if (result != SBOX_ALL_OK) return false; @@ -184,8 +184,7 @@ directory_str += L"*"; // Otherwise, add the version of the path that ends with a separator. - result = policy->AddRule(TargetPolicy::SUBSYS_FILES, access, - directory_str.c_str()); + result = policy->AddRule(SubSystem::kFiles, access, directory_str.c_str()); if (result != SBOX_ALL_OK) return false; @@ -331,17 +330,16 @@ // Add the policy for the client side of a pipe. It is just a file // in the \pipe\ namespace. We restrict it to pipes that start with // "chrome." so the sandboxed process cannot connect to system services. - result = - policy->AddRule(TargetPolicy::SUBSYS_FILES, TargetPolicy::FILES_ALLOW_ANY, - L"\\??\\pipe\\chrome.*"); + result = policy->AddRule(SubSystem::kFiles, Semantics::kFilesAllowAny, + L"\\??\\pipe\\chrome.*"); if (result != SBOX_ALL_OK) return result; // Allow the server side of sync sockets, which are pipes that have // the "chrome.sync" namespace and a randomly generated suffix. - result = policy->AddRule(TargetPolicy::SUBSYS_NAMED_PIPES, - TargetPolicy::NAMEDPIPES_ALLOW_ANY, - L"\\\\.\\pipe\\chrome.sync.*"); + result = + policy->AddRule(SubSystem::kNamedPipes, Semantics::kNamedPipesAllowAny, + L"\\\\.\\pipe\\chrome.sync.*"); if (result != SBOX_ALL_OK) return result; @@ -351,8 +349,7 @@ if (!base::PathService::Get(base::FILE_EXE, &exe)) return SBOX_ERROR_GENERIC; base::FilePath pdb_path = exe.DirName().Append(L"*.pdb"); - result = policy->AddRule(TargetPolicy::SUBSYS_FILES, - TargetPolicy::FILES_ALLOW_READONLY, + result = policy->AddRule(SubSystem::kFiles, Semantics::kFilesAllowReadonly, pdb_path.value().c_str()); if (result != SBOX_ALL_OK) return result; @@ -372,8 +369,7 @@ CHECK(coverage_dir.size() == coverage_dir_size); base::FilePath sancov_path = base::FilePath(coverage_dir).Append(L"*.sancov"); - result = policy->AddRule(TargetPolicy::SUBSYS_FILES, - TargetPolicy::FILES_ALLOW_ANY, + result = policy->AddRule(SubSystem::kFiles, Semantics::kFilesAllowAny, sancov_path.value().c_str()); if (result != SBOX_ALL_OK) return result; @@ -859,8 +855,8 @@ if (result != SBOX_ALL_OK) return result; - return policy->AddRule(TargetPolicy::SUBSYS_WIN32K_LOCKDOWN, - TargetPolicy::FAKE_USER_GDI_INIT, nullptr); + return policy->AddRule(SubSystem::kWin32kLockdown, Semantics::kFakeGdiInit, + nullptr); #else return SBOX_ALL_OK; #endif @@ -1069,7 +1065,7 @@ process_type == switches::kPpapiPluginProcess || sandbox_type == Sandbox::kPrintCompositor) { AddDirectory(base::DIR_WINDOWS_FONTS, NULL, true, - TargetPolicy::FILES_ALLOW_READONLY, policy); + Semantics::kFilesAllowReadonly, policy); } #endif @@ -1095,8 +1091,7 @@ process_type == switches::kUtilityProcess) { if (logging::IsLoggingToFileEnabled()) { DCHECK(base::FilePath(logging::GetLogFileFullPath()).IsAbsolute()); - result = policy->AddRule(TargetPolicy::SUBSYS_FILES, - TargetPolicy::FILES_ALLOW_ANY, + result = policy->AddRule(SubSystem::kFiles, Semantics::kFilesAllowAny, logging::GetLogFileFullPath().c_str()); if (result != SBOX_ALL_OK) return result;
diff --git a/sandbox/win/fuzzer/sandbox_policy_rule_fuzzer.cc b/sandbox/win/fuzzer/sandbox_policy_rule_fuzzer.cc index 1396f3cf..6a7d2499 100644 --- a/sandbox/win/fuzzer/sandbox_policy_rule_fuzzer.cc +++ b/sandbox/win/fuzzer/sandbox_policy_rule_fuzzer.cc
@@ -21,19 +21,18 @@ std::unique_ptr<sandbox::PolicyBase> InitPolicy() { auto policy = std::make_unique<sandbox::PolicyBase>(); - policy->AddRule(sandbox::TargetPolicy::SUBSYS_WIN32K_LOCKDOWN, - sandbox::TargetPolicy::FAKE_USER_GDI_INIT, nullptr); + policy->AddRule(sandbox::SubSystem::kWin32kLockdown, + sandbox::Semantics::kFakeGdiInit, nullptr); - policy->AddRule(sandbox::TargetPolicy::SUBSYS_FILES, - sandbox::TargetPolicy::FILES_ALLOW_ANY, - L"\\??\\pipe\\chrome.*"); + policy->AddRule(sandbox::SubSystem::kFiles, + sandbox::Semantics::kFilesAllowAny, L"\\??\\pipe\\chrome.*"); - policy->AddRule(sandbox::TargetPolicy::SUBSYS_NAMED_PIPES, - sandbox::TargetPolicy::NAMEDPIPES_ALLOW_ANY, + policy->AddRule(sandbox::SubSystem::kNamedPipes, + sandbox::Semantics::kNamedPipesAllowAny, L"\\\\.\\pipe\\chrome.nacl.*"); - policy->AddRule(sandbox::TargetPolicy::SUBSYS_NAMED_PIPES, - sandbox::TargetPolicy::NAMEDPIPES_ALLOW_ANY, + policy->AddRule(sandbox::SubSystem::kNamedPipes, + sandbox::Semantics::kNamedPipesAllowAny, L"\\\\.\\pipe\\chrome.sync.*"); return policy;
diff --git a/sandbox/win/src/address_sanitizer_test.cc b/sandbox/win/src/address_sanitizer_test.cc index 69c8829..32236a3 100644 --- a/sandbox/win/src/address_sanitizer_test.cc +++ b/sandbox/win/src/address_sanitizer_test.cc
@@ -81,7 +81,7 @@ base::FilePath exe; ASSERT_TRUE(base::PathService::Get(base::FILE_EXE, &exe)); base::FilePath pdb_path = exe.DirName().Append(L"*.pdb"); - ASSERT_TRUE(runner.AddFsRule(TargetPolicy::FILES_ALLOW_READONLY, + ASSERT_TRUE(runner.AddFsRule(Semantics::kFilesAllowReadonly, pdb_path.value().c_str())); env_->SetVar("ASAN_OPTIONS", "exitcode=123");
diff --git a/sandbox/win/src/app_container_test.cc b/sandbox/win/src/app_container_test.cc index 52b8410..248d580 100644 --- a/sandbox/win/src/app_container_test.cc +++ b/sandbox/win/src/app_container_test.cc
@@ -962,8 +962,8 @@ } if (ShouldBrokerRuleBeAdded()) { TargetPolicy* policy = runner_.GetPolicy(); - policy->AddRule(TargetPolicy::SUBSYS_SOCKET, - TargetPolicy::SOCKET_ALLOW_BROKER, nullptr); + policy->AddRule(SubSystem::kSocket, Semantics::kSocketAllowBroker, + nullptr); } }
diff --git a/sandbox/win/src/file_policy_test.cc b/sandbox/win/src/file_policy_test.cc index dd02b5c..9e6f114 100644 --- a/sandbox/win/src/file_policy_test.cc +++ b/sandbox/win/src/file_policy_test.cc
@@ -274,12 +274,12 @@ TEST(FilePolicyTest, DenyNtCreateCalc) { TestRunner runner; - EXPECT_TRUE(runner.AddRuleSys32(TargetPolicy::FILES_ALLOW_ANY, L"calc.txt")); + EXPECT_TRUE(runner.AddRuleSys32(Semantics::kFilesAllowAny, L"calc.txt")); EXPECT_EQ(SBOX_TEST_DENIED, runner.RunTest(L"File_CreateSys32 calc.exe")); TestRunner before_revert; EXPECT_TRUE( - before_revert.AddRuleSys32(TargetPolicy::FILES_ALLOW_ANY, L"calc.txt")); + before_revert.AddRuleSys32(Semantics::kFilesAllowAny, L"calc.txt")); before_revert.SetTestState(BEFORE_REVERT); EXPECT_EQ(SBOX_TEST_SUCCEEDED, before_revert.RunTest(L"File_CreateSys32 calc.exe")); @@ -287,12 +287,12 @@ TEST(FilePolicyTest, AllowNtCreateCalc) { TestRunner runner; - EXPECT_TRUE(runner.AddRuleSys32(TargetPolicy::FILES_ALLOW_ANY, L"calc.exe")); + EXPECT_TRUE(runner.AddRuleSys32(Semantics::kFilesAllowAny, L"calc.exe")); EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(L"File_CreateSys32 calc.exe")); TestRunner before_revert; EXPECT_TRUE( - before_revert.AddRuleSys32(TargetPolicy::FILES_ALLOW_ANY, L"calc.exe")); + before_revert.AddRuleSys32(Semantics::kFilesAllowAny, L"calc.exe")); before_revert.SetTestState(BEFORE_REVERT); EXPECT_EQ(SBOX_TEST_SUCCEEDED, before_revert.RunTest(L"File_CreateSys32 calc.exe")); @@ -304,13 +304,13 @@ ASSERT_TRUE(GetNtPathFromWin32Path(calc, &nt_path)); TestRunner runner; - runner.AddFsRule(TargetPolicy::FILES_ALLOW_READONLY, nt_path.c_str()); + runner.AddFsRule(Semantics::kFilesAllowReadonly, nt_path.c_str()); wchar_t buff[MAX_PATH]; ::wsprintfW(buff, L"File_CreateSys32 %s", nt_path.c_str()); EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(buff)); TestRunner runner2; - runner2.AddFsRule(TargetPolicy::FILES_ALLOW_READONLY, nt_path.c_str()); + runner2.AddFsRule(Semantics::kFilesAllowReadonly, nt_path.c_str()); for (wchar_t& c : nt_path) c = std::tolower(c); ::wsprintfW(buff, L"File_CreateSys32 %s", nt_path.c_str()); @@ -320,7 +320,7 @@ std::unique_ptr<TestRunner> AllowReadOnlyRunner(wchar_t* temp_file_name) { auto runner = std::make_unique<TestRunner>(); EXPECT_TRUE( - runner->AddFsRule(TargetPolicy::FILES_ALLOW_READONLY, temp_file_name)); + runner->AddFsRule(Semantics::kFilesAllowReadonly, temp_file_name)); return runner; } @@ -380,7 +380,7 @@ TestRunner runner_with_rule; EXPECT_TRUE( - runner_with_rule.AddFsRule(TargetPolicy::FILES_ALLOW_ANY, path.c_str())); + runner_with_rule.AddFsRule(Semantics::kFilesAllowAny, path.c_str())); EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner_with_rule.RunTest(command)); DeleteFile(temp_file_name); @@ -396,7 +396,7 @@ ASSERT_NE(::GetTempFileName(temp_directory, L"test", 0, temp_file_name), 0u); wcscat_s(temp_directory, MAX_PATH, L"*"); - EXPECT_TRUE(runner.AddFsRule(TargetPolicy::FILES_ALLOW_ANY, temp_directory)); + EXPECT_TRUE(runner.AddFsRule(Semantics::kFilesAllowAny, temp_directory)); wchar_t command_write[MAX_PATH + 20] = {}; wsprintf(command_write, L"File_Create Write \"%ls\"", temp_file_name); @@ -409,7 +409,7 @@ std::unique_ptr<TestRunner> AllowNtCreatePatternRunner() { auto runner = std::make_unique<TestRunner>(); - EXPECT_TRUE(runner->AddRuleSys32(TargetPolicy::FILES_ALLOW_ANY, L"App*.dll")); + EXPECT_TRUE(runner->AddRuleSys32(Semantics::kFilesAllowAny, L"App*.dll")); return runner; } @@ -433,7 +433,7 @@ TEST(FilePolicyTest, CheckNotFound) { TestRunner runner; - EXPECT_TRUE(runner.AddRuleSys32(TargetPolicy::FILES_ALLOW_ANY, L"n*.dll")); + EXPECT_TRUE(runner.AddRuleSys32(Semantics::kFilesAllowAny, L"n*.dll")); EXPECT_EQ(SBOX_TEST_NOT_FOUND, runner.RunTest(L"File_OpenSys32 notfound.dll")); @@ -446,13 +446,11 @@ std::unique_ptr<TestRunner> QueryAttributesFileRunner() { auto runner = std::make_unique<TestRunner>(); + EXPECT_TRUE(runner->AddRuleSys32(Semantics::kFilesAllowAny, L"apphelp.dll")); + EXPECT_TRUE(runner->AddRuleSys32(Semantics::kFilesAllowAny, L"notfound.exe")); + EXPECT_TRUE(runner->AddRuleSys32(Semantics::kFilesAllowAny, L"drivers")); EXPECT_TRUE( - runner->AddRuleSys32(TargetPolicy::FILES_ALLOW_ANY, L"apphelp.dll")); - EXPECT_TRUE( - runner->AddRuleSys32(TargetPolicy::FILES_ALLOW_ANY, L"notfound.exe")); - EXPECT_TRUE(runner->AddRuleSys32(TargetPolicy::FILES_ALLOW_ANY, L"drivers")); - EXPECT_TRUE( - runner->AddRuleSys32(TargetPolicy::FILES_ALLOW_QUERY, L"ipconfig.exe")); + runner->AddRuleSys32(Semantics::kFilesAllowQuery, L"ipconfig.exe")); return runner; } @@ -495,19 +493,19 @@ std::vector<std::wstring>& temp_files) { auto runner = std::make_unique<TestRunner>(); // Add rules to make file0->file1 succeed. - runner->AddFsRule(TargetPolicy::FILES_ALLOW_ANY, temp_files[0].c_str()); - runner->AddFsRule(TargetPolicy::FILES_ALLOW_ANY, temp_files[1].c_str()); + runner->AddFsRule(Semantics::kFilesAllowAny, temp_files[0].c_str()); + runner->AddFsRule(Semantics::kFilesAllowAny, temp_files[1].c_str()); // Add rules to make file2->file3 fail. - runner->AddFsRule(TargetPolicy::FILES_ALLOW_ANY, temp_files[2].c_str()); - runner->AddFsRule(TargetPolicy::FILES_ALLOW_READONLY, temp_files[3].c_str()); + runner->AddFsRule(Semantics::kFilesAllowAny, temp_files[2].c_str()); + runner->AddFsRule(Semantics::kFilesAllowReadonly, temp_files[3].c_str()); // Add rules to make file4->file5 fail. - runner->AddFsRule(TargetPolicy::FILES_ALLOW_READONLY, temp_files[4].c_str()); - runner->AddFsRule(TargetPolicy::FILES_ALLOW_ANY, temp_files[5].c_str()); + runner->AddFsRule(Semantics::kFilesAllowReadonly, temp_files[4].c_str()); + runner->AddFsRule(Semantics::kFilesAllowAny, temp_files[5].c_str()); // Add rules to make file6->no_pol_file fail. - runner->AddFsRule(TargetPolicy::FILES_ALLOW_ANY, temp_files[6].c_str()); + runner->AddFsRule(Semantics::kFilesAllowAny, temp_files[6].c_str()); return runner; } @@ -558,7 +556,7 @@ std::unique_ptr<TestRunner> AllowNotepadRunner() { auto runner = std::make_unique<TestRunner>(); - runner->AddRuleSys32(TargetPolicy::FILES_ALLOW_ANY, L"notepad.exe"); + runner->AddRuleSys32(Semantics::kFilesAllowAny, L"notepad.exe"); return runner; } @@ -582,7 +580,7 @@ std::unique_ptr<TestRunner> FileGetDiskSpaceRunner() { auto runner = std::make_unique<TestRunner>(); - runner->AddRuleSys32(TargetPolicy::FILES_ALLOW_READONLY, L""); + runner->AddRuleSys32(Semantics::kFilesAllowReadonly, L""); return runner; } @@ -613,7 +611,7 @@ std::unique_ptr<TestRunner> ReparsePointRunner( std::wstring& temp_dir_wildcard) { auto runner = std::make_unique<TestRunner>(); - runner->AddFsRule(TargetPolicy::FILES_ALLOW_ANY, temp_dir_wildcard.c_str()); + runner->AddFsRule(Semantics::kFilesAllowAny, temp_dir_wildcard.c_str()); return runner; } @@ -726,8 +724,7 @@ runner.SetTimeout(2000); // Allow read access to calc.exe, this should be on all Windows versions. - ASSERT_TRUE( - runner.AddRuleSys32(TargetPolicy::FILES_ALLOW_READONLY, L"calc.exe")); + ASSERT_TRUE(runner.AddRuleSys32(Semantics::kFilesAllowReadonly, L"calc.exe")); sandbox::TargetPolicy* policy = runner.GetPolicy();
diff --git a/sandbox/win/src/filesystem_policy.cc b/sandbox/win/src/filesystem_policy.cc index 25fe202..03c67673 100644 --- a/sandbox/win/src/filesystem_policy.cc +++ b/sandbox/win/src/filesystem_policy.cc
@@ -72,7 +72,7 @@ namespace sandbox { bool FileSystemPolicy::GenerateRules(const wchar_t* name, - TargetPolicy::Semantics semantics, + Semantics semantics, LowLevelPolicy* policy) { std::wstring mod_name(name); if (mod_name.empty()) { @@ -114,7 +114,7 @@ PolicyRule rename(result); switch (semantics) { - case TargetPolicy::FILES_ALLOW_READONLY: { + case Semantics::kFilesAllowReadonly: { // We consider all flags that are not known to be readonly as potentially // used for write. DWORD allowed_flags = FILE_READ_DATA | FILE_READ_ATTRIBUTES | @@ -130,13 +130,13 @@ rule_to_add &= ~kCallNtSetInfoRename; break; } - case TargetPolicy::FILES_ALLOW_QUERY: { + case Semantics::kFilesAllowQuery: { // Here we don't want to add policy for the open or the create. rule_to_add &= ~(kCallNtOpenFile | kCallNtCreateFile | kCallNtSetInfoRename); break; } - case TargetPolicy::FILES_ALLOW_ANY: { + case Semantics::kFilesAllowAny: { break; } default: {
diff --git a/sandbox/win/src/filesystem_policy.h b/sandbox/win/src/filesystem_policy.h index e42b245..903cae52 100644 --- a/sandbox/win/src/filesystem_policy.h +++ b/sandbox/win/src/filesystem_policy.h
@@ -25,7 +25,7 @@ // 'semantics' is the desired semantics for the open or create. // 'policy' is the policy generator to which the rules are going to be added. static bool GenerateRules(const wchar_t* name, - TargetPolicy::Semantics semantics, + Semantics semantics, LowLevelPolicy* policy); // Performs the desired policy action on a create request with an
diff --git a/sandbox/win/src/named_pipe_policy.cc b/sandbox/win/src/named_pipe_policy.cc index bfad758..cbffd78 100644 --- a/sandbox/win/src/named_pipe_policy.cc +++ b/sandbox/win/src/named_pipe_policy.cc
@@ -45,9 +45,9 @@ namespace sandbox { bool NamedPipePolicy::GenerateRules(const wchar_t* name, - TargetPolicy::Semantics semantics, + Semantics semantics, LowLevelPolicy* policy) { - if (TargetPolicy::NAMEDPIPES_ALLOW_ANY != semantics) { + if (Semantics::kNamedPipesAllowAny != semantics) { return false; } PolicyRule pipe(ASK_BROKER);
diff --git a/sandbox/win/src/named_pipe_policy.h b/sandbox/win/src/named_pipe_policy.h index 3f303a56..b16f32d 100644 --- a/sandbox/win/src/named_pipe_policy.h +++ b/sandbox/win/src/named_pipe_policy.h
@@ -22,7 +22,7 @@ // 'semantics' is the desired semantics. // 'policy' is the policy generator to which the rules are going to be added. static bool GenerateRules(const wchar_t* name, - TargetPolicy::Semantics semantics, + Semantics semantics, LowLevelPolicy* policy); // Processes a 'CreateNamedPipeW()' request from the target.
diff --git a/sandbox/win/src/named_pipe_policy_test.cc b/sandbox/win/src/named_pipe_policy_test.cc index 817aa43..c73d0d5 100644 --- a/sandbox/win/src/named_pipe_policy_test.cc +++ b/sandbox/win/src/named_pipe_policy_test.cc
@@ -56,8 +56,8 @@ auto runner = std::make_unique<TestRunner>(); // TODO(nsylvain): This policy is wrong because "*" is a valid char in a // namedpipe name. Here we apply it like a wildcard. http://b/893603 - runner->AddRule(TargetPolicy::SUBSYS_NAMED_PIPES, - TargetPolicy::NAMEDPIPES_ALLOW_ANY, L"\\\\.\\pipe\\test*"); + runner->AddRule(SubSystem::kNamedPipes, Semantics::kNamedPipesAllowAny, + L"\\\\.\\pipe\\test*"); return runner; } @@ -76,8 +76,8 @@ auto runner = std::make_unique<TestRunner>(); // TODO(nsylvain): This policy is wrong because "*" is a valid char in a // namedpipe name. Here we apply it like a wildcard. http://b/893603 - runner->AddRule(TargetPolicy::SUBSYS_NAMED_PIPES, - TargetPolicy::NAMEDPIPES_ALLOW_ANY, L"\\\\.\\pipe\\test*"); + runner->AddRule(SubSystem::kNamedPipes, Semantics::kNamedPipesAllowAny, + L"\\\\.\\pipe\\test*"); return runner; } @@ -118,8 +118,8 @@ runner->GetPolicy()->SetStrictInterceptions(); // TODO(nsylvain): This policy is wrong because "*" is a valid char in a // namedpipe name. Here we apply it like a wildcard. http://b/893603 - runner->AddRule(TargetPolicy::SUBSYS_NAMED_PIPES, - TargetPolicy::NAMEDPIPES_ALLOW_ANY, L"\\\\.\\pipe\\test*"); + runner->AddRule(SubSystem::kNamedPipes, Semantics::kNamedPipesAllowAny, + L"\\\\.\\pipe\\test*"); return runner; }
diff --git a/sandbox/win/src/process_mitigations_dyncode_unittest.cc b/sandbox/win/src/process_mitigations_dyncode_unittest.cc index b4dc8f2..4309553a 100644 --- a/sandbox/win/src/process_mitigations_dyncode_unittest.cc +++ b/sandbox/win/src/process_mitigations_dyncode_unittest.cc
@@ -327,7 +327,7 @@ runner = enable_mitigation ? RunnerWithMitigation(which_mitigation) : std::make_unique<sandbox::TestRunner>(); - EXPECT_TRUE(runner->AddFsRule(sandbox::TargetPolicy::FILES_ALLOW_ANY, + EXPECT_TRUE(runner->AddFsRule(sandbox::Semantics::kFilesAllowAny, temp_dll_path.value().c_str())); test = base::StringPrintf(L"%ls %u \"%ls\"", shared.c_str(), MAPVIEWFILE,
diff --git a/sandbox/win/src/process_mitigations_unittest.cc b/sandbox/win/src/process_mitigations_unittest.cc index 63bbaa2..5427491 100644 --- a/sandbox/win/src/process_mitigations_unittest.cc +++ b/sandbox/win/src/process_mitigations_unittest.cc
@@ -61,7 +61,7 @@ font_path = font_path.Append(L"arial.ttf"); sandbox::TestRunner runner; - EXPECT_TRUE(runner.AddFsRule(sandbox::TargetPolicy::FILES_ALLOW_READONLY, + EXPECT_TRUE(runner.AddFsRule(sandbox::Semantics::kFilesAllowReadonly, font_path.value().c_str())); if (!is_success_test) { @@ -124,8 +124,8 @@ if (add_dll_permission) { EXPECT_EQ(sandbox::SBOX_ALL_OK, - policy->AddRule(sandbox::TargetPolicy::SUBSYS_SIGNED_BINARY, - sandbox::TargetPolicy::SIGNED_ALLOW_LOAD, + policy->AddRule(sandbox::SubSystem::kSignedBinary, + sandbox::Semantics::kSignedAllowLoad, dll_path.value().c_str())); } if (add_directory_permission) { @@ -133,12 +133,12 @@ EXPECT_TRUE(base::PathService::Get(base::DIR_EXE, &exe_path)); EXPECT_EQ(sandbox::SBOX_ALL_OK, policy->AddRule( - sandbox::TargetPolicy::SUBSYS_SIGNED_BINARY, - sandbox::TargetPolicy::SIGNED_ALLOW_LOAD, + sandbox::SubSystem::kSignedBinary, + sandbox::Semantics::kSignedAllowLoad, exe_path.DirName().AppendASCII("*.dll").value().c_str())); } } - EXPECT_TRUE(runner.AddFsRule(sandbox::TargetPolicy::FILES_ALLOW_READONLY, + EXPECT_TRUE(runner.AddFsRule(sandbox::Semantics::kFilesAllowReadonly, dll_path.value().c_str())); // Set up test string. std::wstring test = L"TestDllLoad \""; @@ -878,8 +878,8 @@ // Allow all *.dll in current directory to load. EXPECT_EQ( sandbox::SBOX_ALL_OK, - policy->AddRule(sandbox::TargetPolicy::SUBSYS_SIGNED_BINARY, - sandbox::TargetPolicy::SIGNED_ALLOW_LOAD, + policy->AddRule(sandbox::SubSystem::kSignedBinary, + sandbox::Semantics::kSignedAllowLoad, exe_path.DirName().AppendASCII("*.dll").value().c_str())); #endif // defined(COMPONENT_BUILD)
diff --git a/sandbox/win/src/process_mitigations_win32k_policy.cc b/sandbox/win/src/process_mitigations_win32k_policy.cc index 3cdf47b..0122cd1 100644 --- a/sandbox/win/src/process_mitigations_win32k_policy.cc +++ b/sandbox/win/src/process_mitigations_win32k_policy.cc
@@ -12,7 +12,7 @@ bool ProcessMitigationsWin32KLockdownPolicy::GenerateRules( const wchar_t* name, - TargetPolicy::Semantics semantics, + Semantics semantics, LowLevelPolicy* policy) { PolicyRule rule(FAKE_SUCCESS); if (!policy->AddRule(IpcTag::GDI_GDIDLLINITIALIZE, &rule))
diff --git a/sandbox/win/src/process_mitigations_win32k_policy.h b/sandbox/win/src/process_mitigations_win32k_policy.h index d2b8be6..c03d258f 100644 --- a/sandbox/win/src/process_mitigations_win32k_policy.h +++ b/sandbox/win/src/process_mitigations_win32k_policy.h
@@ -21,7 +21,7 @@ // open or create and policy is the policy generator to which the rules are // going to be added. static bool GenerateRules(const wchar_t* name, - TargetPolicy::Semantics semantics, + Semantics semantics, LowLevelPolicy* policy); };
diff --git a/sandbox/win/src/process_mitigations_win32k_unittest.cc b/sandbox/win/src/process_mitigations_win32k_unittest.cc index b1494fb..28bfc187e 100644 --- a/sandbox/win/src/process_mitigations_win32k_unittest.cc +++ b/sandbox/win/src/process_mitigations_win32k_unittest.cc
@@ -54,8 +54,8 @@ sandbox::TargetPolicy* policy = runner.GetPolicy(); EXPECT_EQ(policy->SetProcessMitigations(MITIGATION_WIN32K_DISABLE), SBOX_ALL_OK); - EXPECT_EQ(policy->AddRule(sandbox::TargetPolicy::SUBSYS_WIN32K_LOCKDOWN, - sandbox::TargetPolicy::FAKE_USER_GDI_INIT, nullptr), + EXPECT_EQ(policy->AddRule(sandbox::SubSystem::kWin32kLockdown, + sandbox::Semantics::kFakeGdiInit, nullptr), sandbox::SBOX_ALL_OK); EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(test_policy_command.c_str())); }
diff --git a/sandbox/win/src/sandbox_policy.h b/sandbox/win/src/sandbox_policy.h index 66ccda5..40ba0e51 100644 --- a/sandbox/win/src/sandbox_policy.h +++ b/sandbox/win/src/sandbox_policy.h
@@ -18,38 +18,38 @@ class AppContainer; +// Windows subsystems that can have specific rules. +// Note: The process subsystem (kProcess) does not evaluate the request +// exactly like the CreateProcess API does. See the comment at the top of +// process_thread_dispatcher.cc for more details. +enum class SubSystem { + kFiles, // Creation and opening of files and pipes. + kNamedPipes, // Creation of named pipes. + kProcess, // Creation of child processes. + kWin32kLockdown, // Win32K Lockdown related policy. + kSignedBinary, // Signed binary policy. + kSocket // Socket brokering policy. +}; + +// Allowable semantics when a rule is matched. +enum class Semantics { + kFilesAllowAny, // Allows open or create for any kind of access that + // the file system supports. + kFilesAllowReadonly, // Allows open or create with read access only. + kFilesAllowQuery, // Allows access to query the attributes of a file. + kNamedPipesAllowAny, // Allows creation of a named pipe. + kFakeGdiInit, // Fakes user32 and gdi32 initialization. This can + // be used to allow the DLLs to load and initialize + // even if the process cannot access that subsystem. + kSignedAllowLoad, // Allows loading the module when CIG is enabled. + kSocketAllowBroker // Allows brokering of sockets. +}; + // We need [[clang::lto_visibility_public]] because instances of this class are // passed across module boundaries. This means different modules must have // compatible definitions of the class even when LTO is enabled. class [[clang::lto_visibility_public]] TargetPolicy { public: - // Windows subsystems that can have specific rules. - // Note: The process subsystem(SUBSYS_PROCESS) does not evaluate the request - // exactly like the CreateProcess API does. See the comment at the top of - // process_thread_dispatcher.cc for more details. - enum SubSystem { - SUBSYS_FILES, // Creation and opening of files and pipes. - SUBSYS_NAMED_PIPES, // Creation of named pipes. - SUBSYS_PROCESS, // Creation of child processes. - SUBSYS_WIN32K_LOCKDOWN, // Win32K Lockdown related policy. - SUBSYS_SIGNED_BINARY, // Signed binary policy. - SUBSYS_SOCKET // Socket brokering policy. - }; - - // Allowable semantics when a rule is matched. - enum Semantics { - FILES_ALLOW_ANY, // Allows open or create for any kind of access that - // the file system supports. - FILES_ALLOW_READONLY, // Allows open or create with read access only. - FILES_ALLOW_QUERY, // Allows access to query the attributes of a file. - NAMEDPIPES_ALLOW_ANY, // Allows creation of a named pipe. - FAKE_USER_GDI_INIT, // Fakes user32 and gdi32 initialization. This can - // be used to allow the DLLs to load and initialize - // even if the process cannot access that subsystem. - SIGNED_ALLOW_LOAD, // Allows loading the module when CIG is enabled. - SOCKET_ALLOW_BROKER // Allows brokering of sockets. - }; - virtual ~TargetPolicy() {} // Sets the security level for the target process' two tokens.
diff --git a/sandbox/win/src/sandbox_policy_base.cc b/sandbox/win/src/sandbox_policy_base.cc index f43b3a1..11e9c3b 100644 --- a/sandbox/win/src/sandbox_policy_base.cc +++ b/sandbox/win/src/sandbox_policy_base.cc
@@ -342,8 +342,10 @@ ResultCode result = AddRuleInternal(subsystem, semantics, pattern); LOG_IF(ERROR, result != SBOX_ALL_OK) << "Failed to add sandbox rule." - << " error = " << result << ", subsystem = " << subsystem - << ", semantics = " << semantics << ", pattern = '" << pattern << "'"; + << " error = " << result + << ", subsystem = " << static_cast<int>(subsystem) + << ", semantics = " << static_cast<int>(semantics) << ", pattern = '" + << pattern << "'"; return result; } @@ -690,21 +692,21 @@ } switch (subsystem) { - case SUBSYS_FILES: { + case SubSystem::kFiles: { if (!FileSystemPolicy::GenerateRules(pattern, semantics, policy_maker_)) { NOTREACHED(); return SBOX_ERROR_BAD_PARAMS; } break; } - case SUBSYS_NAMED_PIPES: { + case SubSystem::kNamedPipes: { if (!NamedPipePolicy::GenerateRules(pattern, semantics, policy_maker_)) { NOTREACHED(); return SBOX_ERROR_BAD_PARAMS; } break; } - case SUBSYS_WIN32K_LOCKDOWN: { + case SubSystem::kWin32kLockdown: { // Win32k intercept rules only supported on Windows 8 and above. This must // match the version checks in process_mitigations.cc for consistency. if (base::win::GetVersion() >= base::win::Version::WIN8) { @@ -720,7 +722,7 @@ } break; } - case SUBSYS_SIGNED_BINARY: { + case SubSystem::kSignedBinary: { // Signed intercept rules only supported on Windows 10 TH2 and above. This // must match the version checks in process_mitigations.cc for // consistency. @@ -736,17 +738,18 @@ } break; } - case SUBSYS_SOCKET: { + case SubSystem::kSocket: { // Only one semantic is supported for this subsystem; to allow socket // brokering. - DCHECK_EQ(SOCKET_ALLOW_BROKER, semantics); + DCHECK_EQ(Semantics::kSocketAllowBroker, semantics); // A very simple policy that just allows socket brokering if present. PolicyRule socket_policy(ASK_BROKER); policy_maker_->AddRule(IpcTag::WS2SOCKET, &socket_policy); break; } - - default: { return SBOX_ERROR_UNSUPPORTED; } + case SubSystem::kProcess: { + return SBOX_ERROR_UNSUPPORTED; + } } return SBOX_ALL_OK;
diff --git a/sandbox/win/src/signed_policy.cc b/sandbox/win/src/signed_policy.cc index eb32734..7c7ebf94 100644 --- a/sandbox/win/src/signed_policy.cc +++ b/sandbox/win/src/signed_policy.cc
@@ -18,10 +18,10 @@ namespace sandbox { bool SignedPolicy::GenerateRules(const wchar_t* name, - TargetPolicy::Semantics semantics, + Semantics semantics, LowLevelPolicy* policy) { // Only support one semantic. - if (TargetPolicy::SIGNED_ALLOW_LOAD != semantics) { + if (Semantics::kSignedAllowLoad != semantics) { return false; }
diff --git a/sandbox/win/src/signed_policy.h b/sandbox/win/src/signed_policy.h index d22af4d..8285107 100644 --- a/sandbox/win/src/signed_policy.h +++ b/sandbox/win/src/signed_policy.h
@@ -21,7 +21,7 @@ // Creates the required low-level policy rules to evaluate a high-level // policy rule. static bool GenerateRules(const wchar_t* name, - TargetPolicy::Semantics semantics, + Semantics semantics, LowLevelPolicy* policy); // Performs the desired policy action on a request.
diff --git a/sandbox/win/src/unload_dll_test.cc b/sandbox/win/src/unload_dll_test.cc index 2067f77..cbcb7f09 100644 --- a/sandbox/win/src/unload_dll_test.cc +++ b/sandbox/win/src/unload_dll_test.cc
@@ -48,7 +48,7 @@ runner->SetTimeout(2000); // Add a registry rule, because that ensures that the interception agent has // more than one item in its internal table. - runner->AddRule(TargetPolicy::SUBSYS_FILES, TargetPolicy::FILES_ALLOW_QUERY, + runner->AddRule(SubSystem::kFiles, Semantics::kFilesAllowQuery, L"\\??\\*.exe"); return runner; } @@ -91,9 +91,9 @@ // Add a couple of rules that ensures that the interception agent add EAT // patching on the client which makes sure that the unload dll record does // not interact badly with them. - runner->AddRule(TargetPolicy::SUBSYS_FILES, TargetPolicy::FILES_ALLOW_QUERY, + runner->AddRule(SubSystem::kFiles, Semantics::kFilesAllowQuery, L"\\??\\*.exe"); - runner->AddRule(TargetPolicy::SUBSYS_FILES, TargetPolicy::FILES_ALLOW_QUERY, + runner->AddRule(SubSystem::kFiles, Semantics::kFilesAllowQuery, L"\\??\\*.log"); return runner; }
diff --git a/sandbox/win/tests/common/controller.cc b/sandbox/win/tests/common/controller.cc index 00d5871..851df0c 100644 --- a/sandbox/win/tests/common/controller.cc +++ b/sandbox/win/tests/common/controller.cc
@@ -140,8 +140,8 @@ ::TerminateProcess(target_process_.Get(), 0); } -bool TestRunner::AddRule(TargetPolicy::SubSystem subsystem, - TargetPolicy::Semantics semantics, +bool TestRunner::AddRule(SubSystem subsystem, + Semantics semantics, const wchar_t* pattern) { if (!is_init_) return false; @@ -149,8 +149,7 @@ return (SBOX_ALL_OK == policy_->AddRule(subsystem, semantics, pattern)); } -bool TestRunner::AddRuleSys32(TargetPolicy::Semantics semantics, - const wchar_t* pattern) { +bool TestRunner::AddRuleSys32(Semantics semantics, const wchar_t* pattern) { if (!is_init_) return false; @@ -158,7 +157,7 @@ if (win32_path.empty()) return false; - if (!AddRule(TargetPolicy::SUBSYS_FILES, semantics, win32_path.c_str())) + if (!AddRule(SubSystem::kFiles, semantics, win32_path.c_str())) return false; if (!base::win::OSInfo::GetInstance()->IsWowX86OnAMD64()) @@ -168,15 +167,14 @@ if (win32_path.empty()) return false; - return AddRule(TargetPolicy::SUBSYS_FILES, semantics, win32_path.c_str()); + return AddRule(SubSystem::kFiles, semantics, win32_path.c_str()); } -bool TestRunner::AddFsRule(TargetPolicy::Semantics semantics, - const wchar_t* pattern) { +bool TestRunner::AddFsRule(Semantics semantics, const wchar_t* pattern) { if (!is_init_) return false; - return AddRule(TargetPolicy::SUBSYS_FILES, semantics, pattern); + return AddRule(SubSystem::kFiles, semantics, pattern); } int TestRunner::RunTest(const wchar_t* command) {
diff --git a/sandbox/win/tests/common/controller.h b/sandbox/win/tests/common/controller.h index bbfe809..1a4f32a 100644 --- a/sandbox/win/tests/common/controller.h +++ b/sandbox/win/tests/common/controller.h
@@ -100,18 +100,18 @@ // Adds a rule to the policy. The parameters are the same as the AddRule // function in the sandbox. - bool AddRule(TargetPolicy::SubSystem subsystem, - TargetPolicy::Semantics semantics, + bool AddRule(SubSystem subsystem, + Semantics semantics, const wchar_t* pattern); // Adds a filesystem rules with the path of a file in system32. The function // appends "pattern" to "system32" and then call AddRule. Return true if the // function succeeds. - bool AddRuleSys32(TargetPolicy::Semantics semantics, const wchar_t* pattern); + bool AddRuleSys32(Semantics semantics, const wchar_t* pattern); // Adds a filesystem rules to the policy. Returns true if the functions // succeeds. - bool AddFsRule(TargetPolicy::Semantics semantics, const wchar_t* pattern); + bool AddFsRule(Semantics semantics, const wchar_t* pattern); // Starts a child process in the sandbox and ask it to run |command|. Returns // a SboxTestResult. By default, the test runs AFTER_REVERT.
diff --git a/services/cert_verifier/cert_verifier_service_factory.cc b/services/cert_verifier/cert_verifier_service_factory.cc index 3608393..b2e5a49 100644 --- a/services/cert_verifier/cert_verifier_service_factory.cc +++ b/services/cert_verifier/cert_verifier_service_factory.cc
@@ -26,6 +26,8 @@ #if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED) #include "mojo/public/cpp/base/big_buffer.h" +#include "net/cert/internal/parse_name.h" +#include "net/cert/internal/parsed_certificate.h" #include "net/cert/internal/trust_store_chrome.h" #include "net/cert/root_store_proto_lite/root_store.pb.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -72,6 +74,26 @@ std::move(cert_net_fetcher)); } +#if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED) +std::string GetName(scoped_refptr<net::ParsedCertificate> cert) { + net::RDNSequence subject_rdn; + if (!net::ParseName(cert->subject_tlv(), &subject_rdn)) { + return "UNKNOWN"; + } + std::string subject_string; + if (!net::ConvertToRFC2253(subject_rdn, &subject_string)) { + return "UNKNOWN"; + } + return subject_string; +} + +std::string GetHash(scoped_refptr<net::ParsedCertificate> cert) { + net::SHA256HashValue hash = + net::X509Certificate::CalculateFingerprint256(cert->cert_buffer()); + return base::HexEncode(hash.data, std::size(hash.data)); +} +#endif + } // namespace CertVerifierServiceFactoryImpl::CertVerifierServiceFactoryImpl( @@ -148,6 +170,25 @@ // instances will start with the updated store. root_store_data_ = std::move(root_store_data); } + +void CertVerifierServiceFactoryImpl::GetChromeRootStoreInfo( + GetChromeRootStoreInfoCallback callback) { + mojom::ChromeRootStoreInfoPtr info_ptr = mojom::ChromeRootStoreInfo::New(); + if (root_store_data_) { + info_ptr->version = root_store_data_->version(); + for (auto cert : root_store_data_->anchors()) { + info_ptr->root_cert_info.push_back( + mojom::ChromeRootCertInfo::New(GetName(cert), GetHash(cert))); + } + } else { + info_ptr->version = net::CompiledChromeRootStoreVersion(); + for (auto cert : net::CompiledChromeRootStoreAnchors()) { + info_ptr->root_cert_info.push_back( + mojom::ChromeRootCertInfo::New(GetName(cert), GetHash(cert))); + } + } + std::move(callback).Run(std::move(info_ptr)); +} #endif void CertVerifierServiceFactoryImpl::RemoveService(
diff --git a/services/cert_verifier/cert_verifier_service_factory.h b/services/cert_verifier/cert_verifier_service_factory.h index c1e582fa..ccbe6f1 100644 --- a/services/cert_verifier/cert_verifier_service_factory.h +++ b/services/cert_verifier/cert_verifier_service_factory.h
@@ -51,6 +51,7 @@ #if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED) // mojom::CertVerifierServiceFactory implementation: void UpdateChromeRootStore(mojom::ChromeRootStorePtr new_root_store) override; + void GetChromeRootStoreInfo(GetChromeRootStoreInfoCallback callback) override; #endif // Remove a CertVerifyService from needing updates to the Chrome Root Store.
diff --git a/services/cert_verifier/cert_verifier_service_factory_unittest.cc b/services/cert_verifier/cert_verifier_service_factory_unittest.cc index 3a971d1..bbbff4f 100644 --- a/services/cert_verifier/cert_verifier_service_factory_unittest.cc +++ b/services/cert_verifier/cert_verifier_service_factory_unittest.cc
@@ -33,8 +33,10 @@ #if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED) #include "mojo/public/cpp/base/big_buffer.h" +#include "net/cert/internal/parse_name.h" #include "net/cert/internal/trust_store_chrome.h" #include "net/cert/root_store_proto_lite/root_store.pb.h" +#include "net/der/input.h" #endif namespace cert_verifier { @@ -446,6 +448,81 @@ } } +void GetRootStoreInfo(cert_verifier::mojom::ChromeRootStoreInfoPtr* return_ptr, + base::RepeatingClosure quit_closure, + cert_verifier::mojom::ChromeRootStoreInfoPtr info) { + *return_ptr = std::move(info); + quit_closure.Run(); +} + +TEST(CertVerifierServiceFactoryTest, RootStoreInfoWithUpdatedRootStore) { + // Create leaf and root certs. + base::test::TaskEnvironment task_environment; + std::unique_ptr<net::CertBuilder> leaf, root; + net::CertBuilder::CreateSimpleChain(&leaf, &root); + ASSERT_TRUE(leaf && root); + + base::Time now = base::Time::Now(); + leaf->SetValidity(now - base::Days(1), now + base::Days(1)); + + // Create updated Chrome Root Store with just the root cert from above. + chrome_root_store::RootStore root_store_proto; + root_store_proto.set_version_major(net::CompiledChromeRootStoreVersion() + 1); + chrome_root_store::TrustAnchor* anchor = root_store_proto.add_trust_anchors(); + anchor->set_der(root->GetDER()); + std::string proto_serialized; + root_store_proto.SerializeToString(&proto_serialized); + cert_verifier::mojom::ChromeRootStorePtr root_store_ptr = + cert_verifier::mojom::ChromeRootStore::New( + base::as_bytes(base::make_span(proto_serialized))); + + mojo::Remote<mojom::CertVerifierServiceFactory> cv_service_factory_remote; + CertVerifierServiceFactoryImpl cv_service_factory_impl( + cv_service_factory_remote.BindNewPipeAndPassReceiver()); + + // Feed factory the new Chrome Root Store. + cv_service_factory_impl.UpdateChromeRootStore(std::move(root_store_ptr)); + + cert_verifier::mojom::ChromeRootStoreInfoPtr info_ptr; + base::RunLoop request_completed_run_loop; + cv_service_factory_remote->GetChromeRootStoreInfo(base::BindOnce( + &GetRootStoreInfo, &info_ptr, request_completed_run_loop.QuitClosure())); + request_completed_run_loop.Run(); + ASSERT_TRUE(info_ptr); + EXPECT_EQ(info_ptr->version, root_store_proto.version_major()); + ASSERT_EQ(info_ptr->root_cert_info.size(), static_cast<std::size_t>(1)); + + net::der::Input subject_tlv(&root->GetSubject()); + net::RDNSequence subject_rdn; + ASSERT_TRUE(net::ParseName(subject_tlv, &subject_rdn)); + std::string subject_string; + ASSERT_TRUE(net::ConvertToRFC2253(subject_rdn, &subject_string)); + EXPECT_EQ(info_ptr->root_cert_info[0]->name, subject_string); + + net::SHA256HashValue root_hash = + net::X509Certificate::CalculateFingerprint256(root->GetCertBuffer()); + EXPECT_EQ(info_ptr->root_cert_info[0]->sha256hash_hex, + base::HexEncode(root_hash.data, std::size(root_hash.data))); +} + +TEST(CertVerifierServiceFactoryTest, RootStoreInfoWithCompiledRootStore) { + base::test::TaskEnvironment task_environment; + net::ParsedCertificateList anchors = net::CompiledChromeRootStoreAnchors(); + + mojo::Remote<mojom::CertVerifierServiceFactory> cv_service_factory_remote; + CertVerifierServiceFactoryImpl cv_service_factory_impl( + cv_service_factory_remote.BindNewPipeAndPassReceiver()); + cert_verifier::mojom::ChromeRootStoreInfoPtr info_ptr; + base::RunLoop request_completed_run_loop; + cv_service_factory_remote->GetChromeRootStoreInfo(base::BindOnce( + &GetRootStoreInfo, &info_ptr, request_completed_run_loop.QuitClosure())); + request_completed_run_loop.Run(); + + ASSERT_TRUE(info_ptr); + EXPECT_EQ(info_ptr->version, net::CompiledChromeRootStoreVersion()); + EXPECT_EQ(info_ptr->root_cert_info.size(), anchors.size()); +} + #endif } // namespace cert_verifier
diff --git a/services/cert_verifier/public/mojom/cert_verifier_service_factory.mojom b/services/cert_verifier/public/mojom/cert_verifier_service_factory.mojom index 8cc5e7c8..38a218a 100644 --- a/services/cert_verifier/public/mojom/cert_verifier_service_factory.mojom +++ b/services/cert_verifier/public/mojom/cert_verifier_service_factory.mojom
@@ -75,6 +75,19 @@ mojo_base.mojom.BigBuffer serialized_proto_root_store; }; +// Information about a certificate in the Chrome Root Store +struct ChromeRootCertInfo { + // Human-readable name for the certificate. + string name; + string sha256hash_hex; +}; + +// Information about the Chrome Root Store +struct ChromeRootStoreInfo { + int64 version; + array<ChromeRootCertInfo> root_cert_info; +}; + // Parent interface for the CertVerifierProcess. Hands out new // CertVerifierService's, which have their own underlying CertVerifier's // underneath. @@ -88,4 +101,8 @@ // new version. [EnableIf=is_chrome_root_store_supported] UpdateChromeRootStore(ChromeRootStore new_root_store); + + // Returns information about the current Chrome Root Store. + [EnableIf=is_chrome_root_store_supported] + GetChromeRootStoreInfo() => (ChromeRootStoreInfo root_store_info); };
diff --git a/services/cert_verifier/test_cert_verifier_service_factory.cc b/services/cert_verifier/test_cert_verifier_service_factory.cc index 363f6bda1..139d98f 100644 --- a/services/cert_verifier/test_cert_verifier_service_factory.cc +++ b/services/cert_verifier/test_cert_verifier_service_factory.cc
@@ -48,6 +48,13 @@ #if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED) void TestCertVerifierServiceFactoryImpl::UpdateChromeRootStore( mojom::ChromeRootStorePtr new_root_store) {} + +void TestCertVerifierServiceFactoryImpl::GetChromeRootStoreInfo( + GetChromeRootStoreInfoCallback callback) { + mojom::ChromeRootStoreInfoPtr info_ptr = mojom::ChromeRootStoreInfo::New(); + info_ptr->version = 42; + std::move(callback).Run(std::move(info_ptr)); +} #endif void TestCertVerifierServiceFactoryImpl::ReleaseAllCertVerifierParams() {
diff --git a/services/cert_verifier/test_cert_verifier_service_factory.h b/services/cert_verifier/test_cert_verifier_service_factory.h index f256214..6ff8a30 100644 --- a/services/cert_verifier/test_cert_verifier_service_factory.h +++ b/services/cert_verifier/test_cert_verifier_service_factory.h
@@ -48,6 +48,7 @@ #if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED) void UpdateChromeRootStore(mojom::ChromeRootStorePtr new_root_store) override; + void GetChromeRootStoreInfo(GetChromeRootStoreInfoCallback callback) override; #endif // Pops the first request off the back of the list and forwards it to the
diff --git a/storage/browser/file_system/copy_or_move_file_validator_unittest.cc b/storage/browser/file_system/copy_or_move_file_validator_unittest.cc index b09f649..3396597 100644 --- a/storage/browser/file_system/copy_or_move_file_validator_unittest.cc +++ b/storage/browser/file_system/copy_or_move_file_validator_unittest.cc
@@ -24,8 +24,9 @@ #include "storage/browser/file_system/file_system_context.h" #include "storage/browser/file_system/file_system_url.h" #include "storage/browser/file_system/isolated_context.h" -#include "storage/browser/quota/quota_manager_proxy.h" #include "storage/browser/test/async_file_test_helper.h" +#include "storage/browser/test/mock_quota_manager.h" +#include "storage/browser/test/mock_quota_manager_proxy.h" #include "storage/browser/test/mock_special_storage_policy.h" #include "storage/browser/test/test_file_system_backend.h" #include "storage/browser/test/test_file_system_context.h" @@ -71,8 +72,14 @@ ASSERT_TRUE(base_.CreateUniqueTempDir()); base::FilePath base_dir = base_.GetPath(); - file_system_context_ = CreateFileSystemContextForTesting( - /*quota_manager_proxy=*/nullptr, base_dir); + quota_manager_ = base::MakeRefCounted<storage::MockQuotaManager>( + /*is_incognito=*/false, base_dir, base::ThreadTaskRunnerHandle::Get(), + base::MakeRefCounted<storage::MockSpecialStoragePolicy>()); + quota_manager_proxy_ = base::MakeRefCounted<storage::MockQuotaManagerProxy>( + quota_manager_.get(), base::ThreadTaskRunnerHandle::Get()); + // Prepare file system. + file_system_context_ = storage::CreateFileSystemContextForTesting( + quota_manager_proxy_.get(), base_dir); // Set up TestFileSystemBackend to require CopyOrMoveFileValidator. FileSystemBackend* test_file_system_backend = @@ -187,6 +194,8 @@ std::string dest_fsid_; base::test::TaskEnvironment task_environment_; + scoped_refptr<storage::MockQuotaManager> quota_manager_; + scoped_refptr<storage::MockQuotaManagerProxy> quota_manager_proxy_; scoped_refptr<FileSystemContext> file_system_context_; FileSystemURL copy_src_;
diff --git a/storage/browser/file_system/copy_or_move_operation_delegate_unittest.cc b/storage/browser/file_system/copy_or_move_operation_delegate_unittest.cc index ff629b93..e1c56fb 100644 --- a/storage/browser/file_system/copy_or_move_operation_delegate_unittest.cc +++ b/storage/browser/file_system/copy_or_move_operation_delegate_unittest.cc
@@ -1349,8 +1349,14 @@ void SetUp() { ASSERT_TRUE(base_.CreateUniqueTempDir()); base::FilePath base_dir = base_.GetPath(); - file_system_context_ = - storage::CreateFileSystemContextForTesting(nullptr, base_dir); + quota_manager_ = base::MakeRefCounted<storage::MockQuotaManager>( + /*is_incognito=*/false, base_dir, base::ThreadTaskRunnerHandle::Get(), + base::MakeRefCounted<storage::MockSpecialStoragePolicy>()); + quota_manager_proxy_ = base::MakeRefCounted<storage::MockQuotaManagerProxy>( + quota_manager_.get(), base::ThreadTaskRunnerHandle::Get()); + // Prepare file system. + file_system_context_ = storage::CreateFileSystemContextForTesting( + quota_manager_proxy_.get(), base_dir); // Prepare the origin's root directory. FileSystemBackend* backend = @@ -1453,6 +1459,8 @@ FileSystemURL error_url_; base::test::TaskEnvironment task_environment_; + scoped_refptr<storage::MockQuotaManager> quota_manager_; + scoped_refptr<storage::MockQuotaManagerProxy> quota_manager_proxy_; scoped_refptr<FileSystemContext> file_system_context_; };
diff --git a/storage/browser/file_system/dragged_file_util_unittest.cc b/storage/browser/file_system/dragged_file_util_unittest.cc index e1020fed..b40a591 100644 --- a/storage/browser/file_system/dragged_file_util_unittest.cc +++ b/storage/browser/file_system/dragged_file_util_unittest.cc
@@ -29,6 +29,9 @@ #include "storage/browser/quota/quota_manager_proxy.h" #include "storage/browser/test/async_file_test_helper.h" #include "storage/browser/test/file_system_test_file_set.h" +#include "storage/browser/test/mock_quota_manager.h" +#include "storage/browser/test/mock_quota_manager_proxy.h" +#include "storage/browser/test/mock_special_storage_policy.h" #include "storage/browser/test/test_file_system_context.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -107,8 +110,16 @@ // root paths) as dropped files. SimulateDropFiles(); - file_system_context_ = CreateFileSystemContextForTesting( - /*quota_manager_proxy=*/nullptr, partition_dir_.GetPath()); + base::FilePath partition_path = partition_dir_.GetPath(); + quota_manager_ = base::MakeRefCounted<storage::MockQuotaManager>( + /*is_incognito=*/false, partition_path, + base::ThreadTaskRunnerHandle::Get(), + base::MakeRefCounted<storage::MockSpecialStoragePolicy>()); + quota_manager_proxy_ = base::MakeRefCounted<storage::MockQuotaManagerProxy>( + quota_manager_.get(), base::ThreadTaskRunnerHandle::Get()); + // Prepare file system. + file_system_context_ = storage::CreateFileSystemContextForTesting( + quota_manager_proxy_.get(), partition_path); isolated_context()->AddReference(filesystem_id_); } @@ -274,9 +285,11 @@ base::ScopedTempDir data_dir_; base::ScopedTempDir partition_dir_; - base::test::SingleThreadTaskEnvironment task_environment_{ - base::test::SingleThreadTaskEnvironment::MainThreadType::IO}; + base::test::TaskEnvironment task_environment_{ + base::test::TaskEnvironment::MainThreadType::IO}; std::string filesystem_id_; + scoped_refptr<storage::MockQuotaManager> quota_manager_; + scoped_refptr<storage::MockQuotaManagerProxy> quota_manager_proxy_; scoped_refptr<FileSystemContext> file_system_context_; std::map<base::FilePath, base::FilePath> toplevel_root_map_; std::unique_ptr<DraggedFileUtil> file_util_;
diff --git a/storage/browser/file_system/file_system_quota_client_unittest.cc b/storage/browser/file_system/file_system_quota_client_unittest.cc index 407f5da..f29c9f5e 100644 --- a/storage/browser/file_system/file_system_quota_client_unittest.cc +++ b/storage/browser/file_system/file_system_quota_client_unittest.cc
@@ -550,9 +550,6 @@ const int64_t file_paths_cost_temporary_foo_https = ComputeFilePathsCostForOriginAndType(kFiles, "https://foo.com/", kFileSystemTypeTemporary); - const int64_t file_paths_cost_persistent_foo = - ComputeFilePathsCostForOriginAndType(kFiles, "http://foo.com/", - kFileSystemTypePersistent); const int64_t file_paths_cost_temporary_bar = ComputeFilePathsCostForOriginAndType(kFiles, "http://bar.com/", kFileSystemTypeTemporary); @@ -603,22 +600,6 @@ ? 32 + file_paths_cost_persistent_bar_https : 0), GetBucketUsage(quota_client, bar_https_temp_bucket)); - - if (!persistent_quota_is_temporary_quota()) { - auto bar_perm_bucket = - GetBucket("http://bar.com/", kDefaultBucketName, kPersistent); - EXPECT_EQ(0, GetBucketUsage(quota_client, bar_perm_bucket)); - - auto foo_perm_bucket = - GetBucket("http://foo.com/", kDefaultBucketName, kPersistent); - EXPECT_EQ(4 + file_paths_cost_persistent_foo, - GetBucketUsage(quota_client, foo_perm_bucket)); - - auto bar_https_perm_bucket = - GetBucket("https://bar.com/", kDefaultBucketName, kPersistent); - EXPECT_EQ(32 + file_paths_cost_persistent_bar_https, - GetBucketUsage(quota_client, bar_https_perm_bucket)); - } } INSTANTIATE_TEST_SUITE_P(FileSystemQuotaClientTests,
diff --git a/storage/browser/file_system/obfuscated_file_util.cc b/storage/browser/file_system/obfuscated_file_util.cc index 1b590b09..acc464b 100644 --- a/storage/browser/file_system/obfuscated_file_util.cc +++ b/storage/browser/file_system/obfuscated_file_util.cc
@@ -74,7 +74,10 @@ const int64_t kPathByteQuotaCost = 2; // Bytes per byte of path length in UTF-8. -const char kDirectoryDatabaseKeySeparator = ' '; +// TODO(https://crbug.com/1344157): Refactor to compare by Quota types rather +// than string representations of FileSystem types. The string representation of +// a kTemporary type. +const char kTemporary[] = "t"; int64_t UsageForPath(size_t length) { return kPathCreationQuotaCost + @@ -113,6 +116,41 @@ } // namespace +// Implementing the DatabaseKey for the directories_ map. +DatabaseKey::DatabaseKey() = default; +DatabaseKey::~DatabaseKey() = default; + +// Copyable and moveable +DatabaseKey::DatabaseKey(const DatabaseKey& other) = default; +DatabaseKey& DatabaseKey::operator=(const DatabaseKey& other) = default; +DatabaseKey::DatabaseKey(DatabaseKey&& other) = default; +DatabaseKey& DatabaseKey::operator=(DatabaseKey&& other) = default; + +DatabaseKey::DatabaseKey(const blink::StorageKey& storage_key, + const absl::optional<BucketLocator>& bucket, + const std::string& type) { + storage_key_ = storage_key; + bucket_ = bucket; + type_ = type; +} + +bool DatabaseKey::operator==(const DatabaseKey& other) const { + return std::tie(storage_key_, bucket_, type_) == + std::tie(other.storage_key_, other.bucket_, other.type_); +} + +bool DatabaseKey::operator!=(const DatabaseKey& other) const { + return std::tie(storage_key_, bucket_, type_) != + std::tie(other.storage_key_, other.bucket_, other.type_); +} + +bool DatabaseKey::operator<(const DatabaseKey& other) const { + return std::tie(storage_key_, bucket_, type_) < + std::tie(other.storage_key_, other.bucket_, other.type_); +} + +// end DatabaseKey implementation. + // TODO(https://crbug.com/1248104): This class will eventually interface with // Storage Buckets instead of directly interfacing with LevelDB. Thus, the below // functions were converted from url::Origin to blink::StorageKey to prepare for @@ -929,7 +967,7 @@ const blink::StorageKey& storage_key, const std::string& type_string) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DestroyDirectoryDatabase(storage_key, type_string); + DestroyDirectoryDatabaseForStorageKey(storage_key, type_string); base::FileErrorOr<base::FilePath> origin_path = GetDirectoryForStorageKey(storage_key, false); @@ -975,23 +1013,6 @@ true /* recursive */); } -void ObfuscatedFileUtil::CloseFileSystemForStorageKeyAndType( - const blink::StorageKey& storage_key, - const std::string& type_string) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - const std::string key_prefix = - GetDirectoryDatabaseKey(storage_key, type_string); - for (auto iter = directories_.lower_bound(key_prefix); - iter != directories_.end();) { - if (!base::StartsWith(iter->first, key_prefix, - base::CompareCase::SENSITIVE)) - break; - DCHECK(type_string.empty() || iter->first == key_prefix); - directories_.erase(iter++); - } -} - std::unique_ptr<ObfuscatedFileUtil::AbstractStorageKeyEnumerator> ObfuscatedFileUtil::CreateStorageKeyEnumerator() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); @@ -1007,27 +1028,65 @@ origin_database_.get(), file_util_delegate, file_system_directory_); } -void ObfuscatedFileUtil::DestroyDirectoryDatabase( +void ObfuscatedFileUtil::DestroyDirectoryDatabaseForStorageKey( + const blink::StorageKey& storage_key, + const std::string& type_string) { + DestroyDirectoryDatabaseHelper(absl::nullopt, storage_key, type_string); +} + +void ObfuscatedFileUtil::DestroyDirectoryDatabaseForBucket( + const BucketLocator& bucket_locator, + const std::string& type_string) { + DestroyDirectoryDatabaseHelper(bucket_locator, bucket_locator.storage_key, + type_string); +} + +void ObfuscatedFileUtil::DestroyDirectoryDatabaseHelper( + const absl::optional<BucketLocator>& bucket_locator, const blink::StorageKey& storage_key, const std::string& type_string) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DatabaseKey key_prefix; + // TODO(https://crbug.com/1344157): Refactor to compare by Quota types rather + // than string representations of FileSystem types. `key.bucket()` is + // absl::nullopt for all non-kTemporary types. + if (type_string == kTemporary) { + if (bucket_locator.has_value()) { + key_prefix = DatabaseKey(bucket_locator->storage_key, + bucket_locator.value(), type_string); + } else { + // If we are not provided a custom bucket value we must find the default + // bucket corresponding to the StorageKey. + QuotaErrorOr<BucketLocator> default_bucket = + GetOrCreateDefaultBucket(storage_key); + // If there is no default bucket for a given StorageKey, there is not a + // valid FileSystem to close, so we return. + if (!default_bucket.ok()) + return; + key_prefix = + DatabaseKey(storage_key, default_bucket.value(), type_string); + } + } else { // All other storage types. + key_prefix = DatabaseKey(storage_key, absl::nullopt, type_string); + } + // If `type_string` is empty, delete all filesystem types under `storage_key`. - const std::string key_prefix = - GetDirectoryDatabaseKey(storage_key, type_string); for (auto iter = directories_.lower_bound(key_prefix); iter != directories_.end();) { - if (!base::StartsWith(iter->first, key_prefix, - base::CompareCase::SENSITIVE)) + // If the key matches exactly or `type_string` is empty and just the + // StorageKey and BucketLocator match exactly, delete the database. + if (iter->first == key_prefix || + (type_string == std::string() && + iter->first.storage_key() == key_prefix.storage_key() && + iter->first.bucket() == key_prefix.bucket())) { + std::unique_ptr<SandboxDirectoryDatabase> database = + std::move(iter->second); + directories_.erase(iter++); + database->DestroyDatabase(); + } else { break; - DCHECK(type_string.empty() || iter->first == key_prefix); - std::unique_ptr<SandboxDirectoryDatabase> database = - std::move(iter->second); - directories_.erase(iter++); - - // Continue to destroy databases even if it failed because it doesn't affect - // the final result. - database->DestroyDatabase(); + } } } @@ -1062,6 +1121,33 @@ return get_type_string_for_url_.Run(url); } +QuotaErrorOr<BucketLocator> ObfuscatedFileUtil::GetOrCreateDefaultBucket( + const blink::StorageKey& storage_key) { + // If we have already looked up this default bucket for this StorageKey, + // return the cached value. + auto iter = default_buckets_.find(storage_key); + if (iter != default_buckets_.end()) { + return iter->second; + } + // GetOrCreateBucketSync() called below requires the use of the + // base::WaitableEvent sync primitive. We must explicitly declare the usage + // of this primitive to avoid thread restriction errors. + base::ScopedAllowBaseSyncPrimitives allow_wait; + // Instead of crashing, return a QuotaError if the proxy is a nullptr. + if (!sandbox_delegate_->quota_manager_proxy()) { + LOG(WARNING) << "Failed to GetOrCreateBucket: QuotaManagerProxy is null"; + return QuotaError::kUnknownError; + } + // Retrieve or create the default bucket for this StorageKey. + QuotaErrorOr<BucketInfo> bucket = + sandbox_delegate_->quota_manager_proxy()->GetOrCreateBucketSync( + BucketInitParams::ForDefaultBucket(storage_key)); + if (!bucket.ok()) + return bucket.error(); + default_buckets_[storage_key] = bucket->ToBucketLocator(); + return bucket->ToBucketLocator(); +} + base::File::Error ObfuscatedFileUtil::GetFileInfoInternal( SandboxDirectoryDatabase* db, FileSystemOperationContext* context, @@ -1231,14 +1317,6 @@ return root.value().Append(data_path); } -std::string ObfuscatedFileUtil::GetDirectoryDatabaseKey( - const blink::StorageKey& storage_key, - const std::string& type_string) { - // For isolated origin we just use a type string as a key. - return GetIdentifierFromOrigin(storage_key.origin()) + - kDirectoryDatabaseKeySeparator + type_string; -} - // TODO(ericu): How to do the whole validation-without-creation thing? // We may not have quota even to create the database. // Ah, in that case don't even get here? @@ -1248,10 +1326,26 @@ bool create) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - std::string key = - GetDirectoryDatabaseKey(url.storage_key(), CallGetTypeStringForURL(url)); - if (key.empty()) - return nullptr; + DatabaseKey key; + std::string type_string = CallGetTypeStringForURL(url); + // TODO(https://crbug.com/1344157): Refactor to compare by Quota types rather + // than string representations of FileSystem types. `key.bucket()` is + // absl::nullopt for all non-kTemporary types. + if (type_string == kTemporary) { + if (url.bucket().has_value()) { + key = DatabaseKey(url.storage_key(), url.bucket().value(), type_string); + } else { + // If we are not provided a custom bucket value we must find the default + // bucket corresponding to the url's StorageKey. + QuotaErrorOr<BucketLocator> default_bucket = + GetOrCreateDefaultBucket(url.storage_key()); + if (!default_bucket.ok()) + return nullptr; + key = DatabaseKey(url.storage_key(), default_bucket.value(), type_string); + } + } else { // All other storage types. + key = DatabaseKey(url.storage_key(), absl::nullopt, type_string); + } auto iter = directories_.find(key); if (iter != directories_.end()) { @@ -1277,20 +1371,14 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (storage_key.IsThirdPartyContext()) { - // GetOrCreateBucketSync() called below requires the use of the - // base::WaitableEvent sync primitive. We must explicitly declare the usage - // of this primitive to avoid thread restriction errors. - base::ScopedAllowBaseSyncPrimitives allow_wait; - // Retrieve the bucket information for third-party StorageKey. - QuotaErrorOr<BucketInfo> bucket = - sandbox_delegate_->quota_manager_proxy()->GetOrCreateBucketSync( - BucketInitParams::ForDefaultBucket(storage_key)); + // Retrieve the default bucket value for `storage_key`. + QuotaErrorOr<BucketLocator> bucket = GetOrCreateDefaultBucket(storage_key); if (!bucket.ok()) return base::File::FILE_ERROR_FAILED; // Get the path and verify it is valid. base::FileErrorOr<base::FilePath> path = sandbox_delegate_->quota_manager_proxy()->GetClientBucketPath( - bucket->ToBucketLocator(), QuotaClientType::kFileSystem); + bucket.value(), QuotaClientType::kFileSystem); if (path.is_error()) return path.error(); base::File::Error error = GetDirectoryHelper(path.value(), create); @@ -1375,6 +1463,21 @@ origin_database_->RewriteDatabase(); } +void ObfuscatedFileUtil::DeleteDefaultBucketForStorageKey( + const blink::StorageKey& storage_key) { + auto default_bucket_iter = default_buckets_.find(storage_key); + // If we are not already caching the bucket for that StorageKey, it does not + // need to be deleted. + if (default_bucket_iter == default_buckets_.end()) + return; + BucketLocator default_bucket = default_buckets_[storage_key]; + // Ensure that all directories with that StorageKey and bucket have been + // erased. + DCHECK(directories_.find(DatabaseKey(storage_key, default_bucket, + kTemporary)) == directories_.end()); + default_buckets_.erase(default_bucket_iter); +} + bool ObfuscatedFileUtil::InitOriginDatabase(const url::Origin& origin_hint, bool create) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
diff --git a/storage/browser/file_system/obfuscated_file_util.h b/storage/browser/file_system/obfuscated_file_util.h index 5f582fdc7..8a67a41 100644 --- a/storage/browser/file_system/obfuscated_file_util.h +++ b/storage/browser/file_system/obfuscated_file_util.h
@@ -46,6 +46,41 @@ class SandboxOriginDatabaseInterface; class SpecialStoragePolicy; +// Class representing the key for directories_. NOTE: The BucketLocator value is +// optional due to usage of ObfuscatedFileUtil where the type is not kTemporary +// (i.e. kPersistent or kSyncable). For all non-temporary types, expect the +// bucket member value to be absl::nullopt. The class is implemented as such to +// avoid mapping the same StorageKey to potentially different bucket values, +// which would cause directories_ lookup errors. +class DatabaseKey { + public: + DatabaseKey(); + ~DatabaseKey(); + + // Copyable and movable + DatabaseKey(const DatabaseKey& other); + DatabaseKey& operator=(const DatabaseKey& other); + DatabaseKey(DatabaseKey&& other); + DatabaseKey& operator=(DatabaseKey&& other); + + DatabaseKey(const blink::StorageKey& storage_key, + const absl::optional<BucketLocator>& bucket, + const std::string& type); + + const blink::StorageKey& storage_key() const { return storage_key_; } + const absl::optional<BucketLocator>& bucket() const { return bucket_; } + const std::string& type() const { return type_; } + + bool operator==(const DatabaseKey& other) const; + bool operator!=(const DatabaseKey& other) const; + bool operator<(const DatabaseKey& other) const; + + private: + blink::StorageKey storage_key_; + absl::optional<BucketLocator> bucket_; + std::string type_; +}; + // This file util stores directory information in LevelDB to obfuscate // and to neutralize virtual file paths given by arbitrary apps. // Files are stored with two-level isolation: per-origin and per-type. @@ -205,19 +240,21 @@ bool DeleteDirectoryForStorageKeyAndType(const blink::StorageKey& storage_key, const std::string& type_string); - // Frees resources used by a StorageKey's filesystem. - void CloseFileSystemForStorageKeyAndType(const blink::StorageKey& storage_key, - const std::string& type_string); - // This method and all methods of its returned class must be called only on // the FILE thread. The caller is responsible for deleting the returned // object. std::unique_ptr<AbstractStorageKeyEnumerator> CreateStorageKeyEnumerator(); - // Deletes a directory database from the database list in the ObfuscatedFSFU - // and destroys the database on the disk. - void DestroyDirectoryDatabase(const blink::StorageKey& storage_key, - const std::string& type_string); + // Deletes a directory database from the database list and destroys the + // database on the disk corresponding to the provided StorageKey and type. + void DestroyDirectoryDatabaseForStorageKey( + const blink::StorageKey& storage_key, + const std::string& type_string); + + // Deletes a directory database from the database list and destroys the + // database on the disk corresponding to the provided bucket locator and type. + void DestroyDirectoryDatabaseForBucket(const BucketLocator& bucket_locator, + const std::string& type_string); // Computes a cost for storing a given file in the obfuscated FSFU. // As the cost of a file is independent of the cost of its parent directories, @@ -229,6 +266,12 @@ // This will rewrite the databases to remove traces of deleted data from disk. void RewriteDatabases(); + // This function removes the key-value pair from default_buckets_ keyed at + // `storage_key`. Called when a default bucket is deleted from Quota + // management and the default_buckets_ cache needs to be updated to reflect + // that change in state. + void DeleteDefaultBucketForStorageKey(const blink::StorageKey& storage_key); + bool is_incognito() { return is_incognito_; } ObfuscatedFileUtilDelegate* delegate() { return delegate_.get(); } @@ -301,8 +344,12 @@ base::FilePath DataPathToLocalPath(const FileSystemURL& url, const base::FilePath& data_file_path); - std::string GetDirectoryDatabaseKey(const blink::StorageKey& storage_key, - const std::string& type_string); + // Deletes a directory database from the database list and destroys the + // database on the disk. + void DestroyDirectoryDatabaseHelper( + const absl::optional<BucketLocator>& bucket_locator, + const blink::StorageKey& storage_key, + const std::string& type_string); // This returns nullptr if `create` flag is false and a filesystem does not // exist for the given `url`. @@ -327,6 +374,14 @@ const blink::StorageKey& storage_key, FileSystemType type); + // Given a StorageKey, retrieve its default bucket either from the + // default_buckets_ in-memory structure or via GetOrCreateBucketSync(). NOTE: + // this function may use base::ScopedAllowBaseSyncPrimitives and call + // QuotaManagerProxy::GetOrCreateBucketSync() which relies on a blocking + // base::WaitableEvent. + QuotaErrorOr<BucketLocator> GetOrCreateDefaultBucket( + const blink::StorageKey& storage_key); + void MarkUsed(); void DropDatabases(); @@ -348,7 +403,10 @@ SEQUENCE_CHECKER(sequence_checker_); - std::map<std::string, std::unique_ptr<SandboxDirectoryDatabase>> directories_; + // Keeps tracks of previously-seen default buckets mapped to their + // corresponding StorageKey. Should remain in parallel with directories_. + std::map<blink::StorageKey, BucketLocator> default_buckets_; + std::map<DatabaseKey, std::unique_ptr<SandboxDirectoryDatabase>> directories_; std::unique_ptr<SandboxOriginDatabaseInterface> origin_database_; scoped_refptr<SpecialStoragePolicy> special_storage_policy_; base::FilePath file_system_directory_;
diff --git a/storage/browser/file_system/obfuscated_file_util_unittest.cc b/storage/browser/file_system/obfuscated_file_util_unittest.cc index 59e2ac8e0..c7d5b4aa 100644 --- a/storage/browser/file_system/obfuscated_file_util_unittest.cc +++ b/storage/browser/file_system/obfuscated_file_util_unittest.cc
@@ -837,8 +837,11 @@ ASSERT_TRUE(db != nullptr); // Destroy it. - ofu()->DestroyDirectoryDatabase(url.storage_key(), - GetTypeString(url.type())); + (is_non_default_bucket()) + ? ofu()->DestroyDirectoryDatabaseForBucket(url.bucket().value(), + GetTypeString(url.type())) + : ofu()->DestroyDirectoryDatabaseForStorageKey( + url.storage_key(), GetTypeString(url.type())); ASSERT_TRUE(ofu()->directories_.empty()); } @@ -1836,7 +1839,10 @@ EXPECT_EQ(10, file_info.size); // Destroy database to make inconsistency between database and filesystem. - ofu()->DestroyDirectoryDatabase(storage_key(), type_string()); + (is_non_default_bucket()) + ? ofu()->DestroyDirectoryDatabaseForBucket(custom_bucket_, type_string()) + : ofu()->DestroyDirectoryDatabaseForStorageKey(storage_key(), + type_string()); // Try to get file info of broken file. EXPECT_FALSE(PathExists(kPath1)); @@ -1856,7 +1862,10 @@ EXPECT_TRUE(created); // Destroy again. - ofu()->DestroyDirectoryDatabase(storage_key(), type_string()); + (is_non_default_bucket()) + ? ofu()->DestroyDirectoryDatabaseForBucket(custom_bucket_, type_string()) + : ofu()->DestroyDirectoryDatabaseForStorageKey(storage_key(), + type_string()); // Repair broken `kPath1`. context = NewContext(nullptr); @@ -1874,7 +1883,10 @@ FileSystemOperation::CopyOrMoveOptionSet(), true /* copy */)); - ofu()->DestroyDirectoryDatabase(storage_key(), type_string()); + (is_non_default_bucket()) + ? ofu()->DestroyDirectoryDatabaseForBucket(custom_bucket_, type_string()) + : ofu()->DestroyDirectoryDatabaseForStorageKey(storage_key(), + type_string()); context = NewContext(nullptr); created = false; EXPECT_EQ(base::File::FILE_OK,
diff --git a/storage/browser/file_system/recursive_operation_delegate_unittest.cc b/storage/browser/file_system/recursive_operation_delegate_unittest.cc index 5a98279..82eb5ed1 100644 --- a/storage/browser/file_system/recursive_operation_delegate_unittest.cc +++ b/storage/browser/file_system/recursive_operation_delegate_unittest.cc
@@ -21,6 +21,9 @@ #include "storage/browser/file_system/file_system_file_util.h" #include "storage/browser/file_system/file_system_operation.h" #include "storage/browser/file_system/file_system_operation_runner.h" +#include "storage/browser/test/mock_quota_manager.h" +#include "storage/browser/test/mock_quota_manager_proxy.h" +#include "storage/browser/test/mock_special_storage_policy.h" #include "storage/browser/test/sandbox_file_system_test_helper.h" #include "testing/gtest/include/gtest/gtest.h" @@ -145,7 +148,13 @@ protected: void SetUp() override { EXPECT_TRUE(base_.CreateUniqueTempDir()); - sandbox_file_system_.SetUp(base_.GetPath().AppendASCII("filesystem")); + base::FilePath base_dir = base_.GetPath().AppendASCII("filesystem"); + quota_manager_ = base::MakeRefCounted<storage::MockQuotaManager>( + /*is_incognito=*/false, base_dir, base::ThreadTaskRunnerHandle::Get(), + base::MakeRefCounted<storage::MockSpecialStoragePolicy>()); + quota_manager_proxy_ = base::MakeRefCounted<storage::MockQuotaManagerProxy>( + quota_manager_.get(), base::ThreadTaskRunnerHandle::Get()); + sandbox_file_system_.SetUp(base_dir, quota_manager_proxy_); } void TearDown() override { sandbox_file_system_.TearDown(); } @@ -186,6 +195,8 @@ // Common temp base for nondestructive uses. base::ScopedTempDir base_; SandboxFileSystemTestHelper sandbox_file_system_; + scoped_refptr<storage::MockQuotaManager> quota_manager_; + scoped_refptr<storage::MockQuotaManagerProxy> quota_manager_proxy_; }; TEST_F(RecursiveOperationDelegateTest, RootIsFile) {
diff --git a/storage/browser/file_system/sandbox_file_system_backend_delegate.cc b/storage/browser/file_system/sandbox_file_system_backend_delegate.cc index 1fcad798..36ed665 100644 --- a/storage/browser/file_system/sandbox_file_system_backend_delegate.cc +++ b/storage/browser/file_system/sandbox_file_system_backend_delegate.cc
@@ -375,6 +375,14 @@ base::SequencedTaskRunnerHandle::Get(), base::DoNothing()); } + // If obfuscated_file_util() was caching the default bucket for this + // StorageKey, it should be deleted as well. If it was not cached, result is a + // no-op. NOTE: one StorageKey may map to many BucketLocators depending on the + // type. We only want to cache and delete kFileSystemTypeTemporary buckets. + // Otherwise, we may accidentally delete the wrong databases. + if (type == FileSystemType::kFileSystemTypeTemporary) + obfuscated_file_util()->DeleteDefaultBucketForStorageKey(storage_key); + if (result) return base::File::FILE_OK; return base::File::FILE_ERROR_FAILED;
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 1174a34..cd6319c 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -10076,21 +10076,6 @@ ] } ], - "WebViewLegacyTlsSupport": [ - { - "platforms": [ - "android_webview" - ], - "experiments": [ - { - "name": "Disabled", - "disable_features": [ - "WebViewLegacyTlsSupport" - ] - } - ] - } - ], "WebViewMeasureScreenCoverage": [ { "platforms": [
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl index 8002c19d..cdbc564 100644 --- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl +++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -754,6 +754,7 @@ DeprecationExample DocumentDomainSettingWithoutOriginAgentClusterHeader EventPath + ExpectCTHeader GeolocationInsecureOrigin GeolocationInsecureOriginDeprecatedNotRemoved GetUserMediaInsecureOrigin @@ -4875,6 +4876,7 @@ TextTrack XHR Fetch + Prefetch EventSource WebSocket Manifest
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 62fe056..7dd0b25 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
@@ -3619,6 +3619,7 @@ kUnhandledExceptionCountInWorker = 4298, kWebCodecsImageDecoderPremultiplyAlphaDeprecation = 4299, kCookieDomainNonASCII = 4300, + kExpectCTHeader = 4301, // Add new features immediately above this line. Don't change assigned // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/renderer/core/animation/document_animations.cc b/third_party/blink/renderer/core/animation/document_animations.cc index 6be2dc4..8dfa26c 100644 --- a/third_party/blink/renderer/core/animation/document_animations.cc +++ b/third_party/blink/renderer/core/animation/document_animations.cc
@@ -200,8 +200,11 @@ if (!compositor_timeline) continue; - document_->GetPage()->GetChromeClient().DetachCompositorAnimationTimeline( - compositor_timeline, document_->GetFrame()); + if (cc::AnimationHost* host = + document_->GetPage()->GetChromeClient().GetCompositorAnimationHost( + *document_->GetFrame())) { + host->RemoveAnimationTimeline(compositor_timeline); + } } }
diff --git a/third_party/blink/renderer/core/document_transition/document_transition_style_tracker.cc b/third_party/blink/renderer/core/document_transition/document_transition_style_tracker.cc index 6508086..bee8157 100644 --- a/third_party/blink/renderer/core/document_transition/document_transition_style_tracker.cc +++ b/third_party/blink/renderer/core/document_transition/document_transition_style_tracker.cc
@@ -59,7 +59,7 @@ } absl::optional<String> ComputeInsetDifference(PhysicalRect reference_rect, - const gfx::Rect& target_rect, + const LayoutRect& target_rect, float device_pixel_ratio) { if (reference_rect.IsEmpty()) { DCHECK(target_rect.IsEmpty()); @@ -70,19 +70,21 @@ // space. Note that this currently relies on the fact that object-view-box // scales its parameters from CSS to layout space. However, that's a bug. // TODO(crbug.com/1324618): Fix this when the object-view-box bug is fixed. - gfx::Rect reference_bounding_rect = gfx::ToEnclosingRect(gfx::ScaleRect( - static_cast<gfx::RectF>(reference_rect), 1.0 / device_pixel_ratio)); + reference_rect.Scale(1.f / device_pixel_ratio); + LayoutRect reference_layout_rect = reference_rect.ToLayoutRect(); - if (reference_bounding_rect == target_rect) + if (reference_layout_rect == target_rect) return absl::nullopt; - int top_offset = target_rect.y() - reference_bounding_rect.y(); - int right_offset = reference_bounding_rect.right() - target_rect.right(); - int bottom_offset = reference_bounding_rect.bottom() - target_rect.bottom(); - int left_offset = target_rect.x() - reference_bounding_rect.x(); + float top_offset = (target_rect.Y() - reference_layout_rect.Y()).ToFloat(); + float right_offset = + (reference_layout_rect.MaxX() - target_rect.MaxX()).ToFloat(); + float bottom_offset = + (reference_layout_rect.MaxY() - target_rect.MaxY()).ToFloat(); + float left_offset = (target_rect.X() - reference_layout_rect.X()).ToFloat(); - return String::Format("inset(%dpx %dpx %dpx %dpx)", top_offset, right_offset, - bottom_offset, left_offset); + return String::Format("inset(%.3fpx %.3fpx %.3fpx %.3fpx)", top_offset, + right_offset, bottom_offset, left_offset); } // TODO(vmpstr): This could be optimized by caching values for individual layout @@ -976,8 +978,8 @@ R"CSS({ from { transform: %s; - width: %dpx; - height: %dpx; + width: %.3fpx; + height: %.3fpx; } })CSS", ComputedStyleUtils::ValueForTransformationMatrix(source_matrix, 1, @@ -985,7 +987,7 @@ ->CssText() .Utf8() .c_str(), - source_size.Width().ToInt(), source_size.Height().ToInt()); + source_size.Width().ToFloat(), source_size.Height().ToFloat()); append_selector("html::page-transition-container", tag); builder.Append("{ animation: page-transition-container-anim-"); @@ -1057,9 +1059,6 @@ // `element_data_map_`. This is case 1 above. DCHECK(!tag_is_old_root || !tag_is_new_root); - gfx::Rect border_box_in_css_space = gfx::Rect( - gfx::Size(element_data->border_box_size_in_css_space.Width().ToInt(), - element_data->border_box_size_in_css_space.Height().ToInt())); std::ostringstream writing_mode_stream; writing_mode_stream << element_data->container_writing_mode; @@ -1071,12 +1070,13 @@ document_transition_tag); builder.AppendFormat( R"CSS({ - width: %dpx; - height: %dpx; + width: %.3fpx; + height: %.3fpx; transform: %s; writing-mode: %s; })CSS", - border_box_in_css_space.width(), border_box_in_css_space.height(), + element_data->border_box_size_in_css_space.Width().ToFloat(), + element_data->border_box_size_in_css_space.Height().ToFloat(), ComputedStyleUtils::ValueForTransformationMatrix( element_data->viewport_matrix, 1, false) ->CssText() @@ -1088,7 +1088,8 @@ // (not a new root). absl::optional<String> incoming_inset = ComputeInsetDifference( element_data->visual_overflow_rect_in_layout_space, - border_box_in_css_space, device_pixel_ratio); + LayoutRect(LayoutPoint(), element_data->border_box_size_in_css_space), + device_pixel_ratio); if (incoming_inset) { append_selector("html::page-transition-incoming-image", document_transition_tag); @@ -1103,13 +1104,11 @@ // Outgoing inset only makes sense if the tag is an old shared element (not // an old root). if (!tag_is_old_root) { - gfx::Rect cached_border_box_in_css_space = gfx::Rect(gfx::Size( - element_data->cached_border_box_size_in_css_space.Width().ToInt(), - element_data->cached_border_box_size_in_css_space.Height().ToInt())); - absl::optional<String> outgoing_inset = ComputeInsetDifference( element_data->cached_visual_overflow_rect_in_layout_space, - cached_border_box_in_css_space, device_pixel_ratio); + LayoutRect(LayoutPoint(), + element_data->cached_border_box_size_in_css_space), + device_pixel_ratio); if (outgoing_inset) { append_selector("html::page-transition-outgoing-image", document_transition_tag);
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc index c71bd9e..46955f2 100644 --- a/third_party/blink/renderer/core/dom/document.cc +++ b/third_party/blink/renderer/core/dom/document.cc
@@ -44,6 +44,7 @@ #include "base/metrics/histogram_functions.h" #include "base/notreached.h" #include "base/time/time.h" +#include "cc/animation/animation_host.h" #include "cc/animation/animation_timeline.h" #include "cc/input/overscroll_behavior.h" #include "cc/input/scroll_snap_data.h" @@ -2636,8 +2637,11 @@ if (timeline->IsScrollTimeline() && timeline->animation_host()) return; - GetPage()->GetChromeClient().AttachCompositorAnimationTimeline(timeline, - GetFrame()); + if (cc::AnimationHost* host = + GetPage()->GetChromeClient().GetCompositorAnimationHost( + *GetFrame())) { + host->AddAnimationTimeline(timeline); + } } void Document::ClearFocusedElementIfNeeded() {
diff --git a/third_party/blink/renderer/core/dom/global_event_handlers.idl b/third_party/blink/renderer/core/dom/global_event_handlers.idl index eefaa82..b7a8f0dc 100644 --- a/third_party/blink/renderer/core/dom/global_event_handlers.idl +++ b/third_party/blink/renderer/core/dom/global_event_handlers.idl
@@ -118,7 +118,7 @@ attribute EventHandler onlostpointercapture; attribute EventHandler onpointerdown; attribute EventHandler onpointermove; - [RuntimeEnabled=PointerRawUpdate] attribute EventHandler onpointerrawupdate; + attribute EventHandler onpointerrawupdate; attribute EventHandler onpointerup; attribute EventHandler onpointercancel; attribute EventHandler onpointerover;
diff --git a/third_party/blink/renderer/core/exported/web_page_popup_impl.cc b/third_party/blink/renderer/core/exported/web_page_popup_impl.cc index b5509f82..cac78d7c 100644 --- a/third_party/blink/renderer/core/exported/web_page_popup_impl.cc +++ b/third_party/blink/renderer/core/exported/web_page_popup_impl.cc
@@ -232,14 +232,13 @@ popup_->widget_base_->RequestAnimationAfterDelay(delay); } - void AttachCompositorAnimationTimeline(cc::AnimationTimeline* timeline, - LocalFrame*) override { - popup_->widget_base_->AnimationHost()->AddAnimationTimeline(timeline); + cc::AnimationHost* GetCompositorAnimationHost(LocalFrame&) const override { + return popup_->widget_base_->AnimationHost(); } - void DetachCompositorAnimationTimeline(cc::AnimationTimeline* timeline, - LocalFrame*) override { - popup_->widget_base_->AnimationHost()->RemoveAnimationTimeline(timeline); + cc::AnimationTimeline* GetScrollAnimationTimeline( + LocalFrame&) const override { + return popup_->widget_base_->ScrollAnimationTimeline(); } const display::ScreenInfo& GetScreenInfo(LocalFrame&) const override { @@ -409,7 +408,7 @@ if (AXObjectCache* cache = frame->GetDocument()->ExistingAXObjectCache()) cache->ChildrenChanged(&popup_client_->OwnerElement()); - page_->AnimationHostInitialized(*widget_base_->AnimationHost(), nullptr); + page_->DidInitializeCompositing(*widget_base_->AnimationHost()); scoped_refptr<SharedBuffer> data = SharedBuffer::Create(); popup_client_->WriteDocument(data.get()); @@ -575,7 +574,7 @@ } void WebPagePopupImpl::DestroyPage() { - page_->WillCloseAnimationHost(nullptr); + page_->WillStopCompositing(); page_->WillBeDestroyed(); page_.Clear(); }
diff --git a/third_party/blink/renderer/core/frame/attribution_response_parsing.cc b/third_party/blink/renderer/core/frame/attribution_response_parsing.cc index 5520c4a..3261df4 100644 --- a/third_party/blink/renderer/core/frame/attribution_response_parsing.cc +++ b/third_party/blink/renderer/core/frame/attribution_response_parsing.cc
@@ -231,25 +231,23 @@ source_data.destination = std::move(destination); // Treat invalid expiry, priority, and debug key as if they were not set. - String priority_string; - if (object->GetString("priority", &priority_string)) { - bool priority_is_valid = false; - int64_t priority = priority_string.ToInt64Strict(&priority_is_valid); - if (priority_is_valid) + + if (String s; object->GetString("priority", &s)) { + bool valid = false; + int64_t priority = s.ToInt64Strict(&valid); + if (valid) source_data.priority = priority; } - String expiry_string; - if (object->GetString("expiry", &expiry_string)) { - bool expiry_is_valid = false; - int64_t expiry = expiry_string.ToInt64Strict(&expiry_is_valid); - if (expiry_is_valid) - source_data.expiry = base::Seconds(expiry); + if (String s; object->GetString("expiry", &s)) { + bool valid = false; + int64_t seconds = s.ToInt64Strict(&valid); + if (valid) + source_data.expiry = base::Seconds(seconds); } - String debug_key_string; - if (object->GetString("debug_key", &debug_key_string)) - source_data.debug_key = ParseDebugKey(debug_key_string); + if (String s; object->GetString("debug_key", &s)) + source_data.debug_key = ParseDebugKey(s); source_data.filter_data = mojom::blink::AttributionFilterData::New(); if (!ParseAttributionFilterData(object->Get("filter_data"), @@ -311,20 +309,18 @@ event_trigger->data = trigger_data_is_valid ? trigger_data_value : 0; // Treat invalid priority and deduplication key as if they were not set. - String priority_string; - if (object_val->GetString("priority", &priority_string)) { - bool priority_is_valid = false; - int64_t priority = priority_string.ToInt64Strict(&priority_is_valid); - if (priority_is_valid) + + if (String s; object_val->GetString("priority", &s)) { + bool valid = false; + int64_t priority = s.ToInt64Strict(&valid); + if (valid) event_trigger->priority = priority; } - // Treat invalid priority and deduplication_key as if they were not set. - String dedup_key_string; - if (object_val->GetString("deduplication_key", &dedup_key_string)) { - bool dedup_key_is_valid = false; - uint64_t dedup_key = dedup_key_string.ToUInt64Strict(&dedup_key_is_valid); - if (dedup_key_is_valid) { + if (String s; object_val->GetString("deduplication_key", &s)) { + bool valid = false; + uint64_t dedup_key = s.ToUInt64Strict(&valid); + if (valid) { event_trigger->dedup_key = mojom::blink::AttributionTriggerDedupKey::New(dedup_key); } @@ -510,9 +506,8 @@ return false; } - String debug_key_string; - if (object->GetString("debug_key", &debug_key_string)) - trigger_data.debug_key = ParseDebugKey(debug_key_string); + if (String s; object->GetString("debug_key", &s)) + trigger_data.debug_key = ParseDebugKey(s); return true; }
diff --git a/third_party/blink/renderer/core/frame/attribution_src_loader.cc b/third_party/blink/renderer/core/frame/attribution_src_loader.cc index f1162be..536ecc1 100644 --- a/third_party/blink/renderer/core/frame/attribution_src_loader.cc +++ b/third_party/blink/renderer/core/frame/attribution_src_loader.cc
@@ -69,6 +69,8 @@ const absl::optional<String>& string, HTMLElement* element, absl::optional<uint64_t> request_id) { + DCHECK(frame); + if (!frame->IsAttached()) return; @@ -87,8 +89,9 @@ LocalFrame* frame, HTMLElement* element, absl::optional<uint64_t> request_id, - AttributionSrcLoader::RegisterContext context, - bool log_issues) { + AttributionSrcLoader::RegisterContext context) { + DCHECK(frame); + LocalDOMWindow* window = frame->DomWindow(); DCHECK(window); @@ -99,26 +102,22 @@ mojom::blink::PermissionsPolicyFeature::kAttributionReporting); if (!feature_policy_enabled) { - if (log_issues) { - MaybeLogAuditIssue( - frame, AttributionReportingIssueType::kPermissionPolicyDisabled, - /*string=*/absl::nullopt, element, request_id); - } + MaybeLogAuditIssue(frame, + AttributionReportingIssueType::kPermissionPolicyDisabled, + /*string=*/absl::nullopt, element, request_id); return false; } // The API is only allowed in secure contexts. if (!window->IsSecureContext()) { - if (log_issues) { - MaybeLogAuditIssue( - frame, - context == AttributionSrcLoader::RegisterContext::kAttributionSrc - ? AttributionReportingIssueType:: - kAttributionSourceUntrustworthyOrigin - : AttributionReportingIssueType::kAttributionUntrustworthyOrigin, - frame->GetSecurityContext()->GetSecurityOrigin()->ToString(), element, - request_id); - } + MaybeLogAuditIssue( + frame, + context == AttributionSrcLoader::RegisterContext::kAttributionSrc + ? AttributionReportingIssueType:: + kAttributionSourceUntrustworthyOrigin + : AttributionReportingIssueType::kAttributionUntrustworthyOrigin, + frame->GetSecurityContext()->GetSecurityOrigin()->ToString(), element, + request_id); return false; } @@ -333,9 +332,9 @@ DCHECK(window); if (!CanRegisterAttributionInContext(local_frame_, element, request_id, - context, - /*log_issues=*/true)) + context)) { return false; + } scoped_refptr<const SecurityOrigin> reporting_origin = SecurityOrigin::Create(url);
diff --git a/third_party/blink/renderer/core/frame/attribution_src_loader.h b/third_party/blink/renderer/core/frame/attribution_src_loader.h index e085fe9..2d5b3b77 100644 --- a/third_party/blink/renderer/core/frame/attribution_src_loader.h +++ b/third_party/blink/renderer/core/frame/attribution_src_loader.h
@@ -106,15 +106,14 @@ size_t num_resource_clients_ = 0; }; -// Returns whether attribution is allowed, and logs devtools issues if -// registration was attempted in a context is not allowed and `log_issues` is -// set. `element` may be null. +// Returns whether attribution is allowed, and logs DevTools issues if +// registration was attempted in a context that is not allowed. +// `element` may be null. CORE_EXPORT bool CanRegisterAttributionInContext( LocalFrame* frame, HTMLElement* element, absl::optional<uint64_t> request_id, - AttributionSrcLoader::RegisterContext context, - bool log_issues); + AttributionSrcLoader::RegisterContext context); } // namespace blink
diff --git a/third_party/blink/renderer/core/frame/deprecation/deprecation.cc b/third_party/blink/renderer/core/frame/deprecation/deprecation.cc index fa008e6..dab6a6e 100644 --- a/third_party/blink/renderer/core/frame/deprecation/deprecation.cc +++ b/third_party/blink/renderer/core/frame/deprecation/deprecation.cc
@@ -102,6 +102,9 @@ case WebFeature::kEventPath: return DeprecationInfo::WithTranslation(feature, DeprecationIssueType::kEventPath); + case WebFeature::kExpectCTHeader: + return DeprecationInfo::WithTranslation( + feature, DeprecationIssueType::kExpectCTHeader); // Powerful features on insecure origins (https://goo.gl/rStTGz) case WebFeature::kGeolocationInsecureOrigin: case WebFeature::kGeolocationInsecureOriginIframe:
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc index c188e71..f222d27 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.cc +++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -132,7 +132,6 @@ #include "third_party/blink/renderer/core/page/page_animator.h" #include "third_party/blink/renderer/core/page/scrolling/fragment_anchor.h" #include "third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h" -#include "third_party/blink/renderer/core/page/scrolling/scrolling_coordinator_context.h" #include "third_party/blink/renderer/core/page/scrolling/snap_coordinator.h" #include "third_party/blink/renderer/core/page/scrolling/top_document_root_scroller_controller.h" #include "third_party/blink/renderer/core/page/spatial_navigation_controller.h" @@ -584,40 +583,18 @@ return p ? p->GetScrollingCoordinator() : nullptr; } -ScrollingCoordinatorContext* LocalFrameView::GetScrollingContext() const { - LocalFrame* root = &GetFrame().LocalFrameRoot(); - if (GetFrame() != root) - return root->View()->GetScrollingContext(); - - if (!scrolling_context_) - scrolling_context_ = std::make_unique<ScrollingCoordinatorContext>(); - return scrolling_context_.get(); -} - cc::AnimationHost* LocalFrameView::GetCompositorAnimationHost() const { - if (GetScrollingContext()->GetCompositorAnimationHost()) - return GetScrollingContext()->GetCompositorAnimationHost(); - - if (!GetFrame().LocalFrameRoot().IsMainFrame()) - return frame_->GetWidgetForLocalRoot()->AnimationHost(); - - // TODO(kenrb): Compositor animation host and timeline for the main frame - // still live on ScrollingCoordinator. https://crbug.com/680606. - ScrollingCoordinator* c = GetScrollingCoordinator(); - return c ? c->GetCompositorAnimationHost() : nullptr; -} - -cc::AnimationTimeline* LocalFrameView::GetCompositorAnimationTimeline() const { - if (GetScrollingContext()->GetCompositorAnimationTimeline()) - return GetScrollingContext()->GetCompositorAnimationTimeline(); - - if (!GetFrame().LocalFrameRoot().IsMainFrame()) + if (!GetChromeClient()) return nullptr; - // TODO(kenrb): Compositor animation host and timeline for the main frame - // still live on ScrollingCoordinator. https://crbug.com/680606. - ScrollingCoordinator* c = GetScrollingCoordinator(); - return c ? c->GetCompositorAnimationTimeline() : nullptr; + return GetChromeClient()->GetCompositorAnimationHost(*frame_); +} + +cc::AnimationTimeline* LocalFrameView::GetScrollAnimationTimeline() const { + if (!GetChromeClient()) + return nullptr; + + return GetChromeClient()->GetScrollAnimationTimeline(*frame_); } void LocalFrameView::SetLayoutOverflowSize(const gfx::Size& size) {
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.h b/third_party/blink/renderer/core/frame/local_frame_view.h index 40f7287..232696d 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.h +++ b/third_party/blink/renderer/core/frame/local_frame_view.h
@@ -115,7 +115,6 @@ class ScrollableArea; class Scrollbar; class ScrollingCoordinator; -class ScrollingCoordinatorContext; class TransformState; class LocalFrameUkmAggregator; class WebPluginContainerImpl; @@ -727,9 +726,8 @@ cc::Layer* RootCcLayer(); const cc::Layer* RootCcLayer() const; - ScrollingCoordinatorContext* GetScrollingContext() const; cc::AnimationHost* GetCompositorAnimationHost() const; - cc::AnimationTimeline* GetCompositorAnimationTimeline() const; + cc::AnimationTimeline* GetScrollAnimationTimeline() const; LayoutShiftTracker& GetLayoutShiftTracker() { return *layout_shift_tracker_; } PaintTimingDetector& GetPaintTimingDetector() const { @@ -1158,9 +1156,6 @@ LifecycleData lifecycle_data_; - // Lazily created, but should only be created on a local frame root's view. - mutable std::unique_ptr<ScrollingCoordinatorContext> scrolling_context_; - // For testing. bool is_tracking_raster_invalidations_ = false;
diff --git a/third_party/blink/renderer/core/frame/visual_viewport.cc b/third_party/blink/renderer/core/frame/visual_viewport.cc index e5c4745a..b33fc5b 100644 --- a/third_party/blink/renderer/core/frame/visual_viewport.cc +++ b/third_party/blink/renderer/core/frame/visual_viewport.cc
@@ -1137,14 +1137,14 @@ cc::AnimationHost* VisualViewport::GetCompositorAnimationHost() const { DCHECK(IsActiveViewport()); - ScrollingCoordinator* c = GetPage().GetScrollingCoordinator(); - return c ? c->GetCompositorAnimationHost() : nullptr; + DCHECK(GetChromeClient()); + return GetChromeClient()->GetCompositorAnimationHost(LocalMainFrame()); } cc::AnimationTimeline* VisualViewport::GetCompositorAnimationTimeline() const { DCHECK(IsActiveViewport()); - ScrollingCoordinator* c = GetPage().GetScrollingCoordinator(); - return c ? c->GetCompositorAnimationTimeline() : nullptr; + DCHECK(GetChromeClient()); + return GetChromeClient()->GetScrollAnimationTimeline(LocalMainFrame()); } void VisualViewport::NotifyRootFrameViewport() const {
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc index 08fb7b6..3f21004 100644 --- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc +++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
@@ -41,6 +41,7 @@ #include "base/task/single_thread_task_runner.h" #include "base/time/time.h" #include "build/build_config.h" +#include "cc/animation/animation_host.h" #include "cc/base/features.h" #include "cc/trees/compositor_commit_data.h" #include "cc/trees/layer_tree_host.h" @@ -318,17 +319,9 @@ } void WebFrameWidgetImpl::Close() { - LocalFrameView* frame_view; - if (ForSubframe()) { - frame_view = LocalRootImpl()->GetFrame()->View(); - } else { - // Scrolling for the root frame is special we need to pass null indicating - // we are at the top of the tree when setting up the Animation. Which will - // cause ownership of the timeline and animation host. - // See ScrollingCoordinator::AnimationHostInitialized. - frame_view = nullptr; - } - GetPage()->WillCloseAnimationHost(frame_view); + // TODO(bokan): This seems wrong since the page may have other still-active + // frame widgets. See also: https://crbug.com/1344531. + GetPage()->WillStopCompositing(); if (ForMainFrame()) { // Closing the WebFrameWidgetImpl happens in response to the local main @@ -963,6 +956,7 @@ frame->GetEventHandler().TargetGestureEvent(scaled_event); // Link highlight animations are only for the main frame. + // TODO(bokan): This isn't intentional, see https://crbug.com/1344531. if (ForMainFrame()) { // Handle link highlighting outside the main switch to avoid getting lost in // the complicated set of cases handled below. @@ -2058,18 +2052,11 @@ *GetPage()->GetPageScheduler(), screen_infos, settings, input_handler_weak_ptr_factory_.GetWeakPtr()); - LocalFrameView* frame_view; - if (ForSubframe()) { - frame_view = LocalRootImpl()->GetFrame()->View(); - } else { - // Scrolling for the root frame is special we need to pass null indicating - // we are at the top of the tree when setting up the Animation. Which will - // cause ownership of the timeline and animation host. - // See ScrollingCoordinator::AnimationHostInitialized. - frame_view = nullptr; - } - - GetPage()->AnimationHostInitialized(*AnimationHost(), frame_view); + // TODO(bokan): This seems wrong. Page may host multiple FrameWidgets so this + // will call DidInitializeCompositing once per FrameWidget. It probably makes + // sense to move LinkHighlight from Page to WidgetBase so initialization is + // per-widget. See also: https://crbug.com/1344531. + GetPage()->DidInitializeCompositing(*AnimationHost()); } void WebFrameWidgetImpl::InitializeNonCompositing( @@ -2914,6 +2901,10 @@ return widget_base_->AnimationHost(); } +cc::AnimationTimeline* WebFrameWidgetImpl::ScrollAnimationTimeline() const { + return widget_base_->ScrollAnimationTimeline(); +} + base::WeakPtr<PaintWorkletPaintDispatcher> WebFrameWidgetImpl::EnsureCompositorPaintDispatcher( scoped_refptr<base::SingleThreadTaskRunner>* paint_task_runner) {
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.h b/third_party/blink/renderer/core/frame/web_frame_widget_impl.h index d040f64..130e4fc 100644 --- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.h +++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.h
@@ -211,6 +211,7 @@ // FrameWidget overrides. cc::AnimationHost* AnimationHost() const final; + cc::AnimationTimeline* ScrollAnimationTimeline() const final; void SetOverscrollBehavior( const cc::OverscrollBehavior& overscroll_behavior) final; void RequestAnimationAfterDelay(const base::TimeDelta&) final;
diff --git a/third_party/blink/renderer/core/html/html_anchor_element.cc b/third_party/blink/renderer/core/html/html_anchor_element.cc index c93d961..5e2dc06 100644 --- a/third_party/blink/renderer/core/html/html_anchor_element.cc +++ b/third_party/blink/renderer/core/html/html_anchor_element.cc
@@ -540,8 +540,7 @@ CanRegisterAttributionInContext( frame, this, /*request_id=*/absl::nullopt, - AttributionSrcLoader::RegisterContext::kAttributionSrc, - /*log_issues=*/false)) { + AttributionSrcLoader::RegisterContext::kAttributionSrc)) { frame_request.SetImpression(blink::Impression()); } }
diff --git a/third_party/blink/renderer/core/html/track/vtt/vtt_cue_layout_algorithm.cc b/third_party/blink/renderer/core/html/track/vtt/vtt_cue_layout_algorithm.cc index aa30400..efc7da7 100644 --- a/third_party/blink/renderer/core/html/track/vtt/vtt_cue_layout_algorithm.cc +++ b/third_party/blink/renderer/core/html/track/vtt/vtt_cue_layout_algorithm.cc
@@ -4,6 +4,8 @@ #include "third_party/blink/renderer/core/html/track/vtt/vtt_cue_layout_algorithm.h" +#include <cmath> + #include "third_party/blink/renderer/core/frame/settings.h" #include "third_party/blink/renderer/core/html/track/vtt/vtt_cue.h" #include "third_party/blink/renderer/core/html/track/vtt/vtt_cue_box.h" @@ -31,6 +33,42 @@ } } +LayoutUnit VttCueLayoutAlgorithm::ComputeInitialPositionAdjustment( + LayoutUnit max_dimension) { + DCHECK(std::isfinite(snap_to_lines_position_)); + + // 4. Let line be cue's computed line. + // 5. Round line to an integer by adding 0.5 and then flooring it. + float line = std::floorf(snap_to_lines_position_ + 0.5f); + + // 6. Vertical Growing Left: Add one to line then negate it. + const auto& cue_box = *cue_.GetLayoutBox(); + if (cue_box.HasFlippedBlocksWritingMode()) + line = -(line + 1); + + // 7. Let position be the result of multiplying step and line offset. + LayoutUnit position(step_ * line); + + // 8. Vertical Growing Left: Decrease position by the width of the + // bounding box of the boxes in boxes, then increase position by step. + if (cue_box.HasFlippedBlocksWritingMode()) { + position -= cue_box.FrameRect().Width(); + position += step_; + } + + // 9. If line is less than zero then increase position by max dimension, + // and negate step. + if (line < 0) { + position += max_dimension; + step_ = -step_; + } else { + // https://www.w3.org/TR/2017/WD-webvtt1-20170808/#apply-webvtt-cue-settings + // 11.11. Otherwise, increase position by margin. + position += margin_; + } + return position; +} + // CueBoundingBox() does not return the geometry from LayoutBox as is because // the resultant rectangle should be: // - Based on the latest adjusted position even before the box is laid out. @@ -96,8 +134,7 @@ const double margin_ratio = settings ? settings->GetTextTrackMarginPercentage() / 100.0 : 0; margin_ = LayoutUnit(full_dimension * margin_ratio); - [[maybe_unused]] const LayoutUnit max_dimension = - full_dimension - 2 * margin_; + const LayoutUnit max_dimension = full_dimension - 2 * margin_; // 2. Horizontal: Let step be the height of the first line box in boxes. // Vertical: Let step be the width of the first line box in boxes. @@ -107,6 +144,10 @@ if (step_ == LayoutUnit()) return; + // Step 4-9 + [[maybe_unused]] LayoutUnit position = + ComputeInitialPositionAdjustment(max_dimension); + // TODO(crbug.com/1335309): Implement this. // This function will make cue_.adjusted_position_ a value other than
diff --git a/third_party/blink/renderer/core/html/track/vtt/vtt_cue_layout_algorithm.h b/third_party/blink/renderer/core/html/track/vtt/vtt_cue_layout_algorithm.h index 95766ee4..b163d88 100644 --- a/third_party/blink/renderer/core/html/track/vtt/vtt_cue_layout_algorithm.h +++ b/third_party/blink/renderer/core/html/track/vtt/vtt_cue_layout_algorithm.h
@@ -37,6 +37,7 @@ // Helpers for AdjustPositionWithSnapToLines(): + LayoutUnit ComputeInitialPositionAdjustment(LayoutUnit max_dimension); static gfx::Rect CueBoundingBox(const LayoutBox& cue_box); VTTCueBox& cue_; @@ -44,8 +45,8 @@ // |margin_| and |step_| are data members because they are accessed by // multiple member functions, and we'd like to simplify their arguments. - [[maybe_unused]] LayoutUnit margin_; - [[maybe_unused]] LayoutUnit step_; + LayoutUnit margin_; + LayoutUnit step_; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/input/pointer_event_manager.cc b/third_party/blink/renderer/core/input/pointer_event_manager.cc index d4080054..c88ec07 100644 --- a/third_party/blink/renderer/core/input/pointer_event_manager.cc +++ b/third_party/blink/renderer/core/input/pointer_event_manager.cc
@@ -548,8 +548,7 @@ const Vector<WebPointerEvent>& coalesced_events, const Vector<WebPointerEvent>& predicted_events) { if (event.GetType() == WebInputEvent::Type::kPointerRawUpdate) { - if (!RuntimeEnabledFeatures::PointerRawUpdateEnabled() || - !frame_->GetEventHandlerRegistry().HasEventHandlers( + if (!frame_->GetEventHandlerRegistry().HasEventHandlers( EventHandlerRegistry::kPointerRawUpdateEvent)) return WebInputEventResult::kHandledSystem; @@ -861,7 +860,6 @@ if ((event_type == WebInputEvent::Type::kPointerDown || event_type == WebInputEvent::Type::kPointerUp) && pointer_event->type() == event_type_names::kPointermove && - RuntimeEnabledFeatures::PointerRawUpdateEnabled() && frame_->GetEventHandlerRegistry().HasEventHandlers( EventHandlerRegistry::kPointerRawUpdateEvent)) { // This is a chorded button move event. We need to also send a
diff --git a/third_party/blink/renderer/core/inspector/inspector_audits_issue.cc b/third_party/blink/renderer/core/inspector/inspector_audits_issue.cc index 9a5fae6..426cfb7 100644 --- a/third_party/blink/renderer/core/inspector/inspector_audits_issue.cc +++ b/third_party/blink/renderer/core/inspector/inspector_audits_issue.cc
@@ -467,6 +467,9 @@ case DeprecationIssueType::kEventPath: type = protocol::Audits::DeprecationIssueTypeEnum::EventPath; break; + case DeprecationIssueType::kExpectCTHeader: + type = protocol::Audits::DeprecationIssueTypeEnum::ExpectCTHeader; + break; case DeprecationIssueType::kGeolocationInsecureOrigin: type = protocol::Audits::DeprecationIssueTypeEnum::GeolocationInsecureOrigin;
diff --git a/third_party/blink/renderer/core/inspector/inspector_audits_issue.h b/third_party/blink/renderer/core/inspector/inspector_audits_issue.h index a245d85..3458bd3 100644 --- a/third_party/blink/renderer/core/inspector/inspector_audits_issue.h +++ b/third_party/blink/renderer/core/inspector/inspector_audits_issue.h
@@ -51,6 +51,7 @@ kDeprecationExample, kDocumentDomainSettingWithoutOriginAgentClusterHeader, kEventPath, + kExpectCTHeader, kGeolocationInsecureOrigin, kGeolocationInsecureOriginDeprecatedNotRemoved, kGetUserMediaInsecureOrigin,
diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc index f6fd9250..d44e58e 100644 --- a/third_party/blink/renderer/core/loader/document_loader.cc +++ b/third_party/blink/renderer/core/loader/document_loader.cc
@@ -2372,6 +2372,10 @@ RecordUseCountersForCommit(); RecordConsoleMessagesForCommit(); + if (!response_.HttpHeaderField(http_names::kExpectCT).IsEmpty()) { + Deprecation::CountDeprecation(frame_->DomWindow(), + mojom::blink::WebFeature::kExpectCTHeader); + } // Clear the user activation state. // TODO(crbug.com/736415): Clear this bit unconditionally for all frames.
diff --git a/third_party/blink/renderer/core/loader/empty_clients.h b/third_party/blink/renderer/core/loader/empty_clients.h index 4e7ec0a..d44adfd6 100644 --- a/third_party/blink/renderer/core/loader/empty_clients.h +++ b/third_party/blink/renderer/core/loader/empty_clients.h
@@ -221,6 +221,13 @@ } void AttachRootLayer(scoped_refptr<cc::Layer>, LocalFrame* local_root) override; + cc::AnimationHost* GetCompositorAnimationHost(LocalFrame&) const override { + return nullptr; + } + cc::AnimationTimeline* GetScrollAnimationTimeline( + LocalFrame&) const override { + return nullptr; + } void SetEventListenerProperties(LocalFrame*, cc::EventListenerClass, cc::EventListenerProperties) override {}
diff --git a/third_party/blink/renderer/core/loader/image_loader.cc b/third_party/blink/renderer/core/loader/image_loader.cc index 422d4e2..db2aaa45 100644 --- a/third_party/blink/renderer/core/loader/image_loader.cc +++ b/third_party/blink/renderer/core/loader/image_loader.cc
@@ -505,9 +505,9 @@ if (IsA<HTMLImageElement>(GetElement()) && GetElement()->FastHasAttribute(html_names::kAttributionsrcAttr) && CanRegisterAttributionInContext( - frame, To<HTMLImageElement>(GetElement()), absl::nullopt, - AttributionSrcLoader::RegisterContext::kResource, - /*log_issues=*/false)) { + frame, To<HTMLImageElement>(GetElement()), + /*request_id=*/absl::nullopt, + AttributionSrcLoader::RegisterContext::kResource)) { resource_request.SetHttpHeaderField( http_names::kAttributionReportingEligible, kAttributionEligibleEventSourceAndTrigger);
diff --git a/third_party/blink/renderer/core/loader/resource_load_observer_for_frame.cc b/third_party/blink/renderer/core/loader/resource_load_observer_for_frame.cc index ed1d4081..31218845 100644 --- a/third_party/blink/renderer/core/loader/resource_load_observer_for_frame.cc +++ b/third_party/blink/renderer/core/loader/resource_load_observer_for_frame.cc
@@ -155,6 +155,12 @@ request.Priority()); } + if (!redirect_response.IsNull() && + !redirect_response.HttpHeaderField(http_names::kExpectCT).IsEmpty()) { + Deprecation::CountDeprecation(frame->DomWindow(), + mojom::blink::WebFeature::kExpectCTHeader); + } + frame->GetAttributionSrcLoader()->MaybeRegisterAttributionHeaders( request, redirect_response, resource); @@ -262,6 +268,11 @@ RecordAddressSpaceFeature(frame, response); + if (!response.HttpHeaderField(http_names::kExpectCT).IsEmpty()) { + Deprecation::CountDeprecation(frame->DomWindow(), + mojom::blink::WebFeature::kExpectCTHeader); + } + std::unique_ptr<AlternateSignedExchangeResourceInfo> alternate_resource_info; // See if this is a prefetch for a SXG.
diff --git a/third_party/blink/renderer/core/page/build.gni b/third_party/blink/renderer/core/page/build.gni index c13851d..80fc81a6 100644 --- a/third_party/blink/renderer/core/page/build.gni +++ b/third_party/blink/renderer/core/page/build.gni
@@ -83,7 +83,6 @@ "scrolling/scroll_state_callback.h", "scrolling/scrolling_coordinator.cc", "scrolling/scrolling_coordinator.h", - "scrolling/scrolling_coordinator_context.h", "scrolling/snap_coordinator.cc", "scrolling/snap_coordinator.h", "scrolling/sticky_position_scrolling_constraints.cc",
diff --git a/third_party/blink/renderer/core/page/chrome_client.h b/third_party/blink/renderer/core/page/chrome_client.h index 15c701da..881412b7 100644 --- a/third_party/blink/renderer/core/page/chrome_client.h +++ b/third_party/blink/renderer/core/page/chrome_client.h
@@ -62,6 +62,7 @@ #undef CreateWindow namespace cc { +class AnimationHost; class AnimationTimeline; struct ElementId; class Layer; @@ -417,15 +418,10 @@ virtual void AttachRootLayer(scoped_refptr<cc::Layer>, LocalFrame* local_root) = 0; - // Set the cc::AnimationTimeline for a local root. Should later be unset - // by a call to DetachCompositorAnimationTimeline(). - virtual void AttachCompositorAnimationTimeline(cc::AnimationTimeline*, - LocalFrame* local_root) {} - // Removes the cc::AnimationTimeline for a local root. The timeline - // would have previously been given to AttachCompositorAnimationTimeline() but - // it's valid to call this even if the timeline was never attached. - virtual void DetachCompositorAnimationTimeline(cc::AnimationTimeline*, - LocalFrame* local_root) {} + virtual cc::AnimationHost* GetCompositorAnimationHost(LocalFrame&) const = 0; + + virtual cc::AnimationTimeline* GetScrollAnimationTimeline( + LocalFrame&) const = 0; virtual void EnterFullscreen(LocalFrame&, const FullscreenOptions*,
diff --git a/third_party/blink/renderer/core/page/chrome_client_impl.cc b/third_party/blink/renderer/core/page/chrome_client_impl.cc index dd3d4ab..c3efeb47 100644 --- a/third_party/blink/renderer/core/page/chrome_client_impl.cc +++ b/third_party/blink/renderer/core/page/chrome_client_impl.cc
@@ -863,22 +863,18 @@ widget->SetRootLayer(std::move(root_layer)); } -void ChromeClientImpl::AttachCompositorAnimationTimeline( - cc::AnimationTimeline* compositor_timeline, - LocalFrame* local_frame) { - DCHECK(Platform::Current()->IsThreadedAnimationEnabled()); - FrameWidget* widget = local_frame->GetWidgetForLocalRoot(); +cc::AnimationHost* ChromeClientImpl::GetCompositorAnimationHost( + LocalFrame& local_frame) const { + FrameWidget* widget = local_frame.GetWidgetForLocalRoot(); DCHECK(widget); - widget->AnimationHost()->AddAnimationTimeline(compositor_timeline); + return widget->AnimationHost(); } -void ChromeClientImpl::DetachCompositorAnimationTimeline( - cc::AnimationTimeline* compositor_timeline, - LocalFrame* local_frame) { - DCHECK(Platform::Current()->IsThreadedAnimationEnabled()); - FrameWidget* widget = local_frame->GetWidgetForLocalRoot(); +cc::AnimationTimeline* ChromeClientImpl::GetScrollAnimationTimeline( + LocalFrame& local_frame) const { + FrameWidget* widget = local_frame.GetWidgetForLocalRoot(); DCHECK(widget); - widget->AnimationHost()->RemoveAnimationTimeline(compositor_timeline); + return widget->ScrollAnimationTimeline(); } void ChromeClientImpl::EnterFullscreen(LocalFrame& frame,
diff --git a/third_party/blink/renderer/core/page/chrome_client_impl.h b/third_party/blink/renderer/core/page/chrome_client_impl.h index 027e727..6b8d68c 100644 --- a/third_party/blink/renderer/core/page/chrome_client_impl.h +++ b/third_party/blink/renderer/core/page/chrome_client_impl.h
@@ -201,10 +201,8 @@ void AttachRootLayer(scoped_refptr<cc::Layer>, LocalFrame* local_root) override; - void AttachCompositorAnimationTimeline(cc::AnimationTimeline*, - LocalFrame*) override; - void DetachCompositorAnimationTimeline(cc::AnimationTimeline*, - LocalFrame*) override; + cc::AnimationHost* GetCompositorAnimationHost(LocalFrame&) const override; + cc::AnimationTimeline* GetScrollAnimationTimeline(LocalFrame&) const override; void EnterFullscreen(LocalFrame&, const FullscreenOptions*,
diff --git a/third_party/blink/renderer/core/page/create_window.cc b/third_party/blink/renderer/core/page/create_window.cc index c526aab..09ad56296 100644 --- a/third_party/blink/renderer/core/page/create_window.cc +++ b/third_party/blink/renderer/core/page/create_window.cc
@@ -229,8 +229,7 @@ CanRegisterAttributionInContext( dom_window->GetFrame(), /*element=*/nullptr, /*request_id=*/absl::nullopt, - AttributionSrcLoader::RegisterContext::kAttributionSrc, - /*log_issues=*/false)) { + AttributionSrcLoader::RegisterContext::kAttributionSrc)) { window_features.impression = blink::Impression(); } }
diff --git a/third_party/blink/renderer/core/page/page.cc b/third_party/blink/renderer/core/page/page.cc index 3a02bd83..84b3aec95 100644 --- a/third_party/blink/renderer/core/page/page.cc +++ b/third_party/blink/renderer/core/page/page.cc
@@ -944,19 +944,12 @@ Supplementable<Page>::Trace(visitor); } -void Page::AnimationHostInitialized(cc::AnimationHost& animation_host, - LocalFrameView* view) { - if (GetScrollingCoordinator()) { - GetScrollingCoordinator()->AnimationHostInitialized(animation_host, view); - } - GetLinkHighlight().AnimationHostInitialized(animation_host); +void Page::DidInitializeCompositing(cc::AnimationHost& host) { + GetLinkHighlight().AnimationHostInitialized(host); } -void Page::WillCloseAnimationHost(LocalFrameView* view) { - if (scrolling_coordinator_) - scrolling_coordinator_->WillCloseAnimationHost(view); +void Page::WillStopCompositing() { GetLinkHighlight().WillCloseAnimationHost(); - // We may have disconnected the associated LayerTreeHost during // the frame lifecycle so ensure the PageAnimator is reset to the // default state.
diff --git a/third_party/blink/renderer/core/page/page.h b/third_party/blink/renderer/core/page/page.h index 9cfb780..f5cc0f4 100644 --- a/third_party/blink/renderer/core/page/page.h +++ b/third_party/blink/renderer/core/page/page.h
@@ -318,8 +318,8 @@ void Trace(Visitor*) const override; - void AnimationHostInitialized(cc::AnimationHost&, LocalFrameView*); - void WillCloseAnimationHost(LocalFrameView*); + void DidInitializeCompositing(cc::AnimationHost&); + void WillStopCompositing(); void WillBeDestroyed();
diff --git a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc index 242cecd..35228c3 100644 --- a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc +++ b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc
@@ -29,9 +29,6 @@ #include <utility> #include "build/build_config.h" -#include "cc/animation/animation_host.h" -#include "cc/animation/animation_id_provider.h" -#include "cc/animation/animation_timeline.h" #include "cc/input/main_thread_scrolling_reason.h" #include "cc/input/scroll_snap_data.h" #include "cc/layers/picture_layer.h" @@ -46,7 +43,6 @@ #include "third_party/blink/renderer/core/layout/layout_view.h" #include "third_party/blink/renderer/core/page/chrome_client.h" #include "third_party/blink/renderer/core/page/page.h" -#include "third_party/blink/renderer/core/page/scrolling/scrolling_coordinator_context.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/scroll/scroll_animator_base.h" @@ -175,41 +171,6 @@ vertical_scrollbars_.clear(); } -void ScrollingCoordinator::AnimationHostInitialized( - cc::AnimationHost& animation_host, - LocalFrameView* view) { - if (!Platform::Current()->IsThreadedAnimationEnabled()) - return; - - auto timeline = - cc::AnimationTimeline::Create(cc::AnimationIdProvider::NextTimelineId()); - if (view && view->GetFrame().LocalFrameRoot() != page_->MainFrame()) { - view->GetScrollingContext()->SetAnimationHost(&animation_host); - view->GetScrollingContext()->SetAnimationTimeline(std::move(timeline)); - view->GetCompositorAnimationHost()->AddAnimationTimeline( - view->GetCompositorAnimationTimeline()); - } else { - animation_host_ = &animation_host; - programmatic_scroll_animator_timeline_ = std::move(timeline); - animation_host_->AddAnimationTimeline( - programmatic_scroll_animator_timeline_); - } -} - -void ScrollingCoordinator::WillCloseAnimationHost(LocalFrameView* view) { - if (view && view->GetFrame().LocalFrameRoot() != page_->MainFrame()) { - view->GetCompositorAnimationHost()->RemoveAnimationTimeline( - view->GetCompositorAnimationTimeline()); - view->GetScrollingContext()->SetAnimationTimeline(nullptr); - view->GetScrollingContext()->SetAnimationHost(nullptr); - } else if (programmatic_scroll_animator_timeline_) { - animation_host_->RemoveAnimationTimeline( - programmatic_scroll_animator_timeline_); - programmatic_scroll_animator_timeline_ = nullptr; - animation_host_ = nullptr; - } -} - void ScrollingCoordinator::WillBeDestroyed() { DCHECK(page_); page_ = nullptr;
diff --git a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h index 367fd22..be34a0e 100644 --- a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h +++ b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h
@@ -26,8 +26,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_SCROLLING_SCROLLING_COORDINATOR_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_SCROLLING_SCROLLING_COORDINATOR_H_ -#include <memory> - #include "base/memory/weak_ptr.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/scroll/scroll_types.h" @@ -37,14 +35,11 @@ #include "third_party/blink/renderer/platform/heap/garbage_collected.h" namespace cc { -class AnimationHost; -class AnimationTimeline; class ScrollbarLayerBase; } // namespace cc namespace blink { class LocalFrame; -class LocalFrameView; class Page; class ScrollableArea; @@ -68,14 +63,6 @@ ~ScrollingCoordinator() override; void Trace(Visitor*) const; - // The LocalFrameView argument is optional, nullptr causes the the scrolling - // animation host and timeline to be owned by the ScrollingCoordinator. When - // not null, the host and timeline are attached to the specified - // LocalFrameView. A LocalFrameView only needs to own them when it is the view - // for an OOPIF. - void AnimationHostInitialized(cc::AnimationHost&, LocalFrameView*); - void WillCloseAnimationHost(LocalFrameView*); - void WillBeDestroyed(); void WillDestroyScrollableArea(ScrollableArea*); @@ -89,11 +76,6 @@ // Returns whether the update is successful. bool UpdateCompositorScrollOffset(const LocalFrame&, const ScrollableArea&); - cc::AnimationHost* GetCompositorAnimationHost() { return animation_host_; } - cc::AnimationTimeline* GetCompositorAnimationTimeline() { - return programmatic_scroll_animator_timeline_.get(); - } - // Traverses the frame tree to find the scrollable area using the element id. // This function only checks the local frames. This function does not check // the VisualViewport element id. @@ -127,9 +109,6 @@ ScrollbarOrientation); void RemoveScrollbarLayer(ScrollableArea*, ScrollbarOrientation); - cc::AnimationHost* animation_host_ = nullptr; - scoped_refptr<cc::AnimationTimeline> programmatic_scroll_animator_timeline_; - using ScrollbarMap = HeapHashMap<Member<ScrollableArea>, scoped_refptr<cc::ScrollbarLayerBase>>; ScrollbarMap horizontal_scrollbars_;
diff --git a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator_context.h b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator_context.h deleted file mode 100644 index f3903e7..0000000 --- a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator_context.h +++ /dev/null
@@ -1,49 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_SCROLLING_SCROLLING_COORDINATOR_CONTEXT_H_ -#define THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_SCROLLING_SCROLLING_COORDINATOR_CONTEXT_H_ - -#include "base/memory/scoped_refptr.h" -#include "cc/animation/animation_timeline.h" -#include "third_party/blink/renderer/core/core_export.h" -#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" - -namespace cc { -class AnimationHost; -} - -namespace blink { - -// This enscapsulates ScrollingCoordinator state for each local frame root. -// TODO(kenrb): This class could be temporary depending on how -// https://crbug.com/680606 is resolved. -class CORE_EXPORT ScrollingCoordinatorContext final { - USING_FAST_MALLOC(ScrollingCoordinatorContext); - - public: - ScrollingCoordinatorContext() = default; - ScrollingCoordinatorContext(const ScrollingCoordinatorContext&) = delete; - ScrollingCoordinatorContext& operator=(const ScrollingCoordinatorContext&) = - delete; - virtual ~ScrollingCoordinatorContext() = default; - - void SetAnimationTimeline(scoped_refptr<cc::AnimationTimeline> timeline) { - animation_timeline_ = timeline; - } - void SetAnimationHost(cc::AnimationHost* host) { animation_host_ = host; } - - cc::AnimationTimeline* GetCompositorAnimationTimeline() { - return animation_timeline_.get(); - } - cc::AnimationHost* GetCompositorAnimationHost() { return animation_host_; } - - private: - scoped_refptr<cc::AnimationTimeline> animation_timeline_; - cc::AnimationHost* animation_host_ = nullptr; -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_SCROLLING_SCROLLING_COORDINATOR_CONTEXT_H_
diff --git a/third_party/blink/renderer/core/page/scrolling/scrolling_test.cc b/third_party/blink/renderer/core/page/scrolling/scrolling_test.cc index 74d9ddc..413d50b 100644 --- a/third_party/blink/renderer/core/page/scrolling/scrolling_test.cc +++ b/third_party/blink/renderer/core/page/scrolling/scrolling_test.cc
@@ -55,7 +55,6 @@ #include "third_party/blink/renderer/core/layout/layout_view.h" #include "third_party/blink/renderer/core/page/page.h" #include "third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h" -#include "third_party/blink/renderer/core/page/scrolling/scrolling_coordinator_context.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/testing/sim/sim_request.h" #include "third_party/blink/renderer/core/testing/sim/sim_test.h"
diff --git a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc index 76b6262f..86d831f2 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc
@@ -2558,9 +2558,7 @@ cc::AnimationTimeline* PaintLayerScrollableArea::GetCompositorAnimationTimeline() const { - return layer_->GetLayoutObject() - .GetFrameView() - ->GetCompositorAnimationTimeline(); + return layer_->GetLayoutObject().GetFrameView()->GetScrollAnimationTimeline(); } bool PaintLayerScrollableArea::HasTickmarks() const {
diff --git a/third_party/blink/renderer/core/script/script_loader.cc b/third_party/blink/renderer/core/script/script_loader.cc index 285db3f..8d61ad2 100644 --- a/third_party/blink/renderer/core/script/script_loader.cc +++ b/third_party/blink/renderer/core/script/script_loader.cc
@@ -524,8 +524,7 @@ CanRegisterAttributionInContext( context_window->GetFrame(), /*element=*/nullptr, /*request_id=*/absl::nullopt, - AttributionSrcLoader::RegisterContext::kResource, - /*log_issues=*/false) + AttributionSrcLoader::RegisterContext::kResource) ? ScriptFetchOptions::AttributionReportingEligibility::kEligible : ScriptFetchOptions::AttributionReportingEligibility::kIneligible;
diff --git a/third_party/blink/renderer/platform/heap/blink_gc_memory_dump_provider.cc b/third_party/blink/renderer/platform/heap/blink_gc_memory_dump_provider.cc index bafd3d9..e039f9b 100644 --- a/third_party/blink/renderer/platform/heap/blink_gc_memory_dump_provider.cc +++ b/third_party/blink/renderer/platform/heap/blink_gc_memory_dump_provider.cc
@@ -205,7 +205,8 @@ dump_base_name_ + "/allocated_objects"); for (size_t i = 0; i < global_object_stats.size(); i++) { auto* details = process_memory_dump->CreateAllocatorDump( - "blink_objects/blink_gc/" + GetUniqueName(stats.type_names[i], i)); + "blink_objects/" + dump_base_name_ + "/" + + GetUniqueName(stats.type_names[i], i)); details->AddScalar("allocated_objects_size", base::trace_event::MemoryAllocatorDump::kUnitsBytes, global_object_stats[i].allocated_bytes);
diff --git a/third_party/blink/renderer/platform/network/http_names.json5 b/third_party/blink/renderer/platform/network/http_names.json5 index 35e86bfa..39f7184b 100644 --- a/third_party/blink/renderer/platform/network/http_names.json5 +++ b/third_party/blink/renderer/platform/network/http_names.json5
@@ -36,6 +36,7 @@ "Document-Policy", "Document-Policy-Report-Only", "ETag", + "Expect-CT", "Expires", "Date", "Feature-Policy",
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 366413b..f86691e 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -1848,10 +1848,6 @@ status: "stable", }, { - name: "PointerRawUpdate", - status: "stable", - }, - { name: "Portals", // Portals must be enabled by blink::features::kPortals as we require the // support of the browser process to enable the feature. Enabling this
diff --git a/third_party/blink/renderer/platform/widget/frame_widget.h b/third_party/blink/renderer/platform/widget/frame_widget.h index 314172b..b829a01 100644 --- a/third_party/blink/renderer/platform/widget/frame_widget.h +++ b/third_party/blink/renderer/platform/widget/frame_widget.h
@@ -20,6 +20,7 @@ namespace cc { class AnimationHost; +class AnimationTimeline; enum class EventListenerClass; enum class EventListenerProperties; class Layer; @@ -53,6 +54,9 @@ // Returns the compositors's AnimationHost for the widget. virtual cc::AnimationHost* AnimationHost() const = 0; + // Returns the compositors's AnimationTimeline for the widget. + virtual cc::AnimationTimeline* ScrollAnimationTimeline() const = 0; + // Set the browser's behavior when overscroll happens, e.g. whether to glow // or navigate. virtual void SetOverscrollBehavior(
diff --git a/third_party/blink/renderer/platform/widget/widget_base.cc b/third_party/blink/renderer/platform/widget/widget_base.cc index 2529068..335eeec 100644 --- a/third_party/blink/renderer/platform/widget/widget_base.cc +++ b/third_party/blink/renderer/platform/widget/widget_base.cc
@@ -11,6 +11,8 @@ #include "base/threading/thread_task_runner_handle.h" #include "base/timer/elapsed_timer.h" #include "build/build_config.h" +#include "cc/animation/animation_host.h" +#include "cc/animation/animation_id_provider.h" #include "cc/mojo_embedder/async_layer_tree_frame_sink.h" #include "cc/trees/layer_tree_host.h" #include "cc/trees/layer_tree_settings.h" @@ -236,6 +238,13 @@ if (!is_hidden_) SetCompositorVisible(true); + if (Platform::Current()->IsThreadedAnimationEnabled()) { + DCHECK(AnimationHost()); + scroll_animation_timeline_ = cc::AnimationTimeline::Create( + cc::AnimationIdProvider::NextTimelineId()); + AnimationHost()->AddAnimationTimeline(scroll_animation_timeline_); + } + initialized_ = true; } @@ -266,6 +275,11 @@ // LayerTreeView owns the LayerTreeHost, and is its client, so they are kept // alive together for a clean call stack. if (layer_tree_view_) { + if (ScrollAnimationTimeline()) { + DCHECK(AnimationHost()); + AnimationHost()->RemoveAnimationTimeline(ScrollAnimationTimeline()); + } + layer_tree_view_->Disconnect(); // The `widget_scheduler_` must be deleted last because the @@ -303,7 +317,11 @@ } cc::AnimationHost* WidgetBase::AnimationHost() const { - return layer_tree_view_->animation_host(); + return layer_tree_view_ ? layer_tree_view_->animation_host() : nullptr; +} + +cc::AnimationTimeline* WidgetBase::ScrollAnimationTimeline() const { + return scroll_animation_timeline_.get(); } scheduler::WidgetScheduler* WidgetBase::WidgetScheduler() {
diff --git a/third_party/blink/renderer/platform/widget/widget_base.h b/third_party/blink/renderer/platform/widget/widget_base.h index 2dd98c03..4b50471 100644 --- a/third_party/blink/renderer/platform/widget/widget_base.h +++ b/third_party/blink/renderer/platform/widget/widget_base.h
@@ -6,6 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_WIDGET_WIDGET_BASE_H_ #include "base/time/time.h" +#include "cc/animation/animation_timeline.h" #include "cc/mojo_embedder/async_layer_tree_frame_sink.h" #include "cc/paint/element_id.h" #include "cc/trees/browser_controls_params.h" @@ -33,6 +34,7 @@ namespace cc { class AnimationHost; +class AnimationTimeline; class LayerTreeHost; class LayerTreeSettings; } // namespace cc @@ -182,6 +184,7 @@ void ScheduleAnimationForWebTests() override; cc::AnimationHost* AnimationHost() const; + cc::AnimationTimeline* ScrollAnimationTimeline() const; cc::LayerTreeHost* LayerTreeHost() const; scheduler::WidgetScheduler* WidgetScheduler(); @@ -532,6 +535,9 @@ // See https://crbug.com/1131389 gfx::Size visible_viewport_size_in_dips_; + // The AnimationTimeline for smooth scrolls in this widget. + scoped_refptr<cc::AnimationTimeline> scroll_animation_timeline_; + // Indicates that we shouldn't bother generated paint events. bool is_hidden_;
diff --git a/third_party/blink/web_tests/SlowTests b/third_party/blink/web_tests/SlowTests index 1856e02..4e224c7 100644 --- a/third_party/blink/web_tests/SlowTests +++ b/third_party/blink/web_tests/SlowTests
@@ -815,3 +815,5 @@ crbug.com/1300811 [ Debug Mac ] animations/interpolation/webkit-column-width-interpolation.html [ Slow ] crbug.com/1300811 [ Debug Linux ] animations/interpolation/webkit-column-width-interpolation.html [ Slow ] + +crbug.com/1228246 http/tests/inspector-protocol/network-fetch-content-with-error-status-code.js [ Slow ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index b4f4f8af..ce99327 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -283,8 +283,12 @@ crbug.com/1302831 [ Mac10.14 ] external/wpt/html/browsers/browsing-the-web/back-forward-cache/eligibility/broadcast-channel.html [ Pass Timeout ] crbug.com/1302831 [ Win10.20h2 ] external/wpt/html/browsers/browsing-the-web/back-forward-cache/eligibility/broadcast-channel.html [ Pass Timeout ] -# These tests require the experimental speculative prefetch feature. -crbug.com/1302365 external/wpt/speculation-rules/prefetch/* [ Skip ] +# These tests require the experimental speculative prefetch feature, and requires extra switches to enable content implementation of speculation rules prefetch. +# This expectation and the virtual suite can be removed once that is enabled by default. +crbug.com/1343590 external/wpt/speculation-rules/prefetch/* [ Skip ] +crbug.com/1343590 virtual/prefetch/external/wpt/speculation-rules/prefetch/* [ Skip ] +crbug.com/1343590 http/tests/inspector-protocol/prefetch/* [ Skip ] +crbug.com/1343590 virtual/prefetch/http/tests/inspector-protocol/prefetch/* [ Pass ] # These tests are flaky with BFCache, which is enabled by default. crbug.com/1171298 virtual/plz-dedicated-worker/http/tests/inspector-protocol/network/interception-download.js [ Failure Pass ] @@ -3410,6 +3414,7 @@ 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 [ Mac11 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/registered-property-value-010.https.html [ Failure ] crbug.com/626703 external/wpt/css/mediaqueries/prefers-color-scheme-svg-image.html [ Failure ] crbug.com/626703 external/wpt/css/css-images/gradient/gradient-eval-001.tentative.html [ Failure ] crbug.com/626703 [ Mac12 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/paint2d-composite.https.html [ Failure ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites index eddd5e1..2cbd72e 100644 --- a/third_party/blink/web_tests/VirtualTestSuites +++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -1306,5 +1306,19 @@ "platforms": ["Linux", "Mac", "Win"], "bases": [ "external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties" ], "args": [ "--enable-features=CoopRestrictProperties" ] + }, + { + "prefix": "prefetch", + "platforms": ["Linux", "Mac", "Win"], + "bases": [ + "external/wpt/speculation-rules/prefetch", + "http/tests/inspector-protocol/prefetch" + ], + "args": [ + "--enable-blink-features=SpeculationRulesPrefetchProxy", + "--enable-features=SpeculationRulesPrefetchProxy,PrefetchUseContentRefactor", + "--bypass-prefetch-proxy-for-host=not-web-platform.test", + "--isolated-prerender-allow-all-domains" + ] } ]
diff --git a/third_party/blink/web_tests/external/Version b/third_party/blink/web_tests/external/Version index e208cc0..1a8468c 100644 --- a/third_party/blink/web_tests/external/Version +++ b/third_party/blink/web_tests/external/Version
@@ -1 +1 @@ -Version: 926d343abc5c60def07579e476694b87f0ce7dd6 +Version: 92c5a8f1b91f56c0e39a989138b9431d4b9b381d
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 cac0196..5845282 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
@@ -153162,7 +153162,7 @@ ] ], "target-text-text-decoration-001.html": [ - "1709ce70816a9f384b2ad86d74e03284aea7b50e", + "d90d5d96630d05ab88430b88fe4a4ad8985a6fac", [ null, [ @@ -283435,7 +283435,7 @@ [] ], "target-text-text-decoration-001-ref.html": [ - "b15f74c1dac7da3000f9f9fcc71ba86d5336a072", + "0ee37b1e8aadfed3945bfecc6dbe77e783def5a1", [] ], "target-text-two-words-ref.html": [ @@ -315422,6 +315422,58 @@ ] } }, + "defer-script": { + "README.md": [ + "ac5c91c9a2eab22e4815cab7a7603359d2faceb4", + [] + ], + "resources": { + "async-script-1.js": [ + "267f324aa650154ff8fc787124132774b91e2259", + [] + ], + "defer-script-1.js": [ + "1a0524f4fbd271f9ffed2d8d37d75682620def47", + [] + ], + "defer-script-2.js": [ + "d644e37f182bb3211659f5a5543b44e16550e74f", + [] + ], + "document-open-write-close.js": [ + "80703d5c0ef1cebdaf9e5b91ff42d75e92c494a5", + [] + ], + "document-open-write.js": [ + "178c374df6999fce51a557701842a857cdae46f9", + [] + ], + "document-write-close.js": [ + "7cdde0d78ffa1ec13a6d47a12883b8f7ed957321", + [] + ], + "document-write-iframe.sub.html": [ + "e3022e3bf1f9a6a8e49337e57250b5e77416d63b", + [] + ], + "document-write.js": [ + "413a9bc6210f52b305356373f58623dd2e6e392e", + [] + ], + "helper.js": [ + "89c6d1e8282097b5258588f688ae9fd2cbd69ad7", + [] + ], + "sync-script-1.js": [ + "726b56346e8c32c79028540085e09806d3105527", + [] + ], + "sync-script-2.js": [ + "ba2edfbf270583ab62e32647fcd234f7b039ed83", + [] + ] + } + }, "defer.js": [ "c4449ca7c8a598e3712c8b24eb9e424775c19102", [] @@ -375980,7 +376032,7 @@ }, "content-visibility": { "animation-display-lock.html": [ - "d30cf0df2cd9e1a31d38d54a9bc23b32c6533626", + "7960ba0f59dbaa5f9ce8a7f23b05111d9731c4ed", [ null, {} @@ -376173,6 +376225,16 @@ {} ] ], + "content-visibility-auto-state-changed.html": [ + "d1076459d4b4d52e423f2ed8722ead69451ca73e", + [ + null, + { + "testdriver": true, + "timeout": "long" + } + ] + ], "content-visibility-img.html": [ "94981aa2649514855a9304c4e673f7b7b04680d5", [ @@ -408142,6 +408204,289 @@ } ] ], + "insertparagraph-in-inline-editing-host.tentative.html": [ + "0df107c08044ac93a2d8a3626c234bcedb62a330", + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=normal&display=block&method=enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=normal&display=block&method=shift-enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=normal&display=inline&method=enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=normal&display=inline&method=shift-enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=normal&display=inline-block&method=enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=normal&display=inline-block&method=shift-enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=normal&display=list-item&method=enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=normal&display=list-item&method=shift-enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=normal&display=table-cell&method=enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=normal&display=table-cell&method=shift-enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=pre&display=block&method=enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=pre&display=block&method=shift-enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=pre&display=inline&method=enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=pre&display=inline&method=shift-enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=pre&display=inline-block&method=enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=pre&display=inline-block&method=shift-enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=pre&display=list-item&method=enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=pre&display=list-item&method=shift-enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=pre&display=table-cell&method=enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=pre&display=table-cell&method=shift-enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=pre-line&display=block&method=enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=pre-line&display=block&method=shift-enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=pre-line&display=inline&method=enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=pre-line&display=inline&method=shift-enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=pre-line&display=inline-block&method=enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=pre-line&display=inline-block&method=shift-enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=pre-line&display=list-item&method=enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=pre-line&display=list-item&method=shift-enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=pre-line&display=table-cell&method=enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=pre-line&display=table-cell&method=shift-enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=pre-wrap&display=block&method=enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=pre-wrap&display=block&method=shift-enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=pre-wrap&display=inline&method=enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=pre-wrap&display=inline&method=shift-enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=pre-wrap&display=inline-block&method=enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=pre-wrap&display=inline-block&method=shift-enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=pre-wrap&display=list-item&method=enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=pre-wrap&display=list-item&method=shift-enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=pre-wrap&display=table-cell&method=enter", + { + "testdriver": true, + "timeout": "long" + } + ], + [ + "editing/other/insertparagraph-in-inline-editing-host.tentative.html?white-space=pre-wrap&display=table-cell&method=shift-enter", + { + "testdriver": true, + "timeout": "long" + } + ] + ], "insertparagraph-with-white-space-style.tentative.html": [ "496c073b5f81721ed5b40d3fbfe23d9a2fc5a9b2", [ @@ -439156,6 +439501,13 @@ ] ] }, + "navigate-cross-origin-iframe-to-same-url-with-fragment-fire-load-event.html": [ + "f74bbfd7d3f935dde2df07f86d3300bd9c0cba60", + [ + null, + {} + ] + ], "navigate-cross-origin-iframe-to-same-url-with-fragment.html": [ "ed228ad59b55fa16c2fd22d3f0fdd4b618950989", [ @@ -477474,6 +477826,43 @@ {} ] ], + "defer-script": { + "async-script-2.html": [ + "f7377d847adc04163e50c6a51294363b5a45de35", + [ + null, + {} + ] + ], + "async-script.html": [ + "ea6c546781106d5c76589c49f7db3e82096b7a74", + [ + null, + {} + ] + ], + "defer-script-xml.xhtml": [ + "9d02ff39f517c8c5c68c94e3e56fe8e44f88ffd8", + [ + null, + {} + ] + ], + "defer-script.html": [ + "62c3a74014f080f056ae636cd38669a488f212ff", + [ + null, + {} + ] + ], + "document-write.html": [ + "63e251bae5c0a0274481c196c0a942e88e8a3f2d", + [ + null, + {} + ] + ] + }, "emptyish-script-elements.html": [ "37f4a87c95ea21fdadee85575ad24e7fed9fba55", [
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/animation-display-lock.html b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/animation-display-lock.html index d30cf0d..7960ba0f5 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/animation-display-lock.html +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/animation-display-lock.html
@@ -70,7 +70,7 @@ 'display locked subtree'); await waitForAnimationFrames(2); assert_false(animationIterationEvent, - 'Animation events do no fire while the animation is ' + + 'Animation events do not fire while the animation is ' + 'running in a display locked subtree'); container.style.contentVisibility = 'visible'; await waitForAnimationFrames(2); @@ -144,30 +144,44 @@ target.className = ''; container.style.contentVisibility = 'hidden'; assert_equals(target.getAnimations().length, 0); - let animationStartEvent = false; - let animationFinished = false; - target.addEventListener('animationstart', () => { - animationStartEvent = true; - }); + // Though originally a CSS animation, it is no longer associated with // CSS rules and no longer has an owning element. It now behaves like a - // programmatic web animation. Events should be dispatched and promises - // resolved despite being in a display locked subtree. - animation.play(); + // programmatic web animation. Animation playback events (but not CSS + // animation events) should be dispatched and promises resolved despite + // being in a display locked subtree. + + let cssAnimationEndEvent = false; + target.addEventListener('animationend', () => { + cssAnimationEndEvent = true; + }); + + let animationFinishEvent = false; + animation.addEventListener('finish', () => { + animationFinishEvent = true; + }); + + let animationFinished = false; animation.finished.then(() => { animationFinished = true; }); + + animation.play(); assert_equals(target.getAnimations().length, 1); + + animation.currentTime = 1999; await animation.ready; await waitForAnimationFrames(2); - assert_true(animationStartEvent, + + assert_true(animationFinishEvent, 'Animation event not blocked on display locked subtree if ' + 'no owning element'); - animation.currentTime = 1999; - await waitForAnimationFrames(2); assert_true(animationFinished, 'Finished promise not blocked on display locked subtrtee if ' + 'no owning element'); + assert_false(cssAnimationEndEvent, + 'CSS animation events should not be dispatched if there is no ' + + 'owning element'); }, 'Events and promises are handled normally for animations without an ' + 'owning element');
diff --git a/third_party/blink/web_tests/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative.html b/third_party/blink/web_tests/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative.html new file mode 100644 index 0000000..0df107c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative.html
@@ -0,0 +1,416 @@ +<!doctype html> +<meta chareset="utf-8"> +<meta name="timeout" content="long"> + +<meta name="variant" content="?white-space=normal&display=inline&method=enter"> +<meta name="variant" content="?white-space=normal&display=inline&method=shift-enter"> +<meta name="variant" content="?white-space=normal&display=inline-block&method=enter"> +<meta name="variant" content="?white-space=normal&display=inline-block&method=shift-enter"> +<meta name="variant" content="?white-space=normal&display=block&method=enter"> +<meta name="variant" content="?white-space=normal&display=block&method=shift-enter"> +<meta name="variant" content="?white-space=normal&display=list-item&method=enter"> +<meta name="variant" content="?white-space=normal&display=list-item&method=shift-enter"> +<meta name="variant" content="?white-space=normal&display=table-cell&method=enter"> +<meta name="variant" content="?white-space=normal&display=table-cell&method=shift-enter"> + +<meta name="variant" content="?white-space=pre&display=inline&method=enter"> +<meta name="variant" content="?white-space=pre&display=inline&method=shift-enter"> +<meta name="variant" content="?white-space=pre&display=inline-block&method=enter"> +<meta name="variant" content="?white-space=pre&display=inline-block&method=shift-enter"> +<meta name="variant" content="?white-space=pre&display=block&method=enter"> +<meta name="variant" content="?white-space=pre&display=block&method=shift-enter"> +<meta name="variant" content="?white-space=pre&display=list-item&method=enter"> +<meta name="variant" content="?white-space=pre&display=list-item&method=shift-enter"> +<meta name="variant" content="?white-space=pre&display=table-cell&method=enter"> +<meta name="variant" content="?white-space=pre&display=table-cell&method=shift-enter"> + +<meta name="variant" content="?white-space=pre-line&display=inline&method=enter"> +<meta name="variant" content="?white-space=pre-line&display=inline&method=shift-enter"> +<meta name="variant" content="?white-space=pre-line&display=inline-block&method=enter"> +<meta name="variant" content="?white-space=pre-line&display=inline-block&method=shift-enter"> +<meta name="variant" content="?white-space=pre-line&display=block&method=enter"> +<meta name="variant" content="?white-space=pre-line&display=block&method=shift-enter"> +<meta name="variant" content="?white-space=pre-line&display=list-item&method=enter"> +<meta name="variant" content="?white-space=pre-line&display=list-item&method=shift-enter"> +<meta name="variant" content="?white-space=pre-line&display=table-cell&method=enter"> +<meta name="variant" content="?white-space=pre-line&display=table-cell&method=shift-enter"> + +<meta name="variant" content="?white-space=pre-wrap&display=inline&method=enter"> +<meta name="variant" content="?white-space=pre-wrap&display=inline&method=shift-enter"> +<meta name="variant" content="?white-space=pre-wrap&display=inline-block&method=enter"> +<meta name="variant" content="?white-space=pre-wrap&display=inline-block&method=shift-enter"> +<meta name="variant" content="?white-space=pre-wrap&display=block&method=enter"> +<meta name="variant" content="?white-space=pre-wrap&display=block&method=shift-enter"> +<meta name="variant" content="?white-space=pre-wrap&display=list-item&method=enter"> +<meta name="variant" content="?white-space=pre-wrap&display=list-item&method=shift-enter"> +<meta name="variant" content="?white-space=pre-wrap&display=table-cell&method=enter"> +<meta name="variant" content="?white-space=pre-wrap&display=table-cell&method=shift-enter"> + +<title>Line breaking in inline editing host</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="/resources/testdriver-actions.js"></script> +<script src="../include/editor-test-utils.js"></script> +<div><span contenteditable></span></div> +<script> +"use strict"; + +const searchParams = new URLSearchParams(document.location.search); +const testingInsertParagraph = searchParams.get("method") == "enter"; +const whiteSpace = searchParams.get("white-space"); +const display = searchParams.get("display"); + +const isPreformatted = + whiteSpace == "pre" || whiteSpace == "pre-line" || whiteSpace == "pre-wrap"; + +const editingHost = document.querySelector("span[contenteditable]"); +const container = editingHost.parentElement; +const utils = new EditorTestUtils(editingHost); +const modifiers = (() => { + if (testingInsertParagraph) { + return null; + } + // Only Safari treats `Ctrl+Enter` as insertLineBreak + if (navigator.platform.includes("Mac") && + navigator.userAgent.includes("Safari") && + !navigator.userAgent.includes("Chrom")) { + return utils.kControl; + } + // The others including WebKitGTK treat `Shift+Enter` as it. + return utils.kShift; +})(); + +for (const defaultParagraphSeparator of ["div", "p"]) { + document.execCommand( + "defaultParagraphSeparator", + false, + defaultParagraphSeparator + ); + + promise_test(async t => { + editingHost.setAttribute( + "style", + `display:${display};white-space:${whiteSpace}` + ); + utils.setupEditingHost("{}"); + await utils.sendEnterKey(modifiers); + editingHost.removeAttribute("style"); + // In this case, the inserting line break is the last visible thing in the + // block. Therefore, additional <br> or a preformatted linefeed is also + // required to make the new line visible. + if (!isPreformatted) { + assert_equals( + container.innerHTML, + '<span contenteditable=""><br><br></span>', + `A <br> and additional <br> should be inserted when ${t.name}` + ); + } else { + assert_in_array( + container.innerHTML, + [ + '<span contenteditable="">\n<br></span>', + '<span contenteditable="">\n\n</span>', + ], + `A linefeed and additional line breaker should be inserted when ${t.name}` + ); + } + }, `${ + testingInsertParagraph ? "insertParagraph" : "insertLineBreak" + } in <span contenteditable style="display:${ + display + };white-space:${whiteSpace}">{}</span> (defaultParagraphSeparator=${ + defaultParagraphSeparator + })`); + + promise_test(async t => { + editingHost.setAttribute( + "style", + `display:${display};white-space:${whiteSpace}` + ); + const brElement = document.createElement("br"); + try { + container.appendChild(brElement); + utils.setupEditingHost("{}"); + await utils.sendEnterKey(modifiers); + editingHost.removeAttribute("style"); + // Even if the <span> element is followed by an invisible <br>, it does + // not make the new line in the <span> element visible. Therefore, + // inserting additional line break is required in this case too. + if (!isPreformatted) { + assert_equals( + container.innerHTML, + '<span contenteditable=""><br><br></span><br>', + `A <br> and additional <br> should be inserted when ${t.name}` + ); + } else { + assert_in_array( + container.innerHTML, + [ + `<span contenteditable="">\n\n</span><br>`, + `<span contenteditable="">\n<br></span><br>`, + ], + `A linefeed and additional line break should be inserted when ${t.name}` + ); + } + } finally { + brElement.remove(); + } + }, `${ + testingInsertParagraph ? "insertParagraph" : "insertLineBreak" + } in <span contenteditable style="display:${ + display + };white-space:${ + whiteSpace + }">{}</span> followed by a <br> (defaultParagraphSeparator=${ + defaultParagraphSeparator + })`); + + promise_test(async t => { + editingHost.setAttribute( + "style", + `display:${display};white-space:${whiteSpace}` + ); + const text = document.createTextNode("abc"); + try { + container.appendChild(text); + utils.setupEditingHost("{}"); + await utils.sendEnterKey(modifiers); + editingHost.removeAttribute("style"); + // Even if the <span> element is followed by visible text, it does + // not make the new line in the <span> element visible. Therefore, + // inserting additional line break is required in this case too. + if (!isPreformatted) { + assert_equals( + container.innerHTML, + '<span contenteditable=""><br><br></span>abc', + `A <br> and additional <br> should be inserted when ${t.name}` + ); + } else { + assert_in_array( + container.innerHTML, + [ + `<span contenteditable="">\n\n</span>abc`, + `<span contenteditable="">\n<br></span>abc`, + ], + `A linefeed and additional line break should be inserted when ${t.name}` + ); + } + } finally { + text.remove(); + } + }, `${ + testingInsertParagraph ? "insertParagraph" : "insertLineBreak" + } in <span contenteditable style="display:${ + display + };white-space:${ + whiteSpace + }">{}</span> followed by text (defaultParagraphSeparator=${ + defaultParagraphSeparator + })`); + + promise_test(async t => { + editingHost.setAttribute( + "style", + `display:${display};white-space:${whiteSpace}` + ); + utils.setupEditingHost("{}<br>"); + await utils.sendEnterKey(modifiers); + editingHost.removeAttribute("style"); + // In this case, there is a <br> element which makes the new line (last + // line) visible. Therefore, only a line break should be inserted. + if (!isPreformatted) { + assert_equals( + container.innerHTML, + `<span contenteditable=""><br><br></span>`, + `A <br> should be inserted when ${t.name}` + ); + } else { + assert_equals( + container.innerHTML, + `<span contenteditable="">\n<br></span>`, + `A <br> should be inserted when ${t.name}` + ); + } + }, `${ + testingInsertParagraph ? "insertParagraph" : "insertLineBreak" + } in <span contenteditable style="display:${ + display + };white-space:${whiteSpace}">{}<br></span> (defaultParagraphSeparator=${ + defaultParagraphSeparator + })`); + + promise_test(async t => { + editingHost.setAttribute( + "style", + `display:${display};white-space:${whiteSpace}` + ); + utils.setupEditingHost("[]abcd"); + await utils.sendEnterKey(modifiers); + editingHost.removeAttribute("style"); + assert_equals( + container.innerHTML, + `<span contenteditable="">${ + isPreformatted ? "\n" : "<br>" + }abcd</span>`, + `${ + isPreformatted ? "A linefeed" : "A <br>" + } should be inserted when ${t.name}` + ); + }, `${ + testingInsertParagraph ? "insertParagraph" : "insertLineBreak" + } in <span contenteditable style="display:${ + display + };white-space:${whiteSpace}">[]abcd</span> (defaultParagraphSeparator=${ + defaultParagraphSeparator + })`); + + promise_test(async t => { + editingHost.setAttribute( + "style", + `display:${display};white-space:${whiteSpace}` + ); + utils.setupEditingHost("ab[]cd"); + await utils.sendEnterKey(modifiers); + editingHost.removeAttribute("style"); + assert_equals( + container.innerHTML, + `<span contenteditable="">ab${ + isPreformatted ? "\n" : "<br>" + }cd</span>`, + `${ + isPreformatted ? "A linefeed" : "A <br>" + } should be inserted when ${t.name}` + ); + }, `${ + testingInsertParagraph ? "insertParagraph" : "insertLineBreak" + } in <span contenteditable style="display:${ + display + };white-space:${whiteSpace}">ab[]cd</span> (defaultParagraphSeparator=${ + defaultParagraphSeparator + })`); + + promise_test(async t => { + editingHost.setAttribute( + "style", + `display:${display};white-space:${whiteSpace}` + ); + utils.setupEditingHost("abcd[]"); + await utils.sendEnterKey(modifiers); + editingHost.removeAttribute("style"); + // In this case, the inserting line break is the last visible thing in the + // block. Therefore, additional line break is also required to make the + // new line visible. + if (!isPreformatted) { + assert_equals( + container.innerHTML, + `<span contenteditable="">abcd<br><br></span>`, + `A <br> and additional <br> should be inserted when ${t.name}` + ); + } else { + assert_in_array( + container.innerHTML, + [ + `<span contenteditable="">abcd\n<br></span>`, + `<span contenteditable="">abcd\n\n</span>`, + ], + `A linefeed and additional line break should be inserted when ${t.name}` + ); + } + }, `${ + testingInsertParagraph ? "insertParagraph" : "insertLineBreak" + } in <span contenteditable style="display:${ + display + };white-space:${whiteSpace}">abcd[]</span> (defaultParagraphSeparator=${ + defaultParagraphSeparator + })`); + + promise_test(async t => { + editingHost.setAttribute( + "style", + `display:${display};white-space:${whiteSpace}` + ); + const brElement = document.createElement("br"); + try { + container.appendChild(brElement); + utils.setupEditingHost("abcd[]"); + await utils.sendEnterKey(modifiers); + editingHost.removeAttribute("style"); + // Even if the <span> element is followed by an invisible <br>, it does + // not make the new line in the <span> element visible. Therefore, + // inserting additional line break is required in this case too. + if (!isPreformatted) { + assert_equals( + container.innerHTML, + '<span contenteditable="">abcd<br><br></span><br>', + `A <br> and additional <br> should be inserted when ${t.name}` + ); + } else { + assert_in_array( + container.innerHTML, + [ + `<span contenteditable="">abcd\n<br></span><br>`, + `<span contenteditable="">abcd\n\n</span><br>`, + ], + `A linefeed and additional line break should be inserted when ${t.name}` + ); + } + } finally { + brElement.remove(); + } + }, `${ + testingInsertParagraph ? "insertParagraph" : "insertLineBreak" + } in <span contenteditable style="display:${ + display + };white-space:${ + whiteSpace + }">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=${ + defaultParagraphSeparator + })`); + + promise_test(async t => { + editingHost.setAttribute( + "style", + `display:${display};white-space:${whiteSpace}` + ); + const text = document.createTextNode("efg"); + try { + container.appendChild(text); + utils.setupEditingHost("abcd[]"); + await utils.sendEnterKey(modifiers); + editingHost.removeAttribute("style"); + // Even if the <span> element is followed by visible text, it does + // not make the new line in the <span> element visible. Therefore, + // inserting additional line break is required in this case too. + if (!isPreformatted) { + assert_equals( + container.innerHTML, + '<span contenteditable="">abcd<br><br></span>efg', + `A <br> and additional <br> should be inserted when ${t.name}` + ); + } else { + assert_in_array( + container.innerHTML, + [ + `<span contenteditable="">abcd\n<br></span>efg`, + `<span contenteditable="">abcd\n\n</span>efg`, + ], + `A linefeed and additional line break should be inserted when ${t.name}` + ); + } + } finally { + text.remove(); + } + }, `${ + testingInsertParagraph ? "insertParagraph" : "insertLineBreak" + } in <span contenteditable style="display:${ + display + };white-space:${ + whiteSpace + }">abcd[]</span> followed by text (defaultParagraphSeparator=${ + defaultParagraphSeparator + })`); +} + +</script>
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/attribution-reporting/disabled-permission-policy-attributionsrc-eligible.js b/third_party/blink/web_tests/http/tests/inspector-protocol/attribution-reporting/disabled-permission-policy-attributionsrc-eligible.js new file mode 100644 index 0000000..275d2e0 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/attribution-reporting/disabled-permission-policy-attributionsrc-eligible.js
@@ -0,0 +1,26 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +(async function(testRunner) { + const {page, dp} = await testRunner.startBlank( + `Test that clicking an anchor with valueless attributionsrc triggers an issue when the attribution-reporting Permissions Policy is disabled.`); + + await dp.Audits.enable(); + await page.navigate( + 'https://devtools.test:8443/inspector-protocol/attribution-reporting/resources/permissions-policy-no-conversion-measurement.php'); + + await page.loadHTML(` + <a id="adlink" href="https://a.com" + attributionsrc target="_blank">Impression</a>`); + + const issuePromise = dp.Audits.onceIssueAdded(); + await dp.Runtime.evaluate({ + expression: `document.getElementById('adlink').click()`, + userGesture: true + }); + const issue = await issuePromise; + testRunner.log( + issue.params.issue, 'Issue reported: ', ['frame', 'violatingNodeId']); + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/issues/expect-ct-issue-creation.js b/third_party/blink/web_tests/http/tests/inspector-protocol/issues/expect-ct-issue-creation.js new file mode 100644 index 0000000..5c6f003b --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/issues/expect-ct-issue-creation.js
@@ -0,0 +1,11 @@ +(async function(testRunner) { + const {page, session, dp} = await testRunner.startBlank( + `Verifies that Expect-CT deprecation issue is created from page with Expect-CT header.\n`); + + await dp.Audits.enable(); + page.navigate('http://127.0.0.1:8000/inspector-protocol/resources/expect-ct.php'); + const issue = await dp.Audits.onceIssueAdded(); + + testRunner.log(issue.params, "Inspector issue: "); + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/issues/expect-ct-subresource-issue-creation.js b/third_party/blink/web_tests/http/tests/inspector-protocol/issues/expect-ct-subresource-issue-creation.js new file mode 100644 index 0000000..0c03df46 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/issues/expect-ct-subresource-issue-creation.js
@@ -0,0 +1,11 @@ +(async function(testRunner) { + const {page, session, dp} = await testRunner.startBlank( + `Verifies that Expect-CT deprecation issue is created from subresource with Expect-CT header.\n`); + + await dp.Audits.enable(); + page.navigate('http://127.0.0.1:8000/inspector-protocol/resources/expect-ct-subresource.html'); + const issue = await dp.Audits.onceIssueAdded(); + + testRunner.log(issue.params, "Inspector issue: "); + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/cross-origin-isolation/coop-coep-get-security-isolation-info.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/cross-origin-isolation/coop-coep-get-security-isolation-info.js index 9f8403e..2f6f60c 100644 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/network/cross-origin-isolation/coop-coep-get-security-isolation-info.js +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/network/cross-origin-isolation/coop-coep-get-security-isolation-info.js
@@ -22,7 +22,8 @@ } } }); - + const url = 'https://devtools.oopif.test:8443/inspector-protocol/network/cross-origin-isolation/resources/page-with-coep-corp.php'; + await session.navigate(url); // Sometimes the first request fails after a 30s timeout. Sending "warm up" request to avoid this. async function onFrameNavigated(event) { const frameId = event.params.frame.id; const {result} = await session.protocol.Network.getSecurityIsolationStatus({frameId}); @@ -39,7 +40,6 @@ }); await dp.Target.setAutoAttach({autoAttach: true, waitForDebuggerOnStart: true, flatten: true}); - const url = 'https://devtools.oopif.test:8443/inspector-protocol/network/cross-origin-isolation/resources/page-with-coep-corp.php'; await session.navigate(`${url}?coep&corp=same-site&coop`); await session.navigate(`${url}?coep=require-corp;report-to="endpoint-1"&corp=same-origin&coop=same-origin-allow-popups;report-to="endpoint-2"`); await session.navigate(`${url}?coep-rpt&corp=same-site&coop-rpt`);
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/prefetch/request-will-be-sent.https.js b/third_party/blink/web_tests/http/tests/inspector-protocol/prefetch/request-will-be-sent.https.js new file mode 100644 index 0000000..0419636 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/prefetch/request-will-be-sent.https.js
@@ -0,0 +1,47 @@ +(async function(testRunner) { + let {page, session, dp} = await testRunner.startBlank( + `Tests that Network.requestWillBeSent is dispatched for speculation-rule base prefetch requests.`); + + await dp.Network.enable(); + + let testPromise = new Promise((resolve) => { + let finalizedRequests = 0; + let events = []; + let requestIds = []; + function store(event, title){ + const requestId = event.params.requestId; + if(!requestIds.includes(requestId)) { + requestIds.push(requestId) + } + events.push({id: requestId, title: title, params: event.params}); + } + function checkResolve() { + finalizedRequests++; + if(finalizedRequests >= 2) { + resolve({requestIds, events}); + } + } + dp.Network.onRequestWillBeSent(event => store(event, 'Network.onRequestWillBeSent')); + dp.Network.onRequestWillBeSentExtraInfo(event => store(event, 'Network.onRequestWillBeSentExtraInfo')); + dp.Network.onResponseReceived(event => store(event, 'Network.onResponseReceived')); + dp.Network.onLoadingFinished(event => { store(event, 'Network.onLoadingFinished'); checkResolve();}); + dp.Network.onLoadingFailed(event => { store(event, 'Network.onLoadingFailed'); checkResolve();}); + }); + + page.navigate("https://127.0.0.1:8443/inspector-protocol/prefetch/resources/prefetch.https.html") + + await testPromise.then((result) => { + const stabilizeNames = [...TestRunner.stabilizeNames, 'wallTime', 'requestTime', 'responseTime', 'Date', 'receiveHeadersEnd', 'sendStart', 'sendEnd', 'ETag', 'Last-Modified', 'User-Agent']; + let {requestIds, events} = result; + for(let i=0; i<requestIds.length; ++i) { + testRunner.log(`Message ${i}`); + events.forEach((event) => { + if(event.id === requestIds[i]) { + testRunner.log(event.params, event.title, stabilizeNames); + } + }); + } + }); + + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/prefetch/resources/prefetch.https.html b/third_party/blink/web_tests/http/tests/inspector-protocol/prefetch/resources/prefetch.https.html new file mode 100644 index 0000000..2a0642b --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/prefetch/resources/prefetch.https.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<html> +<script> + let script = document.createElement('script'); + script.type = 'speculationrules'; + script.textContent = JSON.stringify({ prefetch: [{ source: "list", urls: ["https://127.0.0.1:8443/inspector-protocol/prefetch/resources/prefetch.https.html?page=2"] }] }); + document.head.appendChild(script); +</script> +<body> This is a test page for prefetch! </body> +</html>
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/resources/expect-ct-subresource.html b/third_party/blink/web_tests/http/tests/inspector-protocol/resources/expect-ct-subresource.html new file mode 100644 index 0000000..90aa771 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/resources/expect-ct-subresource.html
@@ -0,0 +1,7 @@ +<!DOCTYPE html> +<html> + <body> + <h2>Webpage with Expect-CT subresource</h2> + <img src="expect-ct.php"/> + </body> +</html>
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/resources/expect-ct.php b/third_party/blink/web_tests/http/tests/inspector-protocol/resources/expect-ct.php new file mode 100644 index 0000000..8a922f1 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/resources/expect-ct.php
@@ -0,0 +1,9 @@ +<?php +header("Expect-CT: max-age=604800, enforce"); +?> +<!DOCTYPE html> +<html> + <body> + <h2>Webpage with Expect-CT header</h2> + </body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/css/css-contain/content-visibility/animation-display-lock-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/css/css-contain/content-visibility/animation-display-lock-expected.txt new file mode 100644 index 0000000..425327e --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/css/css-contain/content-visibility/animation-display-lock-expected.txt
@@ -0,0 +1,7 @@ +This is a testharness.js-based test. +PASS Animation events do not fire for a CSS animation running in a display locked subtree +PASS The finished promise does not resolve due to the normal passage of time for a CSS animation in a display locked subtree +PASS The finished promise does not resolve due to the normal passage of time for a CSS transition in a display locked subtree +FAIL Events and promises are handled normally for animations without an owning element assert_false: CSS animation events should not be dispatched if there is no owning element expected false got true +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=normal_display=block_method=enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=normal_display=block_method=enter-expected.txt new file mode 100644 index 0000000..562b5a5 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=normal_display=block_method=enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertParagraph in <span contenteditable style="display:block;white-space:normal">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:normal">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:normal">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:normal">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:normal">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:normal">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:normal">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:normal">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:normal">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:normal">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:normal">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:normal">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:normal">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:normal">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:normal">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:normal">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:normal">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:normal">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=normal_display=block_method=shift-enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=normal_display=block_method=shift-enter-expected.txt new file mode 100644 index 0000000..15b8aa0 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=normal_display=block_method=shift-enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:normal">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:normal">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:normal">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:normal">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:normal">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:normal">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:normal">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:normal">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:normal">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:normal">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:normal">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:normal">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:normal">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:normal">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:normal">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:normal">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:normal">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:normal">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=normal_display=inline-block_method=enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=normal_display=inline-block_method=enter-expected.txt new file mode 100644 index 0000000..417bad3 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=normal_display=inline-block_method=enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:normal">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:normal">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:normal">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:normal">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:normal">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:normal">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:normal">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:normal">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:normal">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:normal">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:normal">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:normal">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:normal">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:normal">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:normal">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:normal">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:normal">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:normal">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=normal_display=inline-block_method=shift-enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=normal_display=inline-block_method=shift-enter-expected.txt new file mode 100644 index 0000000..aa0cdcb5 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=normal_display=inline-block_method=shift-enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:normal">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:normal">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:normal">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:normal">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:normal">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:normal">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:normal">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:normal">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:normal">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:normal">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:normal">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:normal">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:normal">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:normal">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:normal">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:normal">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:normal">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:normal">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=normal_display=inline_method=enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=normal_display=inline_method=enter-expected.txt new file mode 100644 index 0000000..ea7bb4e --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=normal_display=inline_method=enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:normal">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:normal">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:normal">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:normal">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:normal">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:normal">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:normal">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:normal">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:normal">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:normal">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:normal">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:normal">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:normal">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:normal">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:normal">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:normal">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:normal">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:normal">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=normal_display=inline_method=shift-enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=normal_display=inline_method=shift-enter-expected.txt new file mode 100644 index 0000000..cceae7c7 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=normal_display=inline_method=shift-enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:normal">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:normal">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:normal">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:normal">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:normal">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:normal">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:normal">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:normal">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:normal">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:normal">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:normal">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:normal">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:normal">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:normal">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:normal">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:normal">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:normal">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:normal">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=normal_display=list-item_method=enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=normal_display=list-item_method=enter-expected.txt new file mode 100644 index 0000000..8e57be8 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=normal_display=list-item_method=enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:normal">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:normal">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:normal">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:normal">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:normal">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:normal">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:normal">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:normal">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:normal">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:normal">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:normal">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:normal">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:normal">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:normal">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:normal">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:normal">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:normal">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:normal">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=normal_display=list-item_method=shift-enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=normal_display=list-item_method=shift-enter-expected.txt new file mode 100644 index 0000000..e65b4889 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=normal_display=list-item_method=shift-enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:normal">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:normal">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:normal">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:normal">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:normal">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:normal">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:normal">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:normal">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:normal">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:normal">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:normal">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:normal">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:normal">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:normal">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:normal">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:normal">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:normal">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:normal">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=normal_display=table-cell_method=enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=normal_display=table-cell_method=enter-expected.txt new file mode 100644 index 0000000..1b13aa10 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=normal_display=table-cell_method=enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:normal">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:normal">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:normal">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:normal">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:normal">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:normal">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:normal">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:normal">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:normal">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:normal">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:normal">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:normal">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:normal">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:normal">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:normal">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:normal">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:normal">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:normal">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=normal_display=table-cell_method=shift-enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=normal_display=table-cell_method=shift-enter-expected.txt new file mode 100644 index 0000000..28af273 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=normal_display=table-cell_method=shift-enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:normal">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:normal">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:normal">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:normal">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:normal">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:normal">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:normal">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:normal">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:normal">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:normal">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:normal">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:normal">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:normal">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:normal">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:normal">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:normal">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:normal">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:normal">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-line_display=block_method=enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-line_display=block_method=enter-expected.txt new file mode 100644 index 0000000..2e5897d --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-line_display=block_method=enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-line">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-line">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-line">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-line">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-line">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-line">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-line">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-line">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-line">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-line">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-line">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-line">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-line">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-line">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-line">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-line">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-line">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-line">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-line_display=block_method=shift-enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-line_display=block_method=shift-enter-expected.txt new file mode 100644 index 0000000..bd9a3b1 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-line_display=block_method=shift-enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-line">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-line">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-line">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-line">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-line">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-line">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-line">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-line">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-line">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-line">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-line">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-line">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-line">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-line">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-line">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-line">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-line">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-line">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-line_display=inline-block_method=enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-line_display=inline-block_method=enter-expected.txt new file mode 100644 index 0000000..46fcf38 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-line_display=inline-block_method=enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-line">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-line">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-line">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-line">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-line">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-line">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-line">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-line">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-line">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-line">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-line">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-line">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-line">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-line">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-line">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-line">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-line">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-line">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-line_display=inline-block_method=shift-enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-line_display=inline-block_method=shift-enter-expected.txt new file mode 100644 index 0000000..8d70c706 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-line_display=inline-block_method=shift-enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-line">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-line">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-line">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-line">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-line">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-line">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-line">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-line">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-line">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-line">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-line">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-line">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-line">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-line">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-line">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-line">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-line">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-line">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-line_display=inline_method=enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-line_display=inline_method=enter-expected.txt new file mode 100644 index 0000000..0720c2d1 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-line_display=inline_method=enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-line">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-line">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-line">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-line">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-line">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-line">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-line">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-line">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-line">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-line">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-line">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-line">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-line">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-line">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-line">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-line">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-line">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-line">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-line_display=inline_method=shift-enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-line_display=inline_method=shift-enter-expected.txt new file mode 100644 index 0000000..770c5e29 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-line_display=inline_method=shift-enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-line">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-line">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-line">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-line">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-line">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-line">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-line">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-line">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-line">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-line">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-line">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-line">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-line">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-line">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-line">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-line">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-line">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-line">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-line_display=list-item_method=enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-line_display=list-item_method=enter-expected.txt new file mode 100644 index 0000000..1d18c04 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-line_display=list-item_method=enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-line">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-line">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-line">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-line">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-line">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-line">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-line">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-line">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-line">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-line">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-line">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-line">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-line">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-line">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-line">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-line">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-line">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-line">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-line_display=list-item_method=shift-enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-line_display=list-item_method=shift-enter-expected.txt new file mode 100644 index 0000000..7b0b70b9 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-line_display=list-item_method=shift-enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-line">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-line">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-line">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-line">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-line">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-line">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-line">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-line">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-line">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-line">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-line">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-line">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-line">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-line">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-line">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-line">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-line">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-line">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-line_display=table-cell_method=enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-line_display=table-cell_method=enter-expected.txt new file mode 100644 index 0000000..d402bcc --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-line_display=table-cell_method=enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-line">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-line">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-line">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-line">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-line">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-line">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-line">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-line">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-line">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-line">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-line">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-line">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-line">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-line">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-line">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-line">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-line">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-line">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-line_display=table-cell_method=shift-enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-line_display=table-cell_method=shift-enter-expected.txt new file mode 100644 index 0000000..d3558d3 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-line_display=table-cell_method=shift-enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-line">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-line">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-line">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-line">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-line">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-line">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-line">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-line">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-line">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-line">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-line">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-line">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-line">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-line">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-line">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-line">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-line">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-line">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-wrap_display=block_method=enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-wrap_display=block_method=enter-expected.txt new file mode 100644 index 0000000..6d93d2cc --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-wrap_display=block_method=enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-wrap">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-wrap">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-wrap">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-wrap">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-wrap">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-wrap">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-wrap">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-wrap">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-wrap">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-wrap">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-wrap">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-wrap">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-wrap">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-wrap">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-wrap">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-wrap">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-wrap">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre-wrap">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-wrap_display=block_method=shift-enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-wrap_display=block_method=shift-enter-expected.txt new file mode 100644 index 0000000..459fd09 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-wrap_display=block_method=shift-enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-wrap">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-wrap">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-wrap">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-wrap">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-wrap">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-wrap">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-wrap">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-wrap">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-wrap">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-wrap">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-wrap">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-wrap">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-wrap">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-wrap">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-wrap">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-wrap">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-wrap">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre-wrap">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-wrap_display=inline-block_method=enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-wrap_display=inline-block_method=enter-expected.txt new file mode 100644 index 0000000..2578f2a7 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-wrap_display=inline-block_method=enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-wrap">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-wrap">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-wrap">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-wrap">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-wrap">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-wrap">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-wrap">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-wrap">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-wrap">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-wrap">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-wrap">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-wrap">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-wrap">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-wrap">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-wrap">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-wrap">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-wrap">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre-wrap">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-wrap_display=inline-block_method=shift-enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-wrap_display=inline-block_method=shift-enter-expected.txt new file mode 100644 index 0000000..c818208 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-wrap_display=inline-block_method=shift-enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-wrap">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-wrap">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-wrap">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-wrap">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-wrap">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-wrap">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-wrap">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-wrap">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-wrap">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-wrap">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-wrap">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-wrap">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-wrap">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-wrap">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-wrap">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-wrap">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-wrap">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre-wrap">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-wrap_display=inline_method=enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-wrap_display=inline_method=enter-expected.txt new file mode 100644 index 0000000..7eda03074 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-wrap_display=inline_method=enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-wrap">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-wrap">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-wrap">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-wrap">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-wrap">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-wrap">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-wrap">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-wrap">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-wrap">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-wrap">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-wrap">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-wrap">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-wrap">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-wrap">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-wrap">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-wrap">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-wrap">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre-wrap">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-wrap_display=inline_method=shift-enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-wrap_display=inline_method=shift-enter-expected.txt new file mode 100644 index 0000000..af3d751 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-wrap_display=inline_method=shift-enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-wrap">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-wrap">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-wrap">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-wrap">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-wrap">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-wrap">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-wrap">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-wrap">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-wrap">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-wrap">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-wrap">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-wrap">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-wrap">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-wrap">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-wrap">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-wrap">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-wrap">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre-wrap">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-wrap_display=list-item_method=enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-wrap_display=list-item_method=enter-expected.txt new file mode 100644 index 0000000..f6df31b --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-wrap_display=list-item_method=enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-wrap">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-wrap">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-wrap">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-wrap">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-wrap">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-wrap">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-wrap">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-wrap">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-wrap">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-wrap">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-wrap">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-wrap">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-wrap">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-wrap">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-wrap">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-wrap">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-wrap">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre-wrap">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-wrap_display=list-item_method=shift-enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-wrap_display=list-item_method=shift-enter-expected.txt new file mode 100644 index 0000000..3bbd9e47 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-wrap_display=list-item_method=shift-enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-wrap">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-wrap">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-wrap">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-wrap">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-wrap">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-wrap">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-wrap">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-wrap">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-wrap">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-wrap">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-wrap">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-wrap">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-wrap">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-wrap">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-wrap">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-wrap">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-wrap">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre-wrap">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-wrap_display=table-cell_method=enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-wrap_display=table-cell_method=enter-expected.txt new file mode 100644 index 0000000..d6129b8 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-wrap_display=table-cell_method=enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-wrap">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-wrap">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-wrap">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-wrap">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-wrap">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-wrap">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-wrap">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-wrap">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-wrap">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-wrap">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-wrap">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-wrap">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-wrap">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-wrap">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-wrap">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-wrap">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-wrap">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre-wrap">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-wrap_display=table-cell_method=shift-enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-wrap_display=table-cell_method=shift-enter-expected.txt new file mode 100644 index 0000000..3ea3451 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre-wrap_display=table-cell_method=shift-enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-wrap">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-wrap">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-wrap">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-wrap">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-wrap">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-wrap">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-wrap">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-wrap">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-wrap">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-wrap">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-wrap">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-wrap">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-wrap">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-wrap">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-wrap">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-wrap">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-wrap">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre-wrap">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre_display=block_method=enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre_display=block_method=enter-expected.txt new file mode 100644 index 0000000..17080605 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre_display=block_method=enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:block;white-space:pre">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre_display=block_method=shift-enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre_display=block_method=shift-enter-expected.txt new file mode 100644 index 0000000..d491f05c --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre_display=block_method=shift-enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:block;white-space:pre">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre_display=inline-block_method=enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre_display=inline-block_method=enter-expected.txt new file mode 100644 index 0000000..a7c3afbd --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre_display=inline-block_method=enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline-block;white-space:pre">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre_display=inline-block_method=shift-enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre_display=inline-block_method=shift-enter-expected.txt new file mode 100644 index 0000000..0117c1f --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre_display=inline-block_method=shift-enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline-block;white-space:pre">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre_display=inline_method=enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre_display=inline_method=enter-expected.txt new file mode 100644 index 0000000..f12697ce --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre_display=inline_method=enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:inline;white-space:pre">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre_display=inline_method=shift-enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre_display=inline_method=shift-enter-expected.txt new file mode 100644 index 0000000..a6d80ed --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre_display=inline_method=shift-enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:inline;white-space:pre">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre_display=list-item_method=enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre_display=list-item_method=enter-expected.txt new file mode 100644 index 0000000..ca6b15ba --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre_display=list-item_method=enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:list-item;white-space:pre">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre_display=list-item_method=shift-enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre_display=list-item_method=shift-enter-expected.txt new file mode 100644 index 0000000..5165af3 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre_display=list-item_method=shift-enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:list-item;white-space:pre">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre_display=table-cell_method=enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre_display=table-cell_method=enter-expected.txt new file mode 100644 index 0000000..b449443 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre_display=table-cell_method=enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertParagraph in <span contenteditable style="display:table-cell;white-space:pre">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre_display=table-cell_method=shift-enter-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre_display=table-cell_method=shift-enter-expected.txt new file mode 100644 index 0000000..36c7522e --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-inline-editing-host.tentative_white-space=pre_display=table-cell_method=shift-enter-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre">{}</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre">{}</span> followed by a <br> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre">{}</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre">{}<br></span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre">[]abcd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre">ab[]cd</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre">abcd[]</span> (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre">abcd[]</span> followed by text (defaultParagraphSeparator=div) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre">{}</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre">{}</span> followed by a <br> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre">{}</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre">{}<br></span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre">[]abcd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre">ab[]cd</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre">abcd[]</span> (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre">abcd[]</span> followed by a <br> element (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +FAIL insertLineBreak in <span contenteditable style="display:table-cell;white-space:pre">abcd[]</span> followed by text (defaultParagraphSeparator=p) promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/disabled-permission-policy-attributionsrc-eligible-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/disabled-permission-policy-attributionsrc-eligible-expected.txt new file mode 100644 index 0000000..7b73d5c --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/disabled-permission-policy-attributionsrc-eligible-expected.txt
@@ -0,0 +1,12 @@ +Test that clicking an anchor with valueless attributionsrc triggers an issue when the attribution-reporting Permissions Policy is disabled. +Issue reported: { + code : AttributionReportingIssue + details : { + attributionReportingIssueDetails : { + frame : <object> + violatingNodeId : <number> + violationType : PermissionPolicyDisabled + } + } +} +
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/issues/expect-ct-issue-creation-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/issues/expect-ct-issue-creation-expected.txt new file mode 100644 index 0000000..b04218f --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/issues/expect-ct-issue-creation-expected.txt
@@ -0,0 +1,21 @@ +Verifies that Expect-CT deprecation issue is created from page with Expect-CT header. + +Inspector issue: { + issue : { + code : DeprecationIssue + details : { + deprecationIssueDetails : { + affectedFrame : { + frameId : <string> + } + sourceCodeLocation : { + columnNumber : 0 + lineNumber : -1 + url : http://127.0.0.1:8000/inspector-protocol/resources/expect-ct.php + } + type : ExpectCTHeader + } + } + } +} +
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/issues/expect-ct-subresource-issue-creation-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/issues/expect-ct-subresource-issue-creation-expected.txt new file mode 100644 index 0000000..2c4ba6e --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/issues/expect-ct-subresource-issue-creation-expected.txt
@@ -0,0 +1,21 @@ +Verifies that Expect-CT deprecation issue is created from subresource with Expect-CT header. + +Inspector issue: { + issue : { + code : DeprecationIssue + details : { + deprecationIssueDetails : { + affectedFrame : { + frameId : <string> + } + sourceCodeLocation : { + columnNumber : 0 + lineNumber : 0 + url : http://127.0.0.1:8000/inspector-protocol/resources/expect-ct-subresource.html + } + type : ExpectCTHeader + } + } + } +} +
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/prefetch/request-will-be-sent.https-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/prefetch/request-will-be-sent.https-expected.txt new file mode 100644 index 0000000..fc41644 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/prefetch/request-will-be-sent.https-expected.txt
@@ -0,0 +1,249 @@ +Tests that Network.requestWillBeSent is dispatched for speculation-rule base prefetch requests. +Message 0 +Network.onRequestWillBeSent{ + documentURL : <string> + frameId : <string> + hasUserGesture : false + initiator : { + type : other + } + loaderId : <string> + redirectHasExtraInfo : false + request : { + headers : { + Upgrade-Insecure-Requests : 1 + User-Agent : <string> + sec-ch-ua : "content_shell";v="999" + sec-ch-ua-mobile : ?0 + sec-ch-ua-platform : "Unknown" + } + initialPriority : VeryHigh + isSameSite : true + method : GET + mixedContentType : none + referrerPolicy : strict-origin-when-cross-origin + url : https://127.0.0.1:8443/inspector-protocol/prefetch/resources/prefetch.https.html + } + requestId : <string> + timestamp : <number> + type : Document + wallTime : <number> +} +Network.onRequestWillBeSentExtraInfo{ + associatedCookies : [ + ] + connectTiming : { + requestTime : <number> + } + headers : { + Accept : text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 + Accept-Encoding : gzip, deflate, br + Accept-Language : en-us,en + Connection : keep-alive + Host : 127.0.0.1:8443 + Sec-Fetch-Dest : document + Sec-Fetch-Mode : navigate + Sec-Fetch-Site : none + Sec-Fetch-User : ?1 + Upgrade-Insecure-Requests : 1 + User-Agent : <string> + sec-ch-ua : "content_shell";v="999" + sec-ch-ua-mobile : ?0 + sec-ch-ua-platform : "Unknown" + } + requestId : <string> +} +Network.onResponseReceived{ + frameId : <string> + hasExtraInfo : true + loaderId : <string> + requestId : <string> + response : { + connectionId : 10 + connectionReused : true + encodedDataLength : 263 + fromDiskCache : false + fromPrefetchCache : false + fromServiceWorker : false + headers : { + Accept-Ranges : bytes + Connection : Keep-Alive + Content-Length : 395 + Content-Type : text/html + Date : <string> + ETag : <string> + Keep-Alive : timeout=9999 + Last-Modified : <string> + Server : Apache + } + mimeType : text/html + protocol : http/1.1 + remoteIPAddress : 127.0.0.1 + remotePort : 8443 + responseTime : <number> + securityDetails : { + certificateId : 0 + certificateTransparencyCompliance : unknown + cipher : AES_128_GCM + issuer : + keyExchange : + keyExchangeGroup : X25519 + protocol : TLS 1.3 + sanList : [ + ] + signedCertificateTimestampList : [ + ] + subjectName : + validFrom : 1542841725 + validTo : 1858201725 + } + securityState : insecure + status : 200 + statusText : OK + timing : { + connectEnd : -1 + connectStart : -1 + dnsEnd : -1 + dnsStart : -1 + proxyEnd : -1 + proxyStart : -1 + pushEnd : 0 + pushStart : 0 + receiveHeadersEnd : <number> + requestTime : <number> + sendEnd : <number> + sendStart : <number> + sslEnd : -1 + sslStart : -1 + workerFetchStart : -1 + workerReady : -1 + workerRespondWithSettled : -1 + workerStart : -1 + } + url : https://127.0.0.1:8443/inspector-protocol/prefetch/resources/prefetch.https.html + } + timestamp : <number> + type : Document +} +Network.onLoadingFinished{ + encodedDataLength : 658 + requestId : <string> + shouldReportCorbBlocking : false + timestamp : <number> +} +Message 1 +Network.onRequestWillBeSent{ + documentURL : <string> + frameId : <string> + hasUserGesture : false + initiator : { + type : script + url : https://127.0.0.1:8443/inspector-protocol/prefetch/resources/prefetch.https.html + } + loaderId : <string> + redirectHasExtraInfo : false + request : { + headers : { + Purpose : prefetch + Sec-Purpose : prefetch + } + initialPriority : VeryLow + method : GET + referrerPolicy : unsafe-url + url : https://127.0.0.1:8443/inspector-protocol/prefetch/resources/prefetch.https.html?page=2 + } + requestId : <string> + timestamp : <number> + type : Prefetch + wallTime : <number> +} +Network.onRequestWillBeSentExtraInfo{ + associatedCookies : [ + ] + connectTiming : { + requestTime : <number> + } + headers : { + Purpose : prefetch + Sec-Purpose : prefetch + } + requestId : <string> +} +Network.onResponseReceived{ + frameId : <string> + hasExtraInfo : false + loaderId : <string> + requestId : <string> + response : { + connectionId : 10 + connectionReused : true + encodedDataLength : 263 + fromDiskCache : false + fromPrefetchCache : false + fromServiceWorker : false + headers : { + Accept-Ranges : bytes + Connection : Keep-Alive + Content-Length : 395 + Content-Type : text/html + Date : <string> + ETag : <string> + Keep-Alive : timeout=9999 + Last-Modified : <string> + Server : Apache + } + mimeType : text/html + protocol : http/1.1 + remoteIPAddress : 127.0.0.1 + remotePort : 8443 + responseTime : <number> + securityDetails : { + certificateId : 0 + certificateTransparencyCompliance : unknown + cipher : AES_128_GCM + issuer : + keyExchange : + keyExchangeGroup : X25519 + protocol : TLS 1.3 + sanList : [ + ] + signedCertificateTimestampList : [ + ] + subjectName : + validFrom : 1542841725 + validTo : 1858201725 + } + securityState : insecure + status : 200 + statusText : OK + timing : { + connectEnd : -1 + connectStart : -1 + dnsEnd : -1 + dnsStart : -1 + proxyEnd : -1 + proxyStart : -1 + pushEnd : 0 + pushStart : 0 + receiveHeadersEnd : <number> + requestTime : <number> + sendEnd : <number> + sendStart : <number> + sslEnd : -1 + sslStart : -1 + workerFetchStart : -1 + workerReady : -1 + workerRespondWithSettled : -1 + workerStart : -1 + } + url : https://127.0.0.1:8443/inspector-protocol/prefetch/resources/prefetch.https.html?page=2 + } + timestamp : <number> + type : Prefetch +} +Network.onLoadingFinished{ + encodedDataLength : 658 + requestId : <string> + timestamp : <number> +} +
diff --git a/third_party/blink/web_tests/platform/mac-mac11/external/wpt/webmessaging/with-ports/020-expected.txt b/third_party/blink/web_tests/platform/mac-mac11/external/wpt/webmessaging/with-ports/020-expected.txt deleted file mode 100644 index 44de48e..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11/external/wpt/webmessaging/with-ports/020-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -PASS cross-origin test -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/webmessaging/with-ports/020-expected.txt b/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/webmessaging/with-ports/020-expected.txt deleted file mode 100644 index 44de48e..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/webmessaging/with-ports/020-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -PASS cross-origin test -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/webmessaging/with-ports/020-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/webmessaging/with-ports/020-expected.txt deleted file mode 100644 index bd17790a..0000000 --- a/third_party/blink/web_tests/platform/mac/external/wpt/webmessaging/with-ports/020-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL cross-origin test Uncaught Error: assert_equals: expected 1 but got 2 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/virtual/prefetch/README.md b/third_party/blink/web_tests/virtual/prefetch/README.md new file mode 100644 index 0000000..11fe6c9 --- /dev/null +++ b/third_party/blink/web_tests/virtual/prefetch/README.md
@@ -0,0 +1 @@ +This directory is for testing speculation-rule based prefetch
diff --git a/third_party/blink/web_tests/wpt_internal/attribution-reporting/event-level-trigger-filter-data.sub.https.html b/third_party/blink/web_tests/wpt_internal/attribution-reporting/event-level-trigger-filter-data.sub.https.html new file mode 100644 index 0000000..822b7015 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/attribution-reporting/event-level-trigger-filter-data.sub.https.html
@@ -0,0 +1,242 @@ +<!doctype html> +<meta charset=utf-8> +<meta name=timeout content=long> +<meta name=variant content="?include=filters"> +<meta name=variant content="?include=not_filters"> +<meta name=variant content="?include=combination"> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/subset-tests-by-key.js"></script> +<script src="resources/helpers.js"></script> +<script> +const filter_data_promise_test = (testCase) => + attribution_reporting_promise_test(async t => { + await registerAttributionSrc(t, { + source: { + source_event_id: '999', + destination: `https://{{host}}`, + filter_data: testCase.source_filter_data, + }, + method: testCase.method === undefined ? 'open' : testCase.method, + }); + + await registerAttributionSrc(t, {trigger: { + event_trigger_data: testCase.event_trigger_data + }}); + + const payload = await pollEventLevelReports(); + assert_equals(payload.reports.length, 1); + const report = JSON.parse(payload.reports[0].body); + + assert_equals(report.trigger_data, testCase.expectedTriggerData); + }, testCase.testName); + +const testCases = new Map(); +testCases.set('filters', [ + { + testName: 'Implicit matching of event source type', + method: 'img', + event_trigger_data: [ + { + trigger_data: '0', + filters: {source_type: ['navigation']}, + }, + { + trigger_data: '1', + filters: {source_type: ['event']}, + }, + ], + expectedTriggerData: '1', + }, + { + testName: 'Implicit matching of navigation source type', + event_trigger_data: [ + { + trigger_data: '0', + filters: {source_type: ['event']}, + }, + { + trigger_data: '1', + filters: {source_type: ['navigation']}, + }, + ], + expectedTriggerData: '1', + }, + { + testName: 'Empty filter data', + source_filter_data: {a: []}, + event_trigger_data: [ + { + trigger_data: '3', + filters: {a: ['b']}, + }, + { + trigger_data: '4', + filters: {a: []}, + }, + { + trigger_data: '5', + filters: {a: []}, + }, + ], + expectedTriggerData: '4', + }, + { + testName: 'Single filter with multiple values', + source_filter_data: {a: ['b', 'c']}, + event_trigger_data: [ + { + trigger_data: '3', + filters: {a: []}, + }, + { + trigger_data: '4', + filters: {a: ['d']}, + }, + { + trigger_data: '5', + filters: {a: ['b']}, + }, + ], + expectedTriggerData: '5', + }, + { + testName: 'Multiple filters', + source_filter_data: { + 'a': ['c'], + 'b': ['d'], + }, + event_trigger_data: [ + { + trigger_data: '3', + filters: {'a': ['c'], 'b': []}, + }, + { + trigger_data: '4', + filters: {'a': ['c'], 'b': ['d']}, + }, + ], + expectedTriggerData: '4', + }, +]); + +testCases.set('not_filters', [ + { + testName: 'Implicit matching of event source type', + method: 'img', + event_trigger_data: [ + { + trigger_data: '0', + not_filters: {source_type: ['event']}, + }, + { + trigger_data: '1', + not_filters: {source_type: ['navigation']}, + }, + ], + expectedTriggerData: '1', + }, + { + testName: 'Implicit matching of navigation source type', + event_trigger_data: [ + { + trigger_data: '0', + not_filters: {source_type: ['navigation']}, + }, + { + trigger_data: '1', + not_filters: {source_type: ['event']}, + }, + ], + expectedTriggerData: '1', + }, + { + testName: 'Empty filter data', + source_filter_data: {a: []}, + event_trigger_data: [ + { + trigger_data: '3', + not_filters: {a: []}, + }, + { + trigger_data: '4', + not_filters: {a: ['b']}, + }, + { + trigger_data: '5', + not_filters: {a: ['b']}, + }, + ], + expectedTriggerData: '4', + }, + { + testName: 'Single filter with multiple values', + source_filter_data: {a: ['b', 'c']}, + event_trigger_data: [ + { + trigger_data: '3', + not_filters: {a: ['b']}, + }, + { + trigger_data: '4', + not_filters: {a: ['d']}, + }, + ], + expectedTriggerData: '4', + }, + { + testName: 'Multiple filters', + source_filter_data: {a: ['c'], b: ['d']}, + event_trigger_data: [ + { + trigger_data: '3', + not_filters: {a: ['c'], b: []}, + }, + { + trigger_data: '4', + not_filters: {a: ['d'], b: []}, + }, + ], + expectedTriggerData: '4', + }, +]); + +testCases.set('combination', [ + { + testName: 'Combination of positive and negative filters', + source_filter_data: {a: ['b', 'c']}, + event_trigger_data: [ + { + trigger_data: '3', + filters: {a: []}, + not_filters: {a: ['d']}, + }, + { + trigger_data: '4', + filters: {a: ['c']}, + not_filters: {a: ['b']}, + }, + { + trigger_data: '5', + filters: {a: ['c']}, + not_filters: {a: ['d']}, + }, + { + trigger_data: '6', + filters: {a: ['c']}, + not_filters: {a: ['d']}, + }, + ], + expectedTriggerData: '5', + } +]); + +testCases.forEach((subTestCases, key) => { + subsetTestByKey(key, (subTestCases) => { + subTestCases.forEach(filter_data_promise_test); + }, subTestCases); +}); + +</script>
diff --git a/third_party/closure_compiler/externs/automation.js b/third_party/closure_compiler/externs/automation.js index 634f948..010ab2b 100644 --- a/third_party/closure_compiler/externs/automation.js +++ b/third_party/closure_compiler/externs/automation.js
@@ -460,6 +460,7 @@ */ chrome.automation.DescriptionFromType = { ARIA_DESCRIPTION: 'ariaDescription', + ATTRIBUTE_EXPLICITLY_EMPTY: 'attributeExplicitlyEmpty', BUTTON_LABEL: 'buttonLabel', POPUP_ELEMENT: 'popupElement', RELATED_ELEMENT: 'relatedElement',
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 31ee9b2..43302e8 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -32035,6 +32035,7 @@ <int value="992" label="ChromeRootStoreEnabled"/> <int value="993" label="WebSQLNonSecureContextEnabled"/> <int value="994" label="IdleProfileCloseTimeout"/> + <int value="995" label="NewWindowsInKioskAllowed"/> </enum> <enum name="EnterprisePoliciesSources"> @@ -40832,6 +40833,7 @@ <int value="4298" label="UnhandledExceptionCountInWorker"/> <int value="4299" label="WebCodecsImageDecoderPremultiplyAlphaDeprecation"/> <int value="4300" label="CookieDomainNonASCII"/> + <int value="4301" label="ExpectCTHeader"/> </enum> <enum name="FeaturePolicyAllowlistType"> @@ -75657,6 +75659,9 @@ <int value="1" label="DB Not Available"/> <int value="2" label="Reading failure"/> <int value="3" label="Reading success but metadata cleaned for initial sync"/> + <int value="4" + label="Reading success but metadata cleaned to resolve inconsistencies + in the cache of unsupported proto fields"/> </enum> <enum name="PasswordSyncState"> @@ -95608,7 +95613,7 @@ </enum> <enum name="TrustedVaultDeviceRegistrationState"> - <int value="0" label="Already registered"/> + <int value="0" label="Already registered V0"/> <int value="1" label="Local keys are stale"/> <int value="2" label="Throttled client side"/> <int value="3" label="Attempting registration with newly generated keys"/> @@ -95616,6 +95621,7 @@ <int value="5" label="Attempting registration while having persistent authentication error"/> + <int value="6" label="Already registered V1"/> </enum> <enum name="TrustedVaultDownloadKeysStatus">
diff --git a/tools/metrics/histograms/metadata/histogram_suffixes_list.xml b/tools/metrics/histograms/metadata/histogram_suffixes_list.xml index 07e52fa..35758ac 100644 --- a/tools/metrics/histograms/metadata/histogram_suffixes_list.xml +++ b/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
@@ -7779,6 +7779,9 @@ <suffix name="Malloc.AllocatedObjects" label="Only counting objects allocated using the malloc allocator. The measurement is only accurate on Linux and MacOS."/> + <suffix name="Malloc.CommittedSize" + label="Committed memory size for malloc(). Recorded only when + PartitionAlloc is used as malloc()."/> <suffix name="Malloc.Fragmentation" label="Fragmentation of Partition allocator."/> <suffix name="Malloc.Fragmentation.After1H" @@ -7866,6 +7869,14 @@ uptime is 24H+."/> <suffix name="PartitionAlloc.AllocatedObjects" label="Only counting objects allocated using Partition allocator."/> + <suffix name="PartitionAlloc.CommittedSize.ArrayBuffer" + label="Committed memory size for the ArrayBuffer partition."/> + <suffix name="PartitionAlloc.CommittedSize.Buffer" + label="Committed memory size for the Buffer partition."/> + <suffix name="PartitionAlloc.CommittedSize.FastMalloc" + label="Committed memory size for the FastMalloc partition."/> + <suffix name="PartitionAlloc.CommittedSize.Layout" + label="Committed memory size for the Layout partition."/> <suffix name="PartitionAlloc.Fragmentation.ArrayBuffer" label="Fragmentation of ArrayBuffer partition."/> <suffix name="PartitionAlloc.Fragmentation.ArrayBuffer.After1H"
diff --git a/tools/metrics/histograms/metadata/segmentation_platform/histograms.xml b/tools/metrics/histograms/metadata/segmentation_platform/histograms.xml index e6e1793..ded6d5e 100644 --- a/tools/metrics/histograms/metadata/segmentation_platform/histograms.xml +++ b/tools/metrics/histograms/metadata/segmentation_platform/histograms.xml
@@ -447,6 +447,27 @@ <token key="SegmentID" variants="SegmentationModel"/> </histogram> +<histogram + name="SegmentationPlatform.SegmentSelectionOnDemand.Duration.{SegmentationKey}.{SelectedSegment}" + units="ms" expires_after="2022-12-01"> + <owner>shaktisahu@chromium.org</owner> + <owner>chrome-segmentation-platform@google.com</owner> + <summary> + Records the duration for running on-demand segment selection for + {SegmentationKey} which includes feature process and model execution of all + the models associated with {SegmentationKey}. + + Starts recording every time the on-demand segment selection method is called + for {SegmentationKey}. Records the duration when a {SelectedSegment} is + returned as the result. + </summary> + <token key="SegmentationKey" variants="SegmentationKey"/> + <token key="SelectedSegment" variants="SegmentationModel"> + <variant name="Any"/> + <variant name="None"/> + </token> +</histogram> + <histogram name="SegmentationPlatform.SelectionFailedReason" enum="SegmentationSelectionFailureReason" expires_after="2022-12-11"> <owner>ssid@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/sync/histograms.xml b/tools/metrics/histograms/metadata/sync/histograms.xml index ec5b1fa..86083ca0 100644 --- a/tools/metrics/histograms/metadata/sync/histograms.xml +++ b/tools/metrics/histograms/metadata/sync/histograms.xml
@@ -1187,6 +1187,19 @@ </summary> </histogram> +<histogram name="Sync.TrustedVaultDeviceRegistered" enum="Boolean" + expires_after="2022-11-13"> + <owner>mmoskvitin@google.com</owner> + <owner>mastiz@chromium.org</owner> + <component>Services>Sync</component> + <summary> + Simplified version of Sync.TrustedVaultDeviceRegistrationState. Records + whether the local device is registered (and ignores whether re-registration + was completed/pending/in-flight) upon startup (if signed in) or upon first + signin. + </summary> +</histogram> + <histogram name="Sync.TrustedVaultDeviceRegistrationState" enum="TrustedVaultDeviceRegistrationState" expires_after="2022-11-13"> <owner>mmoskvitin@google.com</owner>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index 6daccfbc..755b0571 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,24 +5,24 @@ "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux_arm64/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell" }, "win": { - "hash": "f7c9650e3453070480ffbbd12766b7e09153d8ff", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/bed4b810cd8b4049d93220a9279fc56d95f3289d/trace_processor_shell.exe" + "hash": "80b8dad393558537ff8599c113cfb680f65d9499", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/16075d13d01a9078bb4ca7de52c489b01dae4677/trace_processor_shell.exe" }, "linux_arm": { "hash": "58893933be305d3bfe0a72ebebcacde2ac3ca893", "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux_arm/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell" }, "mac": { - "hash": "ae8a798b3c3d93af16bdc077ce2b35bbcaacb8a4", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/bed4b810cd8b4049d93220a9279fc56d95f3289d/trace_processor_shell" + "hash": "37958969ab00730d190579d5956ee1b792c92ec6", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/4a7522f01b43ac3bac8561926e55d7500a55afa2/trace_processor_shell" }, "mac_arm64": { "hash": "e1ad4861384b06d911a65f035317914b8cc975c6", "full_remote_path": "perfetto-luci-artifacts/v25.0/mac-arm64/trace_processor_shell" }, "linux": { - "hash": "2bed915c632efe0902d2c2f6c6c6d4815545f747", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/0c6720dbdd99fb96faaa3476bbdd8bac58dbf677/trace_processor_shell" + "hash": "fc47f3885eb8733d6c699122b36e105002be939b", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/16075d13d01a9078bb4ca7de52c489b01dae4677/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/ui/accessibility/ax_enum_util.cc b/ui/accessibility/ax_enum_util.cc index 885f60f..ccb6b45e 100644 --- a/ui/accessibility/ax_enum_util.cc +++ b/ui/accessibility/ax_enum_util.cc
@@ -1579,6 +1579,8 @@ return "none"; case ax::mojom::DescriptionFrom::kAriaDescription: return "ariaDescription"; + case ax::mojom::DescriptionFrom::kAttributeExplicitlyEmpty: + return "attributeExplicitlyEmpty"; case ax::mojom::DescriptionFrom::kButtonLabel: return "buttonLabel"; case ax::mojom::DescriptionFrom::kPopupElement:
diff --git a/ui/accessibility/ax_enums.mojom b/ui/accessibility/ax_enums.mojom index 98ecd88..d365ce4 100644 --- a/ui/accessibility/ax_enums.mojom +++ b/ui/accessibility/ax_enums.mojom
@@ -1182,17 +1182,55 @@ kValue, // E.g. <input type="button" value="Button's name">. }; +// The source of the accessible description. Used by some screen readers +// to determine if and how the description should be presented to the user. enum DescriptionFrom { + // No description has been provided. (See also kAttributeExplicitlyEmpty) kNone, + + // The description comes from a flat string, such as aria-description (in the + // case of web content) or provided by the View. kAriaDescription, - kButtonLabel, // HTML-AAM 5.2.2 + + // The description has been removed to improve accessibility. Example: The + // description normally provided by this View's tooltip contains text which + // is also present in this View's name. This could cause screen readers to + // speak the information twice, which is not desired. Therefore the + // description has been deliberately set to the empty string to prevent + // double presentation. + kAttributeExplicitlyEmpty, + + // The description comes from the label/text of a button. + // See HTML-AAM's Accessible Name and Description Computation. + kButtonLabel, + + // The description comes from some other object such as an element referenced + // by aria-describedby (in the case of web content), or another View present + // in the UI. kRelatedElement, + + // The description comes from a Ruby annotation. kRubyAnnotation, - kSummary, // HTML-AAM 5.8.2 + + // The description comes from the contents of a summary element. + // See HTML-AAM's Accessible Name and Description Computation. + kSummary, + + // The description comes from the text of an SVG desc element. + // See SVG-AAM's Accessible Name and Description Computation. kSvgDescElement, - kTableCaption, // HTML-AAM 5.9.2 + + // The description comes from a table's caption element. + // See HTML-AAM's Accessible Name and Description Computation. + kTableCaption, + + // The description comes from the title attribute (HTML), the title element + // (SVG), or a View's tooltip. kTitle, - kPopupElement, // E.g. |triggerpopup| attr pointing to `popup=hint`. + + // The description comes from a non-tooltip popup, e.g. the |triggerpopup| + // attribute pointing to `popup=hint`. + kPopupElement, }; // Next value: 4
diff --git a/ui/accessibility/platform/ax_platform_node.cc b/ui/accessibility/platform/ax_platform_node.cc index 1c72c838..a0c15c29 100644 --- a/ui/accessibility/platform/ax_platform_node.cc +++ b/ui/accessibility/platform/ax_platform_node.cc
@@ -94,7 +94,6 @@ // static void AXPlatformNode::NotifyAddAXModeFlags(AXMode mode_flags) { - // Note: this is only called on Windows, and in tests. AXMode new_ax_mode(ax_mode_); new_ax_mode |= mode_flags; @@ -108,7 +107,6 @@ // static void AXPlatformNode::SetAXMode(AXMode new_mode) { - // Note: this is only called on Windows. ax_mode_ = new_mode; }
diff --git a/ui/accessibility/platform/ax_platform_node_base.cc b/ui/accessibility/platform/ax_platform_node_base.cc index cc83364..54d732a4 100644 --- a/ui/accessibility/platform/ax_platform_node_base.cc +++ b/ui/accessibility/platform/ax_platform_node_base.cc
@@ -1268,6 +1268,7 @@ from = "tooltip"; break; case ax::mojom::DescriptionFrom::kNone: + case ax::mojom::DescriptionFrom::kAttributeExplicitlyEmpty: NOTREACHED(); } DCHECK(!from.empty());
diff --git a/ui/accessibility/platform/ax_platform_node_cocoa.h b/ui/accessibility/platform/ax_platform_node_cocoa.h index b6b32b6..07f5bed 100644 --- a/ui/accessibility/platform/ax_platform_node_cocoa.h +++ b/ui/accessibility/platform/ax_platform_node_cocoa.h
@@ -62,7 +62,6 @@ - (instancetype)initWithNode:(ui::AXPlatformNodeBase*)node; - (void)detach; -@property(nonatomic, readonly) NSRect boundsInScreen; @property(nonatomic, readonly) ui::AXPlatformNodeBase* node; @property(nonatomic, readonly) ui::AXPlatformNodeDelegate* nodeDelegate;
diff --git a/ui/accessibility/platform/ax_platform_node_cocoa.mm b/ui/accessibility/platform/ax_platform_node_cocoa.mm index 426b6ce73..f774d14 100644 --- a/ui/accessibility/platform/ax_platform_node_cocoa.mm +++ b/ui/accessibility/platform/ax_platform_node_cocoa.mm
@@ -652,13 +652,6 @@ self, NSAccessibilityUIElementDestroyedNotification); } -- (NSRect)boundsInScreen { - if (!_node || !_node->GetDelegate()) - return NSZeroRect; - return gfx::ScreenRectToNSRect(_node->GetDelegate()->GetBoundsRect( - ui::AXCoordinateSystem::kScreenDIPs, ui::AXClippingBehavior::kClipped)); -} - - (NSString*)getStringAttribute:(ax::mojom::StringAttribute)attribute { std::string attributeValue; if (_node->GetStringAttribute(attribute, &attributeValue)) @@ -770,7 +763,7 @@ } - (id)accessibilityHitTest:(NSPoint)point { - if (!NSPointInRect(point, [self boundsInScreen])) + if (!NSPointInRect(point, [self accessibilityFrame])) return nil; for (id child in [[self AXChildren] reverseObjectEnumerator]) { @@ -1579,11 +1572,11 @@ } - (NSValue*)AXPosition { - return [NSValue valueWithPoint:self.boundsInScreen.origin]; + return [NSValue valueWithPoint:self.accessibilityFrame.origin]; } - (NSValue*)AXSize { - return [NSValue valueWithSize:self.boundsInScreen.size]; + return [NSValue valueWithSize:self.accessibilityFrame.size]; } - (NSString*)AXTitle { @@ -1768,7 +1761,10 @@ } - (NSRect)accessibilityFrame { - return [self boundsInScreen]; + if (!_node || !_node->GetDelegate()) + return NSZeroRect; + return gfx::ScreenRectToNSRect(_node->GetDelegate()->GetBoundsRect( + ui::AXCoordinateSystem::kScreenDIPs, ui::AXClippingBehavior::kClipped)); } - (NSString*)accessibilityLabel {
diff --git a/ui/accessibility/platform/ax_platform_node_delegate.h b/ui/accessibility/platform/ax_platform_node_delegate.h index f4b11c4..092444db 100644 --- a/ui/accessibility/platform/ax_platform_node_delegate.h +++ b/ui/accessibility/platform/ax_platform_node_delegate.h
@@ -170,6 +170,7 @@ virtual bool HasAction(ax::mojom::Action action) const = 0; virtual bool HasTextStyle(ax::mojom::TextStyle text_style) const = 0; virtual ax::mojom::NameFrom GetNameFrom() const = 0; + virtual ax::mojom::DescriptionFrom GetDescriptionFrom() const = 0; // Returns the text of this node and all descendant nodes; including text // found in embedded objects. @@ -347,6 +348,11 @@ // Returns the accessible name for the node. virtual const std::string& GetName() const = 0; + // Returns the accessible description for the node. + // An accessible description gives more information about the node in + // contrast to the accessible name which is a shorter label for the node. + virtual const std::string& GetDescription() const = 0; + // Returns the text of this node and represent the text of descendant nodes // with a special character in place of every embedded object. This represents // the concept of text in ATK and IA2 APIs.
diff --git a/ui/accessibility/platform/ax_platform_node_delegate_base.cc b/ui/accessibility/platform/ax_platform_node_delegate_base.cc index 14c9080..b3412ab 100644 --- a/ui/accessibility/platform/ax_platform_node_delegate_base.cc +++ b/ui/accessibility/platform/ax_platform_node_delegate_base.cc
@@ -213,6 +213,11 @@ return GetData().GetNameFrom(); } +ax::mojom::DescriptionFrom AXPlatformNodeDelegateBase::GetDescriptionFrom() + const { + return GetData().GetDescriptionFrom(); +} + std::u16string AXPlatformNodeDelegateBase::GetTextContentUTF16() const { // Unlike in web content The "kValue" attribute always takes precedence, // because we assume that users of this base class, such as Views controls, @@ -562,6 +567,10 @@ return GetStringAttribute(ax::mojom::StringAttribute::kName); } +const std::string& AXPlatformNodeDelegateBase::GetDescription() const { + return GetStringAttribute(ax::mojom::StringAttribute::kDescription); +} + std::u16string AXPlatformNodeDelegateBase::GetHypertext() const { return std::u16string(); }
diff --git a/ui/accessibility/platform/ax_platform_node_delegate_base.h b/ui/accessibility/platform/ax_platform_node_delegate_base.h index 61a378d..2fd1de6 100644 --- a/ui/accessibility/platform/ax_platform_node_delegate_base.h +++ b/ui/accessibility/platform/ax_platform_node_delegate_base.h
@@ -96,6 +96,7 @@ bool HasAction(ax::mojom::Action action) const override; bool HasTextStyle(ax::mojom::TextStyle text_style) const override; ax::mojom::NameFrom GetNameFrom() const override; + ax::mojom::DescriptionFrom GetDescriptionFrom() const override; std::u16string GetTextContentUTF16() const override; std::u16string GetValueForControl() const override; const AXTree::Selection GetUnignoredSelection() const override; @@ -171,6 +172,7 @@ std::unique_ptr<AXPlatformNodeDelegate::ChildIterator> ChildrenEnd() override; const std::string& GetName() const override; + const std::string& GetDescription() const override; std::u16string GetHypertext() const override; const std::map<int, int>& GetHypertextOffsetToHyperlinkChildIndex() const override;
diff --git a/ui/accessibility/platform/ax_utils_mac.h b/ui/accessibility/platform/ax_utils_mac.h index eeea71c..419d8a25 100644 --- a/ui/accessibility/platform/ax_utils_mac.h +++ b/ui/accessibility/platform/ax_utils_mac.h
@@ -14,6 +14,8 @@ class AXPlatformNodeCocoa; +AX_EXPORT bool IsNSRect(id object); + // An AXTextMarker is used by applications like Chrome to store a position in // the accessibility tree's text representation. It is a data structure whose // contents are opaque to the system but whose allocation and deallocation is
diff --git a/ui/accessibility/platform/ax_utils_mac.mm b/ui/accessibility/platform/ax_utils_mac.mm index 02613f0..918936f 100644 --- a/ui/accessibility/platform/ax_utils_mac.mm +++ b/ui/accessibility/platform/ax_utils_mac.mm
@@ -38,6 +38,14 @@ namespace ui { +bool IsNSRect(id object) { + if (object == nil || ![object isKindOfClass:[NSValue class]]) + return false; + if (0 == strcmp([object objCType], @encode(NSRect))) + return true; + return false; +} + bool IsAXTextMarker(id object) { if (object == nil) return false;
diff --git a/ui/accessibility/platform/inspect/ax_call_statement_invoker_mac.h b/ui/accessibility/platform/inspect/ax_call_statement_invoker_mac.h index c42f3f4e7..bce9b65 100644 --- a/ui/accessibility/platform/inspect/ax_call_statement_invoker_mac.h +++ b/ui/accessibility/platform/inspect/ax_call_statement_invoker_mac.h
@@ -63,6 +63,10 @@ const id target, const AXPropertyNode& property_node) const; + // Invokes a property node for a given NSRect. + AXOptionalNSObject InvokeForRect(const id target, + const AXPropertyNode& property_node) const; + // Invokes setAccessibilityFocused method. AXOptionalNSObject InvokeSetAccessibilityFocused( const id target,
diff --git a/ui/accessibility/platform/inspect/ax_call_statement_invoker_mac.mm b/ui/accessibility/platform/inspect/ax_call_statement_invoker_mac.mm index 060fad6..eb59fcf 100644 --- a/ui/accessibility/platform/inspect/ax_call_statement_invoker_mac.mm +++ b/ui/accessibility/platform/inspect/ax_call_statement_invoker_mac.mm
@@ -159,6 +159,10 @@ return InvokeForAXTextMarkerRange(target, property_node); } + if (IsNSRect(target)) { + return InvokeForRect(target, property_node); + } + if ([target isKindOfClass:[NSArray class]]) return InvokeForArray(target, property_node); @@ -398,6 +402,28 @@ return AXOptionalNSObject::NotNullOrError(dictionary[key]); } +AXOptionalNSObject AXCallStatementInvoker::InvokeForRect( + const id target, + const AXPropertyNode& property_node) const { + NSValue* value = target; + NSRect rect = value.rectValue; + + if (property_node.name_or_value == "size") { + NSValue* size = [NSValue valueWithSize:rect.size]; + return AXOptionalNSObject(size); + } + + if (property_node.name_or_value == "position") { + NSValue* position = [NSValue valueWithPoint:rect.origin]; + return AXOptionalNSObject(position); + } + + LOG(ERROR) << "Unrecognized '" << property_node.name_or_value + << "' attribute called on NSRect in '" + << property_node.ToFlatString() << "' statement"; + return AXOptionalNSObject::Error(); +} + AXOptionalNSObject AXCallStatementInvoker::InvokeSetAccessibilityFocused( const id target, const AXPropertyNode& property_node) const {
diff --git a/ui/base/dragdrop/drag_source_win.cc b/ui/base/dragdrop/drag_source_win.cc index e02b9374..c274091 100644 --- a/ui/base/dragdrop/drag_source_win.cc +++ b/ui/base/dragdrop/drag_source_win.cc
@@ -16,7 +16,6 @@ } HRESULT DragSourceWin::QueryContinueDrag(BOOL escape_pressed, DWORD key_state) { - num_query_continues_++; if (cancel_drag_) return DRAGDROP_S_CANCEL;
diff --git a/ui/base/dragdrop/drag_source_win.h b/ui/base/dragdrop/drag_source_win.h index b4557af4..5b03fe2 100644 --- a/ui/base/dragdrop/drag_source_win.h +++ b/ui/base/dragdrop/drag_source_win.h
@@ -46,10 +46,6 @@ cancel_drag_ = true; } - // This is used to tell if the drag drop actually started, for generating - // a BooleanSuccess histogram. - int num_query_continues() const { return num_query_continues_; } - // IDropSource implementation: HRESULT __stdcall QueryContinueDrag(BOOL escape_pressed, DWORD key_state) override; @@ -70,12 +66,6 @@ bool cancel_drag_; raw_ptr<const OSExchangeData> data_; - - // The number of times for this drag that Windows asked if the drag should - // continue. This is used in DesktopDragDropClientWin::StartDragAndDrop to - // detect if touch drag drop started successfully. See comment there for much - // more info. - int num_query_continues_ = 0; }; } // namespace ui
diff --git a/ui/base/models/combobox_model.cc b/ui/base/models/combobox_model.cc index 1a612b6..3f9db33 100644 --- a/ui/base/models/combobox_model.cc +++ b/ui/base/models/combobox_model.cc
@@ -16,23 +16,23 @@ observer.OnComboboxModelDestroying(this); } -std::u16string ComboboxModel::GetDropDownTextAt(int index) const { +std::u16string ComboboxModel::GetDropDownTextAt(size_t index) const { return GetItemAt(index); } -std::u16string ComboboxModel::GetDropDownSecondaryTextAt(int index) const { +std::u16string ComboboxModel::GetDropDownSecondaryTextAt(size_t index) const { return std::u16string(); } -ImageModel ComboboxModel::GetIconAt(int index) const { +ImageModel ComboboxModel::GetIconAt(size_t index) const { return ui::ImageModel(); } -ImageModel ComboboxModel::GetDropDownIconAt(int index) const { +ImageModel ComboboxModel::GetDropDownIconAt(size_t index) const { return GetIconAt(index); } -bool ComboboxModel::IsItemSeparatorAt(int index) const { +bool ComboboxModel::IsItemSeparatorAt(size_t index) const { return false; } @@ -40,7 +40,7 @@ return 0; } -bool ComboboxModel::IsItemEnabledAt(int index) const { +bool ComboboxModel::IsItemEnabledAt(size_t index) const { return true; }
diff --git a/ui/base/models/combobox_model.h b/ui/base/models/combobox_model.h index a81b8a7..30a6c34f 100644 --- a/ui/base/models/combobox_model.h +++ b/ui/base/models/combobox_model.h
@@ -23,37 +23,37 @@ virtual ~ComboboxModel(); // Returns the number of items in the combo box. - virtual int GetItemCount() const = 0; + virtual size_t GetItemCount() const = 0; // Returns the string at the specified index. - virtual std::u16string GetItemAt(int index) const = 0; + virtual std::u16string GetItemAt(size_t index) const = 0; // Returns the string to be shown in the dropdown for the item at |index|. By // default, it returns GetItemAt(index). - virtual std::u16string GetDropDownTextAt(int index) const; + virtual std::u16string GetDropDownTextAt(size_t index) const; // Returns the secondary string at the specified index. Secondary strings are // displayed in a second line inside every menu item. - virtual std::u16string GetDropDownSecondaryTextAt(int index) const; + virtual std::u16string GetDropDownSecondaryTextAt(size_t index) const; // Gets the icon for the item at the specified index. ImageModel is empty if // there is no icon. - virtual ImageModel GetIconAt(int index) const; + virtual ImageModel GetIconAt(size_t index) const; // Gets the icon for the item at |index|. ImageModel is empty if there is no // icon. By default, it returns GetIconAt(index). - virtual ImageModel GetDropDownIconAt(int index) const; + virtual ImageModel GetDropDownIconAt(size_t index) const; // Should return true if the item at |index| is a non-selectable separator // item. - virtual bool IsItemSeparatorAt(int index) const; + virtual bool IsItemSeparatorAt(size_t index) const; // The index of the item that is selected by default (before user // interaction). virtual absl::optional<size_t> GetDefaultIndex() const; // Returns true if the item at |index| is enabled. - virtual bool IsItemEnabledAt(int index) const; + virtual bool IsItemEnabledAt(size_t index) const; // Adds/removes an observer. void AddObserver(ComboboxModelObserver* observer);
diff --git a/ui/base/models/simple_combobox_model.cc b/ui/base/models/simple_combobox_model.cc index 347c6d85..cc393b30 100644 --- a/ui/base/models/simple_combobox_model.cc +++ b/ui/base/models/simple_combobox_model.cc
@@ -34,24 +34,24 @@ SimpleComboboxModel::~SimpleComboboxModel() = default; -int SimpleComboboxModel::GetItemCount() const { +size_t SimpleComboboxModel::GetItemCount() const { return items_.size(); } -std::u16string SimpleComboboxModel::GetItemAt(int index) const { +std::u16string SimpleComboboxModel::GetItemAt(size_t index) const { return items_[index].text; } std::u16string SimpleComboboxModel::GetDropDownSecondaryTextAt( - int index) const { + size_t index) const { return items_[index].dropdown_secondary_text; } -ui::ImageModel SimpleComboboxModel::GetIconAt(int index) const { +ui::ImageModel SimpleComboboxModel::GetIconAt(size_t index) const { return items_[index].icon; } -bool SimpleComboboxModel::IsItemSeparatorAt(int index) const { +bool SimpleComboboxModel::IsItemSeparatorAt(size_t index) const { return items_[index].text.empty(); }
diff --git a/ui/base/models/simple_combobox_model.h b/ui/base/models/simple_combobox_model.h index e3457ef9..451cca6 100644 --- a/ui/base/models/simple_combobox_model.h +++ b/ui/base/models/simple_combobox_model.h
@@ -44,11 +44,11 @@ ~SimpleComboboxModel() override; // ui::ComboboxModel: - int GetItemCount() const override; - std::u16string GetItemAt(int index) const override; - std::u16string GetDropDownSecondaryTextAt(int index) const override; - ui::ImageModel GetIconAt(int index) const override; - bool IsItemSeparatorAt(int index) const override; + size_t GetItemCount() const override; + std::u16string GetItemAt(size_t index) const override; + std::u16string GetDropDownSecondaryTextAt(size_t index) const override; + ui::ImageModel GetIconAt(size_t index) const override; + bool IsItemSeparatorAt(size_t index) const override; absl::optional<size_t> GetDefaultIndex() const override; private:
diff --git a/ui/events/ozone/evdev/BUILD.gn b/ui/events/ozone/evdev/BUILD.gn index b8938f11..c5ef119 100644 --- a/ui/events/ozone/evdev/BUILD.gn +++ b/ui/events/ozone/evdev/BUILD.gn
@@ -147,7 +147,7 @@ "numberpad_metrics.cc", "numberpad_metrics.h", ] - deps += [ "//chromeos/components/feature_usage" ] + deps += [ "//chromeos/ash/components/feature_usage" ] } public_configs = [ ":evdev_config" ] @@ -284,7 +284,7 @@ if (is_chromeos_ash) { sources += [ "numberpad_metrics_unittest.cc" ] - deps += [ "//chromeos/components/feature_usage" ] + deps += [ "//chromeos/ash/components/feature_usage" ] } visibility += [ "//ui/events/ozone:unittests" ]
diff --git a/ui/events/ozone/evdev/DEPS b/ui/events/ozone/evdev/DEPS index d2fc9db..784355d10 100644 --- a/ui/events/ozone/evdev/DEPS +++ b/ui/events/ozone/evdev/DEPS
@@ -1,3 +1,3 @@ include_rules = [ - "+chromeos/components/feature_usage/feature_usage_metrics.h" + "+chromeos/ash/components/feature_usage/feature_usage_metrics.h" ]
diff --git a/ui/events/ozone/evdev/fake_keyboard_heuristic_metrics.cc b/ui/events/ozone/evdev/fake_keyboard_heuristic_metrics.cc index 5bef3c9b5..68d960b3 100644 --- a/ui/events/ozone/evdev/fake_keyboard_heuristic_metrics.cc +++ b/ui/events/ozone/evdev/fake_keyboard_heuristic_metrics.cc
@@ -25,4 +25,4 @@ feature_usage_metrics_.RecordUsage(success); } -} // namespace ui \ No newline at end of file +} // namespace ui
diff --git a/ui/events/ozone/evdev/fake_keyboard_heuristic_metrics.h b/ui/events/ozone/evdev/fake_keyboard_heuristic_metrics.h index b07112a9..869cb236 100644 --- a/ui/events/ozone/evdev/fake_keyboard_heuristic_metrics.h +++ b/ui/events/ozone/evdev/fake_keyboard_heuristic_metrics.h
@@ -5,11 +5,12 @@ #ifndef UI_EVENTS_OZONE_EVDEV_FAKE_KEYBOARD_HEURISTIC_METRICS_H_ #define UI_EVENTS_OZONE_EVDEV_FAKE_KEYBOARD_HEURISTIC_METRICS_H_ -#include "chromeos/components/feature_usage/feature_usage_metrics.h" +#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h" namespace ui { + class FakeKeyboardHeuristicMetrics - : public feature_usage::FeatureUsageMetrics::Delegate { + : public ash::feature_usage::FeatureUsageMetrics::Delegate { public: explicit FakeKeyboardHeuristicMetrics(); ~FakeKeyboardHeuristicMetrics() override; @@ -19,8 +20,9 @@ void RecordUsage(bool success); private: - feature_usage::FeatureUsageMetrics feature_usage_metrics_; + ash::feature_usage::FeatureUsageMetrics feature_usage_metrics_; }; + } // namespace ui #endif // UI_EVENTS_OZONE_EVDEV_FAKE_KEYBOARD_HEURISTIC_METRICS_H_
diff --git a/ui/events/ozone/evdev/numberpad_metrics.h b/ui/events/ozone/evdev/numberpad_metrics.h index c52b0ccd..5a632de 100644 --- a/ui/events/ozone/evdev/numberpad_metrics.h +++ b/ui/events/ozone/evdev/numberpad_metrics.h
@@ -7,15 +7,16 @@ #include "base/component_export.h" #include "base/no_destructor.h" -#include "chromeos/components/feature_usage/feature_usage_metrics.h" +#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h" #include "ui/events/devices/input_device.h" namespace ui { + class NumberpadMetricsTest; // Combine delegate callbacks and FeatureUsageMetrics state for each metric. class COMPONENT_EXPORT(EVDEV) NumberpadMetricsDelegate final - : public feature_usage::FeatureUsageMetrics::Delegate { + : public ash::feature_usage::FeatureUsageMetrics::Delegate { public: explicit NumberpadMetricsDelegate(const std::string& feature_name); NumberpadMetricsDelegate(const NumberpadMetricsDelegate&) = delete; @@ -26,14 +27,14 @@ void SetState(bool now_eligible, bool now_enabled); void SetState(bool now_eligible) { SetState(now_eligible, now_eligible); } - // feature_usage::NumberpadMetricsDelegate::Delegate: + // ash::feature_usage::NumberpadMetricsDelegate::Delegate: bool IsEligible() const final; bool IsEnabled() const final; private: bool eligible_ = false; bool enabled_ = false; - feature_usage::FeatureUsageMetrics metrics_; + ash::feature_usage::FeatureUsageMetrics metrics_; }; // A class that records number-pad related metrics.
diff --git a/ui/events/ozone/evdev/numberpad_metrics_unittest.cc b/ui/events/ozone/evdev/numberpad_metrics_unittest.cc index a2b5c49..f7883ba 100644 --- a/ui/events/ozone/evdev/numberpad_metrics_unittest.cc +++ b/ui/events/ozone/evdev/numberpad_metrics_unittest.cc
@@ -17,6 +17,7 @@ #include "base/test/metrics/histogram_tester.h" #include "base/test/task_environment.h" #include "base/time/time.h" +#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/events/ozone/device/device_manager.h" @@ -29,8 +30,12 @@ #include "ui/events/ozone/evdev/testing/fake_cursor_delegate_evdev.h" #include "ui/events/ozone/layout/stub/stub_keyboard_layout_engine.h" +namespace ui { + namespace { +using FeatureUsageEvent = ::ash::feature_usage::FeatureUsageMetrics::Event; + // TODO(b/202039817): Should not need internal detail of feature_usage_metrics constexpr char kFeatureUsageMetricPrefix[] = "ChromeOS.FeatureUsage."; @@ -49,10 +54,6 @@ } // namespace -namespace ui { - -using FeatureUsageEvent = feature_usage::FeatureUsageMetrics::Event; - class NumberpadMetricsTest : public ::testing::Test { // Structures for keyword parameters to check utilities. struct DynamicMetricsExpectations { @@ -287,7 +288,7 @@ // markers. Use is coupled with EXPECT_METRIC_*() above. void DelayForPeriodicMetrics() { task_environment_.AdvanceClock( - feature_usage::FeatureUsageMetrics::kRepeatedInterval + + ash::feature_usage::FeatureUsageMetrics::kRepeatedInterval + base::Seconds(30)); base::RunLoop().RunUntilIdle(); }
diff --git a/ui/views/accessibility/view_accessibility.cc b/ui/views/accessibility/view_accessibility.cc index f3bfa48..4d149aa 100644 --- a/ui/views/accessibility/view_accessibility.cc +++ b/ui/views/accessibility/view_accessibility.cc
@@ -163,6 +163,11 @@ data->role = ax::mojom::Role::kUnknown; data->SetRestriction(ax::mojom::Restriction::kDisabled); + // TODO(accessibility): Returning early means that any custom data which + // had been set via the Override functions is not included. Preserving + // and exposing these properties might be worth doing, even in the case + // of object destruction. + // Ordinarily, a view cannot be focusable if its widget has already closed. // So, it would have been appropriate to set the focusable state to false in // this particular case. However, the `FocusManager` may sometimes try to @@ -208,6 +213,8 @@ data->SetHasPopup(custom_data_.GetHasPopup()); static constexpr ax::mojom::IntAttribute kOverridableIntAttributes[]{ + ax::mojom::IntAttribute::kDescriptionFrom, + ax::mojom::IntAttribute::kNameFrom, ax::mojom::IntAttribute::kPosInSet, ax::mojom::IntAttribute::kSetSize, }; @@ -346,20 +353,105 @@ custom_data_.role = role; } -void ViewAccessibility::OverrideName(const std::string& name) { +void ViewAccessibility::OverrideName(const std::string& name, + const ax::mojom::NameFrom name_from) { + DCHECK_EQ(name.empty(), + name_from == ax::mojom::NameFrom::kAttributeExplicitlyEmpty) + << "If the name is being removed to improve the user experience, " + "|name_from| should be set to |kAttributeExplicitlyEmpty|."; custom_data_.SetName(name); + custom_data_.SetNameFrom(name_from); } -void ViewAccessibility::OverrideName(const std::u16string& name) { - custom_data_.SetName(name); +void ViewAccessibility::OverrideName(const std::u16string& name, + const ax::mojom::NameFrom name_from) { + OverrideName(base::UTF16ToUTF8(name), name_from); } -void ViewAccessibility::OverrideDescription(const std::string& description) { +void ViewAccessibility::OverrideLabelledBy( + const View* labelled_by_view, + const ax::mojom::NameFrom name_from) { + DCHECK_NE(labelled_by_view, view_); + // |OverrideName| might have been used before |OverrideLabelledBy|. + // We don't want to keep an old/incorrect name. In addition, some ATs might + // expect the name to be provided by us from the label. So try to get the + // name from the labelling View and use the result. + // + // |ViewAccessibility::GetAccessibleNodeData| gets properties from: 1) The + // View's implementation of |View::GetAccessibleNodeData| and 2) the + // custom_data_ set via ViewAccessibility's various Override functions. + // HOWEVER, it returns early prior to checking either of those sources if the + // Widget does not exist or is closed. Thus given a View whose Widget is about + // to be created, we cannot use |ViewAccessibility::GetAccessibleNodeData| to + // obtain the name. If |OverrideLabelledBy| is being called, presumably the + // labelling View is not in the process of being destroyed. So manually check + // the two sources. + ui::AXNodeData label_data; + const_cast<View*>(labelled_by_view)->GetAccessibleNodeData(&label_data); + custom_data_.SetName( + label_data.GetStringAttribute(ax::mojom::StringAttribute::kName).empty() + ? labelled_by_view->GetViewAccessibility() + .custom_data_.GetStringAttribute( + ax::mojom::StringAttribute::kName) + : label_data.GetStringAttribute(ax::mojom::StringAttribute::kName)); + int32_t labelled_by_id = + labelled_by_view->GetViewAccessibility().GetUniqueId().Get(); + custom_data_.AddIntListAttribute(ax::mojom::IntListAttribute::kLabelledbyIds, + {labelled_by_id}); + custom_data_.SetNameFrom(name_from); +} + +void ViewAccessibility::OverrideDescription( + const std::string& description, + const ax::mojom::DescriptionFrom description_from) { + DCHECK_EQ( + description.empty(), + description_from == ax::mojom::DescriptionFrom::kAttributeExplicitlyEmpty) + << "If the description is being removed to improve the user experience, " + "|description_from| should be set to |kAttributeExplicitlyEmpty|."; custom_data_.SetDescription(description); + custom_data_.SetDescriptionFrom(description_from); } -void ViewAccessibility::OverrideDescription(const std::u16string& description) { - custom_data_.SetDescription(description); +void ViewAccessibility::OverrideDescription( + const std::u16string& description, + const ax::mojom::DescriptionFrom description_from) { + OverrideDescription(base::UTF16ToUTF8(description), description_from); +} + +void ViewAccessibility::OverrideDescribedBy( + const View* described_by_view, + const ax::mojom::DescriptionFrom description_from) { + DCHECK_NE(described_by_view, view_); + // |OverrideDescription| might have been used before |OverrideDescribedBy|. + // We don't want to keep an old/incorrect description. In addition, some ATs + // might expect the description to be provided by us from the describing View. + // So try to get the name from the describing View and use the result as the + // description string. + // + // |ViewAccessibility::GetAccessibleNodeData| gets properties from: 1) The + // View's implementation of |View::GetAccessibleNodeData| and 2) the + // custom_data_ set via ViewAccessibility's various Override functions. + // HOWEVER, it returns early prior to checking either of those sources if the + // Widget does not exist or is closed. Thus given a View whose Widget is about + // to be created, we cannot use |ViewAccessibility::GetAccessibleNodeData| to + // obtain the name. If |OverrideDescribedBy| is being called, presumably the + // labelling View is not in the process of being destroyed. So manually check + // the two sources. + ui::AXNodeData data; + const_cast<View*>(described_by_view)->GetAccessibleNodeData(&data); + custom_data_.SetDescription( + data.GetStringAttribute(ax::mojom::StringAttribute::kName).empty() + ? described_by_view->GetViewAccessibility() + .custom_data_.GetStringAttribute( + ax::mojom::StringAttribute::kName) + : data.GetStringAttribute(ax::mojom::StringAttribute::kName)); + + int32_t described_by_id = + described_by_view->GetViewAccessibility().GetUniqueId().Get(); + custom_data_.AddIntListAttribute(ax::mojom::IntListAttribute::kDescribedbyIds, + {described_by_id}); + custom_data_.SetDescriptionFrom(description_from); } void ViewAccessibility::OverrideNativeWindowTitle(const std::string& title) { @@ -426,20 +518,6 @@ custom_data_.relative_bounds.bounds = bounds; } -void ViewAccessibility::OverrideLabelledBy(View* labelled_by_view) { - int32_t labelled_by_id = - labelled_by_view->GetViewAccessibility().GetUniqueId().Get(); - custom_data_.AddIntListAttribute(ax::mojom::IntListAttribute::kLabelledbyIds, - {labelled_by_id}); -} - -void ViewAccessibility::OverrideDescribedBy(View* described_by_view) { - int32_t described_by_id = - described_by_view->GetViewAccessibility().GetUniqueId().Get(); - custom_data_.AddIntListAttribute(ax::mojom::IntListAttribute::kDescribedbyIds, - {described_by_id}); -} - void ViewAccessibility::OverrideHasPopup(const ax::mojom::HasPopup has_popup) { custom_data_.SetHasPopup(has_popup); }
diff --git a/ui/views/accessibility/view_accessibility.h b/ui/views/accessibility/view_accessibility.h index a41f431..9bd8362 100644 --- a/ui/views/accessibility/view_accessibility.h +++ b/ui/views/accessibility/view_accessibility.h
@@ -99,10 +99,71 @@ virtual void FireFocusAfterMenuClose(); void OverrideRole(const ax::mojom::Role role); - void OverrideName(const std::string& name); - void OverrideName(const std::u16string& name); - void OverrideDescription(const std::string& description); - void OverrideDescription(const std::u16string& description); + + // Sets the accessible name to the specified string value. + // By default the source type of the name is attribute. This source is + // appropriate for most use cases where a View is providing a non-empty flat + // string as the accessible name. If a View has a need to remove the + // accessible name, the string should be empty and the source of the name + // should instead be kAttributeExplicitlyEmpty. Note that the name source + // types were created based on needs associated with web content + // accessibility, and assistive technologies may make decisions based on that + // supposition. For instance, kTitle implies that the source of the name will + // be presented as a tooltip, such as would result from the HTML 'title' + // attribute or the SVG <title> element. + void OverrideName( + const std::string& name, + const ax::mojom::NameFrom name_from = ax::mojom::NameFrom::kAttribute); + void OverrideName( + const std::u16string& name, + const ax::mojom::NameFrom name_from = ax::mojom::NameFrom::kAttribute); + + // Sets the accessible label source by establishing a relationship between + // this View and another view, such as a Label. By default the source type of + // the name is "related element." This default should cover most, if not all, + // of the use cases for Views. Note that the name source types were created + // based on needs associated with web content accessibility, and assistive + // technologies may make decisions based on that supposition. For instance, + // kTitle implies that the source of the name will be presented as a tooltip, + // such as would result from the HTML 'title' attribute or the SVG <title> + // element. + void OverrideLabelledBy(const View* labelled_by_view, + const ax::mojom::NameFrom name_from = + ax::mojom::NameFrom::kRelatedElement); + + // Sets the accessible description to the specified string value. + // By default the source type of the description is aria-description. While + // Views technically don't support ARIA, aria-description is the closest + // existing DescriptionFrom source for Views providing a flat string + // description. And assistive technologies already know how to recognize this + // source type. Therefore, Views are encouraged to go with this default unless + // they have a specific reason not to. If a View has a need to remove the + // accessible description, the string should be empty and the source of the + // description should instead be kAttributeExplicitlyEmpty. If a View never + // had an accessible description, there is no need to override it with an + // empty string. + void OverrideDescription(const std::string& description, + const ax::mojom::DescriptionFrom description_from = + ax::mojom::DescriptionFrom::kAriaDescription); + void OverrideDescription(const std::u16string& description, + const ax::mojom::DescriptionFrom description_from = + ax::mojom::DescriptionFrom::kAriaDescription); + + // Sets the accessible description source by establishing a relationship + // between this View and another view, such as a Label. By default the source + // type of the description is "related element." This default should cover + // most, if not all, of the use cases for Views. Note that the description + // source types were created based on needs associated with web content + // accessibility, and assistive technologies may make decisions based on that + // supposition. For instance, kTitle implies that the source of the + // description will be presented as a tooltip, such as would result from the + // HTML 'title' attribute or the SVG <title> element. See also + // OverrideDescription, which allows a View to provide a flat string + // description which is appropriate in cases where there is not one single + // Label/View containing the entire description. + void OverrideDescribedBy(const View* described_by_view, + const ax::mojom::DescriptionFrom description_from = + ax::mojom::DescriptionFrom::kRelatedElement); // Sets the platform-specific accessible name/title property of the // NativeViewAccessible window. This is needed on platforms where the name @@ -147,8 +208,6 @@ virtual bool IsAccessibilityEnabled() const; void OverrideBounds(const gfx::RectF& bounds); - void OverrideLabelledBy(View* labelled_by_view); - void OverrideDescribedBy(View* described_by_view); void OverrideHasPopup(const ax::mojom::HasPopup has_popup); // Override information provided to users by screen readers when describing
diff --git a/ui/views/accessibility/view_ax_platform_node_delegate_unittest.cc b/ui/views/accessibility/view_ax_platform_node_delegate_unittest.cc index 24d33317..e857b113 100644 --- a/ui/views/accessibility/view_ax_platform_node_delegate_unittest.cc +++ b/ui/views/accessibility/view_ax_platform_node_delegate_unittest.cc
@@ -407,6 +407,109 @@ ASSERT_EQ(u"view_1", button_accessibility()->GetAuthorUniqueId()); } +TEST_F(ViewAXPlatformNodeDelegateTest, OverrideNameAndDescription) { + // Initially the button has no name and no description. + // TODO(accessibility): If nothing has set the name, should the NameFrom + // be kNone or kUninitialized instead of kAttribute? + EXPECT_EQ(button_accessibility()->GetName(), ""); + EXPECT_EQ(button_accessibility()->GetNameFrom(), + ax::mojom::NameFrom::kAttribute); + EXPECT_EQ(button_accessibility()->GetDescription(), ""); + EXPECT_EQ(button_accessibility()->GetDescriptionFrom(), + ax::mojom::DescriptionFrom::kNone); + + // Setting the name to the empty string without explicitly setting the + // source to reflect that should trigger a DCHECK in OverrideName. + EXPECT_DCHECK_DEATH_WITH(button_accessibility()->OverrideName(""), + "Check failed: name.empty\\(\\) == name_from == " + "ax::mojom::NameFrom::kAttributeExplicitlyEmpty"); + + // Setting the name to a non-empty string with a NameFrom of + // kAttributeExplicitlyEmpty should trigger a DCHECK in OverrideName. + EXPECT_DCHECK_DEATH_WITH( + button_accessibility()->OverrideName( + "foo", ax::mojom::NameFrom::kAttributeExplicitlyEmpty), + "Check failed: name.empty\\(\\) == name_from == " + "ax::mojom::NameFrom::kAttributeExplicitlyEmpty"); + + button_accessibility()->OverrideName( + "", ax::mojom::NameFrom::kAttributeExplicitlyEmpty); + EXPECT_EQ(button_accessibility()->GetName(), ""); + EXPECT_EQ(button_accessibility()->GetNameFrom(), + ax::mojom::NameFrom::kAttributeExplicitlyEmpty); + + // Setting the description to the empty string without explicitly setting + // the source to reflect that should trigger a DCHECK in OverrideDescription. + EXPECT_DCHECK_DEATH_WITH( + button_accessibility()->OverrideDescription(""), + "Check failed: description.empty\\(\\) == description_from == " + "ax::mojom::DescriptionFrom::kAttributeExplicitlyEmpty"); + + // Setting the description to a non-empty string with a DescriptionFrom of + // kAttributeExplicitlyEmpty should trigger a DCHECK in OverrideDescription. + EXPECT_DCHECK_DEATH_WITH( + button_accessibility()->OverrideDescription( + "foo", ax::mojom::DescriptionFrom::kAttributeExplicitlyEmpty), + "Check failed: description.empty\\(\\) == description_from == " + "ax::mojom::DescriptionFrom::kAttributeExplicitlyEmpty"); + + button_accessibility()->OverrideDescription( + "", ax::mojom::DescriptionFrom::kAttributeExplicitlyEmpty); + EXPECT_EQ(button_accessibility()->GetDescription(), ""); + EXPECT_EQ(button_accessibility()->GetDescriptionFrom(), + ax::mojom::DescriptionFrom::kAttributeExplicitlyEmpty); + + // Overriding the name and description without specifying the sources + // should set the sources to kAttribute and kAriaDescription respectively. + button_accessibility()->OverrideName("Button's Name"); + EXPECT_EQ(button_accessibility()->GetName(), "Button's Name"); + EXPECT_EQ(button_accessibility()->GetNameFrom(), + ax::mojom::NameFrom::kAttribute); + + button_accessibility()->OverrideDescription("Button's description"); + EXPECT_EQ(button_accessibility()->GetDescription(), "Button's description"); + EXPECT_EQ(button_accessibility()->GetDescriptionFrom(), + ax::mojom::DescriptionFrom::kAriaDescription); + + // Initially the label has no name and no description. + EXPECT_EQ(label_accessibility()->GetName(), ""); + EXPECT_EQ(label_accessibility()->GetDescription(), ""); + + // Set the name and description of the label using other source types + // for greater test coverage (i.e. rather than those types being the + // most appropriate choice.) + label_accessibility()->OverrideName("Label's Name", + ax::mojom::NameFrom::kContents); + EXPECT_EQ(label_accessibility()->GetName(), "Label's Name"); + EXPECT_EQ(label_accessibility()->GetNameFrom(), + ax::mojom::NameFrom::kContents); + + label_accessibility()->OverrideDescription( + "Label's description", ax::mojom::DescriptionFrom::kTitle); + EXPECT_EQ(label_accessibility()->GetDescription(), "Label's description"); + EXPECT_EQ(label_accessibility()->GetDescriptionFrom(), + ax::mojom::DescriptionFrom::kTitle); + + // Set the label's View as the name source of the accessible button. + // This should cause the previously-set name to be replaced with the + // accessible name of the label. + button_accessibility()->OverrideLabelledBy(label_); + EXPECT_EQ(button_accessibility()->GetName(), "Label's Name"); + EXPECT_EQ(button_accessibility()->GetNameFrom(), + ax::mojom::NameFrom::kRelatedElement); + + // Set the label's View as the description source of the accessible button. + // This should also remove the previously-set description. + button_accessibility()->OverrideDescribedBy(label_); + EXPECT_EQ(button_accessibility()->GetDescription(), "Label's Name"); + EXPECT_EQ(button_accessibility()->GetDescriptionFrom(), + ax::mojom::DescriptionFrom::kRelatedElement); + + // Setting the labelledby View to itself should trigger a DCHECK. + EXPECT_DCHECK_DEATH_WITH(button_accessibility()->OverrideLabelledBy(button_), + "Check failed: labelled_by_view != view_"); +} + TEST_F(ViewAXPlatformNodeDelegateTest, IsOrderedSet) { View::Views group_ids = SetUpExtraViews(); SetUpExtraViewsGroups(group_ids);
diff --git a/ui/views/controls/combobox/combobox.cc b/ui/views/controls/combobox/combobox.cc index 67752bb6..4a78cdd 100644 --- a/ui/views/controls/combobox/combobox.cc +++ b/ui/views/controls/combobox/combobox.cc
@@ -51,9 +51,6 @@ namespace { -// Used to indicate that no item is currently selected by the user. -constexpr int kNoSelection = -1; - SkColor GetTextColorForEnableState(const Combobox& combobox, bool enabled) { const int style = enabled ? style::STYLE_PRIMARY : style::STYLE_DISABLED; return style::GetColor(combobox, style::CONTEXT_TEXTFIELD, style); @@ -122,23 +119,6 @@ } }; -#if !BUILDFLAG(IS_MAC) -// Returns the next or previous valid index (depending on |increment|'s value). -// Skips separator or disabled indices. Returns -1 if there is no valid adjacent -// index. -int GetAdjacentIndex(ui::ComboboxModel* model, int increment, int index) { - DCHECK(increment == -1 || increment == 1); - - index += increment; - while (index >= 0 && index < model->GetItemCount()) { - if (!model->IsItemSeparatorAt(index) || !model->IsItemEnabledAt(index)) - return index; - index += increment; - } - return kNoSelection; -} -#endif - } // namespace //////////////////////////////////////////////////////////////////////////////// @@ -210,7 +190,7 @@ } bool Combobox::SelectValue(const std::u16string& value) { - for (size_t i = 0; i < static_cast<size_t>(GetModel()->GetItemCount()); ++i) { + for (size_t i = 0; i < GetModel()->GetItemCount(); ++i) { if (value == GetModel()->GetItemAt(i)) { SetSelectedIndex(i); return true; @@ -369,73 +349,85 @@ DCHECK_EQ(e.type(), ui::ET_KEY_PRESSED); DCHECK(selected_index_.has_value()); - DCHECK_LT(selected_index_.value(), - static_cast<size_t>(GetModel()->GetItemCount())); + DCHECK_LT(selected_index_.value(), GetModel()->GetItemCount()); - bool show_menu = false; - int new_index = kNoSelection; - switch (e.key_code()) { #if BUILDFLAG(IS_MAC) - case ui::VKEY_DOWN: - case ui::VKEY_UP: - case ui::VKEY_SPACE: - case ui::VKEY_HOME: - case ui::VKEY_END: - // On Mac, navigation keys should always just show the menu first. - show_menu = true; - break; + if (e.key_code() != ui::VKEY_DOWN && e.key_code() != ui::VKEY_UP && + e.key_code() != ui::VKEY_SPACE && e.key_code() != ui::VKEY_HOME && + e.key_code() != ui::VKEY_END) { + return false; + } + ShowDropDownMenu(ui::MENU_SOURCE_KEYBOARD); + return true; #else + const auto index_at_or_after = [](ui::ComboboxModel* model, + size_t index) -> absl::optional<size_t> { + for (; index < model->GetItemCount(); ++index) { + if (!model->IsItemSeparatorAt(index) && model->IsItemEnabledAt(index)) + return index; + } + return absl::nullopt; + }; + const auto index_before = [](ui::ComboboxModel* model, + size_t index) -> absl::optional<size_t> { + for (; index > 0; --index) { + const auto prev = index - 1; + if (!model->IsItemSeparatorAt(prev) && model->IsItemEnabledAt(prev)) + return prev; + } + return absl::nullopt; + }; + + absl::optional<size_t> new_index; + switch (e.key_code()) { // Show the menu on F4 without modifiers. case ui::VKEY_F4: if (e.IsAltDown() || e.IsAltGrDown() || e.IsControlDown()) return false; - show_menu = true; - break; + ShowDropDownMenu(ui::MENU_SOURCE_KEYBOARD); + return true; // Move to the next item if any, or show the menu on Alt+Down like Windows. case ui::VKEY_DOWN: - if (e.IsAltDown()) - show_menu = true; - else - new_index = GetAdjacentIndex(GetModel(), 1, selected_index_.value()); + if (e.IsAltDown()) { + ShowDropDownMenu(ui::MENU_SOURCE_KEYBOARD); + return true; + } + new_index = index_at_or_after(GetModel(), selected_index_.value() + 1); break; // Move to the end of the list. case ui::VKEY_END: case ui::VKEY_NEXT: // Page down. - new_index = GetAdjacentIndex(GetModel(), -1, GetModel()->GetItemCount()); + new_index = index_before(GetModel(), GetModel()->GetItemCount()); break; // Move to the beginning of the list. case ui::VKEY_HOME: case ui::VKEY_PRIOR: // Page up. - new_index = GetAdjacentIndex(GetModel(), 1, -1); + new_index = index_at_or_after(GetModel(), 0); break; // Move to the previous item if any. case ui::VKEY_UP: - new_index = GetAdjacentIndex(GetModel(), -1, selected_index_.value()); + new_index = index_before(GetModel(), selected_index_.value()); break; case ui::VKEY_RETURN: case ui::VKEY_SPACE: - show_menu = true; - break; -#endif // BUILDFLAG(IS_MAC) + ShowDropDownMenu(ui::MENU_SOURCE_KEYBOARD); + return true; + default: return false; } - if (show_menu) { - ShowDropDownMenu(ui::MENU_SOURCE_KEYBOARD); - } else if (static_cast<size_t>(new_index) != selected_index_ && - new_index != kNoSelection) { - DCHECK(!GetModel()->IsItemSeparatorAt(new_index)); + if (new_index.has_value()) { SetSelectedIndex(new_index); OnPerformAction(); } - return true; +#endif // BUILDFLAG(IS_MAC) } void Combobox::OnPaint(gfx::Canvas* canvas) { @@ -482,7 +474,7 @@ node_data->AddIntAttribute(ax::mojom::IntAttribute::kPosInSet, selected_index_.value()); node_data->AddIntAttribute(ax::mojom::IntAttribute::kSetSize, - model_->GetItemCount()); + base::checked_cast<int>(model_->GetItemCount())); } bool Combobox::HandleAccessibleAction(const ui::AXActionData& action_data) { @@ -504,7 +496,7 @@ // If the selection is no longer valid (or the model is empty), restore the // default index. - if (selected_index_ >= static_cast<size_t>(model_->GetItemCount()) || + if (selected_index_ >= model_->GetItemCount() || model_->GetItemCount() == 0 || model_->IsItemSeparatorAt(selected_index_.value())) { SetSelectedIndex(model_->GetDefaultIndex()); @@ -551,8 +543,7 @@ int contents_height = height() - insets.height(); DCHECK(selected_index_.has_value()); - DCHECK_LT(selected_index_.value(), - static_cast<size_t>(GetModel()->GetItemCount())); + DCHECK_LT(selected_index_.value(), GetModel()->GetItemCount()); // Draw the icon. ui::ImageModel icon = GetModel()->GetIconAt(selected_index_.value()); @@ -670,7 +661,7 @@ const gfx::FontList& font_list = GetFontList(); int height = font_list.GetHeight(); int width = 0; - for (size_t i = 0; i < static_cast<size_t>(GetModel()->GetItemCount()); ++i) { + for (size_t i = 0; i < GetModel()->GetItemCount(); ++i) { if (model_->IsItemSeparatorAt(i)) continue;
diff --git a/ui/views/controls/combobox/combobox_unittest.cc b/ui/views/controls/combobox/combobox_unittest.cc index 81e4165..d382986 100644 --- a/ui/views/controls/combobox/combobox_unittest.cc +++ b/ui/views/controls/combobox/combobox_unittest.cc
@@ -59,24 +59,21 @@ ~TestComboboxModel() override = default; - enum { kItemCount = 10 }; + static constexpr size_t kItemCount = 10; // ui::ComboboxModel: - int GetItemCount() const override { return item_count_; } - std::u16string GetItemAt(int index) const override { - if (IsItemSeparatorAt(index)) { - NOTREACHED(); - return u"SEPARATOR"; - } + size_t GetItemCount() const override { return item_count_; } + std::u16string GetItemAt(size_t index) const override { + DCHECK(!IsItemSeparatorAt(index)); return ASCIIToUTF16(index % 2 == 0 ? "PEANUT BUTTER" : "JELLY"); } - bool IsItemSeparatorAt(int index) const override { + bool IsItemSeparatorAt(size_t index) const override { return separators_.find(index) != separators_.end(); } absl::optional<size_t> GetDefaultIndex() const override { // Return the first index that is not a separator. - for (int index = 0; index < kItemCount; ++index) { + for (size_t index = 0; index < kItemCount; ++index) { if (separators_.find(index) == separators_.end()) return index; } @@ -84,12 +81,12 @@ return 0; } - void SetSeparators(const std::set<int>& separators) { + void SetSeparators(const std::set<size_t>& separators) { separators_ = separators; OnModelChanged(); } - void set_item_count(int item_count) { + void set_item_count(size_t item_count) { item_count_ = item_count; OnModelChanged(); } @@ -100,8 +97,8 @@ observer.OnComboboxModelChanged(this); } - std::set<int> separators_; - int item_count_ = kItemCount; + std::set<size_t> separators_; + size_t item_count_ = kItemCount; }; // A combobox model which refers to a vector. @@ -115,16 +112,16 @@ ~VectorComboboxModel() override = default; - void set_default_index(int default_index) { default_index_ = default_index; } + void set_default_index(size_t default_index) { + default_index_ = default_index; + } // ui::ComboboxModel: - int GetItemCount() const override { - return static_cast<int>(values_->size()); + size_t GetItemCount() const override { return values_->size(); } + std::u16string GetItemAt(size_t index) const override { + return ASCIIToUTF16((*values_)[index]); } - std::u16string GetItemAt(int index) const override { - return ASCIIToUTF16(values_->at(index)); - } - bool IsItemSeparatorAt(int index) const override { return false; } + bool IsItemSeparatorAt(size_t index) const override { return false; } absl::optional<size_t> GetDefaultIndex() const override { return default_index_; } @@ -135,7 +132,7 @@ } private: - int default_index_ = 0; + size_t default_index_ = 0; const raw_ptr<std::vector<std::string>> values_; }; @@ -203,7 +200,7 @@ ViewsTestBase::TearDown(); } - void InitCombobox(const std::set<int>* separators) { + void InitCombobox(const std::set<size_t>* separators) { model_ = std::make_unique<TestComboboxModel>(); if (separators) @@ -362,8 +359,7 @@ TEST_F(ComboboxTest, KeyTest) { InitCombobox(nullptr); PressKey(ui::VKEY_END); - EXPECT_EQ(static_cast<size_t>(model_->GetItemCount()) - 1, - combobox_->GetSelectedIndex()); + EXPECT_EQ(model_->GetItemCount() - 1, combobox_->GetSelectedIndex()); PressKey(ui::VKEY_HOME); EXPECT_EQ(0u, combobox_->GetSelectedIndex()); PressKey(ui::VKEY_DOWN); @@ -378,14 +374,13 @@ PressKey(ui::VKEY_PRIOR); EXPECT_EQ(0u, combobox_->GetSelectedIndex()); PressKey(ui::VKEY_NEXT); - EXPECT_EQ(static_cast<size_t>(model_->GetItemCount()) - 1, - combobox_->GetSelectedIndex()); + EXPECT_EQ(model_->GetItemCount() - 1, combobox_->GetSelectedIndex()); } // Verifies that we don't select a separator line in combobox when navigating // through keyboard. TEST_F(ComboboxTest, SkipSeparatorSimple) { - std::set<int> separators; + std::set<size_t> separators; separators.insert(2); InitCombobox(&separators); EXPECT_EQ(0u, combobox_->GetSelectedIndex()); @@ -406,7 +401,7 @@ // Verifies that we never select the separator that is in the beginning of the // combobox list when navigating through keyboard. TEST_F(ComboboxTest, SkipSeparatorBeginning) { - std::set<int> separators; + std::set<size_t> separators; separators.insert(0); InitCombobox(&separators); EXPECT_EQ(1u, combobox_->GetSelectedIndex()); @@ -427,7 +422,7 @@ // Verifies that we never select the separator that is in the end of the // combobox list when navigating through keyboard. TEST_F(ComboboxTest, SkipSeparatorEnd) { - std::set<int> separators; + std::set<size_t> separators; separators.insert(TestComboboxModel::kItemCount - 1); InitCombobox(&separators); combobox_->SetSelectedIndex(8); @@ -443,7 +438,7 @@ // consecutive) that appear in the beginning of the combobox list when // navigating through keyboard. TEST_F(ComboboxTest, SkipMultipleSeparatorsAtBeginning) { - std::set<int> separators; + std::set<size_t> separators; separators.insert(0); separators.insert(1); separators.insert(2); @@ -467,7 +462,7 @@ // consecutive) that appear in the middle of the combobox list when navigating // through keyboard. TEST_F(ComboboxTest, SkipMultipleAdjacentSeparatorsAtMiddle) { - std::set<int> separators; + std::set<size_t> separators; separators.insert(4); separators.insert(5); separators.insert(6); @@ -483,7 +478,7 @@ // consecutive) that appear in the end of the combobox list when navigating // through keyboard. TEST_F(ComboboxTest, SkipMultipleSeparatorsAtEnd) { - std::set<int> separators; + std::set<size_t> separators; separators.insert(7); separators.insert(8); separators.insert(9); @@ -505,7 +500,7 @@ #endif // !BUILDFLAG(IS_MAC) TEST_F(ComboboxTest, GetTextForRowTest) { - std::set<int> separators; + std::set<size_t> separators; separators.insert(0); separators.insert(1); separators.insert(9); @@ -768,7 +763,7 @@ EXPECT_EQ(2u, combobox_->GetSelectedRow()); // Make the selected index a separator. - std::set<int> separators; + std::set<size_t> separators; separators.insert(2); model_->SetSeparators(separators); EXPECT_EQ(4u, combobox_->GetRowCount()); @@ -827,13 +822,14 @@ // Test properties on the Combobox menu model. TEST_F(ComboboxTest, MenuModel) { const int kSeparatorIndex = 3; - std::set<int> separators; + std::set<size_t> separators; separators.insert(kSeparatorIndex); InitCombobox(&separators); ui::MenuModel* menu_model = test_api_->menu_model(); - EXPECT_EQ(TestComboboxModel::kItemCount, menu_model->GetItemCount()); + EXPECT_EQ(TestComboboxModel::kItemCount, + static_cast<size_t>(menu_model->GetItemCount())); EXPECT_EQ(ui::MenuModel::TYPE_SEPARATOR, menu_model->GetTypeAt(kSeparatorIndex)); @@ -904,8 +900,8 @@ } // ui::ComboboxModel: - int GetItemCount() const override { return item_count_; } - std::u16string GetItemAt(int index) const override { + size_t GetItemCount() const override { return item_count_; } + std::u16string GetItemAt(size_t index) const override { DCHECK_LT(index, item_count_); return base::NumberToString16(index); } @@ -913,14 +909,14 @@ return default_index_; } - void SetItemCount(int item_count) { item_count_ = item_count; } + void SetItemCount(size_t item_count) { item_count_ = item_count; } - void SetDefaultIndex(int default_index) { default_index_ = default_index; } + void SetDefaultIndex(size_t default_index) { default_index_ = default_index; } private: const raw_ptr<bool> destroyed_; - int item_count_ = 0; - int default_index_ = -1; + size_t item_count_ = 0; + absl::optional<size_t> default_index_; }; } // namespace
diff --git a/ui/views/controls/combobox/empty_combobox_model.cc b/ui/views/controls/combobox/empty_combobox_model.cc index 7a18fd8..9c1c3ed 100644 --- a/ui/views/controls/combobox/empty_combobox_model.cc +++ b/ui/views/controls/combobox/empty_combobox_model.cc
@@ -14,11 +14,11 @@ EmptyComboboxModel::EmptyComboboxModel() = default; EmptyComboboxModel::~EmptyComboboxModel() = default; -int EmptyComboboxModel::GetItemCount() const { +size_t EmptyComboboxModel::GetItemCount() const { return 0; } -std::u16string EmptyComboboxModel::GetItemAt(int index) const { +std::u16string EmptyComboboxModel::GetItemAt(size_t index) const { NOTREACHED(); return std::u16string(); }
diff --git a/ui/views/controls/combobox/empty_combobox_model.h b/ui/views/controls/combobox/empty_combobox_model.h index 2fffff0..ec1a57db 100644 --- a/ui/views/controls/combobox/empty_combobox_model.h +++ b/ui/views/controls/combobox/empty_combobox_model.h
@@ -19,8 +19,8 @@ ~EmptyComboboxModel() override; // ui::ComboboxModel: - int GetItemCount() const override; - std::u16string GetItemAt(int index) const override; + size_t GetItemCount() const override; + std::u16string GetItemAt(size_t index) const override; absl::optional<size_t> GetDefaultIndex() const override; };
diff --git a/ui/views/controls/editable_combobox/editable_combobox.cc b/ui/views/controls/editable_combobox/editable_combobox.cc index 27dcc0d..f02a2ba 100644 --- a/ui/views/controls/editable_combobox/editable_combobox.cc +++ b/ui/views/controls/editable_combobox/editable_combobox.cc
@@ -156,12 +156,11 @@ return; items_shown_.clear(); if (show_on_empty_ || !owner_->GetText().empty()) { - for (int i = 0; i < combobox_model_->GetItemCount(); ++i) { + for (size_t i = 0; i < combobox_model_->GetItemCount(); ++i) { if (!filter_on_edit_ || base::StartsWith(combobox_model_->GetItemAt(i), owner_->GetText(), base::CompareCase::INSENSITIVE_ASCII)) { - items_shown_.push_back( - {static_cast<size_t>(i), combobox_model_->IsItemEnabledAt(i)}); + items_shown_.push_back({i, combobox_model_->IsItemEnabledAt(i)}); } } }
diff --git a/ui/views/controls/editable_combobox/editable_combobox_unittest.cc b/ui/views/controls/editable_combobox/editable_combobox_unittest.cc index 2a69777..0efa613a 100644 --- a/ui/views/controls/editable_combobox/editable_combobox_unittest.cc +++ b/ui/views/controls/editable_combobox/editable_combobox_unittest.cc
@@ -909,17 +909,17 @@ } // ui::ComboboxModel: - int GetItemCount() const override { return item_count_; } - std::u16string GetItemAt(int index) const override { + size_t GetItemCount() const override { return item_count_; } + std::u16string GetItemAt(size_t index) const override { DCHECK_LT(index, item_count_); return base::NumberToString16(index); } - void SetItemCount(int item_count) { item_count_ = item_count; } + void SetItemCount(size_t item_count) { item_count_ = item_count; } private: const raw_ptr<bool> destroyed_; - int item_count_ = 0; + size_t item_count_ = 0; }; } // namespace
diff --git a/ui/views/controls/tabbed_pane/tabbed_pane.cc b/ui/views/controls/tabbed_pane/tabbed_pane.cc index 6b746f5..fa9a69ac 100644 --- a/ui/views/controls/tabbed_pane/tabbed_pane.cc +++ b/ui/views/controls/tabbed_pane/tabbed_pane.cc
@@ -525,7 +525,8 @@ std::unique_ptr<View> contents) { DCHECK_LE(index, GetTabCount()); contents->SetVisible(false); - contents->GetViewAccessibility().OverrideName(title); + if (!title.empty()) + contents->GetViewAccessibility().OverrideName(title); contents->GetViewAccessibility().OverrideRole(ax::mojom::Role::kTabPanel); tab_strip_->AddChildViewAt(std::make_unique<Tab>(this, title, contents.get()),
diff --git a/ui/views/controls/textfield/textfield.cc b/ui/views/controls/textfield/textfield.cc index 4699148d..9193f3c8 100644 --- a/ui/views/controls/textfield/textfield.cc +++ b/ui/views/controls/textfield/textfield.cc
@@ -270,15 +270,6 @@ void Textfield::SetAssociatedLabel(View* labelling_view) { DCHECK(labelling_view); GetViewAccessibility().OverrideLabelledBy(labelling_view); - ui::AXNodeData node_data; - labelling_view->GetAccessibleNodeData(&node_data); - // Labelled-by relations are not common practice in native UI, so we also - // set the accessible name for ATs which don't support that. - // TODO(aleventhal) automatically handle setting the name from the related - // label in ViewAccessibility and have it update the name if the text of the - // associated label changes. - SetAccessibleName( - node_data.GetString16Attribute(ax::mojom::StringAttribute::kName)); } void Textfield::SetController(TextfieldController* controller) {
diff --git a/ui/views/examples/combobox_example.cc b/ui/views/examples/combobox_example.cc index 86c173a..edb6327 100644 --- a/ui/views/examples/combobox_example.cc +++ b/ui/views/examples/combobox_example.cc
@@ -32,9 +32,10 @@ private: // ui::ComboboxModel: - int GetItemCount() const override { return 10; } - std::u16string GetItemAt(int index) const override { - return base::UTF8ToUTF16(base::StringPrintf("%c item", 'A' + index)); + size_t GetItemCount() const override { return 10; } + std::u16string GetItemAt(size_t index) const override { + return base::UTF8ToUTF16( + base::StringPrintf("%c item", static_cast<char>('A' + index))); } };
diff --git a/ui/views/examples/designer_example.cc b/ui/views/examples/designer_example.cc index 1064f35d..3726e45 100644 --- a/ui/views/examples/designer_example.cc +++ b/ui/views/examples/designer_example.cc
@@ -160,8 +160,8 @@ } // ui::ComboboxModel - int GetItemCount() const override { return 1; } - std::u16string GetItemAt(int index) const override { return u"<empty>"; } + size_t GetItemCount() const override { return 1; } + std::u16string GetItemAt(size_t index) const override { return u"<empty>"; } absl::optional<size_t> GetDefaultIndex() const override { return 0; } }; @@ -624,11 +624,11 @@ model_observer_ = observer; } -int DesignerExample::GetItemCount() const { +size_t DesignerExample::GetItemCount() const { return class_registrations_.size(); } -std::u16string DesignerExample::GetItemAt(int index) const { +std::u16string DesignerExample::GetItemAt(size_t index) const { return class_registrations_[index]->GetViewClassName(); }
diff --git a/ui/views/examples/designer_example.h b/ui/views/examples/designer_example.h index f3c30e2..ddb25107 100644 --- a/ui/views/examples/designer_example.h +++ b/ui/views/examples/designer_example.h
@@ -144,8 +144,8 @@ void SetObserver(ui::TableModelObserver* observer) override; // ui::ComboboxModel overrides - int GetItemCount() const override; - std::u16string GetItemAt(int index) const override; + size_t GetItemCount() const override; + std::u16string GetItemAt(size_t index) const override; absl::optional<size_t> GetDefaultIndex() const override; BoxLayoutView* designer_container_ = nullptr;
diff --git a/ui/views/examples/example_combobox_model.cc b/ui/views/examples/example_combobox_model.cc index aa21ea27..887dc19 100644 --- a/ui/views/examples/example_combobox_model.cc +++ b/ui/views/examples/example_combobox_model.cc
@@ -10,16 +10,16 @@ namespace examples { ExampleComboboxModel::ExampleComboboxModel(const char* const* strings, - int count) + size_t count) : strings_(strings), count_(count) {} ExampleComboboxModel::~ExampleComboboxModel() = default; -int ExampleComboboxModel::GetItemCount() const { +size_t ExampleComboboxModel::GetItemCount() const { return count_; } -std::u16string ExampleComboboxModel::GetItemAt(int index) const { +std::u16string ExampleComboboxModel::GetItemAt(size_t index) const { return base::ASCIIToUTF16(strings_[index]); }
diff --git a/ui/views/examples/example_combobox_model.h b/ui/views/examples/example_combobox_model.h index 1bf5177b..483af19c 100644 --- a/ui/views/examples/example_combobox_model.h +++ b/ui/views/examples/example_combobox_model.h
@@ -13,7 +13,7 @@ class ExampleComboboxModel : public ui::ComboboxModel { public: - ExampleComboboxModel(const char* const* strings, int count); + ExampleComboboxModel(const char* const* strings, size_t count); ExampleComboboxModel(const ExampleComboboxModel&) = delete; ExampleComboboxModel& operator=(const ExampleComboboxModel&) = delete; @@ -21,12 +21,12 @@ ~ExampleComboboxModel() override; // ui::ComboboxModel: - int GetItemCount() const override; - std::u16string GetItemAt(int index) const override; + size_t GetItemCount() const override; + std::u16string GetItemAt(size_t index) const override; private: const raw_ptr<const char* const> strings_; - const int count_; + const size_t count_; }; } // namespace examples
diff --git a/ui/views/examples/examples_window.cc b/ui/views/examples/examples_window.cc index d2c7242..ff0ab517 100644 --- a/ui/views/examples/examples_window.cc +++ b/ui/views/examples/examples_window.cc
@@ -123,12 +123,12 @@ } // ui::ComboboxModel: - int GetItemCount() const override { return example_list_.size(); } - std::u16string GetItemAt(int index) const override { + size_t GetItemCount() const override { return example_list_.size(); } + std::u16string GetItemAt(size_t index) const override { return base::UTF8ToUTF16(example_list_[index]->example_title()); } - View* GetItemViewAt(int index) { + View* GetItemViewAt(size_t index) { return example_list_[index]->example_view(); } @@ -194,7 +194,7 @@ } gfx::Size CalculatePreferredSize() const override { gfx::Size size(800, 300); - for (int i = 0; i < combobox_model_->GetItemCount(); i++) { + for (size_t i = 0; i < combobox_model_->GetItemCount(); i++) { size.set_height( std::max(size.height(), combobox_model_->GetItemViewAt(i)->GetHeightForWidth(800))); @@ -205,7 +205,7 @@ void ComboboxChanged() { size_t index = combobox_->GetSelectedIndex().value(); - DCHECK_LT(index, static_cast<size_t>(combobox_model_->GetItemCount())); + DCHECK_LT(index, combobox_model_->GetItemCount()); example_shown_->RemoveAllChildViewsWithoutDeleting(); example_shown_->AddChildView(combobox_model_->GetItemViewAt(index)); example_shown_->RequestFocus();
diff --git a/ui/views/examples/login_bubble_dialog_example.cc b/ui/views/examples/login_bubble_dialog_example.cc index 66fa4f6..aee1c77 100644 --- a/ui/views/examples/login_bubble_dialog_example.cc +++ b/ui/views/examples/login_bubble_dialog_example.cc
@@ -22,8 +22,7 @@ using l10n_util::GetStringUTF16; using l10n_util::GetStringUTF8; -namespace views { -namespace examples { +namespace views::examples { namespace { @@ -163,5 +162,4 @@ password_input_->SetText(password); } -} // namespace examples -} // namespace views +} // namespace views::examples
diff --git a/ui/views/focus/focus_manager_unittest.cc b/ui/views/focus/focus_manager_unittest.cc index bbea127..de216f0 100644 --- a/ui/views/focus/focus_manager_unittest.cc +++ b/ui/views/focus/focus_manager_unittest.cc
@@ -30,6 +30,7 @@ #include "ui/views/test/test_platform_native_widget.h" #include "ui/views/test/widget_test.h" #include "ui/views/view_class_properties.h" +#include "ui/views/widget/unique_widget_ptr.h" #include "ui/views/widget/widget.h" #if defined(USE_AURA) @@ -157,17 +158,18 @@ TestWidgetFocusChangeListener widget_listener; AddWidgetFocusChangeListener(&widget_listener); - Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW); - params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; - params.bounds = gfx::Rect(10, 10, 100, 100); - params.parent = GetWidget()->GetNativeView(); - - std::unique_ptr<Widget> widget1(new Widget); - widget1->Init(std::move(params)); + Widget::InitParams params1 = CreateParams(Widget::InitParams::TYPE_WINDOW); + params1.bounds = gfx::Rect(10, 10, 100, 100); + params1.parent = GetWidget()->GetNativeView(); + UniqueWidgetPtr widget1 = std::make_unique<Widget>(); + widget1->Init(std::move(params1)); widget1->Show(); - std::unique_ptr<Widget> widget2(new Widget); - widget2->Init(std::move(params)); + Widget::InitParams params2 = CreateParams(Widget::InitParams::TYPE_WINDOW); + params2.bounds = gfx::Rect(10, 10, 100, 100); + params2.parent = GetWidget()->GetNativeView(); + UniqueWidgetPtr widget2 = std::make_unique<Widget>(); + widget2->Init(std::move(params2)); widget2->Show(); widget_listener.ClearFocusChanges(); @@ -914,25 +916,27 @@ GetContentsView()->AddChildView(widget_view); // Create a widget with two views, focus the second. - std::unique_ptr<AdvanceFocusWidgetDelegate> delegate; Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW); - params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.child = true; params.bounds = gfx::Rect(10, 10, 100, 100); params.parent = GetWidget()->GetNativeView(); - Widget child_widget; - delegate = std::make_unique<AdvanceFocusWidgetDelegate>(&child_widget); - params.delegate = delegate.get(); - child_widget.Init(std::move(params)); + UniqueWidgetPtr child_widget = std::make_unique<Widget>(); + std::unique_ptr<AdvanceFocusWidgetDelegate> delegate_owned = + std::make_unique<AdvanceFocusWidgetDelegate>(child_widget.get()); + AdvanceFocusWidgetDelegate* delegate = delegate_owned.get(); + params.delegate = delegate_owned.release(); + delegate->SetOwnedByWidget(true); + child_widget->Init(std::move(params)); + View* view1 = new View; view1->SetFocusBehavior(View::FocusBehavior::ALWAYS); view1->SetBounds(0, 0, 20, 20); View* view2 = new View; view2->SetFocusBehavior(View::FocusBehavior::ALWAYS); view2->SetBounds(20, 0, 20, 20); - child_widget.client_view()->AddChildView(view1); - child_widget.client_view()->AddChildView(view2); - child_widget.Show(); + child_widget->client_view()->AddChildView(view1); + child_widget->client_view()->AddChildView(view2); + child_widget->Show(); view2->RequestFocus(); EXPECT_EQ(view2, GetFocusManager()->GetFocusedView()); @@ -947,12 +951,6 @@ // And forward again, wrapping back to |view1|. GetFocusManager()->AdvanceFocus(true); EXPECT_EQ(view1, GetFocusManager()->GetFocusedView()); - - // Allow focus to go to the parent, and focus backwards which should now move - // up |widget_view| (in the parent). - delegate->SetFocusTraversesOut(true); - GetFocusManager()->AdvanceFocus(true); - EXPECT_EQ(widget_view, GetFocusManager()->GetFocusedView()); } TEST_F(FocusManagerTest, NavigateIntoAnchoredDialog) { @@ -1123,13 +1121,12 @@ }; TEST_F(DesktopWidgetFocusManagerTest, AnchoredDialogInDesktopNativeWidgetAura) { - Widget widget; + UniqueWidgetPtr widget = std::make_unique<Widget>(); Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW); - params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.bounds = gfx::Rect(0, 0, 1024, 768); - widget.Init(std::move(params)); - widget.Show(); - widget.Activate(); + widget->Init(std::move(params)); + widget->Show(); + widget->Activate(); View* parent1 = new View(); View* parent2 = new View(); @@ -1137,8 +1134,8 @@ parent1->SetFocusBehavior(View::FocusBehavior::ALWAYS); parent2->SetFocusBehavior(View::FocusBehavior::ALWAYS); - widget.GetRootView()->AddChildView(parent1); - widget.GetRootView()->AddChildView(parent2); + widget->GetRootView()->AddChildView(parent1); + widget->GetRootView()->AddChildView(parent2); TestBubbleDialogDelegateView* bubble_delegate = TestBubbleDialogDelegateView::CreateAndShowBubble(parent2); @@ -1156,24 +1153,24 @@ parent2->SetProperty(views::kSkipAccessibilityPaintChecks, true); child->SetProperty(views::kSkipAccessibilityPaintChecks, true); - widget.Activate(); + widget->Activate(); parent1->RequestFocus(); base::RunLoop().RunUntilIdle(); // Initially the outer widget's window is focused. aura::client::FocusClient* focus_client = - aura::client::GetFocusClient(widget.GetNativeView()); - ASSERT_EQ(widget.GetNativeView(), focus_client->GetFocusedWindow()); + aura::client::GetFocusClient(widget->GetNativeView()); + ASSERT_EQ(widget->GetNativeView(), focus_client->GetFocusedWindow()); // Navigate forwards - widget.GetFocusManager()->AdvanceFocus(false); + widget->GetFocusManager()->AdvanceFocus(false); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(parent2->HasFocus()); - widget.GetFocusManager()->AdvanceFocus(false); + widget->GetFocusManager()->AdvanceFocus(false); EXPECT_TRUE(child->HasFocus()); // Now the bubble widget's window is focused. - ASSERT_NE(widget.GetNativeView(), focus_client->GetFocusedWindow()); + ASSERT_NE(widget->GetNativeView(), focus_client->GetFocusedWindow()); ASSERT_EQ(bubble_widget->GetNativeView(), focus_client->GetFocusedWindow()); // Navigate backwards @@ -1181,7 +1178,7 @@ EXPECT_TRUE(parent2->HasFocus()); // Finally, the outer widget's window should be focused again. - ASSERT_EQ(widget.GetNativeView(), focus_client->GetFocusedWindow()); + ASSERT_EQ(widget->GetNativeView(), focus_client->GetFocusedWindow()); } #endif
diff --git a/ui/views/focus/focus_traversal_unittest.cc b/ui/views/focus/focus_traversal_unittest.cc index b062402..a16b093f 100644 --- a/ui/views/focus/focus_traversal_unittest.cc +++ b/ui/views/focus/focus_traversal_unittest.cc
@@ -93,8 +93,8 @@ class DummyComboboxModel : public ui::ComboboxModel { public: // Overridden from ui::ComboboxModel: - int GetItemCount() const override { return 10; } - std::u16string GetItemAt(int index) const override { + size_t GetItemCount() const override { return 10; } + std::u16string GetItemAt(size_t index) const override { return u"Item " + base::NumberToString16(index); } };
diff --git a/ui/views/widget/ax_native_widget_mac_unittest.mm b/ui/views/widget/ax_native_widget_mac_unittest.mm index f6a7f430..5fc3a02a 100644 --- a/ui/views/widget/ax_native_widget_mac_unittest.mm +++ b/ui/views/widget/ax_native_widget_mac_unittest.mm
@@ -773,8 +773,8 @@ TestComboboxModel& operator=(const TestComboboxModel&) = delete; // ui::ComboboxModel: - int GetItemCount() const override { return 2; } - std::u16string GetItemAt(int index) const override { + size_t GetItemCount() const override { return 2; } + std::u16string GetItemAt(size_t index) const override { return index == 0 ? base::SysNSStringToUTF16(kTestStringValue) : u"Second Item"; }
diff --git a/ui/views/widget/desktop_aura/desktop_drag_drop_client_win.cc b/ui/views/widget/desktop_aura/desktop_drag_drop_client_win.cc index d8280fdf..1a41e35 100644 --- a/ui/views/widget/desktop_aura/desktop_drag_drop_client_win.cc +++ b/ui/views/widget/desktop_aura/desktop_drag_drop_client_win.cc
@@ -70,33 +70,12 @@ // drag. (http://crbug.com/806174) base::HangWatcher::InvalidateActiveExpectations(); - base::TimeTicks start_time = base::TimeTicks::Now(); - HRESULT result = ::DoDragDrop( ui::OSExchangeDataProviderWin::GetIDataObject(*data.get()), drag_source_.Get(), ui::DragDropTypes::DragOperationToDropEffect(allowed_operations), &effect); if (alive && source == ui::mojom::DragEventSource::kTouch) { - // In a normal drag drop, ::DoDragDrop calls QueryContinueDrag every time - // it gets a mouse or keyboard event. The windows doc - // https://docs.microsoft.com/en-us/windows/win32/api/oleidl/nf-oleidl-idropsource-querycontinuedrag - // says "every time it detects a change in keyboard or mouse button state" - // but empirically, on a Yoga laptop with a touch screen running Windows 10, - // it's called when it gets a mouse move event as well. (::DoDragDrop - // doesn't support touch, so Chrome synthesizes mouse events from touch - // events during drag drop.) - // In the touch failure case, when ::DoDragDrop blocks waiting for a mouse - // button down event to start the drag, it only calls - // QueryContinueDrag once, when it gets an event that terminates the blocked - // drag drop, e.g., a swipe gesture from outside the Chrome window. So, we - // detect the failure case when a drag drop lasts more than one second, and - // QueryContinueDrag was not called more than once. - // See crbug.com/1126230. - UMA_HISTOGRAM_BOOLEAN( - "Windows.TouchDrag.Success", - drag_source_->num_query_continues() > 1 || - (base::TimeTicks::Now() - start_time < base::Seconds(1))); desktop_host_->FinishTouchDrag(touch_screen_point); // Move the mouse cursor to where the drag drop started, to avoid issues // when the drop is outside of the Chrome window.